
Hari ini saya akan memberi tahu Anda bagaimana kami membuat sistem kontrol akses di kantor berdasarkan layanan pengenalan wajah
Vision . Pertama, sedikit latar belakang. Seperti dalam layanan email apa pun, kami telah menciptakan sistem anti-spam. Sistem seperti itu sekarang dibuat berdasarkan pembelajaran mesin, kami memiliki tim yang kuat yang bertanggung jawab atasnya. Dan di mana ada pembelajaran mesin, ada visi komputer. Oleh karena itu, layanan Visi muncul secara alami dan alami.
Sejalan dengan ini, beberapa tahun yang lalu kami meluncurkan Cloud, penyimpanan file yang andal dengan geo-distribusi ke pusat data, yang dapat digunakan oleh individu dan perusahaan. Seiring waktu, kami mendapat "Cloud for Business", yang tidak hanya menyimpan file, tetapi juga memungkinkan Anda memesan mesin virtual. Secara bertahap, ini berubah menjadi MCS - Mail.ru Cloud Solutions, di mana Visi secara organik cocok menjadi salah satu layanan.
Cloud
Jaringan saraf kami mampu mengenali tidak hanya wajah, tetapi juga berbagai
objek, objek, dan pemandangan , termasuk
pemandangan . Sekarang mereka dapat mengenali sekitar 10 ribu kategori, dan penglihatan mesin terkadang bekerja lebih baik daripada manusia.

Ini adalah putri saya pada 2012, pada 2015 dan 2018. Jika saya tidak mengenalnya secara pribadi, saya mungkin tidak segera mengerti bahwa ini adalah orang yang sama. Dan jaringan saraf mampu mencocokkan dan memahami.

Di sini gadis itu berbalik dan menyipit, dan bocah itu pada umumnya mengenakan topi dengan bayangan di separuh wajahnya. Tetapi pada saat yang sama, jaringan saraf secara akurat mengenali mereka, bahkan meskipun dalam kondisi yang sulit. Secara alami, teknologi yang berkembang di dalam perusahaan tidak dapat membantu tetapi menemukan dukungan dalam layanan internal.
Intranet kita
Intranet kita disebut sys. Ini adalah semacam jejaring sosial (kami memiliki beberapa di antaranya). Di dalamnya, karyawan mengunggah foto dari berbagai acara.

Ketika beberapa ratus foto diletakkan dari acara tersebut, cukup sulit untuk menemukan diri Anda di sana. Oleh karena itu, kami memiliki visi mesin yang terhubung ke album-album ini, yang berada tepat di intranet, di satu tempat, menunjukkan foto-foto tempat saya digambarkan. Di sini sistem melihat saya di salah satu pesta perusahaan musim panas.

Jaringan saraf mengenali saya bahkan di senja dalam profil, dan ada lebih banyak orang di foto.
Rak Konferensi
Kemudian kami membuat rak konferensi. Saya menulis perangkat lunak untuk iPad, yang dipasang di dalam rak, tetapi secara umum saya adalah pengembang iOS dan tidak ada hubungannya dengan visi komputer, saya hanya membantu dengan cara yang ramah.

Apa esensi dari rak ini? Sepanjang acara - pertemuan, konferensi, pesta perusahaan, atau setidaknya ulang tahun - Anda difoto oleh seorang fotografer. Dari waktu ke waktu, ini menjatuhkan akumulasi gambar ke dalam Cloud. Anda dapat pergi ke konter kapan saja, mengambil gambar dan mengklik tombol โTemukan Sayaโ. Dan rak akan segera menampilkan semua foto yang Anda ambil, atau mengatakan bahwa tidak ada yang ditemukan sejauh ini, jika sistem belum berhasil mengindeks gambar, dan meminta Anda untuk memasukkan email. Dan setelah acara tersebut, Anda akan menerima tautan melalui pos ke folder di Cloud dengan semua foto tempat Anda berada. Ini adalah salah satu aplikasi layanan Vision.
Sistem akses
Secara alami, saya ingin menggunakan kemampuan pengenalan wajah seperti itu tidak hanya untuk mencari fisiognomi saya dalam gambar perusahaan, tetapi juga untuk sesuatu yang lebih praktis. Misalnya, untuk sistem throughput otomatis. Menerapkan izin masuk di setiap pintu masuk ke lantai Anda tidak mudah: Anda sering lupa izin, dan untuk anak perempuan dengan pakaian ringan di musim panas tidak ada tempat untuk memperbaiki pas.
Karena itu, kami memutuskan untuk bereksperimen. Kami memiliki semua persyaratan untuk ini: kami tidak perlu meminta izin kepada siapa pun, departemen administrasi yang sangat responsif, yang berkata sambil mendesah: "Oke. Pasang kamera Anda. Hanya saja tidak di pintu. Pintu berhubungan dengan keamanan kebakaran. โ Kami adalah: โBaiklah. Kami akan menempel di samping. " Kami juga memiliki kolega yang sabar, mereka menderita dari kami.
Arsitektur
Sekilas, arsitektur sistem akses tampak sangat sederhana: kamera mengambil gambar, mengirimkannya ke Vision, dan Vision membuka pintu. Tetapi ketika kami mulai melukis dengan rekan-rekan bagaimana sebenarnya melakukan ini, maka kami mendapat skema seperti itu:

Blok di sebelah kanan kita sebut "kamera" - ini adalah modul yang menggantung di pintu. Ini terdiri dari tiga bagian. Raspberry Pi menerima video dari kamera USB, mengkodekan dengan FFmpeg, dan mengirim. Kami menguji beberapa kamera IP dari kisaran harga yang wajar, dan semua orang memiliki penundaan sekitar 0,5 detik. Dan karena kita memiliki keterlambatan pada tahap lain, ketika seseorang muncul, melihat ke kamera dan selama beberapa detik tidak ada yang terjadi, dia sudah ingin membuat umpan. Oleh karena itu, kami mengurangi penundaan sedapat mungkin, dan Raspberry Pi dengan kamera USB ternyata lebih cepat daripada banyak kamera IP komersial. Juga terhubung ke Raspberry adalah Arduino kecil dengan LED multi-warna dan alat pengadu. LED standar berwarna merah. Ketika seseorang muncul dan dikenali, lampu hijau menyala.
Jadi, Raspberry Pi mentransmisikan aliran video, yang melalui Ethernet berkabel memasuki server. Kami memiliki ruang server di setiap lantai, di mana terdapat sakelar, kabel penghubung ke meja karyawan, dan sistem kontrol akses penuh waktu - sistem kontrol akses dan manajemen.
Kami menempatkan Raspberry Pi lain di ruang server, yang menerima streaming video secara real time dan menjalankannya melalui OpenCV. Mengapa kita membutuhkan OpenCV? Kita perlu menentukan apakah ada wajah dalam gambar. Jaringan saraf yang mendefinisikan seseorang dalam sebuah foto bekerja sedikit lebih lama, dan terlalu mahal untuk memberi makan aliran video secara konstan. Oleh karena itu, melalui OpenCV, kami menentukan keberadaan wajah, dan jika itu muncul, maka kami mengirimkannya ke Vision. Layanan tersebut menjawab bahwa ia tidak menemukan karyawan ini, atau mengirimkan pengidentifikasi karyawan di basis data SDM. Dengan pengidentifikasi karyawan ini, kami pergi ke intranet yang dikaitkan dengan ACS, dan mengembalikan kami pengenal pass. Selanjutnya kami membuang pengenal pass ini di Arduino, yang meneruskannya ke ACS. Untuk sistem kontrol akses, ini setara dengan orang yang menerapkan izin. Artinya, kami tidak mengubah ACS dengan cara apa pun, itu masih mencatat masuk dan keluar dari karyawan.
Bagaimana kami mengintegrasikan sistem kami dengan ACS? Di kantor kami, perangkat Bolid C2000-2 digunakan.

Ini adalah sistem kontrol akses domestik. Kemungkinan besar, Anda dapat terhubung ke perangkat ini melalui antarmuka ke-485, tetapi kami terhubung melalui protokol Wiegand.

Kami menghubungkan Arduino, yang bertindak sebagai proksi, ke pembaca pas yang dipasang di dekat pintu.

Foto menunjukkan koneksi daya dan dua jalur data dari pembaca kartu pass. Pad digunakan untuk koneksi yang lebih nyaman.
Arduino menerima nomor pass baik dari pembaca atau dari Raspberry Pi via USB, dan memberikannya ke ACS. ACS bahkan tidak tahu dari mana nomor pass itu berasal.
Wiegand
Ini adalah protokol standar untuk sistem kontrol akses, didukung oleh sebagian besar pembaca. Protokolnya sangat sederhana: dua jalur data, satu garis nol dan satu garis unit. Segera setelah Anda menghubungkan garis nol ke tanah, pembaca memahami bahwa nol ditransmisikan, sama dengan satuan. Artinya, protokol tidak memiliki timing standar, dan nomor loncatan mudah dibaca melalui interupsi pada Arduino, mudah untuk mewakili sebagai urutan data. Dan karena perekaman membutuhkan semacam pengaturan waktu, saya fokus pada nilai-nilai ini:

Sudah ada perpustakaan yang siap pakai untuk Arduino. Dia dapat membaca berbagai format Wiegand, tetapi kemampuannya terbatas untuk ini. Dan saya masih harus mengirim. Oleh karena itu, saya menulis perpustakaan saya, yang hanya berfungsi dengan format Wiegand-26. 26 adalah jumlah bit: 3 byte dari nomor lewati dan 2 bit paritas. Selain itu, dalam semua dokumentasi dan artikel tertulis bahwa, kemungkinan besar, pengontrol modern Anda akan mengabaikan bit paritas, jadi saya malas dan tidak menghitungnya, tetapi selalu mengirim nol. ACS merasakan ini secara normal.
Kami memiliki masalah lain: jika seseorang pertama kali muncul di depan kamera, dan kemudian, tanpa menunggu operasi, menerapkan pass, maka situasi balapan muncul: pada saat yang sama nomor pass datang dari pembaca dan dari pengakuan. ACS tidak bisa mengatasi ini dan tidak membiarkan orang masuk Oleh karena itu, saya harus menambahkan buffer cincin dengan 4 kode ke perpustakaan. Tidak peduli dari mana kode berasal, mereka ditempatkan di buffer, dan kemudian dengan batas waktu 0,5 detik ditransmisikan ke ACS. Sejak itu, kolega telah berhenti mengeluh bahwa mereka tidak diizinkan.
Test stand

Prototipe pertama dirakit dari sesuatu yang mengerikan. Raspberry Pi digantung di sebuah kotak di rak konyol, dan sebuah kamera terpaku di atas selotip dua sisi. Arduino menggantung di screed samping. Secara umum, semua yang kita sukai sangat DIY.
Tentu saja, dalam bentuk ini tidak mungkin untuk pergi, itu perlu diatur dengan indah. Kami berbicara dengan beberapa kontraktor, mereka berjanji untuk memesan sampel di Cina, tetapi kemudian semua tenggat waktu yang disepakati berlalu, dan tidak ada yang menawari kami apa pun.
Produk kustom memiliki satu masalah - semua solusi sangat khusus, mereka akan dibuat khusus untuk kami. Pertama, kita menjadi tergantung pada pemasok. Kedua, ternyata desain sirkuit yang unik dengan sirkulasi kecil, yang berarti biaya satu potong akan tinggi. Ketiga, waktu produksi cukup lama, dan jika salinan gagal, kami tidak akan dapat dengan cepat membeli pengganti di toko, kami harus menunggu proses pencetakan berikutnya, dan jika kami segera melakukannya, sisa salinan akan ditaburkan di gudang.
Setelah semua mitra potensial mengecewakan kami, saya pergi ke seorang rekan dari Vision dan berkata: "Volodya, biarkan saya mencetak kasing pada printer 3D Anda untuk membuatnya terlihat cantik." Dia menghela nafas dan berkata, โAyo. Apa yang harus dilakukan? "
Kamera V 1

Di Fusion, saya menggambar monster Frankenstein. Di sudut seharusnya Raspberry Pi dengan input untuk kabel Ethernet. Pintu masuk samping untuk daya. "Lantai dua" adalah kamera. Hasilnya adalah struktur besar, dan saya bahkan mencetaknya dengan lapisan tipis agar tidak menghabiskan banyak plastik. Itu tampak mengerikan, dan menggantungnya bahkan lebih memalukan.

Selain itu, seorang kolega mengirimi saya referensi seperti itu, kata mereka, kami akan menyukainya. Saya menjawab bahwa saya tidak bisa melakukan ini, tetapi memutuskan untuk merancang bangunan lain.

Kasing baru berdiameter 11 cm, lebih kecil dari CD. Penempatan pengisian juga dua lapis. Setelah mencetak versi pertama, saya menyadari bahwa tidak masuk akal untuk menempatkan kamera-USB sepenuhnya dalam casing aslinya. Saya membongkar dengan hati-hati, dan ternyata ada 4 lubang pendaratan di panel depan. Saya menggabungkan panel ini dengan kamera menjadi rakitan umum dengan tweeter dan LED.

