Pengakuan angka. Panduan Praktis. Bagian 1

Contoh pengakuan plat nomor

Semuanya dimulai norak - selama satu tahun sekarang perusahaan saya telah membayar biaya bulanan untuk layanan yang tahu bagaimana menemukan daerah dengan plat nomor di foto. Fungsi ini digunakan untuk membuat sketsa angka secara otomatis untuk beberapa klien.

Dan suatu hari, Kementerian Dalam Negeri Ukraina membuka akses ke daftar kendaraan . Sekarang, dengan menggunakan plat, sudah dimungkinkan untuk memeriksa beberapa informasi tentang mobil (pembuatan, model, tahun pembuatan, warna, dll.)! Rutinitas membosankan pemrograman linier telah memudar sebelum tugas baru - untuk membaca angka di seluruh basis foto dan memvalidasi data ini dengan yang telah ditentukan pengguna. Anda sendiri tahu bagaimana itu terjadi "mata menyala" - panggilan itu diterima, semua tugas lain menjadi membosankan dan monoton untuk sementara waktu ... Kami mulai bekerja dan mendapatkan hasil yang baik, yang, pada kenyataannya, kami memutuskan untuk berbagi dengan masyarakat.
Untuk referensi: ke situs AUTO.RIA.com, sekitar 100.000 foto ditambahkan per hari.
Para pakar data telah lama dikenal dan mampu menyelesaikan masalah seperti itu, jadi saya dan dimabendera menulis artikel ini khusus untuk para programmer. Jika Anda tidak takut dengan frasa "jaringan konvolusional" dan tahu cara menulis "Hello World" dengan python - Anda dapat menggunakan kucing ...

Siapa lagi yang mengenali


Setahun yang lalu saya mempelajari pasar ini dan ternyata tidak banyak layanan dan perangkat lunak dapat bekerja dengan nomor negara exUSSR. Di bawah ini adalah daftar perusahaan tempat kami bekerja:

  • Pengakuan Pelat Lisensi Otomatis

    Ada versi open source dan komersial. Versi OpenSource menunjukkan tingkat pengenalan yang sangat rendah, di samping itu, ia membutuhkan dependensi khusus untuk perakitan dan operasinya (kami tidak terlalu menyukainya). Versi komersial, atau lebih tepatnya, layanan komersial berfungsi dengan baik. Mampu bekerja dengan angka Rusia dan Ukraina. Harga sedang - 49 $ / 50 ribu pengakuan per bulan. Demo online OpenALPR
  • Pengenal

    Kami telah menggunakan layanan ini selama sekitar satu tahun. Kualitasnya bagus. Dia menemukan daerah dengan angka yang sangat baik. Layanan tidak tahu cara bekerja dengan nomor Ukraina dan Eropa. Perlu diperhatikan pekerjaan yang baik dengan gambar berkualitas rendah (di salju, foto resolusi rendah, ...). Harga layanan ini juga dapat diterima, tetapi mereka enggan untuk mengambil volume kecil.

Ada banyak sistem komersial dengan perangkat lunak tertutup, tetapi kami tidak menemukan implementasi opensource yang baik. Sebenarnya, ini sangat aneh, karena alat open source yang mendasari solusi untuk masalah ini sudah lama ada.

Alat apa yang dibutuhkan untuk mengenali angka


Menemukan objek dalam gambar atau dalam aliran video adalah tugas dari bidang visi komputer, yang diselesaikan dengan pendekatan yang berbeda, tetapi paling sering dengan bantuan yang disebut jaringan saraf convolutional. Kita perlu menemukan tidak hanya area di foto tempat objek yang diinginkan ditemukan, tetapi juga untuk memisahkan semua titik dari objek lain atau latar belakang. Tugas semacam ini disebut "Segmentasi Instans." Ilustrasi di bawah ini memvisualisasikan berbagai jenis tugas penglihatan komputer.

Klasifikasi tugas visi komputer

