Mencari objek dalam gambar? Memiliki sampel pelatihan dan sekumpulan pengetahuan minimum tentang jaringan saraf, setiap siswa saat ini dapat memperoleh solusi dengan akurasi tertentu. Namun, sebagian besar jaringan saraf yang digunakan untuk menyelesaikan masalah ini cukup dalam, dan oleh karena itu memerlukan banyak data untuk pelatihan, mereka bekerja relatif lambat dalam fase inferensi (terutama jika perangkat tidak memiliki GPU), beratnya banyak dan sangat hemat energi. Semua hal di atas bisa sangat kritis dalam kasus-kasus tertentu, terutama untuk aplikasi seluler.
Barcode adalah objek dengan struktur yang cukup sederhana. Dalam perjalanan penelitian, kami dapat, dengan menggunakan pendekatan yang relatif orisinal, untuk mencari objek sederhana seperti itu dengan sangat akurat (kami mengalahkan yang canggih) dan cukup cepat (waktu nyata pada CPU rata-rata). Plus, detektor kami sangat ringan, hanya memiliki bobot 30rb. Kami akan berbicara tentang hasil penelitian kami di artikel ini.
Tetapi sebelum berbicara tentang solusinya, ada baiknya untuk menyelam sedikit ke area subjek, dan mungkin awalnya adalah apa barcode.
Apa itu barcode dan mengapa mencarinya?
Barcode adalah nama generik untuk sekelompok format data yang dapat dibaca mesin. Anda mungkin pernah mendengar tentang barcode dan kode QR - ini hanya kasus barcode khusus. Di dunia modern, mereka dapat ditemukan di tiket, pada barang-barang di toko, di dokumen resmi dan di banyak tempat lainnya.

Barcode biasanya dibagi menjadi satu dimensi, diwakili oleh satu set garis-garis hitam dan putih, dan dua dimensi, terdiri dari blok persegi atau persegi panjang kecil. Seperti yang dapat Anda lihat pada gambar, secara umum, berbagai jenis sangat mirip satu sama lain.
Kompleksitas dapat diwakili oleh beberapa jenis barcode yang panjangnya tidak ditentukan. Barcode semacam itu bisa panjang dan sewenang-wenang pada saat yang sama sangat tipis.