Pertama, kami mencoba membuat mencicit di Raspberry Pi via gpio. Ternyata sangat buruk. Oleh karena itu, kami memutuskan untuk mengambil fungsi ini secara terpisah dari Raspberry Pi dengan menghubungkan arduino kecil (sebenarnya Iskra mini), di mana alat squeaker dan LED disolder, melalui TTL langsung ke blok.
Seperti inilah pertempurannya:
Kami menggantung perangkat di lantai. Dalam bentuk ini, ia hidup cukup lama. Berderit, bercahaya indah, membuka pintu, tidak selalu. Namun, kolega mengeluh bahwa LED terlalu terang. Saya harus melemahkannya 4 kali.
Kamera V 2
Kemudian mereka membuat opsi ini:

Itu terinspirasi oleh desain hub Xiaomi, dengan cincin bercahaya di sekelilingnya. Terlihat sangat indah. Logo Visi dibuat oleh masing-masing bagian yang dicetak dalam plastik warna berbeda. Berikut modelnya:


Kali ini saya meletakkan squeaker di dinding belakang, memasang LED di cincin transparan di sekeliling, dicetak dari PLA transparan. Dekorasi segera runtuh di dalam, karena pada awalnya hanya disisipkan pada gesekan, dan saya harus meletakkannya di lem.
Masalah kamera
Kami memiliki ide untuk meniru keputusan ini di seluruh gedung. Tetapi ada masalah: hampir semua lantai memiliki dua pintu, dan masing-masing harus memiliki dua kamera, hanya 96 kamera untuk hanya satu menara kami, dan sekarang yang kedua sedang dikembangkan secara aktif. Mencetak begitu banyak kasing mungkin, tetapi sudah terasa rumit. Selain itu, kami memiliki beberapa komponen dalam perangkat, yang berarti banyak titik kegagalan. Jika kami skala solusi untuk seluruh gedung, kami akan terus memelihara kamera ini. Sekali lagi, kerumitan penggantian cepat, karena setiap kamera adalah perangkat bagian. Dan Anda perlu mencetak banyak dari mereka, dengan margin, atau, jika sesuatu terjadi, maka segera jalankan, cetak dan kumpulkan yang baru. Kami menyadari bahwa solusi DIY itu keren, tetapi Anda membutuhkan sesuatu yang lebih nyaman dalam replikasi. Dan muncul ide untuk mentransfer segalanya ke iPad.
IPad
IPad memiliki beberapa keunggulan. Yang pertama adalah layar. Kolega mengeluh tentang kurangnya umpan balik, mereka cocok dan tidak mengerti apakah pengakuan telah dimulai atau belum, menunggu mereka atau tidak menunggu.
Kedua, iOS memiliki fitur pengenalan wajah bawaan. Fungsi yang dilakukan OpenCV diteruskan ke iPad. Sebuah bingkai ditampilkan di layar, dan orang tersebut harus sejauh itu sehingga wajah cocok dengan bingkai ini. Setelah itu, sistem mulai mengenalinya secara otomatis, Anda tidak perlu menekan apa pun.
Ketiga, iPad adalah produk massal. Jika gagal, kami menetapkan yang lain. Meskipun tablet itu sendiri berharga sekitar 20 ribu rubel, masih lebih murah daripada kamera khusus yang ditawarkan mitra. Selain itu, lebih cepat dan lebih dapat diandalkan.
Arsitektur baru

iPad mengambil alih sebagian besar fitur. Pada Raspberry Pi, yang ada di ruang server, sebenarnya hanya ada host HTTP yang menerima permintaan GET dengan pass ID. Dia segera proksi kode dalam Arduino, dan dia proksi dalam ACS.
Pada versi pertama, Raspberry Pi sangat dimuat, karena OpenCV terus-menerus mengerjakannya. Tidak mungkin lagi menghubungkan kamera kedua ke sana, tidak akan ada daya komputasi yang cukup. Kami sudah berpikir tentang meletakkan komputer yang jujur โโdi sana, yang akan mengurai 4 utas dari dua pintu. Tapi itu tidak terjadi. Sekarang pencarian wajah pada gambar dilakukan secara independen di setiap iPad. Di kayu salib, ada dua Arduino, satu untuk setiap pintu. Kedua papan bekerja dengan masuk dan keluar melewati. Mengapa penting untuk bekerja dengan entri masuk dan keluar? Pertama, ketika wajah dikenali dan pintu terbuka, lampu hijau pada pembaca kartu menyala, dan rekan kerja memahami bahwa Anda bisa keluar. Kedua, ACS mencatat input dan output. Dengan meniru input dan output secara terpisah, kami tidak memutus skema operasi ACS.
Secara alami, para desainer menyatukan diri mereka sendiri yang membuat kami memiliki antarmuka yang indah. Begini tampilannya di salah satu lantai kantor kami:

Bekerja dengan Visi
Terlepas dari kenyataan bahwa MCS adalah produk bisnis, para amatir juga dapat menggunakannya. Layanan ini menawarkan setiap orang 5 ribu transaksi gratis per bulan, yaitu 166 per hari. Oleh karena itu, Anda dapat mengajukan permohonan untuk kebutuhan domestik Anda, jika Anda memenuhi batas, tentu saja. Bagaimana ini bisa dilakukan?
python examples/python/smarty.py \ -u "https://smarty.mail.ru/api/v1/persons/recognize ?oauth_provider=mcs&oauth_token=e50b000614a371ce 99c01a80a4558d8ed93b313737363830" \ -p friends1.jpg \ --meta '{"space":"1", "create_new":true}' \ -v
Ambil foto dan kirimkan ke Visi bersama dengan token akses kami. Kami mengindikasikan bahwa kami sedang bekerja dengan ruang pertama dan mengatur
create_new
- maka sistem akan membuat pengidentifikasi baru untuk setiap orang yang tidak dikenal. Inilah yang kami dapatkan sebagai tanggapan:
{ "status":200, "body":{ "objects": [ { "status":0, "name":"file_0", "persons":[ {"tag":"person1","coord":[102,30,184,134],"confidence":0.99999,"awesomeness":0.5025}, {"tag":"person2","coord":[393,74,461,166],"confidence":0.99987,"awesomeness":0.548}, {"tag":"person3","coord":[458,48,535,149],"confidence":0.99976,"awesomeness":0.4766}, {"tag":"person4","coord":[273,45,352,147],"confidence":0.99963,"awesomeness":0.504}, {"tag":"person5","coord":[525,81,600,184],"confidence":0.99954,"awesomeness":0.4849}, {"tag":"person6","coord":[194,76,258,167],"confidence":0.9984,"awesomeness":0.5725} ] } ], "aliases_changed":false }, "htmlencoded":false, "last_modified":0 }
Saya memformat JSON sedikit. Responsnya berisi pengidentifikasi orang tersebut, koordinat wajah dalam foto dan dua parameter: seberapa baik wajah dikenali dan seberapa banyak orang ini cocok dengan standar. Anda dapat mengirim permintaan POST dengan gambar dalam bahasa pemrograman Anda, dapatkan JSON, dan uraikan responsnya.
Jika Anda memiliki tanda silang yang besar, dan Anda hanya perlu menentukan selusin orang, Anda dapat mengaturnya secara manual. Kemudian sistem akan memberikan pengidentifikasi untuk orang yang akrab, dan tidak terdefinisi untuk orang yang tidak dikenal. Orang-orang juga dapat dihapus secara selektif, misalnya, jika seorang karyawan berhenti.
Gagasan
Di proyek mana Anda bisa menggunakan pengenalan wajah? Jika Anda ingin menerapkan sistem bandwidth, Anda harus khawatir tentang anti-spoofing. Misalnya, menambahkan kamera inframerah untuk menentukan apakah itu foto atau orang yang hidup. Atau menempatkan dua kamera untuk menentukan kedalaman objek, ini bisa dilakukan menggunakan OpenCV.
Anda dapat mengatur pengakuan orang di pintu masuk. Jika ini tetangga Anda, maka semuanya sudah beres, dan jika seseorang adalah orang luar, Anda dapat mengirimkan lansiran kepada diri sendiri. Kami memiliki masalah seperti itu di rumah kami, orang-orang asing datang dan meninggalkan banyak sampah setelah pendaratan.
Jika Anda membuat "cermin pintar", maka Anda dapat melengkapinya dengan pengakuan anggota keluarga, sehingga semua orang dapat menunjukkan apa yang menarik baginya. Katakanlah, cermin akan menunjukkan kepada saya jadwal pertemuan hari ini, dan dengan putri saya dia akan menyapa saya dengan riang dan menawarkan untuk menyikat gigi, dan tidak secepat, seperti biasa, tetapi dua menit.
Gagasan lain adalah pengakuan plat nomor oleh gerbang otomatis di negara itu. Agar tidak keluar atau menekan tombol fob, Anda dapat menempatkan kamera yang akan menghapus nomor Anda, dan gerbang akan terbuka secara otomatis.