Bagaimana kami melatih jaringan saraf untuk mengklasifikasikan sekrup

Jaringan saraf dapat mengidentifikasi kucing dalam foto, menemukan sofa, meningkatkan perekaman video, menggambar gambar dari anak anjing atau sketsa sederhana. Kami sudah terbiasa. Berita tentang jaringan saraf muncul hampir setiap hari dan telah menjadi hal biasa. Perusahaan Grid Dynamics menetapkan tugas tidak biasa, tetapi sulit - untuk mengajarkan jaringan saraf untuk menemukan sekrup atau baut tertentu dalam katalog besar toko online dari satu foto. Tugasnya lebih sulit daripada menemukan kucing.



Masalah toko online sekrup ada dalam stok. Ribuan atau puluhan ribu model. Setiap sekrup memiliki deskripsi dan karakteristiknya sendiri, sehingga tidak ada harapan untuk filter. Apa yang harus dilakukan Cari secara manual atau cari di hypermarket di rak? Dalam kedua kasus, itu adalah buang-buang waktu. Akibatnya, klien menjadi lelah dan pergi ke palu paku. Untuk membantunya, kita akan menggunakan jaringan saraf. Jika dia dapat menemukan segel atau sofa, maka biarkan dia melakukan sesuatu yang berguna - mengambil sekrup dan baut. Cara mengajar jaringan saraf untuk memilih sekrup dengan cepat dan akurat untuk pengguna, kami akan memberi tahu Anda dalam transkrip laporan Maria Matskevichus , yang di Grid Dynamics terlibat dalam analisis data dan pembelajaran mesin.

Demo singkat tentang apa yang terjadi

Masalah Pembeli


Bayangkan - kami membeli sebuah meja, tetapi satu sekrup kecil hilang, dan sebuah meja tidak dapat dipasang tanpa itu. Kami pergi ke toko online dalam pencarian, dan kami melihat 15.000 posisi unik, yang masing-masing mungkin adalah sekrup kami.

Kita buka filter - ada sekitar 10, yang masing-masing memiliki 5 hingga 100 atribut. Pilih jenis topi dan warna: topi datar - Flat dan tembaga kuning - Kuningan. Kami menerima masalah ini.



Apa ini Kami tidak mencari ini. Tembak orang yang bertanggung jawab atas ekstradisi!

Setelah beberapa saat, kami tetap memilih 2 sekrup meja yang sesuai.



Hal paling sederhana yang tersisa adalah menguraikan deskripsi dan karakteristik. Setiap pabrikan menggambarkan sekrup dengan caranya masing-masing. Tidak ada persyaratan khusus untuk menggambarkan parameter model tertentu.

Segala sesuatu yang menciptakan kesulitan bagi klien. Kehilangan waktu, saraf dan tenaga dukungan teknis, yang membantu klien untuk menemukan model yang diinginkan. Setelah menyadari masalah-masalah pembeli ini, pelanggan kami - perusahaan besar Amerika - memutuskan untuk menyediakan pencarian foto yang cepat, akurat dan sederhana kepada klien, alih-alih pencarian semantik yang lambat dan tidak selalu berhasil.



Kesulitan implementasi


Kami mengambil tugas dan menyadari bahwa ada beberapa masalah.

Sekrupnya mirip. Lihat fotonya.



Ini adalah sekrup yang berbeda. Jika Anda membalik foto, Anda dapat melihat bahwa karakteristik penting berbeda - kepala.



Dan di foto ini?



Di sini modelnya sama. Pencahayaannya berbeda, tetapi di kedua foto ada satu model sekrup.

Ada spesies langka yang membutuhkan klasifikasi. Misalnya, dengan "telinga" atau cincin.



Persyaratan minimum untuk menggunakan aplikasi. Pengguna dapat mengunggah foto dengan latar belakang apa pun, dengan benda asing, dengan bayangan, dengan pencahayaan buruk, dan aplikasi harus memberikan hasilnya. Sekrup atau baut pada latar belakang putih jarang terjadi.



Aplikasi harus bekerja secara real time. Pengguna sedang menunggu hasil di sini dan sekarang.

Pesaing. Baru-baru ini Amazon - pesaing dari pelanggan kami - meluncurkan Part Finder-nya . Ini adalah aplikasi yang mencari sekrup dan baut dari foto.