Contoh di atas adalah buatan, tetapi barcode dengan proporsi yang sama ditemukan dalam dokumen nyata, khususnya dalam faktur.
Dan karena ini adalah format yang dapat dibaca mesin, mereka harus relatif mudah dikenali oleh perangkat keras. Namun, langkah pertama di jalan menuju pengakuan adalah pencarian, dan itu akan dibahas dalam artikel ini.
Perlu dicatat bahwa pemindai laser dan banyak aplikasi menyiratkan partisipasi aktif seseorang - perlu untuk dengan jelas menunjukkan kamera / pemindai pada barcode sehingga diakui, dalam hal ini kebutuhan untuk pencarian secara alami menghilang. Namun, dalam skenario ini, pengguna dipaksa untuk melakukan upaya tambahan di pihak mereka, yang tidak baik. Pendekatan ini juga tidak memungkinkan pengenalan beberapa objek dalam gambar, terbatas hanya satu.
Pernyataan metrik masalah dan kualitas
Apa yang kita inginkan dari detektor barcode yang dibuat?
- Menemukan semua barcode dalam gambar cukup akurat *
- Temukan barcode panjang dan sangat sempit
- Waktu nyata pada cpu
* Diusulkan untuk menggunakan ukuran-f untuk objek dengan ambang IoU = 0,5 sebagai metrik utama akurasi. Kami juga akan melihat tingkat presisi, penarikan dan deteksi.
Definisi Resmi MetrikPertama, kami memperkenalkan konsep IoU - Intersection over Union (juga dikenal sebagai Indeks Jaccard). Memiliki yang benar ( ) dan diprediksi ( ) topeng objek, IoU dihitung sebagai area persimpangan dibagi dengan area persatuan.
Sangat mudah untuk melihat bahwa IoU mengambil nilai dari 0 hingga 1. Sekarang, berdasarkan ukuran ini, kami memperkenalkan konsep-konsep presisi, penarikan, pengukuran-f dan tingkat deteksi.
Biarkan ada objek N dalam sampel. Kami menetapkan ambang IoU sama dengan beberapa nomor tetap (mis. 0,5). Untuk beberapa objek , dan deteksi percaya bahwa jika , objek ditemukan (1), jika tidak kami percaya bahwa objek tidak ditemukan (0). Lalu didefinisikan sebagai proporsi objek sampel yang ditemukan, - proporsi deteksi yang sesuai dengan setidaknya satu objek sampel. f-ukuran didefinisikan secara standar sebagai rata-rata harmonik .
Masih memahami apa tingkat deteksi. Biarkan ada gambar M dengan objek dalam sampel. Kami menghitung IoU antara topeng yang benar dan yang diprediksi dalam gambar , juga memotong ambang batas gambar. Tingkat deteksi adalah fraksi gambar dengan mana total IoU dari semua objek benar dengan total IoU dari semua objek yang diprediksi lebih besar dari t ambang yang diberikan.
Dalam studi sebelumnya (pada deteksi barcode), biasanya digunakan tingkat deteksi untuk menilai kualitas. Namun, mari kita perhatikan situasi ini - biarkan ada satu objek yang sangat besar dan satu yang sangat kecil dalam gambar, tetapi detektor menemukan besar dan tidak menemukan kecil. Dalam hal ini, tingkat deteksi hanya akan menandakan kesalahan jika ambangnya sangat besar. dekat dengan 1. saat tidak akan lebih dari 0,5 untuk nilai ambang batas arbitrer , yang juga akan membuat ukuran-f kurang dari 1. Artinya, untuk contoh seperti itu, ukuran-f dapat menandakan kesalahan lebih awal (dalam arti ambang yang lebih rendah ) daripada tingkat deteksi.
Oleh karena itu, dalam percobaan kami, kami mengandalkan ukuran-f, dan menggunakan tingkat deteksi untuk membandingkan dengan pekerjaan tahun-tahun sebelumnya.
Terinspirasi oleh detektor teks
Mungkin detektor objek yang paling terkenal dan populer ketika kecepatan penting adalah YOLO (You Only Look Once). Ada juga versi YOLOv2 dan YOLOv3 yang lebih baru, tetapi secara umum pendekatan ini baik untuk objek yang kurang lebih persegi, tetapi dalam menemukan objek yang sempit, tetapi sangat memanjang, pendekatan ini tidak begitu kuat.
Jadi kami memutuskan untuk pergi ke arah lain. Seperti yang dapat Anda lihat dengan mudah, garis-garis dengan teks dalam gambar juga sangat panjang dan sempit, dan tugas mencari teks dalam gambar dalam komunitas ilmiah cukup populer (tentu saja lebih populer daripada mencari barcode) dan berbagai arsitektur menarik berdasarkan struktur grafik diciptakan untuknya. Keputusan kami dimotivasi oleh hanya salah satu karya pencarian teks di mana arsitektur PixelLink diusulkan.
PixelLink untuk pencarian teks
Inti dari pendekatan ini adalah sebagai berikut - mari kita selesaikan masalah segmentasi instance seperti ini:
- Untuk setiap piksel, kami akan menyelesaikan masalah klasifikasi biner (teks / bukan teks).
- Untuk setiap piksel, kami akan memprediksi 8 tautan (tautan) dengan tetangganya. Komunikasi berarti bahwa pasangan piksel ini milik satu objek (contoh).
- Setelah menerima peta segmentasi teks / bukan teks dan peta dengan tautan dari gambar, kami menyusun grafik di mana simpul akan menjadi piksel yang kelas teksnya diprediksi dan ujungnya adalah tautan.
- Kami menemukan komponen yang terhubung dalam grafik ini.
- Di sekitar setiap komponen yang terhubung, pilih persegi panjang penutup minimum (misalnya, menggunakan OpenCV), yang akan menjadi deteksi akhir.
Proses ini diilustrasikan secara grafis, angka tersebut diambil dari artikel asli .

