Pengenalan wajah pada level lutut

Secara umum, pengenalan wajah dan identifikasi orang menurut hasil mereka terlihat seperti seks remaja untuk orang tua - semua orang berbicara banyak tentang dia, tetapi sedikit latihan. Jelas bahwa kita tidak lagi terkejut bahwa setelah mengunduh foto dari pertemuan ramah, Facebook / VK menyarankan menandai orang-orang yang ditemukan dalam gambar, tetapi di sini kita secara intuitif tahu bahwa jejaring sosial memiliki bantuan yang baik dalam bentuk grafik koneksi seseorang. Dan jika tidak ada grafik seperti itu? Namun, mari kita mulai secara berurutan.

Sialan bersembunyi di pintu dengan sebuah kotak

Awalnya, pengenalan wajah dan identifikasi "teman / musuh" bersama kami tumbuh dari kebutuhan domestik yang eksklusif - pecandu narkoba masuk ke pintu kolega, dan terus-menerus memantau gambar dari kamera video yang diinstal, dan bahkan membongkar di mana tetangga dan di mana orang asing itu tidak memiliki keinginan tidak

Oleh karena itu, hanya dalam waktu satu minggu, sebuah prototipe dipasang di lutut, yang terdiri dari kamera IP, perangkat papan tunggal, sensor gerak, dan pustaka pengenalan Python face_recognition. Karena pustaka python menggunakan perangkat tunggal, agak kuat ... katakanlah dengan hati-hati, tidak terlalu cepat, kami memutuskan untuk membangun proses pemrosesan sebagai berikut:
  • sensor gerak menentukan apakah ada gerakan di area ruang yang dipercayakan padanya dan memberi sinyal keberadaannya;
  • layanan tertulis berdasarkan gstreamer, yang secara konstan menerima aliran dari kamera IP, memotong 5 detik sebelum dan 10 detik setelah deteksi dan memasukkannya ke perpustakaan pengenalan untuk dianalisis;
  • dia, pada gilirannya, menonton video, menemukan wajah-wajah di sana, membandingkannya dengan sampel yang diketahui, dan jika tidak diketahui ditemukan, mengirimkan video ke saluran Telegram, kemudian itu seharusnya dikontrol di tempat yang sama untuk segera memotong positif palsu - misalnya, ketika seorang tetangga beralih ke kamera di sisi yang salah pada sampel.

Seluruh proses direkatkan bersama oleh Erlang kita tercinta, dan dalam proses pengujian terhadap rekan-rekannya dia membuktikan kapasitas kerjanya yang minimal.

Namun, model yang dirakit tidak menemukan aplikasi dalam kehidupan nyata - bukan karena ketidaksempurnaan teknisnya, yang tidak diragukan lagi - seperti yang ditunjukkan oleh pengalaman, yang dikumpulkan di atas lutut dalam kondisi kantor rumah kaca memiliki kecenderungan yang sangat buruk untuk pecah di lapangan, dan pada saat demonstrasi kepada pelanggan , dan karena organisasi, penghuni pintu masuk menolak sebagian besar pengawasan video.

Proyek berjalan di rak dan secara berkala menyodok dengan tongkat untuk demonstrasi selama penjualan dan keinginan untuk bereinkarnasi dalam rumah tangga pribadi.

Semuanya telah berubah sejak saat kami memiliki proyek yang lebih spesifik dan cukup komersial pada topik yang sama. Karena tidak mungkin untuk memotong sudut di dalamnya menggunakan sensor gerak langsung dari pernyataan masalah, saya harus mempelajari lebih dalam nuansa mencari dan mengenali wajah dalam tiga kepala (oke, dua setengah, jika Anda menghitung milik saya) langsung di sungai. Dan kemudian sebuah wahyu terjadi.

Masalahnya adalah bahwa sebagian besar temuan pada masalah ini adalah sketsa akademis murni pada tema bahwa "Saya harus menulis artikel di majalah tentang topik modis dan mendapatkan tanda centang untuk penerbitan." Saya tidak mengurangi manfaat para ilmuwan - di antara makalah yang saya temukan ada banyak yang berguna dan menarik, tetapi, sayangnya, saya harus mengakui bahwa reproduktifitas pekerjaan kode mereka yang dipasang pada daun Github sangat diinginkan atau terlihat seperti usaha yang meragukan dengan waktu yang terbuang pada akhirnya.

Banyak kerangka kerja untuk jaringan saraf dan pembelajaran mesin sering sulit untuk diangkat - pengenalan wajah adalah tugas sempit yang terpisah untuk mereka, tidak menarik dalam berbagai masalah yang mereka pecahkan. Dengan kata lain, untuk mengambil contoh yang sudah jadi dan menjalankannya pada perangkat keras target hanya untuk memeriksa cara kerjanya dan apakah itu bekerja, tidak berhasil. Itu bukan contoh, maka kebutuhan untuk mendapatkannya menyarankan pencarian asam dari perakitan perpustakaan tertentu dari versi tertentu untuk OS yang didefinisikan secara ketat. Yaitu untuk mengambil dan terbang saat bepergian - secara harfiah remah seperti face_recognition yang disebutkan sebelumnya, yang kami gunakan untuk kerajinan sebelumnya.