Selain Amazona, kami memiliki dua pesaing pemula dengan solusi mereka sendiri untuk pelanggan. Kami harus mengalahkan tidak hanya Amazon, tetapi juga startup, yang tidak sulit. Salah satu pesaing menyarankan gagasan untuk mengambil 20 baut paling populer dan deteksi objek pelatihan pada mereka. Tetapi untuk pertanyaan tentang apa yang akan terjadi ketika jaringan saraf memberikan 100, 1000 atau semua 15.000 sekrup dari situs pelanggan, bagaimana deteksi objek akan bekerja dan di mana mendapatkan banyak data, pesaing tidak menemukan apa yang harus dijawab.

Solusi


Itu harus scalable dan tidak tergantung pada jumlah varietas sekrup dan ukuran katalog. Untuk mengatasi masalah tersebut, kami memutuskan untuk mempertimbangkan sekrup sebagai serangkaian karakteristik atau atribut. Setiap atribut adalah sekumpulan atribut.



Dipilih karakteristik berikut:

  • topi - kepala (32 atribut);
  • lapisan luar - lapisan akhir (15 atribut);
  • point - tip (12 atribut);
  • cakupan benang - cakupan benang (4 atribut).

Kami memeriksa peta semua tanda dan menyadari bahwa untuk mendeskripsikan 15.000 sekrup yang berbeda, mereka hanya membutuhkan 50. Mereka akan membuat kombinasi tanda yang berbeda dengan atribut yang berbeda. Dibutuhkan 50 sekrup dan satu koin untuk mengukur skala sekrup di foto.

Jadi mereka memutuskan. Kami memutuskan ide itu. Diperlukan data lebih lanjut.

Data


Kami menerima data dari pelanggan dan sedikit kesal. Data katalog - foto-foto objek dengan latar belakang putih.



Tetapi mereka tidak cukup sesuai dengan data yang akan diproses aplikasi. Pengguna akan ingin menggunakan latar belakang, akan mengambil gambar di telapak tangannya atau memegang baut dengan jari-jarinya. Data di mana jaringan dilatih tidak akan bertepatan dengan gambaran nyata.

Kemudian kami memutuskan untuk mengikuti saran Richard Soker .

Alih-alih mempelajari metode pengajaran tanpa guru selama sebulan, lebih mudah untuk mengambil satu minggu, menandai data dan melatih pengelompokan.

Jadi kami melakukannya - mencetak banyak latar belakang berwarna pada printer, membeli 50 baut ini dan memotret data pelatihan di latar belakang. Jadi kami mendapatkan semua opsi yang mungkin untuk permukaan meja dan karpet.



Setelah mengumpulkan data, langkah selanjutnya adalah memahami di mana pada gambar baut terletak, jika sama sekali.

Lokalisasi


Kami memeriksa dua pendekatan untuk pelokalan: deteksi objek dan segmentasi semantik .



Deteksi objek mengembalikan kotak area minimum di sekitar objek. Segmentasi semantik mengembalikan topeng. Dalam kasus kami, topeng lebih cocok. Ini mempertahankan bentuknya, menghilangkan latar belakang, bayangan berlebih, dan memungkinkan Anda untuk lebih mengklasifikasikan sekrup lebih baik daripada deteksi objek.



Tugas segmentasi semantik adalah mengembalikan probabilitas miliknya ke kelas untuk setiap piksel. Untuk melatih model seperti itu, data berlabel diperlukan. Kami menggunakan aplikasi "labelme" , yang dengannya kami menandai sampel. Kami punya sekitar seribu topeng dengan koin dan sekrup.



Model


Kami mengambil U-Net . Jaringan ini sangat disukai di Kaggle, dan begitu juga kita sekarang.



U-Net adalah implementasi encoder-decoder yang berhasil.

  • Path atau encoder pembangun . Ini adalah bagian dari U-Net, yang mencoba untuk mewakili seluruh rangkaian data, hadir sebagai representasi vektor dalam ruang yang lebih terkompresi. Dia mempelajari tanda-tanda ini dan menemukan yang paling signifikan.
  • Jalur atau dekoder yang diperluas . Mencoba memecahkan kode peta fitur dan memahami di mana objek berada dalam gambar.

Kami memutuskan modelnya. Sekarang kita memilih fungsi kerugian, nilai yang akan kita minimalkan dalam proses pembelajaran.

