Halo, warga Habrovsk! EastBanc Technologies memiliki sejumlah besar proyek yang berkaitan dengan pengembangan ponsel. Dalam hubungan ini, seluruh kebun binatang perangkat diperlukan untuk pengujian di semua tahap. Dan, secara khas, setiap perangkat tunggal secara konstan dibutuhkan oleh berbagai orang, dan menemukannya bahkan dalam satu departemen pengembangan ponsel beberapa lusin orang adalah keseluruhan cerita. Belum lagi ada penguji, desainer, PM, pada akhirnya!
Dan agar tidak kehilangan telepon, tetapi untuk mengetahui dengan jelas di mana itu dan dengan siapa, kami menggunakan database online yang mengenali karyawan dari wajah mereka. Sekarang kita akan tahu bagaimana kita sampai pada ini dan menerapkannya.

Konteks sejarah
Kami memiliki papan dengan "kartu" perangkat dengan informasi dasar dan tempat untuk magnet yang menunjukkan seorang karyawan. Semua orang mencatat tentang mengambil perangkat.

Sistem ini memiliki kelemahan - tidak kritis, tetapi umumnya tidak nyaman:
- Magnet tidak begitu mudah untuk dipindahkan dari satu tempat ke tempat lain.
- Untuk melihat papan seperti itu, Anda harus pergi ke kantor lain.
- Dan tetap saja, seseorang mungkin membutuhkan banyak perangkat sekaligus ... Yang artinya Anda membutuhkan beberapa magnet per karyawan.
- Oh ya, bahkan karyawan kadang-kadang berhenti dan yang baru datang, yang juga perlu dibuat magnet.
Aplikasi seluler
Dalam sebuah perusahaan yang bergerak dalam proses bisnis otomatis, menggunakan solusi "analog" yang dijelaskan di atas tidak terlalu sehat. Secara alami, kami memutuskan untuk mengotomatiskan tugas menemukan perangkat yang tepat. Langkah pertama adalah menulis aplikasi seluler yang dapat menentukan dan melaporkan lokasinya di kamar melalui titik akses Wi-Fi. Sepanjang jalan, untuk kenyamanan, mereka memberi perangkat kemampuan untuk menginformasikan server tentang versi OS, dan juga menunjukkan karakteristik penting seperti pengisian baterai.
Tampaknya masalah terpecahkan. Anda melihat daftar di database di mana terakhir kali perangkat melihat Wi-Fi, Anda pergi ke sana dan ...
Dalam operasi, ternyata tidak semuanya begitu sederhana. Kami menginstal aplikasi pada perangkat uji dan bekerja dengannya selama beberapa bulan. Ternyata opsi ini nyaman, tetapi juga tidak ideal.
Perangkat kosong, matikan saja, titik akses Wi-Fi diatur ulang dari satu tempat ke tempat lain, dan geolokasi dengan sendirinya hanya mengatakan bahwa perangkat ada di kantor. Kapten terima kasih!
Anda tentu saja dapat mencoba untuk mengoptimalkan sistem yang ada, tetapi mengapa tidak menciptakannya kembali berdasarkan teknologi abad ke-21? Tidak lebih cepat dikatakan daripada dilakukan.
Betapa kami menginginkannya
Kami datang dengan konsep untuk sistem yang akan mengenali karyawan dengan wajah mereka, menguji perangkat dengan tag khusus, meminta konfirmasi perubahan dalam status perangkat, dan kemudian membuat perubahan pada database online, yang dapat dilihat oleh karyawan mana pun tanpa berdiri dari kursinya.
Pengenalan wajah
Pengenalan wajah secara keseluruhan memecahkan masalah pada 2018. Karena itu, kami tidak menemukan kembali roda dan mencoba melatih model kami sendiri, tetapi mengambil keuntungan dari solusi yang sudah jadi. Modul
FaceRecognition tampaknya menjadi pilihan yang paling nyaman itu tidak memerlukan pelatihan tambahan dan bekerja sangat cepat bahkan tanpa akselerasi pada GPU.
Menggunakan fungsi
face_locations ,
wajah terdeteksi dalam foto karyawan, dan menggunakan
face_encodings, fitur wajah karyawan tertentu diekstraksi dari mereka.
Data yang diterima dikumpulkan dalam database. Untuk menentukan karyawan tertentu menggunakan fungsi
face_distance , "perbedaan" antara pengkodean karyawan yang terdeteksi dan pengkodean dari database dipertimbangkan.
Secara umum, pada tahap ini orang bisa melangkah lebih jauh dan membuat classifier, misalnya, berdasarkan
KNN , sehingga sistem itu kurang sensitif terhadap dinamika wajah karyawan. Namun, dalam praktiknya ini membutuhkan waktu lebih lama. Ya, dan dangkal rata-rata penyandian wajah seseorang antara yang sekarang ada dalam database dan yang ditemukan sistem untuk mengubah status perangkat ternyata cukup untuk menghindari akumulasi kesalahan dalam praktik.
Kode pengenalan wajahface_locations = face_recognition.face_locations(rgb_small_frame) face_encodings = face_recognition.face_encodings(rgb_small_frame, face_locations) face_names = [] for face_encoding in face_encodings: matches = face_recognition.face_distance( known_face_encodings, face_encoding) name = "Unknown" if np.min(matches) <= 0.45: best_match_index = np.argmin(matches) name = known_face_info[str(best_match_index)]['name'] else: best_match_index = None
Pengenalan perangkat
Awalnya, muncul ide untuk menggunakan
kode QR untuk pengenalan perangkat, di mana untuk memasukkan informasi tentang perangkat secara bersamaan. Namun, untuk pengenalan kode QR yang stabil, harus dibawa sangat dekat dengan kamera, yang merepotkan.
Akibatnya, muncul ide untuk menggunakan penanda augmented reality. Mereka membawa lebih sedikit informasi, tetapi lebih dikenal secara stabil. Selama percobaan, penanda 30 milimeter dikenali oleh kamera dengan penyimpangan kecil dari vertikal (3-5 derajat) pada jarak hingga dua setengah meter.
Opsi ini sudah terlihat jauh lebih baik.
ARuco dipilih dari seluruh set
penanda augmented reality, sebagai semua alat yang diperlukan untuk bekerja dengannya hadir dalam
distribusi opencv-contrib-python .
Kode Pengakuan Token ARuco self.video_capture = cv2.VideoCapture(0) ret, frame = self.video_capture.read() gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) markers = cv2.aruco.detectMarkers(gray, self.dictionary)
Akibatnya, setiap perangkat diberi indeks numerik, yang digunakan penanda untuk indeks ini.
Apakah itu topi?
Tampaknya kita telah belajar mengenali perangkat dan wajah, pekerjaan sudah selesai. Gembar-gembor, tepuk tangan! Apa lagi yang mungkin dibutuhkan?
Faktanya, pekerjaan baru saja dimulai. Sekarang semua komponen sistem harus dibuat agar bekerja secara stabil dan cepat "dalam pertempuran".
Hal ini diperlukan untuk mengoptimalkan biaya sumber daya server dalam keadaan idle, memikirkan kasus-kasus pengguna dan memahami bagaimana seharusnya terlihat secara grafis.
Antarmuka
Mungkin titik paling penting dalam pengembangan sistem tersebut adalah antarmuka. Seseorang mungkin berdebat, tetapi pengguna adalah elemen utama dalam situasi ini.
Secepat mungkin, Anda dapat mengimplementasikan bagian front-end menggunakan
Tkinter .
Beberapa catatan tentang Tkinter Antarmuka terdiri dari kartu dengan informasi tentang perangkat dan pengguna yang saat ini menggunakan perangkat ini. Sebagian besar layar ditempati oleh katalog kartu - alat akuntansi utama. Di bagian atas terdapat filter yang dapat digunakan untuk memfilter direktori berdasarkan platform atau versi sistem operasi.

