Klasifikasi gambar tulisan tangan. Laporan ing Yandex

Sawetara sasi kepungkur, kolega kita saka Google ngginakaken ing Kaggle kompetisi kanggo nggawe classifier kanggo gambar dijupuk ing sensational ing game "Cepet, Draw!" Tim kasebut, kalebu pangembang Yandex Roman Vlasov, njupuk papan kaping papat ing kompetisi kasebut. Ing latihan machine learning Januari, Roman nuduhake gagasan tim, implementasi final saka classifier, lan laku menarik saka mungsuh.


- Halo kabeh! Jenengku Roma Vlasov, dina iki aku bakal ngandhani sampeyan babagan Cepet, Draw! Tantangan Pangenalan Doodle.

Klasifikasi gambar tulisan tangan. Laporan ing Yandex

Ana limang wong ing tim kita. Aku melu pas sadurunge deadline gabungan. Kita padha apes, kita padha gonjang-ganjing sethitik, nanging kita guncang saka posisi dhuwit, lan padha guncang saka posisi emas. Lan kita njupuk Panggonan papat terhormat.

(Sajrone kompetisi, tim kasebut ngati-ati dhewe ing rating, sing dibentuk adhedhasar asil sing ditampilake ing salah sawijining bagean saka set data sing diusulake. Rating pungkasan, sabanjure, dibentuk ing bagean liya saka dataset. Iki rampung supaya sing peserta kompetisi ora nyetel algoritma kanggo data tartamtu Mulane, ing final, nalika ngoper antarane ratings, posisi goyang-goyang sethitik (saka Inggris goyang munggah - kanggo nyampur): ing data liyane, asil bisa dadi metu. dadi beda. Tim Roman pisanan ana ing telung ndhuwur. Ing kasus iki, telu paling dhuwur yaiku dhuwit, zona peringkat moneter, amarga mung telung panggonan pisanan sing dianugerahi hadiah awis. Sawise shake-up, tim wis mlebu Panggonan papat. Kanthi cara sing padha, tim liyane ilang kamenangan, posisi emas. - Ed.)

Klasifikasi gambar tulisan tangan. Laporan ing Yandex

Kompetisi kasebut uga penting amarga Evgeniy Babakhnin nampa grandmaster, Ivan Sosin nampa master, Roman Soloviev tetep dadi grandmaster, Alex Parinov nampa master, aku dadi ahli, lan saiki aku wis dadi master.

Klasifikasi gambar tulisan tangan. Laporan ing Yandex

Apa iki Cepet, Draw? Iki layanan saka Google. Google duwe tujuan kanggo mempopulerkan AI lan kanthi layanan iki pengin nuduhake cara kerja jaringan saraf. Sampeyan menyang kana, klik Ayo tarik, lan kaca anyar njedhul munggah ngendi sampeyan marang: tarik zigzag, sampeyan duwe 20 detik kanggo nindakake iki. Sampeyan nyoba nggambar zigzag ing 20 detik, kaya ing kene, umpamane. Yen sampeyan kasil, jaringan ngandika iku zigzag lan sampeyan nerusake. Ana mung enem gambar kuwi.

Yen jaringan Google gagal ngenali apa sing sampeyan gambar, salib dilebokake ing tugas kasebut. Mengko aku bakal pitutur marang kowe apa tegese ing mangsa apa drawing dikenali dening jaringan utawa ora.

Layanan iki nglumpukake pangguna sing cukup akeh, lan kabeh gambar sing digambar pangguna dicathet.

Klasifikasi gambar tulisan tangan. Laporan ing Yandex

Kita bisa ngumpulake meh 50 yuta gambar. Saka iki, tanggal sepur lan tes kanggo kompetisi kita dibentuk. Miturut cara, jumlah data ing tes lan jumlah kelas disorot kanthi kandel kanthi alesan. Aku bakal nyritakake babagan dheweke mengko.

Wujudipun data kados ing ngandhap menika. Iki ora mung gambar RGB, nanging, kira-kira, log kabeh sing ditindakake pangguna. Tembung minangka target kita, kode negara asal saka penulis doodle, stempel wektu yaiku wektu. Label sing diakoni mung nuduhake manawa jaringan ngenali gambar kasebut saka Google utawa ora. Lan gambar kasebut minangka urutan, perkiraan kurva sing digambar dening pangguna kanthi titik. Lan timing. Iki wektu saka wiwitan nggambar gambar.

Klasifikasi gambar tulisan tangan. Laporan ing Yandex