Fungsi kerugian


Pilihan klasik untuk segmentasi adalah koefisien Dice :

D(P,G)= frac2|P cdotG||P|+|G|



Ini adalah rata-rata harmonis antara ketepatan dan daya ingat. Mean harmonik berarti bahwa kita menimbang kesalahan jenis pertama dan kesalahan jenis kedua. Data kami tidak seimbang, dan ini sangat tidak cocok untuk kami.



Selalu ada banyak latar belakang, dan objek itu sendiri tidak cukup. Oleh karena itu, model akan selalu memberikan presisi yang sangat tinggi dan daya ingat yang sangat rendah. Untuk menimbang kesalahan jenis pertama dan kedua dengan cara yang berbeda, kami memutuskan untuk mengambil indeks Tversky :

$$ menampilkan $$ S (P, G, α, β) = \ frac {| P \ cdot G |} {| P \ cdot G | + α | P / G | + β | G / P |} $$ tampilkan $$



Indeks Tversky memiliki dua koefisien, α dan β, menimbang dua kesalahan secara berbeda. Jika kita mengambil α = β = 0,5, kita mendapatkan koefisien Dice yang sama. Jika kita memilih parameter lain, kita mendapatkan indeks Jaccard - salah satu ukuran kesamaan objek. Untuk α = β = 1 - indeks Tversky sama dengan indeks Jaccard.

Anda juga bisa mendapatkan skor Fβ. Untuk α + β = 1, indeks Tversky sesuai dengan skor Fβ.

Untuk memilih α dan β, kami melakukan beberapa percobaan. Mereka berhipotesis bahwa model akan didenda lebih keras untuk kesalahan jenis kedua . Ini tidak terlalu buruk ketika model mengklasifikasikan piksel latar belakang sebagai piksel objek. Jika ada bingkai latar belakang kecil di sekitar objek, ini normal. Tetapi ketika model mengklasifikasikan piksel sekrup sebagai piksel latar belakang - lubang muncul pada sekrup, menjadi tidak rata, dan ini mengganggu klasifikasi kami.

Oleh karena itu, kami memutuskan untuk meningkatkan parameter β dan membawanya lebih dekat ke 1, dan parameter α menjadi 0.



Gambar menunjukkan bahwa topeng terbaik diperoleh dengan β = 0,7 dan α = 0,3. Kami memutuskan untuk berhenti pada ini dan melatih model pada semua data kami.

Pelatihan


Strategi pembelajarannya cukup rumit. Karena kami secara manual menandai data dalam waktu pribadi, kami memutuskan untuk menggunakan satu fitur U-Net. Ini segmen setiap kelas baru di saluran baru - menambahkan saluran baru dan objek terlokalisasi di atasnya.

Karena itu, dalam pelatihan kami, tidak ada satu pun gambar yang berisi koin dan baut. Semua gambar berisi satu kelas: 10% - koin, 90% - sekrup.



Ini memungkinkan untuk mendistribusikan upaya dengan benar dan menghemat waktu dengan koin - itu adalah satu, tetapi bentuknya sederhana. Kami dengan mudah belajar mengelompokkannya, yang memungkinkan kami mentransfer 90% upaya kami ke sekrup. Mereka memiliki bentuk dan warna yang berbeda, dan penting untuk mempelajari cara membagi mereka.

Jaringan kami telah belajar mengelompokkan bahkan contoh-contoh yang tidak ada dalam sampel kami. Misalnya, baut dengan bentuk yang tidak biasa tidak ada, tetapi modelnya juga membagi mereka dengan baik. Dia belajar menggeneralisasi tanda-tanda sekrup dan baut dan menggunakannya untuk data baru, yang bagus.



Klasifikasi


Ini adalah tahap selanjutnya setelah lokalisasi objek. Hanya sedikit orang yang melatih jaringan saraf convolutional untuk mengklasifikasikan objek, mereka sering menggunakan pembelajaran Transfer . Mari kita lihat arsitektur jaringan saraf convolutional, dan kemudian ingatlah secara singkat apa itu Transfer learning.



Pada lapisan awal, jaringan belajar mengenali batas dan sudut. Kemudian ia mengenali bentuk sederhana: persegi panjang, lingkaran, kotak. Semakin dekat ke atas, semakin ia mengenali fitur karakteristik dari data yang dilatihnya. Di bagian paling atas, model ini mengenali kelas.