Perusahaan besar, seperti biasa, menyelamatkan kita. Baik Intel dan Nvidia telah lama merasakan momentum yang berkembang dan daya tarik komersial dari kelas tugas ini, tetapi sebagai pemasok peralatan di tempat pertama, mereka mendistribusikan kerangka kerja mereka untuk memecahkan masalah aplikasi spesifik secara gratis.

Proyek kami lebih cenderung bukan penelitian, tetapi bersifat eksperimental, jadi kami tidak menganalisis dan membandingkan solusi dari masing-masing vendor, tetapi hanya mengambil yang pertama dengan tujuan mengumpulkan prototipe yang sudah jadi dan mengujinya dalam pertempuran, sambil menerima respons secepat mungkin. Oleh karena itu, pilihannya sangat cepat jatuh pada Intel OpenVINO - sebuah perpustakaan untuk aplikasi praktis pembelajaran mesin dalam tugas-tugas terapan.

Untuk memulai, kami menyusun dudukan, yang secara tradisional merupakan seperangkat nettop dengan prosesor Intel Core i3 dan kamera IP dari vendor Cina di pasar. Kamera terhubung langsung ke nettop dan memberinya aliran RTSP dengan FPS yang tidak terlalu besar, berdasarkan pada asumsi bahwa orang masih tidak akan berlari di depannya seperti di kompetisi. Kecepatan pemrosesan satu frame (pencarian dan pengenalan wajah) berfluktuasi di wilayah puluhan hingga ratusan milidetik, yang cukup memadai untuk menanamkan mekanisme pencarian untuk orang yang menggunakan sampel yang ada. Selain itu, kami juga memiliki rencana cadangan - Intel memiliki coprocessor khusus untuk mempercepat perhitungan jaringan saraf Neural Compute Stick 2 , yang dapat kami gunakan jika kami tidak memiliki prosesor untuk keperluan umum. Tetapi - sejauh ini tidak ada yang terjadi.

Setelah menyelesaikan perakitan dan memverifikasi fungsionalitas dari contoh dasar - fitur khas dari Intel SDK berada pada langkah-demi-langkah dan contoh panduan yang sangat rinci - kami mulai membangun perangkat lunak.

Tugas utama yang kami hadapi adalah mencari seseorang di bidang pandang kamera, identifikasi dan pemberitahuan kehadirannya tepat waktu. Karenanya, selain mengenali wajah dan membandingkannya dengan pola (bagaimana melakukan ini, pada waktu itu, mengajukan pertanyaan tidak kurang dari yang lainnya), kami perlu menyediakan hal-hal sekunder dari rencana antarmuka. Yaitu, kita harus menerima bingkai dengan wajah orang-orang yang diperlukan dari kamera yang sama untuk identifikasi selanjutnya. Mengapa, dari kamera yang sama, saya pikir itu juga cukup jelas - titik pemasangan kamera pada objek dan optik lensa memperkenalkan distorsi tertentu, yang, mungkin, dapat mempengaruhi kualitas pengakuan, kami menggunakan sumber data sumber yang berbeda dari alat pelacak.

Yaitu Selain stream handler itu sendiri, kita memerlukan setidaknya arsip video dan penganalisa file video yang akan mengisolasi semua wajah yang terdeteksi dari rekaman dan menyimpan yang paling cocok sebagai referensi.

Seperti biasa, kami menggunakan Erlang dan PostgreSQL yang dikenal sebagai lem antara ffmpeg, aplikasi pada OpenVINO dan Telegram Bot API untuk peringatan. Selain itu, kami membutuhkan web-UI untuk menyediakan serangkaian prosedur minimum untuk mengelola kompleks, yang diunggah oleh rekan kami di VueJS.