Pendekatan ini untuk mencari teks memberikan hasil yang cukup layak dibandingkan dengan yang canggih.
Pixel Tautan untuk mencari barcode
Kami kembali sekarang ke barcode. Kami bertanya pada diri sendiri - apakah kami benar-benar membutuhkan tautan ini? Lagi pula, barcode, berbeda dengan teks, dalam sebagian besar kasus jauh dari satu sama lain. Dan memang, sesuai spesifikasinya, banyak jenis barcode harus memiliki celah tertentu dengan objek tetangga terdekat.
Secara umum, kami memutuskan bahwa kami tidak terlalu membutuhkan tautan, dan memodifikasi pendekatan sebagai berikut:
- Kami memecahkan masalah segmentasi semantik - untuk setiap piksel kami menentukan kelas barcode / non-barcode.
- Kami membuat grafik dengan simpul dalam piksel yang jenis barcodenya ditentukan. Sebagai tepian, alih-alih mencari tautan, kami menganggap ada tautan antara pasangan piksel yang berdekatan dari jenis barcode.
- Kami menemukan komponen yang terhubung dalam grafik ini.
- Di sekitar setiap komponen yang terhubung, pilih persegi panjang penutup minimum, yang akan menjadi deteksi akhir.
Jadi, kami memutuskan skema solusi umum. Paragraf 2-4 dapat dianggap sepele, tetapi mari kita bahas bagaimana menangani segmentasi semantik dengan tepat.
Arsitektur Jaringan untuk Segmentasi Semantik
Sedikit sejarah yang biasa digunakan
Secara umum, segmentasi semantik menggunakan jaringan saraf telah berlangsung sejak sekitar 2013 sejak munculnya U-Net. Di U-Net, resolusi spasial pertama-tama dikurangi secara bertahap dalam Encoder, kemudian secara bertahap ditingkatkan dalam Decoder, ada juga lompatan koneksi dari atribut Encoder perantara ke atribut Decoder perantara. Beberapa saat kemudian, konvolusi melebar muncul (lihat gambar di bawah), yang menghasilkan kualitas yang lebih baik, tetapi membutuhkan lebih banyak memori dan perhitungan untuk diproses. Pada akhirnya, ada pendekatan yang dikenal sebagai Deeplabv3 +, yang menggabungkan kedua pendekatan ini dan menjadi canggih di antara arsitektur yang dirancang manusia pada saat penulisan ini (sebenarnya, terima kasih kepada Neural Architecture Search, solusi yang lebih efektif, misalnya ).
Mari kita membahas sedikit tentang konvolusi melebar, karena dalam keputusan akhir, kita akan bergantung pada propertinya.
Konvolusi normal berfungsi seperti ini

Sementara lilitan dilatasi ditunjukkan di bawah ini (pada gambar faktor dilatasi adalah 2)

Anda mungkin memperhatikan bahwa konvolusi konvensional sebenarnya merupakan kasus khusus konvolusi dilatasi (dengan faktor dilatasi 1).
Secara umum, pembahasan solusi untuk segmentasi semantik adalah topik untuk artikel yang agak besar terpisah, saya hanya ingin membuat pengingat kecil di mana hal yang paling penting adalah untuk berurusan dengan perangkat konvolusi melebar. Jika Anda baru mengenal segmentasi semantik, inilah ulasan terbaik yang diketahui oleh penulis, namun, untuk memahami apa yang akan terjadi selanjutnya, pengenalan dengan itu tidak perlu.
Jika semuanya begitu sederhana ...
Persyaratan utama untuk jaringan saraf kita, selain kualitas, adalah kecepatan. Dalam data kami, ada barcode yang sangat kecil relatif terhadap ukuran gambar sehingga resolusi minimum yang masuk akal untuk menjalankan jaringan saraf harus minimal 512x512, dan lebih disukai 1024x1024. Pada saat yang sama, ada persyaratan untuk bekerja pada CPU tidak lebih dari 100 ms pada gambar (dan juga pada satu inti!). Dalam hal serangkaian persyaratan untuk resolusi input dan total waktu operasi, tugasnya tidak terlalu sepele. Dengan pembatasan yang sedemikian ketat, penggunaan arsitektur yang kuat dan dalam tidak dimungkinkan. Dalam keadilan, kami belum memenuhi persyaratan 100 ms pada satu inti, tetapi solusi akhir bekerja 40 ms pada 4 core (Intel Core i5, 3,2 GHz).
Sayangnya, semua arsitektur yang kita kenal untuk segmentasi semantik pasti tidak cocok dengan pembatasan ini. Jadi kami punya pilihan: entah tidak diketahui cara membuat sesuatu yang sama sekali baru, atau mencoba menyederhanakan sebanyak mungkin salah satu arsitektur populer. Kami tidak memiliki ide cemerlang, jadi kami memilih yang terakhir.
Terinspirasi oleh Context Aggregation Network
Konvolusi dilatasi memiliki sifat berguna berikut - jika Anda menerapkannya secara berurutan dengan faktor dilatasi yang meningkat secara eksponensial, bidang reseptif akan tumbuh secara eksponensial (sedangkan dalam kasus konvolusi biasa, ia tumbuh secara linear).