Berikut adalah komponen utama dari antarmuka:
- Perangkat
Kartu perangkat ditampilkan di layar dengan versi sistem operasi, nama dan ID perangkat, serta pengguna yang terdaftar pada perangkat ini. - Memperbaiki foto
Di sebelah kanan adalah unit kontrol, tempat gambar dari webcam ditampilkan, serta tombol untuk mendaftarkan dan mengedit informasi pribadi.
Kami menampilkan gambar untuk memberikan umpan balik kepada pengguna - Anda pasti menekan layar dengan label perangkat. - Pemilihan versi OS
Kami membuat daftar dengan pilihan versi OS yang menarik, karena sering untuk pengujian Anda tidak perlu perangkat tertentu, tetapi versi Android atau iOS tertentu. Filter versi dibuat horizontal untuk menghemat ruang dan membuat daftar versi dapat diakses tanpa menggulir, pada satu layar.
Optimasi
Satu lulus dari setiap komponen sistem tidak memerlukan terlalu banyak waktu. Namun, jika Anda mulai mengenali marker dan wajah secara bersamaan, maka upaya untuk mengenali semua 30 frame per detik yang disediakan oleh kamera akan menyebabkan habisnya sumber daya komputer tanpa GPU.
Jelas bahwa 99% dari waktu sistem akan melakukan pekerjaan ini menganggur.
Untuk menghindari ini, keputusan optimasi berikut dibuat:
- Hanya setiap frame kedelapan dimasukkan ke dalam pemrosesan.
Kode if self.lastseen + self.rec_threshold > time.time() or self.frame_number != 8: ret, frame = self.video_capture.read() self.frame_number += 1 if self.frame_number > 8: self.frame_number = 8 return frame, None, None, None
Penundaan respons sistem naik menjadi sekitar 8/30 detik, sedangkan waktu reaksi manusia adalah sekitar satu detik. Karenanya, penundaan seperti itu masih tidak akan terlihat oleh pengguna. Dan kami sudah delapan kali mengurangi beban pada sistem. - Pertama, penanda perangkat dicari dalam bingkai, dan hanya ketika terdeteksi, pengenalan wajah diluncurkan. Karena pencarian penanda dalam bingkai kira-kira 300 kali lebih murah daripada pencarian wajah, kami memutuskan bahwa dalam mode siaga, kami hanya akan memeriksa keberadaan penanda.
- Untuk mengurangi "rem" saat mencari wajah ketika tidak ada wajah dalam gambar, parameter number_of_time_to_upsample dinonaktifkan dalam fungsi face_locations.
face_locations = face_recognition.face_locations (rgb_small_frame, number_of_times_to_upsample = 0)
Karena ini, waktu pemrosesan bingkai, di mana tidak ada wajah, sama dengan waktu pemrosesan bingkai, di mana wajah mudah dideteksi.
Apa hasilnya?
Saat ini, sistem telah berhasil digunakan pada MacMini Akhir 2009, yang telah datang, pada dua Core 2 Duo core. Sebagai bagian dari pengujian, itu bekerja cukup berhasil bahkan pada satu inti virtual dengan 1024 megabita RAM dan 4 gigabita memori hanya baca dalam wadah Docker. MacMini menghubungkan layar sentuh untuk membuat tampilan minimalis.
Sekarang bahkan para pengguna yang tidak menggunakan papan lama dengan antusias dan tersenyum saat mendaftarkan perangkat pada diri mereka sendiri, dan ada jauh lebih sedikit kasus pencarian yang gagal!
Apa selanjutnya
Ada banyak poin pasti dalam sistem saat ini yang dapat dan ingin kami tingkatkan:
- Pastikan kontrol OS tidak muncul ketika kotak dialog muncul (sekarang ini adalah kotak pesan dari paket Tkinter).
- Pisahkan perhitungan dan permintaan server ke utas berbeda dengan pemrosesan antarmuka (sekarang semuanya dilakukan di utas utama, mainloop Tkinter, yang membekukan antarmuka saat mengirim permintaan ke basis data online).
- Bawa antarmuka ke desain yang sama dengan sumber daya perusahaan lainnya.
- Buat antarmuka web lengkap untuk melihat data dari jauh.
- Gunakan pengenalan suara untuk mengkonfirmasi / membatalkan tindakan dan mengisi bidang teks.
- Menerapkan pendaftaran beberapa perangkat secara bersamaan.
PS Dan begini cara kerjanya.Video direkam dalam versi beta GUI