Saya tidak akan menulis banyak teori tentang bagaimana jaringan konvolusi bekerja, informasi ini cukup di jaringan dan laporan di youtube.

Dari arsitektur modern array convolutional untuk tugas segmentasi, mereka sering menggunakan: U-Net atau Mask R-CNN . Kami memilih Masker R-CNN.
Alat kedua yang kita butuhkan adalah perpustakaan pengenal teks yang dapat bekerja dengan berbagai bahasa dan yang dapat dengan mudah disesuaikan dengan spesifikasi teks yang akan kita kenali. Di sini pilihannya tidak terlalu bagus, yang paling canggih adalah tesseract dari Google.

Ada juga sejumlah alat yang kurang "global" yang dengannya kita perlu menormalkan area dengan plat nomor (bawa sedemikian rupa sehingga pengenalan teks akan dimungkinkan). Biasanya OpenCV digunakan untuk konversi semacam itu.

Selain itu, akan mungkin untuk mencoba menentukan negara dan jenis yang dimiliki nomor plat, sehingga dalam pasca pemrosesan kami menerapkan templat perbaikan khusus untuk negara ini dan jenis nomor ini. Misalnya, pelat nomor Ukraina, mulai tahun 2015, didekorasi dengan warna biru dan kuning, terdiri dari templat "dua huruf empat angka dua huruf".

gambar

Selain itu, dengan memiliki statistik tentang frekuensi "pertemuan" di pelat nomor kombinasi huruf atau angka tertentu, Anda dapat meningkatkan kualitas pasca pemrosesan dalam situasi "kontroversial". "

Nomeroff net


Dari judul artikel itu jelas bahwa kita semua menerapkan dan menamai proyek Nomeroff Net . Sekarang bagian dari kode untuk proyek ini sudah berfungsi dalam produksi di AUTO.RIA.com . Tentu saja, ini masih jauh dari analog komersial, semuanya bekerja dengan baik hanya untuk nomor Ukraina. Selain itu, kecepatan yang dapat diterima dicapai hanya dengan dukungan modul GPU tensorflow! Tanpa GPU, Anda juga dapat mencoba, tetapi tidak pada Raspberry Pi :).
Semua bahan untuk proyek kami: kumpulan data yang ditandai dan model yang terlatih , kami diposting secara publik dengan izin dari RIA.com di bawah lisensi Creative Commons CC BY 4.0

Apa yang kita butuhkan



Dmitry dan saya semua menjalankan Fedora 28, saya yakin semuanya dapat diinstal pada distribusi Linux lainnya. Saya tidak ingin mengubah posting ini menjadi instruksi untuk menginstal dan mengonfigurasi tensorflow, jika Anda ingin mencoba dan sesuatu tidak berhasil - tanyakan di komentar, saya akan menjawab dan memberi tahu Anda.

Untuk mempercepat instalasi, kami berencana membuat dockerfile - harapkan dalam pembaruan proyek selanjutnya.

Nomeroff Net "Halo dunia"


Mari kita coba mengenali sesuatu. Kami mengkloning repositori dengan kode dari github . Kami mengunduh ke folder model, model terlatih untuk mencari dan mengklasifikasikan angka, kami akan sedikit menyesuaikan variabel dengan lokasi folder untuk diri kita sendiri.