Logika kerja adalah sebagai berikut:
  • di bawah kendali pesawat kontrol (di Erlang) ffmpeg menulis aliran dari kamera ke video dalam bagian lima menit, proses terpisah memastikan bahwa catatan disimpan dalam volume yang ditentukan secara ketat dan membersihkan yang tertua ketika ambang ini tercapai;
  • melalui web-UI Anda dapat melihat catatan apa pun, mereka diatur dalam urutan kronologis, yang, meskipun bukan tanpa kesulitan, memungkinkan Anda untuk mengisolasi fragmen yang diinginkan dan mengirimkannya untuk diproses;
  • pemrosesan terdiri dalam menganalisis video dan mengekstraksi frame dengan wajah yang terdeteksi, itu hanya perangkat lunak berbasis OpenVINO (harus saya katakan, di sini kami berhasil memotong sedikit sudut - perangkat lunak untuk menganalisis aliran dan menganalisis file hampir identik, itulah sebabnya sebagian besar dari itu digunakan untuk perpustakaan bersama, dan utilitas itu sendiri hanya berbeda dalam rantai pemrosesan a la modular gstreamer). Pemrosesan terjadi pada video, mengisolasi wajah yang ditemukan menggunakan jaringan saraf yang terlatih khusus. Fragmen yang dihasilkan dari bingkai yang berisi wajah jatuh ke jaringan saraf lain, yang membentuk vektor 256-elemen, yang, pada kenyataannya, adalah koordinat titik referensi wajah seseorang. Vektor ini, bingkai yang terdeteksi, dan koordinat persegi panjang dari wajah yang ditemukan disimpan dalam database;
  • selanjutnya, setelah pemrosesan selesai, operator membuka berbagai bingkai yang ditarik, ngeri dengan jumlah mereka dan hasil untuk mencari orang-orang target. Sampel yang dipilih dapat ditambahkan ke orang yang sudah ada atau membuat yang baru. Setelah pemrosesan tugas selesai, hasil analisis dihapus, dengan pengecualian vektor yang disimpan dipetakan ke catatan yang dapat diobservasi;
  • karenanya, kita dapat melihat kedua frame dan vektor deteksi kapan saja dan mengedit, menghapus sampel yang tidak berhasil;
  • sejajar dengan siklus deteksi di latar belakang, layanan analisis aliran selalu berfungsi, yang melakukan hal yang sama, tetapi dengan aliran dari kamera. Dia memilih wajah dalam aliran yang diamati dan membandingkannya dengan sampel dari database, yang didasarkan pada asumsi sederhana bahwa vektor satu orang akan lebih dekat satu sama lain daripada semua vektor lainnya. Perhitungan berpasangan jarak antara vektor terjadi, ketika ambang tercapai, catatan deteksi dan bingkai dimasukkan ke dalam basis data. Selain itu, seseorang ditambahkan ke daftar berhenti dalam waktu dekat, yang menghindari beberapa notifikasi tentang orang yang sama;
  • pesawat kontrol secara berkala memeriksa log deteksi dan, jika ada entri baru, memberi tahu dengan pesan dengan foto terlampir dan menyorot wajah melalui bot kepada mereka yang diizinkan sesuai dengan pengaturan.


Itu terlihat seperti ini:

Jadi kita bisa melihat ke dalam arsip
Lihat arsip

Dan - menyodok mug yang menyala di video
Hasil Analisis Video

Dan ini mereka, orang-orang ini!
Daftar kepribadian yang diamati

Solusi yang dihasilkan dalam banyak hal kontroversial dan kadang-kadang bahkan tidak optimal baik dalam hal produktivitas maupun dalam hal mengurangi waktu reaksi. Tetapi, saya ulangi, kami tidak memiliki tujuan untuk mendapatkan sistem yang efektif segera, tetapi hanya untuk pergi rute ini dan mengisi jumlah maksimum kerucut, mengidentifikasi jalur sempit dan potensi masalah yang tidak jelas.

Sistem rakitan diuji dalam kondisi kantor rumah kaca selama seminggu. Selama waktu ini, pengamatan berikut dicatat:
  • ada ketergantungan yang jelas dari kualitas pengakuan pada kualitas sampel asli. Jika orang yang diamati melewati zona pengamatan terlalu cepat, maka dengan tingkat probabilitas tinggi dia tidak akan meninggalkan data untuk pengambilan sampel dan tidak akan dikenali. Namun, saya pikir ini adalah masalah fine-tuning sistem, termasuk pencahayaan dan parameter aliran video;
  • karena sistem beroperasi dengan pengenalan elemen-elemen wajah (mata, hidung, mulut, alis, dll.), mudah untuk menipu dengan menempatkan penghalang visual antara wajah dan kamera (rambut, kacamata hitam, mengenakan kerudung, dll.) - wajah, kemungkinan besar, itu akan ditemukan, tetapi perbandingan dengan sampel tidak akan berfungsi karena perbedaan yang kuat antara vektor deteksi dan sampel;
  • kacamata biasa tidak terlalu memengaruhi - kami memiliki contoh respons positif pada orang dengan kacamata dan respons negatif palsu pada orang yang mengenakan kacamata untuk pengujian;
  • jika jenggot ada pada sampel asli, dan kemudian hilang, maka jumlah operasi berkurang (penulis garis-garis ini memotong jenggotnya menjadi 2 mm dan jumlah operasi pada itu dikurangi setengahnya);
  • false positive juga terjadi, ini adalah kesempatan untuk pencelupan lebih lanjut dalam matematika masalah ini dan, mungkin, solusi untuk masalah korespondensi parsial vektor dan metode optimal untuk menghitung jarak di antara mereka. Namun, pengujian lapangan harus mengungkapkan lebih banyak masalah dalam hal ini.

Apa yang akan datang? Memeriksa sistem dalam pertempuran, mengoptimalkan siklus pemrosesan deteksi, menyederhanakan prosedur untuk mencari peristiwa dalam arsip video, menambahkan lebih banyak data ke analisis (usia, jenis kelamin, emosi) dan 100.500 tugas kecil dan tidak-begitu yang masih harus dilakukan. Tapi langkah pertama di jalur seribu langkah sudah kita ambil. Jika ada yang berbagi pengalaman mereka dalam memecahkan masalah seperti itu atau memberikan tautan menarik tentang masalah ini - saya akan sangat berterima kasih.

Source: https://habr.com/ru/post/id465145/


All Articles