Sebagian besar objek di dunia terdiri dari bentuk-bentuk sederhana dan memiliki fitur umum. Anda dapat mengambil bagian dari jaringan yang dilatih tentang sejumlah besar data dan menggunakan atribut ini untuk klasifikasi kami. Jaringan akan dilatih tentang kumpulan data kecil tanpa pengeluaran sumber daya yang besar. Inilah yang kami lakukan.



Setelah Anda memutuskan teknologi umum pembelajaran Transfer, Anda harus memilih model pra-terlatih.

Pemilihan model


Aplikasi kami bekerja secara real time. Modelnya harus ringan dan mobile - memiliki beberapa parameter, tetapi akurat. Untuk menjelaskan dua faktor ini, kami mengorbankan sedikit akurasi demi keringanan. Oleh karena itu, kami memilih bukan model yang paling akurat, tetapi ringan - Xception .



Dalam Xception, alih-alih konvolusi biasa - Konvolusi - Konvolusi yang dapat dipisahkan digunakan. Oleh karena itu, Xception lebih ringan daripada jaringan lain, misalnya, dengan VGG.



Konvolusi Biasa melakukan konvolusi antar saluran dan antar dimensi. Dan bagian Konvolusi Dapat Dipisahkan: pertama, konvolusi interdimensi - Tegas , dan kemudian antar saluran . Hasilnya bergabung.

Xception mengeksekusi Konvolusi yang dapat dipisahkan, sementara ia menghasilkan hasil yang sama baiknya dengan Konvolusi biasa, tetapi ada lebih sedikit parameter.



Kami mengganti nilai dalam rumus untuk menghitung parameter, misalnya, untuk 16 filter. Untuk Konvolusi biasa, Anda perlu menghitung parameter 7 kali lebih banyak daripada untuk Konvolusi Dapat Dipisahkan. Karena ini, Xception lebih akurat dan kurang.



Pelatihan


Pertama, kami memutuskan untuk membangun beberapa baseline dan melatih model dalam gambar aslinya. Kami memiliki 4 pengklasifikasi dan masing-masing bertanggung jawab untuk atribut tertentu. Hasilnya tidak memuaskan.



Kemudian mereka melatih model pada kotak, yang mengembalikan deteksi objek. Mendapat peningkatan akurasi yang baik untuk cakupan Thread. Tetapi untuk sisa pengklasifikasi, hasilnya juga tidak memuaskan.



Kemudian mereka memutuskan untuk hanya memberikan bagian dari sekrup yang mereka inginkan dan akan mengklasifikasikan. Kepala hanya memberikan topi, Tip - hanya ujung tombak. Untuk melakukan ini, kami mengambil topeng, mendapat kontur yang melingkari area minimum dilingkari, dan menghitung sudut rotasi.



Saat ini, kami masih belum tahu sisi kepala dan ujung sekrup yang mana. Untuk mengetahuinya, mereka memotong kotak itu menjadi dua dan melihat ke alun-alun.



Area yang berisi kepala selalu lebih besar dari area yang berisi ujung. Membandingkan area, kami menentukan bagian mana, bagian mana dari sekrup. Itu berhasil, tetapi tidak untuk semua kasus.



Ketika panjang sekrup sebanding dengan diameter tutup, alih-alih persegi panjang, persegi diperoleh. Ketika kita memutarnya, kita mendapatkan gambar, seperti pada angka 3. Model tidak mengklasifikasikan opsi ini dengan baik.

Kemudian kami mengambil semua sekrup panjang, menghitung sudut rotasi untuk mereka, dan membangun jaringan saraf dangkal Rotation Net , yang mengambil sekrup dan memprediksi sudut rotasi.



Kemudian model tambahan ini digunakan untuk sekrup dan baut pendek kecil. Kami mendapat hasil yang baik - semuanya berfungsi, sekrup kecil juga berputar. Pada tahap ini, kesalahan praktis dikurangi menjadi nol. Kami mengambil data ini, melatih pengklasifikasi dan melihat bahwa untuk masing-masing pengklasifikasi, kecuali Selesai, akurasinya meningkat secara signifikan. Ini hebat - kami bekerja lebih jauh.



