Bagaimana kami menggunakan algoritma visi komputer: pemrosesan video di browser seluler menggunakan OpenCV.js

Sudah ada semua kemungkinan untuk mengidentifikasi seseorang secara online, tetapi sejauh ini mereka jarang digunakan. Mungkin kami adalah salah satu yang pertama menerapkan skenario optimal untuk pengguna - masuk ke situs dari smartphone, ambil foto SIM atau paspor Anda dan kirim data ke sistem.

Mari kita pertimbangkan bagaimana algoritma visi komputer membantu mengenali dokumen dalam aliran video langsung di peramban seluler. Pada artikel ini, kami membagikan pengalaman kami tentang bagaimana kami menggunakan OpenCV.js untuk ini di SimbirSoft, kesulitan apa yang mungkin terjadi, bagaimana memastikan kecepatan dan mendapatkan UX "mulus" tanpa melambat.




Apa tugasnya?


Skenario bisnis untuk algoritma yang dikembangkan adalah sebagai berikut. Pengguna yang mengakses situs dari ponsel harus dapat memotret dokumennya dan mengirimkannya ke sistem untuk diproses lebih lanjut. Ini mungkin menjadi bagian dari proses identitas saat melamar penggunaan layanan apa pun.

Aplikasi web dalam skenario ini lebih disukai daripada aplikasi seluler karena ketersediaannya dan berkurangnya waktu untuk menyelesaikan operasi. Halaman web tidak perlu instalasi dan siap untuk bekerja segera setelah memuat. Pengguna dapat melanjutkan untuk melakukan tindakan yang diperlukan - mengirimkan aplikasi - segera setelah menerima tautan, tanpa terganggu oleh tindakan tambahan. Dari perspektif bisnis, faktor-faktor ini meningkatkan konversi dan efektivitas komersial dari proses tersebut.

Dari sudut pandang arsitektur, algoritma diperlukan untuk secara langsung mendeteksi batas-batas dokumen dan memotong latar belakang berlebih pada gambar. Verifikasi identitas, otentikasi dan pemeriksaan penipuan akan dilaksanakan oleh komponen lain. Namun, disarankan untuk melakukan setidaknya pemeriksaan minimal untuk mengecualikan pengiriman kartu nama, persegi panjang kertas kosong dan gambar lain yang jelas tidak relevan untuk memproses gambar.

Persyaratan


Sebagai bagian dari proyek kami, ada persyaratan tambahan berikut untuk algoritme:

  • kemampuan untuk bekerja secara real time: aliran video dari kamera tidak boleh "melambat" selama pengoperasian algoritma;
  • kemampuan untuk bekerja dalam berbagai kontras dan tekstur latar belakang: kontras rendah dan kontras, latar belakang homogen dan heterogen;
  • Dukungan untuk berbagai model ponsel cerdas, termasuk model anggaran yang dirilis beberapa tahun lalu.

Akhirnya, tidak ada dataset untuk pelatihan algoritma pembelajaran mesin di proyek, dan tidak ada cara untuk mengumpulkan dan menandainya. Kami hanya memiliki beberapa sampel uji dari hasil pencarian Google.

Mengingat pernyataan masalah ini, kami memutuskan untuk mengembangkan berdasarkan algoritma visi komputer klasik dari pustaka opencv. Kemungkinan alternatif adalah penggunaan algoritma pembelajaran mesin dan jaringan saraf, namun, itu sudah dibuang pada tahap awal pekerjaan karena persyaratan kinerja: ketika diterapkan, tidak mungkin untuk menyediakan pemrosesan kerangka waktu-nyata pada semua perangkat target.

Pendekatan umum dan struktur algoritma


Gagasan utama dari algoritma ini adalah kerangka referensi, di mana diperlukan untuk menyelaraskan dokumen. Penggunaannya mengejar beberapa tujuan sekaligus. Pertama, ini akan memberikan ukuran gambar yang cocok, cukup untuk pemrosesan dokumen lebih lanjut. Kedua, seperti yang akan kita lihat nanti, ini dapat digunakan sebagai salah satu filter kandidat saat mencari batas dokumen. Ketiga, dapat digunakan untuk mengambil dan memotong gambar jika batas dokumen tidak dapat ditemukan.



Ara. 1. Struktur umum dari algoritma

Struktur umum algoritma ditunjukkan pada Gambar. 1. Bingkai dari aliran video diproses dalam satu siklus, di antara iterasi-fase di mana batas waktu diatur untuk memenuhi FPS yang diinginkan - kami berhenti pada 30 bingkai per detik. Ini memungkinkan Anda untuk menghindari "pelambatan" dan mengurangi beban pada prosesor dan konsumsi daya perangkat.