Gambar ( sumber ) menunjukkan peningkatan eksponensial di bidang reseptif jaringan saraf ketika secara berurutan menerapkan konvolusi dilatasi. (a) F1 diperoleh dari F0 dengan konvolusi dengan dilasi = 1, bidang reseptif = 3x3 untuk setiap elemen dalam F1 (b) F2 diperoleh dari F1 oleh konvolusi dengan dilasi = 2, bidang reseptif = 7x7 untuk setiap elemen dalam F2 (c) F3 diperoleh dari F2 menggunakan konvolusi dengan dilasi = 4, bidang reseptif = 15x15 untuk setiap elemen dalam F3
Dalam artikel "Agregasi Konteks Multi-Skala oleh Konvolusi Dilatasi" berdasarkan properti ini, sebuah blok khusus ditemukan (disebut oleh penulis Modul Konteks), yang digunakan untuk mengumpulkan informasi dari konteks piksel saat ini. Dalam artikel ini, blok ini digunakan di atas jaringan yang sudah tahu cara menyelesaikan masalah segmentasi untuk memperbaiki prediksi ini menggunakan informasi konteks.
Kami memutuskan untuk mengambil Modul Konteks ini, tetapi menggunakannya bukan untuk meningkatkan prediksi model yang baik yang ada, tetapi sebagai bagian utama dari jaringan konvolusi, yang akan menyelesaikan masalah ini. Secara umum, arsitektur kami disusun sebagai berikut (lihat tabel):
- Modul Downscale - konvolusi awal untuk mengekstrak fitur paling sederhana dan mengurangi resolusi.
- Modul Konteks pada dasarnya adalah serangkaian konvolusi melebar yang akan dengan cepat meningkatkan bidang penerimaan, sehingga mengumpulkan atribut dari konteks yang lebih besar.
- Lapisan terakhir (konvolusi 1x1), menerima peta probabilitas untuk segmentasi semantik barcode / non-barcode. Juga, jika kita ingin membedakan antara tipe barcode yang terdeteksi, saluran N diprediksi juga (lihat di bawah).

