Saya mengerti, itu berarti saya ada: ulasan tentang Deep Learning in Computer Vision (bagian 2)

Kami terus memahami sihir modern (visi komputer). Bagian 2 tidak berarti bahwa Anda harus membaca bagian 1 dulu. Bagian 2 berarti bahwa sekarang semuanya serius - kami ingin memahami kekuatan penuh jaringan saraf dalam penglihatan. Deteksi, pelacakan, segmentasi, penilaian postur, pengenalan tindakan ... Arsitektur paling modis dan paling keren, ratusan lapisan dan puluhan ide cemerlang sudah menunggu Anda di bawah potongan!



Di seri terakhir


Biarkan saya mengingatkan Anda bahwa pada bagian pertama kita berkenalan dengan jaringan saraf convolutional dan visualisasi mereka, serta dengan tugas-tugas mengklasifikasikan gambar dan membangun representasi efektif mereka (embeddings). Kami bahkan mendiskusikan tugas pengenalan wajah dan identifikasi ulang orang.

Bahkan di artikel sebelumnya kita berbicara tentang berbagai jenis arsitektur (ya, tablet yang sama yang saya buat sebulan ), dan di sini Google tidak membuang waktu: mereka merilis lagi arsitektur EfficientNet yang sangat cepat dan akurat. Mereka membuatnya menggunakan NAS dan prosedur Penskalaan Senyawa khusus. Lihat artikelnya , itu sangat berharga.


Sementara itu, beberapa peneliti menghidupkan wajah dan mencari ciuman di film , kita akan menghadapi masalah yang lebih mendesak.

Di sini orang mengatakan: "pengenalan gambar". Tapi apa itu "pengakuan"? Apa itu "pemahaman (adegan)"? Menurut pendapat saya, jawaban atas pertanyaan-pertanyaan ini tergantung pada apa yang ingin kita “kenali”, dan apa yang ingin kita “pahami”. Jika kita membangun Kecerdasan Buatan, yang akan mengekstraksi informasi tentang dunia dari aliran visual seefisien (atau bahkan lebih baik) seperti orang, maka kita perlu beralih dari tugas, dari kebutuhan. Secara historis, "pengakuan" dan "pemahaman tentang adegan" modern dapat dibagi menjadi beberapa tugas spesifik: klasifikasi, deteksi, pelacakan, evaluasi postur dan titik wajah, segmentasi, pengenalan tindakan pada video dan deskripsi gambar dalam teks. Artikel ini akan fokus pada dua tugas pertama dari daftar (up, spoiler dari bagian ketiga), jadi rencana saat ini adalah ini:

  1. Temukan saya jika Anda dapat: deteksi objek
  2. Deteksi Wajah: Tidak Tertangkap - Bukan Pencuri
  3. Banyak surat: deteksi teks (dan pengenalan)
  4. Video dan pelacakan: dalam satu aliran

Ayo bergoyang, superstar!

Temukan saya jika Anda dapat: deteksi objek



Jadi, tugasnya terdengar sederhana - gambar diberikan, Anda perlu menemukan objek dari kelas yang sudah ditentukan di atasnya (seseorang, buku, apel, bassis-griffon artesis-Norman, dll.). Untuk mengatasi masalah ini dengan bantuan jaringan saraf, kami mengajukannya dalam hal tensor dan pembelajaran mesin.

Kita ingat bahwa gambar berwarna adalah tensor (H, W, 3) (jika kita tidak ingat, yaitu, bagian 1 ). Sebelumnya, kami hanya tahu cara mengklasifikasikan seluruh gambar, tetapi sekarang tujuan kami adalah memprediksi posisi objek yang menarik (koordinat piksel) dalam gambar dan kelas mereka.

Gagasan utama di sini adalah menyelesaikan dua masalah sekaligus - klasifikasi dan regresi. Kami menggunakan jaringan saraf untuk mundur koordinat dan mengklasifikasikan objek di dalamnya.