Data ditampilake ing rong format. Iki minangka format pisanan, lan sing kapindho disederhanakake. Dheweke ngethok wektu saka ing kono lan ngira-ngira titik kasebut kanthi titik sing luwih cilik. Kanggo iki padha digunakake Algoritma Douglas-Pecker. Sampeyan duwe set gedhe saka titik sing mung kira-kira garis lurus, nanging nyatane sampeyan bisa kira-kira baris iki mung rong titik. Iki minangka gagasan algoritma.

Data kasebut disebarake kaya ing ngisor iki. Kabeh iku seragam, nanging ana sawetara outliers. Nalika kita ngatasi masalah, kita ora katon ing. Wangsulan: Bab ingkang utama iku ora ana kelas sing tenan sawetara, kita ora kudu nindakake samplers bobot lan oversampling data.

Klasifikasi gambar tulisan tangan. Laporan ing Yandex

Apa gambar-gambar kasebut katon? Iki kelas "pesawat" lan conto saka iku karo label dikenali lan ora dikenali. Rasio kasebut ana ing sekitar 1 nganti 9. Nalika sampeyan bisa ndeleng, data kasebut cukup rame. Aku bakal guess iku pesawat. Yen katon ing ora dikenali, ing paling kasus iku mung gangguan. Malah ana sing nyoba nulis "pesawat", nanging katon ing basa Prancis.

Umume peserta mung njupuk kothak, nggambar data saka urutan garis iki minangka gambar RGB, lan dibuwang menyang jaringan. Aku nggambar kanthi cara sing padha: Aku njupuk palet warna, nggambar garis pertama kanthi siji warna, sing ana ing wiwitan palet iki, baris pungkasan karo liyane, sing ana ing mburi palet, lan ing antarane. Aku interpolasi nang endi wae nggunakake palet iki. Miturut cara, iki menehi asil sing luwih apik tinimbang yen sampeyan nggambar ing slide pisanan - mung ireng.

Anggota tim liyane, kayata Ivan Sosin, nyoba pendekatan sing rada beda kanggo nggambar. Kanthi saluran siji dheweke mung nggambar gambar abu-abu, karo saluran liyane dheweke nggambar saben stroke kanthi gradien saka wiwitan nganti pungkasan, saka 32 nganti 255, lan saluran katelu dheweke nggambar gradien ing kabeh stroke saka 32 nganti 255.

Bab liyane sing menarik yaiku Alex Parinov ngunggah informasi menyang jaringan nggunakake kode negara.

Klasifikasi gambar tulisan tangan. Laporan ing Yandex

Metrik sing digunakake ing kompetisi yaiku Mean Average Precision. Apa inti saka metrik iki kanggo kompetisi? Sampeyan bisa menehi telung prediksi, lan yen ora ana prediksi sing bener ing telung iki, sampeyan entuk 0. Yen ana sing bener, mula urutane dianggep. Lan asil target bakal diitung minangka 1 dibagi miturut urutan prediksi sampeyan. Contone, sampeyan nggawe telung prediktor, lan sing bener yaiku sing pisanan, banjur dibagi 1 karo 1 lan entuk 1. Yen prediktor bener lan urutane 2, banjur dibagi 1 karo 2, sampeyan entuk 0,5. Inggih, lsp.

Klasifikasi gambar tulisan tangan. Laporan ing Yandex

Kanthi preprocessing data - cara nggambar gambar lan liya-liyane - kita wis mutusake sethithik. Apa arsitektur sing kita gunakake? Kita nyoba nggunakake arsitektur lemak kayata PNASNet, SENet, lan arsitektur sing wis klasik kaya SE-Res-NeXt, dheweke tambah akeh melu kompetisi anyar. Ana uga ResNet lan DenseNet.

Klasifikasi gambar tulisan tangan. Laporan ing Yandex

Klasifikasi gambar tulisan tangan. Laporan ing Yandex

Klasifikasi gambar tulisan tangan. Laporan ing Yandex

Kepiye carane kita mulang babagan iki? Kabeh model sing dijupuk wis dilatih ing imagenet. Sanajan ana akeh data, 50 yuta gambar, nanging yen sampeyan njupuk jaringan sing wis dilatih ing imagenet, nuduhake asil sing luwih apik tinimbang yen sampeyan mung nglatih saka awal.

Teknik piwulang apa sing kita gunakake? Iki Cosing Annealing karo Warm Restart, sing bakal dakkandhakake mengko. Iki minangka teknik sing aku gunakake ing meh kabeh kompetisi anyarku, lan karo dheweke ternyata bisa nglatih grid kanthi apik, kanggo entuk minimal sing apik.

Klasifikasi gambar tulisan tangan. Laporan ing Yandex

