Hanya beberapa hari yang lalu, Aurorai memindahkan sistem deteksi cacat dan pemantauan troli untuk lokomotif Ermak ke operasi percobaan. Tugasnya adalah non-sepele dan sangat menarik, langkah pertama adalah menilai kondisi bantalan rem dan lebar brace. Kami berhasil menyelesaikan masalah dengan akurasi 1 mm pada kecepatan lokomotif hingga 30 km / jam! Saya ingin mencatat bahwa karena spesifikasinya, dimungkinkan untuk menggunakan
"TTA (test-time augmentation)" - contoh nyata peretasan kompetisi gaya-kaggle yang tidak sesuai dengan segmentasi prod dan semantik berdasarkan pada
encoder se_resnext50 , yang memberikan hasil yang luar biasa akurat dalam prediksi topeng .
Deskripsi tugasPenting untuk membuat kompleks perangkat keras-lunak untuk mendeteksi cacat bantalan rem dan output data ke mandor shift.
Prasyarat untuk tugas ituTernyata, sejumlah besar bantalan, sekitar 80%, perubahan PTOL (titik inspeksi teknis lokomotif), dan ini terjadi setiap 72 jam untuk setiap lokomotif. Sebagian besar cek di PTOL adalah inspeksi visual oleh master bagian eksternal dari kereta lokomotif.
Rencanakan untuk memecahkan masalah:- Pemilihan peralatan
- Pengumpulan data
- Pelatihan model
- Pengembangan Server dengan REST API
- Pengembangan klien tablet Android
- Desain dan perakitan rak untuk penempatan kamera dan cahaya
- Operasi percobaan
Pemilihan peralatanMungkin salah satu yang paling sulit, jika bukan yang paling sulit, tugas adalah memilih kamera, lensa dan cahaya dalam anggaran dan waktu terbatas: MVP harus dilakukan dalam satu setengah bulan. Dalam beberapa hari, Google menjadikan saya ahli perangkat keras untuk visi mesin. Pilihan dibuat pada kamera
Basler dan lampu latar berdenyut 6k lumens, disinkronkan dengan kamera. Dalam mendukung Basler (70 frame / detik, resolusi hingga 1920x1024), API python-nya berbicara, yang sangat memudahkan integrasi semua komponen sistem, satu-satunya negatif adalah harga kamera ~ 100 tr.
Pilihan lensa untuk kamera menjadi rumit karena kurangnya pemahaman akan panjang fokus dan sudut pandang yang diperlukan, saya harus mengambil risiko, tetapi saya mengeluarkan kalkulator lensa dan sedikit keberuntungan.
Lampu latar: waktu yang diperlukan agar LED menyala, jenisnya, dan parameter lensa dibuat secara eksperimental. Saya mencoba 3 modifikasi lensa berbeda untuk LED, dengan sudut 30, 45, 60, akhirnya memilih lensa matte dengan sudut 45.


Merakit dan menguji sinyal kontrol pulsa untuk kamera

Untuk perangkat keras server, saya mengambil Intel Core i7-7740X Kaby Lake, 46gb RAM, 1 TB SSD, dan 3x1080Ti - ini cukup untuk memprediksi dua lokomotif 3-bagian dalam waktu tidak lebih dari 2 menit.
Pertanian kolektif pendinginan sandwich dari kartu video berhembus 10 derajat.
Pengumpulan dataMembuat dataset adalah lagu yang terpisah, tidak ada yang bisa dipercayakan dengan acara ini, dan karena itu saya dikirim ke kota yang tidak dikenal di kejauhan tanah air kami yang luas. Saya memotret sekitar 400 pembalut di
ponsel saya
(!!!) . Ke depan, saya akan mengatakan bahwa karyawan depot yang gagah berani, yang tampaknya ketakutan oleh auditor dari Moskow, mengganti semua bantalan pada lokomotif menjadi yang benar-benar baru dan melukisnya dengan lapisan cat baru, lucu dan menakutkan untuk melihatnya. Saya menantikan yang terburuk, meskipun masih ada sekitar 400 foto blok yang sama sekali berbeda yang saya buat di depot Moskow.
Hanya tetap percaya pada keajaiban, tumpukan augmentasi, muncul dengan heuristik untuk menghapus segmen yang salah, yang ada banyak, karena saya tidak berpikir tentang anti-contoh.
Menunggu:

Realitas:


Di sini harus dikatakan bahwa tidak ada satu pun contoh balok yang sangat aus.
Pelatihan modelModel dengan encoder se_resnext50 dan decoder dengan blok
scse dari repositori
ini menunjukkan yang terbaik, tetapi
scse (implementasi untuk pytorch) harus dihapus karena alasan mempercepat proses prediksi, karena harus diprediksi dalam satu menit. Untuk pelatihan model, kerangka
Pytorch 1.0.1 digunakan , dengan sejumlah besar penambahan dari
albumentations dan augmentasi Horizontal Flip yang ditulis sendiri untuk mengubah kelas saat ditampilkan.
def train_transform(p=1): return Compose([ OneOf([ CLAHE(clip_limit=2), IAASharpen(), IAAEmboss(), RandomBrightnessContrast(brightness_limit=0.8, contrast_limit=0.8), HueSaturationValue(hue_shift_limit=50, sat_shift_limit=50, val_shift_limit=50), RGBShift(r_shift_limit=50, g_shift_limit=50, b_shift_limit=50), JpegCompression(quality_lower=30), RandomGamma(), GaussNoise() ], p=0.3), OneOf([ Blur(), MotionBlur(), MedianBlur(), ], p=0.3), ShiftScaleRotate(shift_limit=0.2, scale_limit=0.4, rotate_limit=5, p=0.5), Normalize(p=1) ], p=p)
Sebagai fungsi kerugian, saya memilih
kerugian Lovรกsz-Softmax , berperilaku hampir sama dengan SM + jaccard, tetapi lebih baik daripada
BCE , yang cocok terlalu banyak pada markup. Pilihan algoritme untuk menentukan nomor seri sepasang roda dan balok juga merupakan tantangan, ada pilihan dengan
pembelajaran metrik , tetapi saya perlu segera menunjukkan hasilnya, dan gagasan itu datang untuk menandai blok di kelas 1 dan 2, di mana 1 adalah orientasi ke kanan, dan 2 adalah ke kiri. Jaringan mulai memprediksi tidak hanya topeng, tetapi juga orientasi. Dengan menggunakan heuristik sederhana, adalah mungkin untuk menentukan nomor seri balok dan roda secara andal, kemudian rata-rata prediksi, pada kenyataannya, menggunakan TTA dengan sedikit pergeseran objek selama gerakan dan sudut pencahayaan yang berbeda memberikan hasil yang baik dalam akurasi topeng bahkan pada resolusi 320x320.
Secara terpisah, tugasnya adalah menentukan cacat balok berbentuk baji, ada banyak ide dari
Huff Transformation , untuk menandai sudut / batas blok dengan titik / garis kelas yang berbeda. Pada akhirnya, opsi menang atas bagaimana pekerja melakukannya: Anda harus mundur 5 cm dari tepi sempit dan mengukur lebar, jika itu dalam kisaran normal, lalu lewati blok.
Pipa pelatihan diambil dari sini oleh
Segmentasi Instrumen Robot MICCAI 2017 . Proses pelatihan terdiri dari tiga tahap: pelatihan dengan encoder beku, pelatihan seluruh jaringan dan pelatihan dengan
CosineAnnealingLR . Dua tahap pertama menggunakan
ReduceLROnPlateau .
Memprogram server dan klien REST di AndroidUntuk server REST, saya memilih termos - lebih mudah untuk tidak memulai peluncuran dalam 2 menit. Saya memutuskan untuk membuat database untuk penyimpanan dengan tangan saya sendiri dalam bentuk struktur folder sederhana dan file status saat ini. Aplikasi untuk tablet di Android Studio, manfaat dari versi terbaru hanyalah surga bagi pengembang.
Desain dan perakitan rak untuk penempatan kamera dan cahayaSaya ingat masa lalu ketika saya membuat stasiun pengisian untuk kendaraan listrik, dan pengalaman ini sangat berguna - kami memutuskan untuk membuatnya dari rak aluminium struktural yang dicetak pada printer 3D.

Mulai tes!Hasilnya melebihi semua harapan. Untuk spesialis penglihatan komputer, tugas itu mungkin tampak cukup mudah dan sederhana. Namun, saya punya beberapa keraguan karena dua hal: pertama, set pelatihan kecil dan tidak mengandung kasus batas seperti blok yang sangat tipis; kedua, pengujian berlangsung dalam kondisi pemotretan dan pencahayaan yang sangat berbeda.

Jaccard pada validasi mencapai 0,96, secara visual bantalan tersegmentasi dengan sangat jelas, menambah rata-rata beberapa foto dan mendapatkan akurasi yang sangat baik dalam memperkirakan lebar bantalan. Selama tes, ternyata Anda dapat bekerja dengan gerobak lokomotif lain, tetapi mengambil kamera lebih cepat:


Sebagai kesimpulan, saya ingin mengatakan bahwa teknologi telah menunjukkan dirinya dengan sangat baik dan, menurut pendapat saya, memiliki potensi besar dalam hal menghilangkan faktor manusia, mengurangi downtime lokomotif dan membuat perkiraan.
Ucapan Terima KasihTerima kasih kepada komunitas
ods.ai , tanpa bantuan Anda, saya tidak akan dapat melakukan semua ini dalam waktu yang singkat! Terima kasih banyak kepada
n01z3 , DL, yang berharap agar saya menerima DL, atas nasihatnya yang tak ternilai dan profesionalisme yang luar biasa! Terima kasih banyak kepada dalang ideologis Vasily Manko (CEO, perusahaan Aurorai), desainer terbaik Tatyana Brusova.
Sampai jumpa di episode selanjutnya dari kisah ini!
Aurorai, llc