- Prasyarat
- Langkah-langkah yang terlibat dalam Pengakuan Plat Nomor menggunakan Raspberry Pi
- 1. Deteksi Plat Nomor
- 2. Segmentasi Karakter
- 3. Pengakuan Karakter
- Kasus Gagal dalam Pengenalan Plat Nomor
- Contoh Sukses Lainnya
Keamanan selalu menjadi perhatian utama umat manusia. Saat ini kami memiliki kamera pengintai video di sekolah, rumah sakit, dan setiap tempat umum lainnya untuk membuat kami merasa aman. Menurut survei HIS, diperkirakan ada sekitar 245 juta kamera keamanan yang dipasang dan berfungsi kembali pada tahun 2014, seperti memiliki satu kamera keamanan untuk setiap 30 orang di planet ini. Dengan kemajuan teknologi khususnya dalam pemrosesan gambar dan Pembelajaran Mesin, dimungkinkan untuk membuat kamera ini lebih pintar dengan melatih mereka untuk memproses informasi dari umpan Video.
Umpan video dari kamera ini dapat digunakan untuk melakukan pengenalan wajah, analisis pola, analisis emosi, dan banyak lagi yang benar-benar akan mendekati sesuatu seperti "Mata Tuhan" yang ditampilkan dalam film FF7. Faktanya, perusahaan pengawasan seperti Hikvision dan banyak lainnya sudah mulai menerapkan fitur ini dalam produk mereka. Kami sebelumnya menggunakan MATLAB Image processing untuk membaca plat nomor, hari ini di artikel ini kita akan belajar cara mengenali dan membaca Nomor Plat dari Mobil menggunakan Raspberry Pi dan OpenCV. Kami akan menggunakan beberapa gambar kendaraan acak dari Google dan menulis program untuk mengenali plat nomor menggunakan OpenCV Contour Detection dan kemudian membaca nomor dari plat tersebut menggunakan Tesseract OCR. Kedengarannya menarik bukan !, jadi mari kita mulai.
Prasyarat
Seperti yang diceritakan sebelumnya, kami akan menggunakan OpenCV Library untuk mendeteksi dan mengenali wajah. Jadi pastikan untuk menginstal OpenCV Library di Raspberry Pi sebelum melanjutkan tutorial ini. Juga Power Pi Anda dengan adaptor 2A dan hubungkan ke monitor tampilan untuk debugging yang lebih mudah.
Tutorial ini tidak akan menjelaskan bagaimana tepatnya OpenCV bekerja, jika Anda tertarik untuk mempelajari pemrosesan gambar, lihat dasar-dasar OpenCV dan tutorial pemrosesan gambar lanjutan ini. Anda juga dapat mempelajari tentang kontur, Deteksi Blob, dll dalam tutorial Segmentasi Gambar ini menggunakan OpenCV. Kami akan melakukan hal serupa untuk mendeteksi pelat nomor mobil dari gambar.
Langkah-langkah yang terlibat dalam Pengakuan Plat Nomor menggunakan Raspberry Pi
Pengakuan Plat Nomor atau disingkat LPR, melibatkan tiga langkah utama. Langkah-langkahnya adalah sebagai berikut
1. Deteksi Plat Nomor : Langkah pertama adalah mendeteksi plat nomor dari mobil. Kami akan menggunakan opsi kontur di OpenCV untuk mendeteksi objek persegi panjang untuk menemukan pelat nomor. Akurasi dapat ditingkatkan jika kita mengetahui ukuran, warna, dan perkiraan lokasi pelat nomor yang tepat. Biasanya algoritme pendeteksian dilatih berdasarkan posisi kamera dan jenis pelat nomor yang digunakan di negara tersebut. Ini semakin rumit jika gambar tersebut bahkan tidak memiliki mobil, dalam hal ini kami akan melakukan langkah tambahan untuk mendeteksi mobil dan kemudian pelat nomornya.
2. Segmentasi Karakter: Setelah kami mendeteksi Plat, kami harus memotongnya dan menyimpannya sebagai gambar baru. Sekali lagi ini dapat dilakukan dengan mudah menggunakan OpenCV.
3. Pengenalan Karakter: Sekarang, gambar baru yang kita peroleh pada langkah sebelumnya pasti memiliki beberapa karakter (Angka / Huruf) yang tertulis di atasnya. Jadi, kita dapat melakukan OCR (Optical Character Recognition) di atasnya untuk mendeteksi nomor tersebut. Kami sudah menjelaskan Pengenalan Karakter Optik (OCR) menggunakan Raspberry Pi.
1. Deteksi Plat Nomor
Langkah pertama dalam Pembaca Plat Lisensi Raspberry Pi ini adalah mendeteksi Plat Nomor. Mari kita ambil contoh gambar sebuah mobil dan mulai dengan mendeteksi Plat Nomor pada mobil itu. Kami kemudian akan menggunakan gambar yang sama untuk Segmentasi Karakter dan Pengenalan Karakter juga. Jika Anda ingin langsung masuk ke dalam kode tanpa penjelasan maka Anda bisa scroll ke bawah hingga ke bagian bawah halaman ini, di mana disediakan kode lengkapnya. Gambar uji yang saya gunakan untuk tutorial ini ditunjukkan di bawah ini.
Langkah 1: Ubah ukuran gambar ke ukuran yang diperlukan, lalu buat skala abu-abu. Kode yang sama diberikan di bawah ini
img = cv2.resize (img, (620,480)) grey = cv2.cvtColor (img, cv2.COLOR_BGR2GRAY) #convert ke skala abu-abu
Mengubah ukuran kami membantu kami untuk menghindari masalah dengan gambar resolusi yang lebih besar, pastikan pelat nomor masih tetap berada di bingkai setelah mengubah ukuran. Penskalaan abu-abu umum terjadi di semua langkah pemrosesan gambar. Ini mempercepat proses berikutnya karena kami tidak lagi harus berurusan dengan detail warna saat memproses gambar. Gambar akan berubah seperti ini jika langkah ini selesai
Langkah 2: Setiap gambar akan memiliki informasi yang berguna dan tidak berguna, dalam hal ini bagi kami hanya plat nomor yang merupakan informasi yang berguna, sisanya tidak berguna untuk program kami. Informasi yang tidak berguna ini disebut kebisingan. Biasanya menggunakan filter bilateral (Bluring) akan menghapus detail yang tidak diinginkan dari gambar. Kode untuk yang sama adalah
abu-abu = cv2.bilateralFilter (abu-abu, 11, 17, 17)
Sintaksnya adalah destination_image = cv2.bilateralFilter (source_image, diameter piksel, sigmaColor, sigmaSpace). Anda dapat meningkatkan warna sigma dan ruang sigma dari 17 ke nilai yang lebih tinggi untuk mengaburkan lebih banyak informasi latar belakang, tetapi berhati-hatilah agar bagian yang berguna tidak menjadi buram. Gambar keluarannya ditunjukkan di bawah ini, seperti yang Anda lihat detail latar belakang (pohon dan bangunan) diburamkan pada gambar ini. Dengan cara ini kita dapat menghindari program agar tidak terkonsentrasi di daerah-daerah ini nantinya.
Langkah 3: Langkah selanjutnya adalah menarik di mana kami melakukan deteksi tepi. Ada banyak cara untuk melakukannya, cara yang paling mudah dan populer adalah dengan menggunakan metode canny edge dari OpenCV. Garis untuk melakukan hal yang sama ditunjukkan di bawah ini
edged = cv2.Canny (abu-abu, 30, 200) #Perform Deteksi tepi
Sintaksnya adalah destination_image = cv2.Canny (source_image, thresholdValue 1, thresholdValue 2). Nilai Ambang 1 dan Nilai Ambang 2 adalah nilai ambang minimum dan maksimum. Hanya tepi yang memiliki gradien intensitas lebih dari nilai ambang batas minimum dan kurang dari nilai ambang batas maksimum yang akan ditampilkan. Gambar yang dihasilkan ditunjukkan di bawah ini
Langkah 4: Sekarang kita bisa mulai mencari kontur pada gambar kita, kita sudah belajar tentang bagaimana menemukan kontur menggunakan OpenCV di tutorial sebelumnya jadi kita lanjutkan seperti yang sama.
nts = cv2.findContours (edged.copy (), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) cnts = imutils.grab_contours (cnts) cnts = diurutkan (cnts, key = cv2.contourArea, reverse = True) screenCnt = Tidak ada
Setelah penghitung terdeteksi, kami mengurutkannya dari besar ke kecil dan hanya mempertimbangkan 10 hasil pertama mengabaikan yang lain. Dalam gambar kami, penghitung bisa berupa apa saja yang memiliki permukaan tertutup tetapi dari semua hasil yang diperoleh, nomor plat juga akan ada karena itu juga merupakan permukaan tertutup.
Untuk memfilter gambar plat di antara hasil yang diperoleh, kami akan mengulang semua hasil dan memeriksa yang memiliki kontur bentuk persegi panjang dengan empat sisi dan gambar tertutup. Karena plat nomor pasti akan berbentuk persegi panjang dengan empat sisi.
# loop di atas kontur kita untuk c di cnts: # perkiraan kontur peri = cv2.arcLength (c, True) approx = cv2.approxPolyDP (c, 0.018 * peri, True) # jika perkiraan kontur kita memiliki empat titik, maka # we dapat berasumsi bahwa kami telah menemukan layar kami jika len (approx) == 4: screenCnt = approx break
Nilai 0,018 adalah nilai eksperimen; Anda dapat memainkannya untuk memeriksa mana yang terbaik untuk Anda. Atau naikkan ke level berikutnya dengan menggunakan pembelajaran mesin untuk melatih berdasarkan gambar mobil dan kemudian gunakan nilai yang tepat di sana. Setelah kami menemukan penghitung yang tepat, kami menyimpannya dalam variabel bernama screenCnt dan kemudian menggambar kotak persegi panjang di sekitarnya untuk memastikan kami telah mendeteksi pelat nomor dengan benar.
Langkah 5: Sekarang setelah kita tahu di mana pelat nomornya, informasi yang tersisa tidak lagi berguna bagi kita. Jadi kita bisa melanjutkan dengan menutupi seluruh gambar kecuali tempat pelat nomor berada. Kode untuk melakukan hal yang sama ditunjukkan di bawah ini
# Menutupi bagian selain dari pelat nomor mask = np.zeros (gray.shape, np.uint8) new_image = cv2.drawContours (mask,, 0,255, -1,) new_image = cv2.bitwise_and (img, img, mask = topeng)
Gambar baru bertopeng akan muncul seperti di bawah ini
2. Segmentasi Karakter
Langkah selanjutnya dalam Pengenalan Plat Nomor Raspberry Pi adalah menyegmentasikan pelat nomor dari gambar dengan memotongnya dan menyimpannya sebagai gambar baru. Kami kemudian dapat menggunakan gambar ini untuk mendeteksi karakter di dalamnya. Kode untuk memotong gambar roi (Region of interest) dari gambar utama ditunjukkan di bawah ini
# Sekarang crop (x, y) = np.where (mask == 255) (topx, topy) = (np.min (x), np.min (y)) (bottomx, bottomy) = (np.max (x), np.max (y)) Dipotong = abu-abu
Gambar yang dihasilkan ditunjukkan di bawah ini. Biasanya ditambahkan ke cropping gambar, kita juga bisa membuatnya menjadi abu-abu dan edge jika diperlukan. Ini dilakukan untuk meningkatkan pengenalan karakter pada langkah selanjutnya. Namun, saya menemukan bahwa ini berfungsi dengan baik bahkan dengan gambar aslinya.
3. Pengakuan Karakter
Langkah terakhir dalam Pengenalan Plat Nomor Raspberry Pi ini adalah benar-benar membaca informasi plat nomor dari gambar yang tersegmentasi. Kami akan menggunakan paket pytesseract untuk membaca karakter dari gambar, seperti yang kami lakukan di tutorial sebelumnya. Kode yang sama diberikan di bawah ini
#Baca pelat nomor text = pytesseract.image_to_string (Dipotong, config = '- psm 11') print ("Nomor Terdeteksi adalah:", teks)
Kami telah menjelaskan cara mengkonfigurasi mesin Tesseract, jadi di sini lagi jika diperlukan, kami dapat mengkonfigurasi OCR Tesseract untuk mendapatkan hasil yang lebih baik jika diperlukan. Karakter yang terdeteksi kemudian dicetak di konsol. Ketika dikompilasi hasilnya seperti di bawah ini
Seperti yang Anda lihat, gambar asli memiliki nomor "HR 25 BR9044" dan program kami telah mendeteksi gambar itu mencetak nilai yang sama di layar.
Kasus Gagal dalam Pengenalan Plat Nomor
File proyek lengkap Pengenalan Plat Lisensi Raspberry Pi ini dapat diunduh dari sini, berisi program dan gambar uji yang kami gunakan untuk memeriksa program kami. Tanpa dikatakan, harus diingat bahwa hasil dari metode ini tidak akan akurat . Akurasi tergantung pada kejelasan gambar, orientasi, pencahayaan, dll. Untuk mendapatkan hasil yang lebih baik, Anda dapat mencoba menerapkan algoritma pembelajaran mesin bersama dengan ini.
Untuk mendapatkan gambaran, mari kita lihat contoh lain di mana mobil tidak menghadap kamera secara langsung.
Seperti yang Anda lihat, program kami dapat mendeteksi pelat nomor dengan benar dan memotongnya. Tetapi perpustakaan Tesseract gagal mengenali karakter dengan benar. Alih-alih "TS 08 UE 3396" yang sebenarnya, OCR telah mengenalinya sebagai "1508 ye 3396". Masalah seperti ini dapat diperbaiki dengan menggunakan gambar orientasi yang lebih baik atau dengan mengkonfigurasi mesin Tesseract .
Skenario kasus terburuk lainnya adalah ketika kontur gagal mendeteksi pelat nomor dengan benar. Gambar di bawah ini memiliki terlalu banyak informasi latar belakang dan pencahayaan yang buruk sehingga program bahkan gagal mengidentifikasi plat nomor dari nomor tersebut. Dalam hal ini kita harus kembali meneruskan pembelajaran Mesin atau meningkatkan kualitas gambar.
Contoh Sukses Lainnya
Seringkali kualitas gambar dan orientasi benar, program mampu mengidentifikasi pelat nomor dan membaca nomor darinya. Bidikan jepret di bawah ini menunjukkan beberapa dari hasil yang berhasil diperoleh. Sekali lagi semua gambar uji dan kode yang digunakan di sini akan tersedia dalam file ZIP yang disediakan di sini.
Semoga Anda memahami Pengenalan Plat Nomor Otomatis menggunakan Raspberry Pi dan menikmati membuat sesuatu yang keren sendiri. Menurut Anda apa lagi yang dapat dilakukan dengan OpenCV dan Tesseract ?, Beri tahu saya pendapat Anda di bagian komentar. Jika Anda memiliki pertanyaan tentang artikel ini, silakan tinggalkan di bagian komentar di bawah atau gunakan forum untuk pertanyaan teknis lainnya.