Mengemudi trotoar otonom dengan OpenCV dan Tensorflow

Penciptaan mobil otonom sekarang menjadi topik populer dan banyak hal menarik terjadi di sini di tingkat amatir.

Kursus tertua dan paling terkenal adalah gelar online dari Udacity .

Jadi, dalam mesin otonom ada pendekatan yang sangat modis - Behavioral Cloning, intinya adalah bahwa komputer belajar berperilaku seperti orang (di setir), hanya mengandalkan input dan output data yang direkam. Secara kasar, ada basis gambar dari kamera dan sudut kemudi yang sesuai.

Secara teori, setelah melatih jaringan saraf pada data ini, kita dapat membiarkannya menggerakkan mesin.
Pendekatan ini didasarkan pada artikel dari Nvidia .

Ada banyak implementasi yang dilakukan terutama oleh siswa Udacity:


Yang lebih menarik adalah aplikasi dalam proyek nyata. Misalnya, Mobil Keledai dikendalikan oleh jaringan saraf yang terlatih khusus.

Infosfer jenuh seperti itu secara langsung mendorong aksi, terutama karena tangki robot saya telah menemui jalan buntu dalam pengembangannya sejak artikel terakhir , dan sangat membutuhkan ide-ide segar. Ada mimpi yang berani - berjalan di taman dengan tanknya, yang, secara umum, tidak lebih buruk dari seekor anjing peliharaan. Intinya kecil - untuk mengajar tangki naik di trotoar di taman.

Jadi apa trotoar dalam hal komputer?

Beberapa area dalam gambar itu berbeda warna dari area lain.

Kebetulan di taman diakses saya, trotoar ternyata menjadi objek paling abu-abu dalam gambar.

(Yang paling abu-abu mengacu pada perbedaan minimum antara nilai RGB). Ini adalah properti abu-abu dan akan menjadi kunci dalam pengenalan trotoar.

Parameter penting lain dari abu-abu adalah kecerahan. Foto musim gugur terdiri dari abu-abu sedikit kurang dari sepenuhnya, sehingga perbedaan antara jalan dan trotoar hanya dalam nuansa.

tangki di taman

Beberapa pendekatan yang paling jelas adalah melakukan pra-kalibrasi - posisikan robot sehingga jalan menempati sebagian besar layar dan

  • ambil kecerahan rata-rata (dalam format HSV)
  • atau potongan RGB rata-rata, dijamin terbuat dari jalan (dalam hal ini akan menjadi sudut kiri bawah).

Setelah menetapkan kriteria seperti itu untuk mengenali trotoar, kami berlari melalui gambar dan mendapatkan beberapa bentuk jalan.


Langkah selanjutnya adalah mengubah tempat seram menjadi aksi - lurus atau belok kanan atau kiri.

Kami berkendara lurus jika tepi kanan terlihat dan sudutnya kurang dari 45 derajat dari vertikal.

Kami belok kiri jika tepi kanan terlihat dan sudut menyimpang dari vertikal ke bawah.
Belok kanan jika kami tidak melihat tepi kanan.

Tepi kanan tempat seram - menggunakan geometri untuk mengatasi masalah ini agak tanpa sukacita. Lebih baik jika pikiran buatan mencari pola kecenderungan dalam memo ini.

Di sinilah jaringan saraf datang untuk menyelamatkan.

Gambar asli dicuci, diperas dan dipotong, kami pilih mengenali trotoar abu-abu dan mendapatkan topeng hitam dan putih 64x64.

Kami menguraikan topeng ini menjadi 3 kelompok - Kiri, Kanan, Lurus dan latih classifier jaringan saraf pada mereka.

Mengumpulkan dan menyiapkan data adalah tugas yang membosankan, butuh beberapa bulan.

Berikut adalah contoh topeng:

Ke kiri:


Ke kanan:


Lurus:


Untuk bekerja dengan jaringan saraf, saya menggunakan Keras + Tensorflow.

Pada awalnya ada ide untuk mengambil struktur jaringan saraf dari Nvidia, tetapi, jelas, itu dirancang untuk beberapa tugas lain dan tidak mengatasi klasifikasi dengan sangat baik. Hasilnya, ternyata jaringan saraf paling sederhana dari tutorial klasifikasi multi-kategori memberikan hasil yang cukup dapat diterima.

model = Sequential() activation = "relu" model.add(Conv2D(20, 5, padding="same", input_shape=input_shape)) model.add(Activation(activation)) model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2))) model.add(Conv2D(50, 5, padding="same")) model.add(Activation(activation)) model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2))) model.add(Flatten()) model.add(Dense(500)) model.add(Activation(activation)) model.add(Dense(cls_n)) opt = SGD(lr=0.01) model.add(Activation("softmax")) model.compile(loss="categorical_crossentropy", optimizer=opt, metrics=["accuracy"]) 

Setelah melatih versi pertama jaringan, saya mengalami ketidakcocokan dengan Raspberry Pi. Sebelum itu, saya menggunakan Tensorflow versi 1.1, menggunakan perdukunan yang dikumpulkan oleh satu orang yang sangat pintar .

Sayangnya, versi ini sudah usang dan tidak dapat membaca model dari Keras.

Namun, baru-baru ini orang-orang dari Google akhirnya turun dan mengumpulkan TF di bawah Raspberry Pi, meskipun di bawah versi baru Raspbian - Stretch. Peregangan itu baik untuk semua orang, tetapi setahun yang lalu saya tidak memiliki OpenCV untuk itu, jadi tangki pergi ke Jessie.

Sekarang, di bawah tekanan perubahan, saya harus beralih ke Stretch. Tensorflow bangun tanpa masalah (walaupun butuh beberapa jam). OpenCV selama setahun juga tidak berhenti dan versi 4.0 telah dirilis. Jadi dia berhasil mengumpulkannya di bawah Stretch, sehingga tidak ada hambatan untuk migrasi.

Ada keraguan tentang bagaimana Raspberry akan menarik monster seperti Tensorflow secara real time, tetapi semuanya ternyata secara umum dapat diterima - meskipun beban jaringan awal sekitar beberapa detik, klasifikasi itu sendiri dapat bekerja beberapa kali per detik tanpa memori yang signifikan dan konsumsi CPU.

Akibatnya, sebagian besar masalah dan kesalahan terjadi justru pada tahap pengenalan jalan.
Jaringan saraf sangat jarang terlewat, meskipun strukturnya sederhana.

Dengan firmware yang diperbarui, tangki memotong melalui taman.

Karena cedera yang diderita, robot terus-menerus berhembus ke kanan, sehingga tanpa kecerdasan buatan ia dengan cepat pergi ke halaman.


Anda sekarang dapat mengantarnya di pagi hari dan mendeteksi anjing yang datang.

Referensi:

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


All Articles