Tetapi karena suatu alasan, Selesai tidak lepas landas. Kami mempelajari kesalahan dan melihat gambar.



Sepasang sekrup yang sama dalam kondisi pencahayaan yang berbeda dan pengaturan kamera yang berbeda berbeda dalam warna. Ini mungkin membingungkan tidak hanya model, tetapi juga orangnya. Abu-abu bisa berubah menjadi merah muda, kuning bisa berubah menjadi oranye. Ingat gaun biru-emas - cerita yang sama. Permukaan reflektif sekrup menyesatkan.

Kami mempelajari kasus serupa di Internet dan menemukan ilmuwan Cina yang mencoba untuk mengklasifikasikan mobil berdasarkan warna dan menghadapi masalah yang sama untuk mobil.



Sebagai solusi, para ilmuwan Cina telah menciptakan jaringan yang dangkal. Fiturnya ada di dua cabang yang digabung pada akhirnya. Arsitektur ini disebut ColorNet .



Kami menerapkan solusi untuk tugas kami, dan kami mendapat peningkatan akurasi hampir 2 kali lipat. Dengan hasil dan model seperti itu Anda dapat bekerja dan mencari sekrup dari tabel di katalog toko online.



Kami hanya memiliki 4 pengklasifikasi untuk 4 atribut, dan ada banyak lainnya. Jadi, Anda perlu membuat beberapa jenis filter yang akan mengambil data katalog dan memfilternya dengan cara tertentu.

Penyaringan


Setiap classifier mengembalikan label dan kelas lunak. Kami mengambil nilai tag lunak dan basis data kami, menghitung beberapa skor - mengalikan semua tag untuk setiap fitur.



Skor menunjukkan kepercayaan diri semua pengklasifikasi bahwa kombinasi fitur ini kemungkinan besar akan muncul. Semakin tinggi skor, semakin besar kemungkinan sekrup dari katalog dan sekrup pada gambar serupa.

Saluran pipa


Ternyata aplikasi semacam itu.



  • Input : mulai dengan gambar mentah.
  • Lokalisasi : tentukan di mana baut atau sekrup berada, dan di mana koin.
  • Transformasi dan rotasi .
  • Klasifikasi : kami dengan hati-hati memangkas segalanya, mengklasifikasikan dan menentukan ukuran.
  • Penyaringan .
  • Keluar ke posisi SKU tertentu.

Bagaimana cara mengimplementasikan proyek yang kompleks


Makan gajah di beberapa bagian . Bagilah masalah besar menjadi beberapa bagian.

Beri label data yang akan mencerminkan kenyataan. Jangan takut markup data - ini adalah cara teraman, yang akan memastikan kualitas model maksimum dengan cepat. Metode sintesis data biasanya menghasilkan hasil yang lebih buruk daripada menggunakan data nyata.

Uji itu . Sebelum membangun banyak model, kami mengambil potongan-potongan kecil data, memberi label dengan tangan kami, dan menguji operasi masing-masing hipotesis. Baru setelah itu mereka melatih U-Net, classifier, Rotation.

Jangan menemukan kembali roda . Seringkali masalah yang Anda hadapi sudah memiliki solusi. Lihat di Internet, baca artikel - pastikan untuk menemukan sesuatu!

Kisah tentang aplikasi Pencarian Visual kami tidak hanya tentang klasifikasi sekrup. Ini tentang bagaimana membuat proyek yang kompleks, yang tidak memiliki analog, tetapi bahkan jika ada, mereka tidak memenuhi persyaratan yang kami tetapkan untuk aplikasi tersebut.

Untuk informasi lebih lanjut tentang proyek Grid Dynamics dan tantangan lain yang dihadapi oleh tim Ilmu Data, lihat blog teknologi perusahaan.

Laporan dengan bias seperti itu - penggunaan algoritma pembelajaran mesin dalam proyek non-standar nyata - kami hanya mencari UseData Conf . Berikut ini lebih banyak tentang bidang yang paling menarik bagi kami.

Kirim aplikasi jika Anda tahu cara mengerjai model sehingga mereka dapat terbang. Jika Anda tahu bahwa konvergensi tidak menjamin kecepatan, dan siap memberi tahu Anda apa yang lebih penting untuk diperhatikan, kami menunggu Anda pada 16 September.

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


All Articles