UPD: Kode ini sudah usang, hanya akan bekerja di cabang 0.1.0 , lihat contoh terbaru di sini :
Semuanya bisa dikenali:
import os import sys import json import matplotlib.image as mpimg # change this property NOMEROFF_NET_DIR = "/var/www/nomeroff-net/" MASK_RCNN_DIR = "/var/www/Mask_RCNN/" MASK_RCNN_LOG_DIR = os.path.join(NOMEROFF_NET_DIR, "logs/") MASK_RCNN_MODEL_PATH = os.path.join(NOMEROFF_NET_DIR, "models/mask_rcnn_numberplate_0700.h5") REGION_MODEL_PATH = os.path.join(NOMEROFF_NET_DIR, "models/imagenet_vgg16_np_region_2019_1_18.h5") sys.path.append(NOMEROFF_NET_DIR) # Import license plate recognition tools. from NomeroffNet import filters, RectDetector, TextDetector, RegionDetector, Detector, textPostprocessing # Initialize npdetector with default configuration file. nnet = Detector(MASK_RCNN_DIR, MASK_RCNN_LOG_DIR) # Load weights in keras format. nnet.loadModel(MASK_RCNN_MODEL_PATH) # Initialize rect detector with default configuration file. rectDetector = RectDetector() # Initialize text detector. textDetector = TextDetector() # Initialize numberplate region detector. regionDetector = RegionDetector() regionDetector.load(REGION_MODEL_PATH) img_path = './examples/images/example1.jpeg' img = mpimg.imread(img_path) NP = nnet.detect([img]) # Generate image mask. cv_img_masks = filters.cv_img_mask(NP) for img_mask in cv_img_masks: # Detect points. points = rectDetector.detect(img_mask, fixRectangleAngle=1, outboundWidthOffset=3) # Split on zones zone = rectDetector.get_cv_zones(img, points) # find standart regionId = regionDetector.predict(zone) regionName = regionDetector.getLabels(regionId) # find text with postprocessing by numberplate region detector text = textDetector.detect(zone) text = textPostprocessing(text, regionName) print('Detected numberplate: "%s" in region [%s]'%(text,regionName)) # Detected numberplate: "AC4921CB" in region [eu-ua-2015] 

Demo online


Mereka membuat sketsa demo sederhana untuk mereka yang tidak ingin menginstal dan menjalankan semua ini :). Bersabar dan sabar dengan kecepatan naskah.

Jika Anda membutuhkan contoh angka Ukraina (untuk memeriksa operasi algoritme koreksi), ambil contoh dari folder ini.

Apa selanjutnya


Saya mengerti bahwa topik ini sangat khusus dan tidak mungkin menimbulkan minat yang besar di antara berbagai programmer, di samping itu, kode dan model masih cukup "mentah" dalam hal kualitas pengenalan, kecepatan, konsumsi memori, dll. Tetapi masih ada harapan bahwa akan ada penggemar yang akan tertarik pada model pelatihan untuk kebutuhan mereka, negara mereka, yang akan membantu dan memberi tahu Anda di mana ada masalah dan bersama kami akan membuat proyek tidak lebih buruk daripada rekan komersial.

Masalah yang Diketahui


  • Proyek tidak memiliki dokumentasi, hanya contoh kode dasar.
  • Sebagai modul pengenalan, tesseract OCR universal dipilih dan dapat membaca banyak, tetapi membuat banyak kesalahan. Dalam hal pengakuan angka Ukraina, sistem koreksi khusus ditulis di sana, yang sejauh ini mengkompensasi beberapa kesalahan, tetapi ada firasat bahwa banyak lagi yang bisa dilakukan di sini.
  • Angka "Kotak" (plat nomor dengan proporsi 1: 2) cukup langka dan kami baru saja mulai mengatasinya, sehingga akan ada lebih banyak kesalahan dengan mereka.
  • Terkadang, alih-alih plat nomor, model kami menemukan rambu jalan dengan nama desa, dashboard di dalam kabin, dan artefak lainnya.
  • Dengan kualitas buruk dari jumlah atau resolusi rendah, wilayah 4 poin tidak sepenuhnya ditentukan

Pengumuman


Jika itu akan menarik bagi seseorang, di bagian kedua kita akan berbicara tentang bagaimana dan bagaimana menandai dataset Anda dan bagaimana melatih model Anda yang dapat bekerja lebih baik untuk konten Anda (negara Anda, ukuran foto Anda). Kami juga akan berbicara tentang cara membuat classifier Anda sendiri, yang, misalnya, akan membantu menentukan apakah nomornya dibuat sketsa di foto.

Beberapa contoh dalam Notebook Jupyter:



Tautan yang bermanfaat


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


All Articles