Setiap frame yang diproses mengalami preprocessing, di mana dua operasi utama dilakukan. Pertama, salinan bingkai ukuran tetap 640x480 dibuat, yang dengannya langkah selanjutnya dari algoritma bekerja. Gambar asli juga tetap, dokumen yang terdeteksi akan dipotong. Ini akan menghemat kualitas gambar akhir. Kedua, salinan yang dibuat diterjemahkan dalam nuansa abu-abu. Warna dokumen yang sedang diproses diabaikan oleh algoritme, karena dapat bervariasi dari satu negara ke negara lain dan bahkan di berbagai wilayah di negara tersebut - contohnya adalah SIM di Amerika Serikat.

Langkah pertama dalam mendeteksi dokumen adalah mencari wajah pada gambar. Penggunaan heuristik ini menghilangkan penangkapan kartu nama dan gambar lain yang jelas tidak relevan. Pencarian dilakukan menggunakan CascadeClassifier.detectMultiScale () opencv'shash standar () dan cascade haarcascade_frontalface_default . Ukuran minimum dan maksimum wajah yang terdeteksi terbatas, yang memungkinkan untuk mengurangi biaya komputasi, dan juga semakin membatasi skala dokumen dalam gambar. Wajah dianggap terdeteksi dalam gambar ketika berada di kiri - atau kiri bawah, untuk paspor - bagian dari area di dalam kerangka referensi (Gbr. 2). Ini adalah langkah tambahan untuk memastikan keselarasan dokumen dalam gambar.

Contoh dalam artikel ini tidak mengandung data pribadi.



Ara. 2. Area posisi wajah yang diharapkan pada gambar. Kerangka pendukung ditunjukkan dengan warna merah, batas area dari lokasi yang diharapkan dari wajah ditampilkan dalam warna hijau.

Setelah deteksi wajah, kami melanjutkan ke deteksi perbatasan. Seringkali findContours () digunakan di sini . Namun, pendekatan ini hanya berfungsi baik dalam kasus-kasus yang kontras, misalnya, untuk selembar kertas yang tergeletak di atas meja yang gelap. Jika kontrasnya lebih rendah, atau pencahayaannya lebih buruk, atau seseorang memegang lembaran di tangan mereka, menutupi bagian perbatasan dengan jari-jari mereka, kontur yang terdeteksi pecah menjadi komponen yang terpisah, โ€œkehilanganโ€ bagian yang signifikan atau tidak terdeteksi sama sekali.

Karena itu, kami mengambil pendekatan yang berbeda. Setelah binarisasi, pertama-tama kita melewatkan gambar melalui filter perbatasan menggunakan Canny () , dan kemudian melihat gambar yang dihasilkan untuk garis menggunakan Huff transform HoughLines () . Parameter ambang segera disetel cukup besar, sama dengan 30 - untuk memfilter segmen pendek dan tidak relevan lainnya yang terdeteksi.

Kumpulan garis yang dihasilkan juga disaring, hanya menyisakan garis dekat dengan kerangka referensi. Untuk melakukan ini, pertama-tama kita menerjemahkan persamaan garis bingkai ke titik-titik dalam sistem koordinat polar (rho, theta) - theta akan selalu menjadi 0 atau pi / 2, dan rho akan menjadi unik untuk setiap baris. Setelah itu, kami memilih dari garis yang diperoleh dari transformasi Huff hanya yang terletak di sekitar titik kontrol - menurut metrik Euclidean, dengan mempertimbangkan perbedaan dalam skala skala nilai.

Kami mendistribusikan rangkaian garis yang diperoleh setelah memfilter menjadi empat grup yang sesuai dengan empat baris kerangka referensi, menemukan persimpangan garis berpasangan di antara grup, rata-rata dan memperoleh koordinat dari empat titik - sudut dokumen yang terdeteksi (Gbr. 3).



Ara. 3. Memfilter garis dan menentukan sudut dokumen. Garis hijau - hasil penyaringan, titik-titik kuning - mendeteksi sudut-sudut dokumen

, selanjutnya Anda perlu memastikan kualitas bingkai. Untuk melakukan ini, kami memverifikasi bahwa frame tetap diam untuk terakhir kalinya. Untuk melakukan ini, kurangi frame di awal periode dari frame saat ini menggunakan absdiff () dan bandingkan dengan ambang batas. Sebelum dikurangi, kami juga menghaluskan gambar dengan filter Gaussian GaussianBlur () untuk mengurangi pengaruh noise dan faktor acak lainnya. Kami juga mengevaluasi fokus bingkai dengan menghitung Laplacian Laplacian () , memperkirakan variansnya dan membandingkan nilai yang diperoleh dengan ambang batas.

Jika semua cek berhasil, Anda dapat melanjutkan ke bagian akhir. Kami menghitung ulang koordinat sudut yang terdeteksi ke dalam sistem koordinat gambar asli yang kurang terang dan memotong daerah yang dihasilkan menggunakan metode roi () . Dokumen berhasil dideteksi.