Sabanjure Ngurangi Tingkat Sinau ing Plateau. Sampeyan miwiti latihan jaringan, nyetel tingkat learning tartamtu, terus mulang, lan mundhut mboko sithik converges menyang nilai tartamtu. Sampeyan mriksa iki, contone, kanggo sepuluh epochs mundhut ora diganti ing kabeh. Sampeyan nyuda tingkat sinau kanthi sawetara nilai lan terus sinau. Iku irungnya sethitik maneh, converges ing sawetara minimal, lan maneh mudhun tingkat learning, lan ing, nganti jaringan pungkasanipun converges.

Sabanjure yaiku teknik sing menarik: Aja nyuda tingkat sinau, tambah ukuran batch. Ana artikel kanthi jeneng sing padha. Nalika sampeyan nglatih jaringan, sampeyan ora kudu nyuda tingkat sinau, sampeyan mung bisa nambah ukuran batch.

Teknik iki, kanthi cara, digunakake dening Alex Parinov. Dheweke miwiti kanthi batch sing padha karo 408, lan nalika jaringan tekan sawetara dataran tinggi, dheweke mung tikel kaping pindho ukuran batch, etc.

Nyatane, aku ora ngelingi apa regane ukuran batch, nanging sing menarik yaiku ana tim ing Kaggle sing nggunakake teknik sing padha, ukuran batch kira-kira 10000. Miturut cara, kerangka modern kanggo sinau jero, kayata PyTorch, umpamane, ngidini sampeyan nindakake iki kanthi gampang. Sampeyan ngasilake batch lan ngirim menyang jaringan ora kaya saiki, nanging dibagi dadi potongan-potongan supaya pas karo kertu video, ngitung gradien, lan sawise sampeyan ngetung gradien kanggo kabeh batch, nganyari bobote.

Miturut cara, ukuran batch gedhe isih kalebu ing kompetisi iki, amarga data cukup rame, lan ukuran batch gedhe mbantu sampeyan ngira-ngira gradien kanthi luwih akurat.

Pseudo-labeling uga digunakake, biasane digunakake dening Roman Soloviev. Panjenenganipun sampel babagan setengah data saka test ing kumpulan, lan dilatih kothak ing kumpulan kuwi.

Ukuran gambar kasebut penting, nanging nyatane sampeyan duwe data akeh, sampeyan kudu nglatih nganti suwe, lan yen ukuran gambar sampeyan cukup gedhe, mula sampeyan bakal nglatih nganti suwe. Nanging iki ora nambah akeh kanggo kualitas classifier final, supaya iku worth nggunakake sawetara jenis trade-off. Lan kita mung nyoba gambar sing ukurane ora gedhe banget.

Kepiye carane kabeh sinau? Pisanan, gambar ukuran cilik dijupuk, sawetara epochs ditindakake, iki njupuk wektu sing cukup suwe. Banjur diwenehi gambar ukuran gedhe, jaringan dilatih, banjur luwih akeh, supaya ora nglatih saka awal lan ora mbuwang akeh wektu.

Babagan optimizers. Kita nggunakake SGD lan Adam. Ing cara iki bisa kanggo njaluk model siji, kang menehi kacepetan 0,941-0,946 ing leaderboard umum, kang cukup apik.

Yen sampeyan nggawe model ing sawetara cara, sampeyan bakal entuk sekitar 0,951. Yen sampeyan nggunakake teknik liyane, sampeyan bakal entuk skor pungkasan 0,954 ing papan umum, kaya sing kita entuk. Nanging luwih ing mengko. Sabanjure aku bakal pitutur marang kowe carane kita nglumpuk model, lan carane kita bisa kanggo entuk kacepetan final.

Sabanjure aku arep ngomong babagan Cosing Annealing karo Wiwiti maneh Anget utawa Stochastic Gradient Descent karo Warm Restart. Kira-kira, ing asas, sampeyan bisa nggunakake sembarang optimizer, nanging titik iki: yen sampeyan mung nglatih siji jaringan lan mboko sithik converges kanggo sawetara minimal, banjur kabeh iku oke, sampeyan bakal entuk siji jaringan, nggawe kesalahan tartamtu, nanging sampeyan bisa nglatih rada beda. Sampeyan bakal nyetel sawetara tingkat sinau awal, lan mboko sithik mudhun miturut rumus iki. Sampeyan ngedhunake, jaringan sampeyan tekan sawetara minimal, banjur sampeyan nyimpen bobot, lan maneh nyetel tingkat learning sing ana ing wiwitan latihan, saéngga munggah nang endi wae saka minimal iki, lan maneh Mudhunake tingkat learning.

Mangkono, sampeyan bisa ngunjungi sawetara minimal bebarengan, kang mundhut bakal, plus utawa minus, padha. Nanging kasunyatane yaiku jaringan kanthi bobot kasebut bakal menehi kesalahan sing beda ing tanggal sampeyan. Kanthi rata-rata, sampeyan bakal entuk sawetara perkiraan, lan kacepetan sampeyan bakal luwih dhuwur.