Klasifikasi? Regresi?
Biarkan saya mengingatkan Anda bahwa kita berbicara tentang tugas pembelajaran mesin. Dalam masalah klasifikasi , label kelas bertindak sebagai kualitas label sebenarnya untuk objek, dan kami memprediksi kelas objek. Dalam masalah regresi , bilangan real adalah bilangan real , dan kami memperkirakan jumlahnya (misalnya: berat, tinggi, gaji, jumlah karakter yang mati dalam seri Game of Thrones berikutnya ...). Lebih detail - Anda dipersilakan untuk kuliah ke-3 DLSchool (FPMI MIPT) .

Tetapi koordinat objek, secara umum, dapat diformalkan dengan cara yang berbeda, dalam DL ada tiga cara utama: deteksi ( kotak objek), evaluasi postur (titik kunci objek) dan segmentasi ("topeng" objek). Sekarang mari kita bicara tentang memprediksi kotak , titik, dan segmentasi yang tepat terikat akan lebih jauh dalam teks.


Pada dasarnya, kumpulan data deteksi ditandai dengan kotak dalam format: "koordinat sudut kiri atas dan kanan bawah untuk setiap objek di setiap gambar" (format ini juga disebut kiri atas, kanan bawah ), dan sebagian besar pendekatan jaringan saraf memprediksi koordinat ini.


Tentang kumpulan data dan metrik dalam masalah deteksi
Setelah menetapkan tugas, yang terbaik adalah melihat data apa yang tersedia untuk pelatihan dan metrik apa yang digunakan untuk mengukur kualitas. Inilah yang saya perlahan bicarakan di paruh pertama kuliah ke - 13 dari Deep Learning School (di x2.0 paling banyak).

Sebelum terjun ke jenis jaringan saraf untuk deteksi, mari kita pikirkan bersama bagaimana menyelesaikan masalah mendeteksi apa pun dalam gambar. Mungkin, jika kita ingin menemukan objek tertentu dalam gambar, maka kita secara kasar mengetahui bagaimana tampilannya dan area apa yang harus ditempati dalam gambar (meskipun itu dapat berubah).

Menemukan deteksi dari awal
Pendekatan naif dan paling sederhana adalah dengan membuat algoritma "pencarian templat": biarkan gambar menjadi 100x100 piksel, dan kami sedang mencari bola sepak. Biarkan ada pola bola 20x20 piksel. Ambil templat ini dan kami akan melewatinya seperti konvolusi di seluruh gambar, menghitung perbedaan pixel-per-pixel. Inilah cara kerja pencocokan templat (beberapa jenis korelasi sering digunakan alih-alih perbedaan piksel demi piksel).

Jika tidak ada template, tetapi ada classifier jaringan saraf, maka kita bisa melakukan ini: kita akan pergi dengan jendela dengan ukuran tetap dalam gambar dan memprediksi kelas area saat ini dari gambar. Kemudian kita hanya mengatakan bahwa daerah yang paling memungkinkan dari objek adalah tempat di mana classifier menjawab dengan percaya diri. Dengan demikian, kita dapat memecahkan masalah fakta bahwa objek terlihat berbeda dalam penampilan secara berbeda (karena dilatih untuk mengklasifikasikan pada sampel yang sangat beragam).

Tapi kemudian muncul masalah - objek dalam gambar memiliki ukuran yang berbeda. Bola sepak yang sama bisa berada di seluruh ketinggian / lebar gambar, atau bisa jauh di tujuan, hanya mengambil 10-20 piksel dari 1000. Saya ingin menulis algoritma Brute Force: kami hanya mengulang ukuran jendela. Misalkan kita memiliki 100x200 piksel, maka kita akan pergi ke jendela 2x2, 2X3, 3x2, 2x4, 4x2, 3x3 ..., 3x4, 4x3 ... Saya pikir Anda mengerti bahwa jumlah jendela yang mungkin adalah 100 * 200, dan masing-masing akan kita lewati gambarnya , melakukan operasi klasifikasi (100-W_window) * (200 - H_window), yang membutuhkan banyak waktu. Saya khawatir kami tidak akan menunggu sampai algoritma seperti itu bekerja.

