- Ön koşullar
- Raspberry Pi kullanarak Plaka Tanıma ile ilgili adımlar
- 1. Plaka Algılama
- 2. Karakter Bölümleme
- 3. Karakter Tanıma
- Plaka Tanıma Başarısız Durumları
- Diğer Başarılı Örnekler
Güvenlik, insanlık için her zaman büyük bir endişe kaynağı olmuştur. Bugün okullarda, hastanelerde ve diğer halka açık yerlerde kendimizi güvende hissetmemizi sağlayacak video gözetim kameralarımız var. HIS tarafından yapılan bir araştırmaya göre, 2014 yılında yaklaşık 245 milyon güvenlik kamerası kurulu ve çalışır durumda olduğu tahmin ediliyor; bu, bu gezegendeki her 30 kişi için bir güvenlik kamerasına sahip olmak gibidir. Özellikle Görüntü işleme ve Makine Öğreniminde teknolojideki ilerlemeyle birlikte, bu kameraları Video beslemesinden gelen bilgileri işlemek üzere eğiterek daha akıllı hale getirmek mümkündür.
Bu kameralardan gelen video akışı, yüz tanıma, desen analizi, duygu analizi ve çok daha fazlasını gerçekleştirmek için kullanılabilir ve bu da onu FF7 filminde gösterilen "Tanrı'nın Gözü" gibi bir şeye gerçekten yaklaştırır. Aslında, Hikvision ve diğerleri gibi gözetim şirketleri bu özellikleri ürünlerinde uygulamaya çoktan başladı. Daha önce plakayı okumak için MATLAB Görüntü işlemeyi kullandık, bugün bu makalede Raspberry Pi ve OpenCV kullanarak Otomobillerden Plaka Numarasını nasıl tanıyıp okuyacağımızı öğreneceğiz. Google'dan bazı rastgele araç görüntülerini kullanacağız ve OpenCV Contour Detection kullanarak plakayı tanımak için bir program yazacağız ve ardından Tesseract OCR kullanarak plakadaki numarayı okuyacağız. Kulağa ilginç geliyor !, Öyleyse başlayalım.
Ön koşullar
Daha önce de belirtildiği gibi, yüzleri algılamak ve tanımak için OpenCV Kitaplığını kullanacağız. Bu eğiticiye devam etmeden önce Raspberry Pi'ye OpenCV Kitaplığı yüklediğinizden emin olun. Ayrıca Pi'nizi 2A adaptörle güçlendirin ve daha kolay hata ayıklama için bir ekran monitörüne bağlayın.
Bu eğitim, OpenCV'nin tam olarak nasıl çalıştığını açıklamayacaktır, Görüntü işlemeyi öğrenmekle ilgileniyorsanız, bu OpenCV temellerini ve gelişmiş Görüntü işleme eğitimlerini inceleyin. Ayrıca OpenCV kullanarak bu Görüntü Segmentasyon eğitiminde konturlar, Blob Algılama vb. Hakkında bilgi edinebilirsiniz. Görüntüden arabanın plakasını tespit etmek için buna benzer bir şey yapacağız.
Raspberry Pi kullanarak Plaka Tanıma ile ilgili adımlar
Kısaca Plaka Tanıma veya LPR, üç ana adımı içerir. Adımlar aşağıdaki gibidir
1. Plaka Algılama: İlk adım, araçtan plakayı algılamaktır. Dikdörtgen nesneleri tespit etmek ve plakayı bulmak için OpenCV'deki kontur seçeneğini kullanacağız. Plakanın tam boyutunu, rengini ve yaklaşık konumunu bilirsek doğruluk artırılabilir. Normalde algılama algoritması, kameranın konumuna ve o ülkede kullanılan plaka türüne göre eğitilir. Görüntünün arabası bile yoksa, bu daha zor hale gelir, bu durumda aracı ve ardından plakayı tespit etmek için ek bir adım atacağız.
2. Karakter Segmentasyonu: Plaka'yı bulduktan sonra onu kesip yeni bir resim olarak kaydetmemiz gerekir. Yine bu, OpenCV kullanılarak kolayca yapılabilir.
3. Karakter Tanıma: Şimdi, önceki adımda elde ettiğimiz yeni görüntünün üzerinde bazı karakterler (Sayılar / Alfabe) yazılı olduğundan emin olun. Böylece numarayı algılamak için üzerine OCR (Optik Karakter Tanıma) uygulayabiliriz. Raspberry Pi kullanarak Optik Karakter Tanıma'yı (OCR) zaten açıkladık.
1. Plaka Algılama
Bu Raspberry Pi Plaka Okuyucusunun ilk adımı, Plaka'yı tespit etmektir. Bir arabanın örnek bir görüntüsünü alalım ve o arabadaki Plaka Tespiti ile başlayalım. Daha sonra aynı görüntüyü Karakter Bölümleme ve Karakter Tanıma için de kullanacağız. Açıklama yapmadan doğrudan koda atlamak istiyorsanız, kodun tamamının sağlandığı bu sayfanın altına inebilirsiniz. Bu eğitim için kullandığım test görüntüsü aşağıda gösterilmektedir.
Adım 1: Görüntüyü gereken boyuta yeniden boyutlandırın ve ardından gri ölçeklendirin. Aynı kod aşağıda verilmiştir.
img = cv2.resize (img, (620,480)) gray = cv2.cvtColor (img, cv2.COLOR_BGR2GRAY) # gri ölçeğe dönüştür
Yeniden boyutlandırma, daha büyük çözünürlüklü görüntülerle ilgili sorunları önlememize yardımcı olur, yeniden boyutlandırdıktan sonra plakanın hala çerçevede kaldığından emin olun. Gri ölçekleme, tüm görüntü işleme adımlarında yaygındır. Bu, bir görüntüyü işlerken artık renk ayrıntılarıyla uğraşmak zorunda olmadığımız diğer işlem sinüsünü hızlandırır. Bu adım tamamlandığında görüntü böyle bir şeye dönüşecektir.
Adım 2: Her görselin yararlı ve yararsız bilgileri olacaktır, bu durumda bizim için sadece plaka yararlı bilgilerdir, geri kalanı programımız için hemen hemen yararsızdır. Bu işe yaramaz bilgiye gürültü denir. Normalde çift taraflı bir filtre (Bulanıklaştırma) kullanmak, istenmeyen ayrıntıları bir görüntüden kaldıracaktır. Aynısının kodu
gri = cv2.bilateralFilter (gri, 11, 17, 17)
Sözdizimi, destination_image = cv2.bilateralFilter (kaynak_görüntü, piksel çapı, sigmaColor, sigmaSpace) şeklindedir. Daha fazla arka plan bilgisini bulanıklaştırmak için sigma rengini ve sigma alanını 17'den daha yüksek değerlere yükseltebilirsiniz, ancak yararlı kısmın bulanıklaşmamasına dikkat edin. Arka plan ayrıntılarının (ağaç ve bina) bu görüntüde bulanık olduğunu görebileceğiniz gibi çıktı görüntüsü aşağıda gösterilmiştir. Bu şekilde, programın daha sonra bu bölgelere yoğunlaşmasını önleyebiliriz.
3. Adım: Bir sonraki adım, kenar algılama yaptığımız yerde ilginçtir. Bunu yapmanın birçok yolu vardır, en kolay ve popüler yolu OpenCV'den canny edge yöntemini kullanmaktır . Aynısını yapmak için satır aşağıda gösterilmiştir
kenar = cv2.Canny (gri, 30, 200) #Perform Kenar algılama
Sözdizimi, destination_image = cv2.Canny (kaynak_görüntü, eşikDeğeri 1, eşikDeğeri 2) olacaktır. Eşik Aralığı 1 ve Eşik Değeri 2, minimum ve maksimum eşik değerleridir. Yalnızca minimum eşik değerinden daha yüksek ve maksimum eşik değerinden düşük yoğunluk gradyanına sahip kenarlar görüntülenecektir. Ortaya çıkan görüntü aşağıda gösterilmiştir
Adım 4: Şimdi resmimiz üzerinde kontur aramaya başlayabiliriz, önceki eğitimimizde OpenCV kullanarak konturları nasıl bulacağımızı zaten öğrendik, bu yüzden aynı şekilde devam ediyoruz.
nts = cv2.findContours (edged.copy (), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) cnts = imutils.grab_contours (cnts) cnts = sıralanmış (cnts, key = cv2.contourArea, reverse = True) screenCnt = Hiçbiri
Sayaçlar tespit edildiğinde, onları büyükten küçüğe sıralar ve diğerlerini göz ardı ederek yalnızca ilk 10 sonucu dikkate alırız. Resmimizde tezgah kapalı bir yüzeye sahip herhangi bir şey olabilir, ancak elde edilen tüm sonuçların içinde plaka numarası da kapalı bir yüzey olduğu için orada olacaktır.
Plaka görüntüsünü elde edilen sonuçlar arasında filtrelemek için, tüm sonuçları döngüye alacağız ve hangisinin dört kenarlı ve kapalı şekle sahip dikdörtgen şeklinde bir kontura sahip olduğunu kontrol edeceğiz. Bir plaka kesinlikle dört kenarlı bir dikdörtgen olacağından.
# cnts cinsinden konturlarımız üzerinde döngü yapın : # çevriyi yaklaşık olarak belirleyin = cv2.arcLength (c, True) yaklaşık = cv2.approxPolyDP (c, 0.018 * peri, True) # Yaklaşık konturumuzda dört nokta varsa, o zaman # biz bizim ekran bulduk varsayabiliriz len if (yaklaşık) == 4: screenCnt = yakl kırmak
0.018 değeri deneysel bir değerdir; Sizin için en uygun olanı kontrol etmek için etrafından dolaşabilirsiniz. Veya araba resimlerine dayalı eğitim için makine öğrenimini kullanarak ve ardından orada doğru değeri kullanarak bunu bir sonraki seviyeye taşıyın. Doğru sayacı bulduğumuzda, bunu screenCnt adlı bir değişkene kaydederiz ve ardından plakayı doğru algıladığımızdan emin olmak için etrafına dikdörtgen bir kutu çizeriz.
Adım 5: Artık plakanın nerede olduğunu bildiğimize göre, geri kalan bilgiler bizim için neredeyse yararsızdır. Böylece plakanın bulunduğu yer dışında tüm resmi maskelemeye devam edebiliriz . Aynısını yapmak için kod aşağıda gösterilmiştir
# Plaka maskesi dışındaki parçayı maskeleme = np.zeros (gray.shape, np.uint8) new_image = cv2.drawContours (mask,, 0,255, -1,) new_image = cv2.bitwise_and (img, img, mask = maske)
Maskelenmiş yeni görüntü aşağıdaki gibi görünecektir
2. Karakter Bölümleme
Raspberry Pi Plaka Tanıma'nın bir sonraki adımı, plakayı kırparak ve yeni bir görüntü olarak kaydederek görüntüden ayırmaktır. Daha sonra bu görüntüyü içindeki karakteri tespit etmek için kullanabiliriz. Ana görüntüden ROI (İlgi Bölgesi) görüntüsünü kırpma kodu aşağıda gösterilmiştir
# Şimdi kırp (x, y) = np.where (maske == 255) (topx, topy) = (np.min (x), np.min (y)) (bottomx, bottomy) = (np.max (x), np.max (y)) Kırpılmış = gri
Ortaya çıkan görüntü aşağıda gösterilmiştir. Normalde görüntüyü kırpmak için eklenir, ayrıca gri olabilir ve gerekirse kenarlarını kesebiliriz. Bu, sonraki adımda karakter tanımayı geliştirmek için yapılır. Ancak, orijinal görüntüyle bile iyi çalıştığını buldum.
3. Karakter Tanıma
Bu Raspberry Pi Plaka Tanıma işleminin son adımı , segmentli görüntüden plaka bilgisini gerçekten okumaktır. Önceki eğitimde yaptığımız gibi, karakterleri resimden okumak için pytesseract paketini kullanacağız. Aynı kod aşağıda verilmiştir.
# Plaka numarasını okuyun text = pytesseract.image_to_string (Cropped, config = '- psm 11') print ("Detected Number:", text)
Bir Tesseract motorunun nasıl yapılandırılacağını zaten açıkladık, bu nedenle gerekirse burada yine gerekirse daha iyi sonuçlar elde etmek için Tesseract OCR'yi yapılandırabiliriz. Algılanan karakter daha sonra konsola yazdırılır. Derlendiğinde sonuç aşağıdaki gibi gösterilir
Gördüğünüz gibi orijinal görüntü üzerinde “HR 25 BR9044” numarası vardı ve programımız aynı değeri ekrana yazdırdığını tespit etti.
Plaka Tanıma Başarısız Durumları
Bu Raspberry Pi Plaka Tanıma'nın eksiksiz proje dosyası buradan indirilebilir, programı ve programımızı kontrol etmek için kullandığımız test görüntülerini içerir. Söylenmeden, bu yöntemden elde edilen sonuçların doğru olmayacağı unutulmamalıdır . Doğruluk, görüntünün netliğine, yönüne, ışığa maruz kalmasına vb. Bağlıdır. Daha iyi sonuçlar elde etmek için bununla birlikte Makine öğrenimi algoritmalarını uygulamayı deneyebilirsiniz.
Bir fikir edinmek için arabanın doğrudan kameraya bakmadığı başka bir örneğe bakalım.
Gördüğünüz gibi, programımız plakayı doğru bir şekilde tespit edip kırpmayı başardı. Ancak Tesseract kütüphanesi, karakterleri doğru bir şekilde tanıyamadı. Gerçek "TS 08 UE 3396" yerine OCR, "1508 ye 3396" olarak tanımıştır. Bunun gibi sorunlar, daha iyi oryantasyon görüntüleri kullanılarak veya Tesseract motorunu yapılandırarak düzeltilebilir.
Bir başka kötü durum senaryosu, konturun plakayı doğru bir şekilde algılayamamasıdır. Aşağıdaki görüntü çok fazla arka plan bilgisine ve kötü ışıklandırmaya sahip, programın plakayı numaradan tanımlayamadı. Bu durumda, Makine öğrenimini yeniden aktarmalı veya resmin kalitesini iyileştirmeliyiz.
Diğer Başarılı Örnekler
Görüntü kalitesinin ve yönünün çoğu zaman doğru olduğu için, program plakayı tanımlayıp numarayı ondan okuyabilmiştir. Aşağıdaki anlık görüntüler, elde edilen başarılı sonuçların birkaçını göstermektedir. Burada kullanılan tüm test görüntüleri ve kod, burada sağlanan ZIP dosyasında mevcut olacaktır.
Umarım Raspberry Pi kullanarak Otomatik Plaka Tanıma'yı anladınız ve kendi başınıza harika bir şey oluşturmaktan keyif aldınız. OpenCV ve Tesseract ile başka neler yapılabileceğini düşünüyorsunuz ? Yorum bölümünde düşüncelerinizi bana bildirin. Bu makaleyle ilgili herhangi bir sorunuz varsa, lütfen çekinmeden aşağıdaki yorum bölümüne bırakın veya diğer teknik sorular için forumları kullanın.