Klasifikasi gambar tulisan tangan. Laporan ing Yandex

Babagan carane kita ngumpulake model kita. Ing awal presentation, Aku ngandika mbayar manungsa waé kanggo jumlah data ing test lan nomer kelas. Yen sampeyan nambah 1 kanggo nomer Doel ing pesawat test lan dibagi dening nomer kelas, sampeyan bakal entuk nomer 330, lan iki ditulis ing forum - sing kelas ing test imbang. Iki bisa digunakake.

Adhedhasar iki, Roman Soloviev nggawe metrik, sing diarani Proxy Score, sing ana hubungane karo papan peringkat. Intine: sampeyan nindakake prediksi, njupuk 1 ndhuwur prediktor sampeyan lan ngitung jumlah obyek kanggo saben kelas. Sabanjure, nyuda 330 saka saben nilai lan tambahake nilai absolut sing diasilake.

Nilai ing ngisor iki dipikolehi. Iki mbantu kita ora nggawe leaderboard probing, nanging kanggo validasi lokal lan pilih koefisien kanggo ensembles kita.

Kanthi gamelan sampeyan bisa entuk kacepetan kasebut. Apa maneh sing bisa daklakoni? Upamane sampeyan nggunakake informasi yen kelas ing tes sampeyan seimbang.

Balancing kasebut beda. Conto salah sijine - imbangan saka wong lanang sing njupuk Panggonan pisanan.

Apa sing kita lakoni? Balancing kita cukup prasaja, disaranake dening Evgeny Babakhnin. Kita pisanan ngurutake prediksi miturut 1 ndhuwur lan milih calon saka wong-wong mau - supaya jumlah kelas ora ngluwihi 330. Nanging kanggo sawetara kelas, sampeyan bakal duwe prediktor kurang saka 330. Oke, ayo diurutake miturut 2 ndhuwur lan 3 sing paling dhuwur. , lan kita uga bakal milih calon.

Kepiye imbangan kita beda karo imbangan sing sepisanan? Dheweke nggunakake pendekatan iteratif, njupuk kelas sing paling populer lan nyuda kemungkinan kelas kasebut kanthi jumlah cilik nganti kelas kasebut ora ana maneh sing paling populer. We njupuk kelas paling populer sabanjuré. Mula banjur padha ngedhunake nganti cacahe kabeh golongane padha.

Saben uwong nggunakake pendekatan plus utawa minus siji kanggo nglatih jaringan, nanging ora kabeh wong nggunakake imbangan. Nggunakake imbangan, sampeyan bisa pindhah menyang emas, lan yen ana begja, banjur menyang dhuwit.

Carane preprocessing tanggal? Saben uwong preprocessed tanggal, plus utawa minus, ing cara sing padha - nggawe fitur handcrafted, nyoba kanggo encode timing karo werna stroke beda, etc Alexey Nozdrin-Plotnitsky, sing njupuk Panggonan 8, ngandika bab iki.

Klasifikasi gambar tulisan tangan. Laporan ing Yandex

Dheweke nindakake kanthi beda. Dheweke ujar manawa kabeh fitur buatan tangan sampeyan ora bisa digunakake, sampeyan ora perlu nglakoni, jaringan sampeyan kudu sinau kabeh iki dhewe. Lan tinimbang, dheweke nggawe modul sinau sing wis ngolah data sampeyan. Dheweke mbuwang data asli menyang wong-wong mau tanpa preprocessing - titik koordinat lan wektu.

Banjur njupuk prabédan adhedhasar koordinat, lan rata-rata kabeh adhedhasar wektu. Lan dheweke teka karo matriks sing rada dawa. Dheweke ngetrapake konvolusi 1D kaping pirang-pirang kanggo entuk matriks ukuran 64xn, ing ngendi n minangka jumlah total poin, lan 64 digawe kanggo menehi feed matriks sing diasilake menyang lapisan jaringan konvolusional, sing nampa jumlah saluran. - 64. dheweke entuk matriks 64xn, banjur saka iki perlu kanggo nggawe tensor sawetara ukuran supaya jumlah saluran padha karo 64. Dheweke normalake kabeh titik X, Y ing sawetara saka 0 kanggo 32 kanggo nggawe a tensor ukuran 32x32. Aku ora ngerti apa kang wanted 32x32, iku mung kedaden. Lan ing koordinat iki diselehake pecahan saka matriks ukuran 64xn. Dadi mung rampung karo tensor 32x32x64 sing bisa dilebokake ing jaringan saraf convolutional sampeyan. Mung kuwi sing dakkandhakake.

Source: www.habr.com

Add a comment