Anda dapat, tentu saja, memilih jendela paling karakteristik tergantung pada objek, tetapi juga akan bekerja untuk waktu yang sangat lama, dan jika cepat, itu tidak mungkin tepat - dalam aplikasi nyata akan ada sejumlah variasi dalam ukuran objek dalam gambar.

Lebih jauh, saya kadang-kadang akan mengandalkan review baru dari area deteksi mulai Januari 2019 (gambar juga akan berasal dari sana). Ini hanya harus dibaca jika Anda ingin dengan cepat mendapatkan tampilan seluas mungkin di deteksi DL.

Salah satu artikel pertama tentang deteksi dan lokalisasi menggunakan CNN adalah Overfeat . Para penulis mengklaim bahwa mereka pertama kali menggunakan jaringan saraf untuk deteksi di ImageNet, merumuskan kembali masalah dan mengubah kerugian. Pendekatannya, omong-omong, hampir end-to-end (di bawah ini adalah skema Overfeat).


Arsitektur penting berikutnya adalah Convolutional Neural Network ( RCNN ) berbasis Wilayah , yang ditemukan oleh para peneliti dari FAIR pada tahun 2014. Esensinya adalah bahwa ia pertama kali memprediksi banyak yang disebut "wilayah minat" (RoI's), di dalamnya berpotensi ada objek (menggunakan algoritma Pencarian Selektif), dan mengklasifikasikannya dan memperbaiki koordinat kotak menggunakan CNN.


Benar, pipa semacam itu membuat seluruh sistem melambat, karena kami menjalankan setiap wilayah melalui jaringan saraf (kami maju melewati ribuan kali). Setahun kemudian, FAIR Ross Girshick yang sama meningkatkan RCNN ke Fast-RCNN . Di sini idenya adalah untuk menukar Pencarian Selektif dan prediksi jaringan: pertama, kami melewati seluruh gambar melalui jaringan saraf yang telah dilatih sebelumnya, dan kemudian kami memperkirakan wilayah yang diminati atas fitur-peta yang dikeluarkan oleh jaringan backbone (misalnya, menggunakan Pencarian Selektif yang sama, tetapi ada algoritma lain ). Itu masih sangat lambat, jauh lebih lambat dari waktu-nyata (untuk saat ini, kami menganggap bahwa waktu-nyata kurang dari 40 milidetik per gambar).


Kecepatan dipengaruhi terutama bukan oleh CNN, tetapi oleh algoritma pembuatan kotak itu sendiri, sehingga diputuskan untuk menggantinya dengan jaringan saraf kedua - Jaringan Proposal Wilayah ( RPN ), yang akan dilatih untuk memprediksi wilayah yang diminati objek. Beginilah Faster-RCNN muncul (ya, mereka jelas tidak memikirkan nama untuk waktu yang lama). Skema:


Lalu ada peningkatan lain dalam bentuk R-FCN , kami tidak akan membicarakannya secara detail, tetapi saya ingin menyebutkan Mask-RCNN . Mask-RCNN adalah yang unik, jaringan saraf pertama yang memecahkan masalah deteksi dan contoh segmentasi pada saat yang sama - itu memprediksi topeng yang tepat (siluet) dari objek di dalam kotak pembatas. Idenya sebenarnya cukup sederhana - ada dua cabang: untuk deteksi dan segmentasi, dan Anda perlu melatih jaringan untuk kedua tugas sekaligus. Yang utama adalah memiliki data yang ditandai. Mask-RCNN sendiri sangat mirip dengan Faster-RCNN: tulang punggungnya sama, tetapi pada akhirnya ada dua "kepala" (seperti lapisan terakhir dari jaringan saraf sering disebut) untuk dua tugas yang berbeda.


Inilah yang disebut pendekatan Dua Tahap (atau berbasis Wilayah ). Sejalan dengan mereka, analog dikembangkan dalam pendeteksian DL - pendekatan Satu Tahap . Ini termasuk jaringan saraf seperti: Single-Shot Detector (SSD), You Only Look Once (YOLO), Detektor Objek yang Sangat Diawasi (DSOD), Jaringan Block Field Reseptif (RFBNet) dan banyak lainnya (lihat peta di bawah, dari repositori ini ).


Pendekatan satu tahap, tidak seperti dua tahap, tidak menggunakan algoritma terpisah untuk menghasilkan kotak, tetapi cukup memprediksi beberapa kotak koordinat untuk setiap peta fitur yang dihasilkan oleh jaringan saraf convolutional. YOLO bertindak dengan cara yang sama, SSD sedikit berbeda, tetapi idenya sama: konvolusi 1x1 memprediksi banyak angka secara mendalam dari peta fitur yang diterima, namun kami sepakat sebelumnya berapa nomor artinya.



Sebagai contoh, kami memperkirakan dari fitur peta ukuran 13x13x256 adalah fitur peta 13x13x (4 * (5 + 80)) angka, di mana kami memperkirakan 85 angka untuk 4 kotak: 4 angka pertama dalam urutan selalu koordinat kotak, ke-5 - Keyakinan dalam tinju, dan 80 angka - probabilitas masing-masing kelas (klasifikasi). Ini diperlukan untuk kemudian menyerahkan angka-angka yang diperlukan untuk kerugian yang diperlukan dan melatih jaringan saraf dengan benar.


Saya ingin menarik perhatian pada fakta bahwa kualitas pekerjaan detektor tergantung pada kualitas jaringan saraf untuk mengekstraksi fitur (yaitu, jaringan saraf backbone ). Biasanya, peran ini dimainkan oleh salah satu arsitektur, yang saya bicarakan di artikel sebelumnya (ResNet, SENet, dll.), Tetapi kadang-kadang penulis membuat arsitektur mereka sendiri yang lebih optimal (misalnya, Darknet-53 di YOLOv3) atau modifikasi (misalnya, Feature Pyramid Pooling (FPN)).

Sekali lagi, saya perhatikan bahwa kami melatih jaringan untuk klasifikasi dan regresi secara bersamaan. Dalam komunitas, ini disebut kehilangan multi-tugas: jumlah kerugian untuk beberapa tugas (dengan beberapa koefisien) muncul dalam satu kehilangan.

Berita dengan Multitask Loss terkemuka
Di Machines Can See 2019, salah satu pembicara menggunakan multi-task loss untuk 7 tugas secara bersamaan , Carl . Ternyata beberapa tugas awalnya ditetapkan sebagai penyeimbang satu sama lain dan "konflik" ternyata, yang mencegah jaringan dari belajar lebih baik daripada jika dilatih untuk setiap tugas secara terpisah. Kesimpulan: jika Anda menggunakan multi-task loss, pastikan bahwa multi-task yang sama ini tidak bertentangan dengan pernyataan (misalnya, memprediksi batas-batas objek dan segmentasi internal mereka dapat saling mengganggu, karena hal-hal ini dapat mengandalkan tanda-tanda berbeda di dalam jaringan). Penulis mengelak dengan menambahkan blok Squeeze-and-Excitation terpisah untuk setiap tugas .

Baru-baru ini, artikel dari 2019 muncul di mana penulis menyatakan rasio kecepatan / akurasi yang lebih baik dalam tugas deteksi menggunakan prediksi kotak berbasis poin . Saya berbicara tentang artikel "Objects Points" dan "CornerNet-Lite" . ExtremeNet adalah modifikasi dari CornerNet. Tampaknya sekarang mereka dapat disebut SOTA dalam pendeteksian menggunakan jaringan saraf (tapi ini tidak akurat).


Jika tiba-tiba penjelasan saya tentang detektor masih tampak kacau dan tidak dapat dipahami, dalam video kami, saya membahasnya perlahan. Mungkin Anda harus melihatnya dulu.

Di bawah ini saya telah memberikan tabel jaringan saraf dalam pendeteksian dengan tautan ke kode dan deskripsi singkat dari chip masing-masing jaringan. Saya mencoba mengumpulkan hanya jaringan-jaringan yang benar-benar penting untuk diketahui (setidaknya ide-ide mereka) untuk mendapatkan ide yang bagus tentang deteksi objek hari ini:



Detektor jaringan saraf (satu tahap)


Detektor jaringan saraf (bermacam-macam)


Detektor jaringan saraf (berbasis titik)
TahunArtikelIde kunciKode
2019Centernetpendekatan baru untuk deteksi, yang memungkinkan untuk dengan cepat dan efisien menyelesaikan masalah menemukan titik, kotak dan kotak 3D secara bersamaanPytorch
2019Cornernetprediksi kotak berdasarkan pasangan titik sudutPytorch
2019CornerNet-Litecornernet dipercepatPytorch
2019ExtremeNetprediksi titik "ekstrim" objek (batas geometris akurat)Pytorch


Untuk memahami bagaimana kecepatan / kualitas setiap arsitektur berkorelasi, Anda dapat melihat ulasan ini atau versi yang lebih populer .

Arsitektur baik-baik saja, tetapi deteksi pada dasarnya adalah tugas praktis. "Tidak memiliki seratus jaringan, tetapi setidaknya ada 1 yang berfungsi" - ini adalah pesan saya. Ada tautan ke kode dalam tabel di atas, tetapi secara pribadi, saya jarang menemukan peluncur detektor langsung dari repositori (setidaknya dengan tujuan penyebaran lebih lanjut ke produksi). Paling sering, perpustakaan digunakan untuk ini, misalnya, TensorFlow Object Detection API (lihat bagian praktis dari pelajaran saya ) atau perpustakaan dari para peneliti dari CUHK . Saya membawa perhatian Anda ke meja-super lain (Anda menyukainya, kan?):

Perpustakaan untuk menjalankan model deteksi
JudulPenulisDeskripsiJaringan Saraf Tiruan yang DiimplementasikanKerangka kerja
DetectronPenelitian AI FacebookRepositori Facebook dengan berbagai kode model untuk mendeteksi dan mengevaluasi posturSemua berbasis wilayahCaffe2
API Deteksi Objek TFTim TensorFlowBanyak model yang siap digunakan (bobot diberikan)Semua Berbasis Wilayah dan SSD (dengan tulang punggung berbeda)Tensorflow
Darkflowterima kasihImplementasi YOLO dan YOLOv2 yang siap digunakanSemua tipe YOLO (dengan modifikasi) kecuali YOLOv3Tensorflow
mmdeteksiBuka MMLab (CUHK)Sejumlah besar detektor di PyTorch, lihat artikel merekaHampir semua model kecuali keluarga YOLOPytorch
Darknet (dimodifikasi)AlexABImplementasi yang mudah dari YOLOv3 dengan banyak perbaikan pada repositori asliYOLOv3C ++


Seringkali Anda perlu mendeteksi objek hanya dari satu kelas, tetapi spesifik dan sangat bervariasi. Misalnya, untuk mendeteksi semua wajah dalam foto (untuk verifikasi / penghitungan lebih lanjut orang), untuk mendeteksi seluruh orang (untuk identifikasi ulang / penghitungan / pelacakan) atau untuk mendeteksi teks pada adegan (untuk OCR / terjemahan kata-kata dalam foto). Secara umum, pendekatan deteksi "biasa" di sini akan bekerja sampai batas tertentu, tetapi masing-masing subtugas ini memiliki trik sendiri untuk meningkatkan kualitas.

Deteksi Wajah: Tidak Tertangkap - Bukan Pencuri



Beberapa kekhususan muncul di sini, karena wajah sering menempati bagian gambar yang cukup kecil. Plus, orang tidak selalu melihat kamera, seringkali wajah hanya terlihat dari samping. Salah satu pendekatan pertama untuk menghadapi pengakuan adalah detektor Viola-Jones yang terkenal berdasarkan kaskade Haar, ditemukan kembali pada tahun 2001.


Jaringan saraf tidak dalam mode saat itu, mereka masih tidak begitu kuat dalam penglihatan, namun, pendekatan kerajinan tangan yang baik melakukan tugasnya. Beberapa jenis masker filter khusus digunakan secara aktif di dalamnya, yang membantu untuk mengekstraksi daerah wajah dari gambar dan tanda-tanda mereka, dan kemudian tanda-tanda ini diserahkan ke pengklasifikasi AdaBoost. Omong-omong, metode ini benar-benar berfungsi dengan baik dan sekarang, ini cukup cepat dan mulai keluar dari kotak menggunakan OpenCV . Kelemahan dari pendeteksi ini adalah ia hanya melihat wajah-wajah yang dikerahkan di depan kamera. Seseorang hanya perlu berbalik sedikit dan stabilitas deteksi dilanggar.

Untuk kasus yang lebih kompleks, Anda dapat menggunakan dlib . Ini adalah C ++ - perpustakaan di mana banyak algoritma penglihatan diimplementasikan, termasuk untuk deteksi wajah.

Dari pendekatan jaringan saraf dalam deteksi wajah, Multi-task Cascaded CNN (MTCNN) ( MatLab , TensorFlow ) sangat signifikan. Secara umum, sekarang aktif digunakan (dalam facenet yang sama).


Gagasan MTCNN adalah menggunakan tiga jaringan saraf secara berurutan (oleh karena itu, sebuah "kaskade" ) untuk memprediksi posisi wajah dan titik-titik singularnya. Dalam hal ini, ada tepat 5 titik khusus pada wajah: mata kiri, mata kanan, tepi kiri bibir, tepi kanan bibir dan hidung. ( P-Net ) . ( R-Net ) — . ( O-Net ) , , 5 . Multi-task , : , / . MTCNN real-time, 40 ms .


, ArXiv ?
Dalam hal ini, saya sarankan mencoba membaca artikel asli tentang MTCNN , jika Anda sudah memiliki latar belakang dalam jaringan konvolusi. Artikel ini hanya membutuhkan 5 halaman , tetapi menetapkan semua informasi yang Anda butuhkan untuk memahami pendekatan. Cobalah, ini akan kencang :)