Fitur Implementasi


Selama pengembangan algoritma, komponen utamanya dikumpulkan dalam skrip python. Setelah itu, algoritma porting ke opencv.js dan javascript, dan kemudian ke wasm. Pendekatan ini ditentukan oleh pertimbangan kenyamanan di semua tahap. Pada python, lebih mudah bagi tim kami untuk bereksperimen dengan berbagai varian algoritma dan melakukan pengaturan parameter kasar. Porting ke javascript memungkinkan untuk menguji operasi algoritma pada platform target, termasuk pada berbagai perangkat dan browser. Berdasarkan hasil pemeriksaan ini, penyempurnaan parameter algoritma dilakukan. Akhirnya, menulis ulang bagian penting kode pada wasm memungkinkan kami untuk mendapatkan peningkatan kinerja tambahan.

Selama migrasi, sejumlah perbedaan ditemukan di OpenCV API, yang menghasilkan perubahan kecil dalam implementasi. Sebagai contoh, varians dari Laplacian di python dianggap hanya sebagai Laplacian (). Var () . Dengan OpenCV.js, tidak ada cara untuk menggunakan NumPy, tetapi tidak ada alternatif implementasi metode var () yang disediakan. Solusi: Hitung fungsi meanStdDev () sebagai standar deviasi (Listing 1).

private isImageBlurry(image: cv.Mat): boolean {
		const laplacian = new cv.Mat();
		cv.Laplacian(image, laplacian, cv.CV_64F);
		const s_mat = new cv.Mat();
		cv.meanStdDev(laplacian, new cv.Mat(), s_mat);
		const s = s_mat.data64F[0];
		const v = Math.pow(s, 2);
		return (v < this.laplacianVarianceThreshold);
	}

Daftar 1. Menilai fokus pada gambar melalui varian Laplacian di opencv.js (TypeScript)

Fitur lain adalah kebutuhan untuk mengurangi ukuran perpustakaan. Dalam bentuk aslinya, OpenCV.js memiliki kapasitas 7,9 MB. Pengunduhan melalui internet memperlambat inisialisasi algoritma. Solusi untuk masalah ini adalah "memangkas" modul yang tidak digunakan selama proses perakitan perpustakaan, yang secara signifikan dapat mengurangi ukuran file output: kami berhasil mencapai ukuran 1,8 MB. Daftar komponen yang termasuk dalam perakitan dapat dikonfigurasi dalam platform file konfigurasi / js / opencv_js.config.py (Listing 2).

white_list = makeWhiteList([core, imgproc, objdetect, video, dnn, features2d, photo, aruco, calib3d])

Daftar 2. Daftar putih asli modul opencv yang termasuk dalam rakitan untuk javascript

Akhirnya, kontribusi penting untuk memastikan kinerja algoritma yang diperlukan dibuat dengan memindahkannya ke Web Worker. Langkah ini, bersama dengan pembatasan FPS, memungkinkan kami untuk menyingkirkan "pelambatan" streaming video selama pengoperasian algoritma, yang memiliki efek positif pada UX.

hasil


Contoh pengambilan dan pemangkasan gambar ditunjukkan pada Gambar. 4. Dapat dilihat bahwa pemangkasan kualitas tertinggi dicapai pada latar belakang seragam gelap, dan kualitas terendah diperoleh dengan latar belakang tidak homogen yang terang. Ini adalah efek yang diharapkan terkait dengan gradien yang diperoleh pada latar belakang yang berbeda dan digunakan untuk mendeteksi batas-batas dokumen. Terhadap latar belakang gelap, gradien lebih besar dari pada latar belakang yang terang, latar belakang yang seragam menyebabkan variabilitas nilai gradien yang lebih sedikit. Ini mengarah pada deteksi batas yang andal dan, sebagai hasilnya, untuk penanaman yang lebih baik.




Ara. 4. Contoh pemangkasan dokumen menggunakan algoritma

Kesimpulan


Artikel ini menyajikan algoritme untuk mendeteksi dokumen pada bingkai dari aliran video yang cocok untuk digunakan di peramban seluler, dan juga mempertimbangkan fitur penerapannya menggunakan perpustakaan opencv.js. Algoritme memungkinkan Anda untuk mendapatkan gambar keluaran dokumen dalam kualitas yang cukup untuk digunakan lebih lanjut oleh algoritma untuk otentikasi, verifikasi identitas, dll. Kecepatan implementasi yang dihasilkan memungkinkan Anda untuk mendapatkan UX "mulus" tanpa "perlambatan" dan kehilangan bingkai.

Terimakasih atas perhatiannya! Kami harap artikel ini bermanfaat bagi Anda.

All Articles