Artinya, dalam arsitektur yang dihasilkan, sejumlah kecil konstan C = 24 saluran digunakan di setiap lapisan, 3 konvolusi pertama mengurangi resolusi, konvolusi berikutnya (Modul Konteks) meningkatkan bidang reseptif dari setiap elemen peta fitur.
Tabel hyperparameters arsitektur, antara lain, menunjukkan apakah konvolusi pada lapisan saat ini dapat dipisahkan. Konvolusi yang dapat dipisah secara teoritis memberikan akselerasi urutan k ^ 2 kali dibandingkan dengan konvolusi konvensional, di mana k adalah ukuran filter. Dalam praktiknya, akselerasi bisa jauh lebih sedikit (itu semua tergantung pada resolusi gambar, jumlah filter input dan output).
Awalnya, kami mencoba membuat semua konvolusi dapat dipisahkan, tetapi kualitasnya menurun drastis. Kemudian kami memutuskan untuk membuat hanya 3 konvolusi pertama yang dapat dipisahkan, yang bekerja dengan resolusi gambar yang lebih tinggi, dan karenanya, membutuhkan lebih banyak perhitungan daripada konvolusi berikutnya. Pada saat yang sama, kualitas dari pengganti semacam itu sudah turun sedikit. Total karena keterpisahan, jaringan saraf dipercepat oleh 20% lainnya.
Masih ada momen terakhir yang tidak dapat dijelaskan - apa arti angka N di lapisan terakhir. N bertanggung jawab atas jumlah berbagai jenis objek (dalam kasus kami, barcode) yang ingin kami bedakan. Jika kami mempertimbangkan kasus paling sederhana - ketika Anda hanya perlu menemukan objek, dan Anda tidak perlu menentukan jenisnya (ini adalah barcode dan tidak peduli yang mana) - Anda dapat mempertimbangkan N = 0. Jika kita masih ingin membedakan antara tipe-tipe barcode (ini adalah barcode tipe [ini-dan-semacam itu]), maka pada layer terakhir saluran N ditambahkan di mana probabilitas dari tipe tertentu diprediksi. Sekarang, setelah menerima deteksi dalam bentuk persegi panjang di mana barcode berada, kita dapat meratakan probabilitas kelas-kelas di dalam persegi panjang yang ditemukan ini, dari mana kita dapat mengetahui jenis barcode yang ditemukan.
Hasil
Setelah menerima solusi, Anda harus selalu melihat-lihat dan membandingkan kualitas solusi dengan studi sebelumnya. Secara umum, tugas mencari barcode tidak terlalu populer, selama 10 tahun terakhir hanya 1-2 artikel yang diterbitkan per tahun (seperti yang Anda tahu, cara paling sederhana untuk mengalahkan state-of-the-art adalah untuk menemukan tugas yang tidak populer, yang akhirnya kami berhasil .. .). Tabel di bawah ini membandingkan dengan pendekatan lain pada dua dataset, di mana salah satu dari kami mendapatkan hasil yang lebih baik.

Keunggulan, tentu saja, tidak super mengesankan, tetapi tetap ada. Namun, fitur utama dari solusi yang ditemukan tidak tepat, tetapi dalam kecepatan - dibandingkan dengan YOLO yang sama pada GPU yang sama (GTX 1080), dan pada resolusi gambar yang lebih tinggi, metode kami bekerja ~ 3,5 kali lebih cepat.

Selain keunggulan kecepatan, ada kelebihan dalam bobot model akhir. Detektor ini memiliki ~ 30 ribu skala, sementara sebagian besar jaringan konvolusi modern (bahkan dipertajam untuk perangkat seluler) memiliki jutaan parameter. Solusi akhir berbobot lebih kecil dari LeNet, yang memiliki ~ 60 ribu parameter.
Kesimpulan
Sebenarnya, karya ini didasarkan pada dua ide sederhana:
- Deteksi melalui segmentasi semantik.
- Menggunakan urutan konvolusi melebar dengan sejumlah kecil saluran untuk pertumbuhan tercepat bidang reseptif.
Hasilnya adalah arsitektur yang sangat ringan dan cepat, yang tetap menunjukkan hasil yang cukup baik (dan bahkan mengalahkan SOTA dalam tugas yang tidak populer untuk menemukan barcode). Selain itu, penerapan pendekatan ini tidak terbatas pada barcode. Kami menggunakan arsitektur yang sama untuk menemukan teks, mencari kartu nama dan paspor, mendapatkan hasil yang baik untuk tugas-tugas ini.
Namun, perlu dicatat bahwa pendekatan ini dalam bentuk ini memiliki keterbatasan. Jika 2 objek dari tipe yang sama terletak sangat dekat, mereka akan tetap bersatu menjadi satu. Mungkin di seri selanjutnya, kami akan memberi tahu Anda cara menangani masalah seperti itu.
Berdasarkan hasil percobaan dengan barcode, kami menulis sebuah artikel yang akan dipresentasikan di ICDAR2019 di Sydney.
Sastra
- Artikel dengan hasil percobaan kami dan sejumlah besar detail. Detektor Kode Batang Universal melalui Segmentasi Semantik
- Artikel ulasan yang sangat baik tentang pengembangan arsitektur untuk segmentasi semantik. tautan
- PixelLink: Mendeteksi Teks Adegan melalui Segmentasi Instans
- Artikel ini adalah tentang menggunakan konvolusi melebar untuk meningkatkan prediksi dengan mengumpulkan informasi dari konteks. Agregasi Konteks Multi-Skala oleh Konvolusi Dilatasi
Kelompok Penelitian Visi Komputer