State-of-the-Art Dual Shot Face Detector (DSFD) FaceBoxes . FaceBoxes CPU (!), DSFD ( 2019 ). DSFD , MTCNN, ( dilated convolutions ), . , dilated convolutions . DSFD (, ?).


, , .

: ( )



. , , bounding box', ( ), . , , , recognition-, .

bounding box', , ( ). , , EAST- .



EAST- , , :

  1. Text Score Map' ( )

, ( ), . arxiv- :



( ) , : TextBoxes++ ( Caffe ) SegLinks , EAST, , .

, . — . , , , . , MORAN ( PyTorch ) ASTER ( TensorFlow ) .



- , : CNN RNN. , . MORAN': .


EAST', - , . , , .

, / . Spatial Transformet Network (STN) , (, , ). / STN.


STN , ( , ) PyTorch .

MORAN ( ) — , x y, , . rectification , ( rectifier' ). :


Namun, selain pendekatan pengenalan teks “modularly” (jaringan deteksi -> jaringan pengenalan), ada arsitektur ujung ke ujung: input adalah gambar, dan outputnya adalah deteksi dan teks dikenali di dalamnya. Dan semua ini adalah satu saluran pipa yang mempelajari kedua tugas sekaligus. Dalam arah ini, ada karya mengesankan Berorientasi Teks Bercak Cepat dengan Jaringan Terpadu ( FOTS ) ( kode PyTorch ), di mana penulis juga mencatat bahwa pendekatan end-to-end dua kali lebih cepat dari "deteksi + pengenalan". Di bawah ini adalah diagram jaringan saraf FOTS, peran khusus dimainkan oleh blok RoiRotate, karena itu dimungkinkan untuk "melemparkan gradien" dari jaringan untuk pengakuan pada jaringan saraf untuk deteksi (ini benar-benar lebih rumit daripada kelihatannya).


By the way, setiap tahun konferensi ICDAR diadakan , di mana beberapa kompetisi untuk pengenalan teks dalam berbagai gambar diatur waktunya.

Masalah saat ini dalam deteksi


Menurut pendapat saya, masalah utama dalam pendeteksian sekarang bukanlah kualitas model detektor, tetapi data: mereka biasanya panjang dan mahal untuk ditandai, terutama jika ada banyak kelas yang perlu dideteksi (tetapi dengan cara ada contoh solusi untuk 500 kelas). Oleh karena itu, banyak karya sekarang dikhususkan untuk menghasilkan data yang paling masuk akal “secara sintetis” dan mendapatkan markup “secara gratis”. Di bawah ini adalah gambar dari diploma saya tentang sebuah artikel dari Nvidia , yang khusus membahas tentang pembuatan data sintetis.


Tapi tetap saja luar biasa bahwa sekarang kita dapat mengatakan dengan pasti di mana dalam gambar itu. Dan jika kita ingin, misalnya, untuk menghitung jumlah sesuatu pada bingkai, maka itu cukup untuk mendeteksi ini dan memberikan jumlah kotak. Dalam mendeteksi orang, YOLO biasa juga berfungsi dengan baik, hanya yang utama adalah mengirimkan banyak data. Darkflow yang sama cocok, dan kelas "manusia" ditemukan di hampir semua dataset deteksi utama. Jadi, jika kita ingin menggunakan kamera untuk menghitung jumlah orang yang lewat, katakanlah, dalam satu hari, atau jumlah barang yang diambil seseorang di toko, kami hanya akan mendeteksi dan memberikan jumlah ...


Berhenti Tetapi jika kita ingin mendeteksi orang di setiap gambar dari kamera, maka kita dapat menghitung jumlah mereka dalam satu bingkai, dan dalam dua - tidak lagi, karena kita tidak bisa mengatakan di mana tepatnya orang yang mana. Kami membutuhkan algoritme yang memungkinkan kami menghitung orang unik di aliran video. Mungkin itu adalah algoritma identifikasi ulang , tetapi ketika menyangkut video dan deteksi, itu dosa jika tidak menggunakan algoritme pelacakan.

Video dan pelacakan: dalam satu aliran


Sejauh ini, kami hanya berbicara tentang tugas dalam gambar, tetapi hal yang paling menarik terjadi di video. Untuk mengatasi pengakuan tindakan yang sama, kita perlu menggunakan tidak hanya komponen ruang yang disebut, tetapi juga komponen temporal , karena video adalah urutan gambar dalam waktu.


Pelacakan adalah analog dari deteksi gambar, tetapi untuk video. Artinya, kami ingin mengajarkan jaringan untuk memprediksi tidak tinju dalam gambar, tetapi tracklet dalam waktu (yang pada dasarnya adalah urutan kotak). Di bawah ini adalah contoh gambar yang menunjukkan "ekor" - jejak orang-orang ini dalam video.


Mari kita pikirkan cara mengatasi masalah pelacakan. Biarkan ada video, dan frame-nya # 1 dan # 2. Mari kita bahas sejauh ini hanya satu objek - kita melacak satu bola. Pada frame # 1, kita bisa menggunakan detektor untuk mendeteksinya. Pada yang kedua kita juga dapat mendeteksi bola, dan jika itu ada di sana sendiri, maka semuanya baik-baik saja: kita mengatakan bahwa tinju pada frame sebelumnya adalah tinju dari bola yang sama seperti pada frame # 2. Anda juga dapat melanjutkan ke frame yang tersisa, di bawah gif dari kursus visi pyimagesearch .


Ngomong-ngomong, untuk menghemat waktu, kita tidak dapat memulai jaringan saraf pada frame kedua, tetapi cukup "memotong" kotak bola dari frame pertama dan mencari korelasi yang persis sama di frame kedua atau pixel demi pixel. Pelacak korelasi menggunakan pendekatan ini, mereka dianggap sederhana dan lebih atau kurang dapat diandalkan jika kita berurusan dengan kasus-kasus sederhana seperti "melacak satu bola di depan kamera di ruang kosong". Tugas ini juga disebut Pelacakan Objek Visual . Di bawah ini adalah contoh karya pelacak korelasi menggunakan contoh satu orang.


Namun, jika ada beberapa deteksi / orang, maka Anda harus dapat mencocokkan kotak dari frame # 1 dan dari frame # 2. Ide pertama yang muncul di pikiran adalah untuk mencoba mencocokkan kotak dengan yang memiliki area persimpangan terbesar ( IoU ) dengannya. Benar, dalam kasus beberapa pendeteksian yang tumpang tindih, pelacak seperti itu akan tidak stabil, jadi Anda perlu menggunakan lebih banyak informasi.


Pendekatan dengan IoU hanya bergantung pada tanda-tanda deteksi "geometris" , yaitu hanya mencoba membandingkannya dengan kedekatan pada bingkai. Tapi kami memiliki seluruh gambar (bahkan dua dalam kasus ini), dan kami dapat menggunakan fakta bahwa di dalam deteksi ini terdapat tanda-tanda "visual" . Selain itu, kami memiliki riwayat deteksi untuk setiap orang, yang memungkinkan kami untuk lebih akurat memprediksi posisi berikutnya berdasarkan kecepatan dan arah gerakan, ini secara kondisional dapat disebut sebagai tanda "fisik" .


Salah satu pelacak real-time pertama, yang sepenuhnya dapat diandalkan dan mampu mengatasi situasi sulit, diterbitkan pada 2016 Simple Online dan Realtime Traker (SORT) ( kode Python ). SORT tidak menggunakan tanda-tanda visual dan jaringan saraf, tetapi hanya memperkirakan sejumlah parameter dari setiap kotak pada setiap frame: kecepatan saat ini (x dan y secara terpisah) dan ukuran (tinggi dan lebar). Rasio aspek kotak selalu diambil dari deteksi pertama kotak itu. Lebih jauh, kecepatan diprediksi menggunakan filter Kalman (umumnya bagus dan ringan di dunia pemrosesan sinyal), matriks persimpangan kotak oleh IoU dibangun, dan deteksi ditetapkan oleh algoritma Hungaria .

Jika menurut Anda matematika sudah menjadi agak banyak, maka dalam artikel ini semuanya dijelaskan dengan cara yang dapat diakses (ini adalah media :).

Sudah pada tahun 2017, modifikasi SORT dirilis dalam bentuk DeepSORT ( kode untuk TensorFlow ). DeepSORT sudah mulai menggunakan jaringan saraf untuk mengekstraksi tanda-tanda visual, menggunakannya untuk menyelesaikan tabrakan. Kualitas pelacakan telah berkembang - bukan tanpa alasan yang dianggap sebagai salah satu pelacak online terbaik saat ini.


Bidang pelacakan memang aktif berkembang: ada pelacak dengan jaringan saraf siam , dan pelacak dengan RNN . Pertahankan jari Anda pada denyut nadi, karena pada hari apa pun arsitektur yang lebih akurat dan cepat dapat keluar (atau sudah keluar). Omong-omong, sangat mudah untuk mengikuti hal-hal seperti itu di PapersWithCode , selalu ada tautan ke artikel dan kode untuk mereka (jika ada).

Kata penutup




Kami benar-benar telah mengalami banyak hal dan belajar banyak. Tetapi visi komputer adalah bidang yang sangat luas, dan saya adalah orang yang sangat keras kepala. Itulah sebabnya kami akan melihat Anda di artikel ketiga dari seri ini (apakah ini akan menjadi yang terakhir? Siapa yang tahu ...), di mana kami akan membahas secara lebih rinci segmentasi, penilaian postur, pengenalan tindakan pada video, dan pembuatan deskripsi dari gambar menggunakan gambar menggunakan jaringan saraf.

PS Saya ingin menyampaikan terima kasih khusus kepada Vadim Gorbachev atas saran dan komentarnya yang berharga dalam persiapan artikel ini dan sebelumnya.

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


All Articles