Peki bu araç plaka tespit sistemi nedir?
Kısaca Hedef Tespit algoritmasına dayanmaktadır. Bunu ilerde anlatacağım.
Bu makale derin öğrenmenin uygulamasını öğrenmek isteyen Xiaobai'ye yöneliktir.Bu yazıda YOLO v5 ve CNN şu anda plaka işlemek ve son olarak tam bir plaka bilgi kaydı oluşturmak için kullanılmaktadır.Yazdıklarım yanlışsa Veya geliştirmeniz gerekiyorsa, bana özel mesaj gönderebilirsiniz.
Plakayı içeren fotoğrafı aldığımızı varsayarız, sonra
İlk adım: plakanın bir kısmını elde etmek için plakanın tespiti.
İkinci adım, plakayı ayrı karakterlere bölmektir.
Adım 3: Bir plakanın her karakteri için, her bir karakteri tahmin etmek için CNN tarafından elde edilen modeli kullanırız.
Son olarak plaka bilgilerini alın.
2. Plaka tespiti
genellemek
Plaka tespitinin birçok yöntemi vardır.Başlangıçta, görüntüyü işlemek için orijinal görüntü morfolojisini kullandım (opencv morfolojik işlemine dayanarak) ve bu yöntemin tüm plakalara iyi uygulanamayacağını buldum. Eh, öğrenme sürecinde, aslında bunu başarmanın birçok başka yolu var. Örneğin , hedef tespiti iyi bir yöntemdir, çünkü bu yöntem daha fazla ve daha geniş uygulama senaryolarına uygulanabilir.
Hedef alanda , esas olarak aşağıdaki iki - tek aşamalı ve iki aşamalı algoritmalara ayrılmıştır.
Öncelikle YOLO serisinin altındaki modeller Tek Aşama'ya aittir ve SSD'yi Tek Aşama'ya dahil etmek de çok yaygın bir yöntemdir.
YOLOv5 öğrenme videosu görüntüleme Tüm ağdaki popüler YOLOv5 hedef tespit projesi Öğrenmeye P41'den başlayabilirsiniz.
Bizim tarafımızdan hazırlanması gereken birkaç önkoşul vardır.
1. Eğitim için gerekli plaka görüntüsü verileri
Plaka verileri Çin Bilim ve Teknoloji Üniversitesi tarafından kurulan CCPD veri setinden gelmektedir.Başka bir şey söyleme.Kısacası öğrenme aşamasında iyi bir veri diyeceğim.
Sayfa ve verilerin indirme adresi :
https://github.com/detectRecog/CCPD
2. YOLOv5 modelini kurun YOLO kurulumu doğrudan GitHub'dan indirilebilir:
İndir: https://github.com/ultralytics/yolov5
Bir başkasının modelini ilk kez kullanıyorsanız, ilk kullanımda bunaltıcı olabilir, ancak birini bir kez kavradığınızda diğerleri benzerdir. Örneğin, görüntü segmentasyonunda U-net ve ocr modelinde PaddlePaddleOCR kullanımda benzerdir.
(1) YOLO dosyasında bazı dosyaların değiştirilmesi gerekiyor
Dizinimde YOLO'yu cars klasörüyle aynı dizine indirdim
YOLO klasörü altındaki birkaç dosyaya dikkat etmemiz gerekiyor, bu benim dosya dizinim

İlk önce YOLO modelini bir yaml dosyası ile, car.yaml dosyasını şekildeki yatay çizgi ile yapılandırmamız gerekiyor.
Aşağıda benim basit yapılandırmam
yol: görüntü verilerinin kök dizinitren: eğitim setinin mutlak yolu, işte tüm resimlerin mutlak yolu
val: Doğrulama kümesine giden mutlak yol, trenle aynı
nc: kategori sayısı
isimler: liste tipi tüm kategori isimleri plaka plaka
(2) Kullanım öncesi YOLO modeli aşağıdaki modelleri vermiştir ve bu modeller bazında kendi modellerimizi eğitebiliriz.

Daha az bellek kaplayan ve iyi bir doğruluk oranına sahip olan yolov5s.yaml kullanıyorum.Ayrıntılar için diğer modeller arasındaki farklar nelerdir, kontrol etmek için resmi web sitesine gidebilirsiniz:https://github.com/ultralytics/yolov5
Kendi projemizin ihtiyaçlarını karşılamak için yolo5s.yaml dosyasını değiştirmemiz gerekiyor.

Projemde dikkat edilmesi gereken tek bir plaka var, bu yüzden nc sayısını 1 olarak değiştirmemiz gerekiyor ve diğer parametreleri değiştirmemize gerek yok.
Eh, YOLO klasörünün içeriğinin şimdilik değiştirilmesine gerek yok.
Görüntü veri analizi
Veri dizini şekilde gösterildiği gibidir

Biz sadece ccpd_base klasörünü kullanıyoruz.Birçok resim var.Bilgisayarın gerçek durumunu göz önünde bulundurarak, veri kaynağı olarak sadece 5000 resim seçiyorum.
ccpd_base dosyasının içeriği aşağıdaki gibidir

Önce bir klasör yapısı oluşturun

car images Veri kümesine 5000 fotoğraf koyun labels sonra bulmaİlk resmin adını ayrıntılı olarak görün
Verilerde dosya adının anlamının ayrıntılı bir açıklaması vardır.

İlk resmin adı: 01-86_91-298&341_449&414-458&394_308&410_304&357_454&341-0_0_14_28_24_26_29-124-24.jpg
1) 01 alandır, 2) 86_91 iki açıya karşılık gelir, yatay 86°, dikey 91° 3) 298&341_449&414 sınırlayıcı kutu koordinatlarına karşılık gelir: sol üst (298, 341), sağ alt (449, 414) 4) 458&394_308&410_304&357_454&341 dört köşe koordinatına karşılık gelir 5) 0_0_14_28_24_26_29-124-24 plaka numarasıdır.Eşleme ilişkisi aşağıdaki gibidir: İlki, Wan il sözlüğüne karşılık gelen il 0, ikincisi ise harfler ve karakterlerdir.Reklamlar sözlüğünü kontrol edin.Örneğin , 0 A'dır, 22 Y'dir...Şimdi sahnemiz için dört noktanın koordinatlarını kullanıyoruz.
Kod aşağıdaki gibidir Car_Model:
import os
import numpy as np
# Resim adının karakterini almak için resme erişin
def load_files(path, cuted=False): # cuted=False yazmaya gerek yok
total_info = []
car_numbers = [] # Plaka numarası
angels = [] #eğim
areas = [] # alan
positions = [] # Plakanın dört köşesi
areas_positions = [] # Plakanın sol üst ve sağ alt bölgesinin konumu
for i, j, names in os.walk(path):
# Yolun şimdi elde edildiğini varsayalım
# Önce, daha önce işe yaramaz olan yolu silin ve şimdi bir str alın
for name in names:
if len(name) < 50:
continue
if cuted is True:
path = name.split("-", 5)
areas.append(path[0])
angels.append(path[1])
areas_positions.append(path[2])
positions.append(path[3])
car_numbers.append(path[4])
else:
total_info.append(name)
if cuted is True: # Diğer durumlarda, her bir bilgiyi almanız gerekebilir, ihtiyacınız olmayabilir
total_info.append(areas)
total_info.append(angels)
total_info.append(areas_positions)
total_info.append(positions)
total_info.append(car_numbers)
total_info.append(names)
return total_infoYOLO'nun resimler için gereksinimleri olduğundan, resimlerle ilgili dosyalarda bazı değişiklikler yapmamız gerekiyor.Genellikle resimlere açıklama eklememiz gerekir, genellikle resimleri etiketlemek için labelme aracını kullanırız.Aşağıda yaygın olarak kullanılan resim etiketleme araçlarının bir karşılaştırması vardır.Hedef tespiti için, labelme kullanabiliriz.
Bu açıklama, resimdeki plaka çerçevesini json dosyası olacak şekilde seçmek içindir.

Kutudaki veriler bir plakanın sol üst noktası (x1, y1) ve sağ alt nokta verileridir (x2, y2) ve bu verileri çıkarmamız gerekiyor.
Ancak Çin Bilim ve Teknoloji Üniversitesi'nin CCPD verilerimiz için, bu veriler dosya adına zaten yazılmıştır, yalnızca YOLO'nun bir gereksinimini karşılamak için adı işlememiz gerekir.
dosyaadıCar_data.py
import os
import Car_Model
import numpy as np
from PIL import Image
DATA_PATH = "/Users/pengpeng/Resources/Python/ccpd_base/car"
# Dosya adındaki 4 nokta koordinatını işleyin ve YOLO gereksinimlerini karşılayın
def process_position(data, data_name):
for name, title in zip(data[3], data_name):
yolo_data = []
bounding_boxes = name.split("_", 4)
real_positions = []
image_name = []
title1 = title.split('.', 2)
image_name.append(title1[0])
# 4 nokta verisi al
for bbox in bounding_boxes:
values = bbox.split("&", 1)
for index in range(len(values)):
values[index] = int(int(values[index]))
real_positions.append(values)
real_positions = np.int0(np.array(real_positions))
# tüm maksimum değeri al
Xs = [i[0] for i in real_positions]
Ys = [i[1] for i in real_positions]
x1 = abs(min(Xs))
x2 = abs(max(Xs))
y1 = abs(min(Ys))
y2 = abs(max(Ys))
'''
YOLO, bu kutunun aşağıdaki gereksinimleri karşılamasını gerektirir
(1) Kutunun merkez koordinat konumu, genişliği (genişliği) ve yüksekliği (yüksekliği) gereklidir
(2) Her değer 0-1 arasında bir ondalık olmalıdır, bu nedenle normalize edilmesi gerekir.
(3) Ayrıca her kutunun hangi kategoriye ait olduğunu işaretlemek ve x, y, w, h kategorisinin beş değerine göre yazmak gerekir.
(4) Yukarıdaki içeriğe erişmek için bir fotoğrafın tüm çerçeveleri için yeni bir txt dosyası oluşturmak gereklidir.
# Görüntü bilgilerini alın, görüntü boyutunu sırasıyla genişlik ve yükseklik olsun
img_path = DATA_PATH+"/images/"+title
img = Image.open(img_path)
imgSize = img.size
img_width = imgSize[0]
img_height = imgSize[1]
# Normalleştirme için bu içerikleri doğrudan kopyalamanız yeterlidir
dw = 1. / img_width # 1/w
dh = 1. / img_height # 1/h
x = (x1 + x2) / 2.0 - 1 #Şekildeki nesnenin merkez noktasının x koordinatı
y = (y1 + y2) / 2.0 - 1 # Şekildeki nesnenin merkez noktasının y koordinatı
w = x2 - x1 # Nesnenin gerçek piksel genişliği
h = y2 - y1 # Nesnenin gerçek piksel yüksekliği
x = x * dw # Nesne merkez noktasının x koordinat oranı (x/orijinal görüntü w'ye eşdeğer)
w = w * dw # nesne genişliğinin genişlik oranı (w/orijinal görüntü w'ye eşdeğer)
y = y * dh # Nesnenin merkez noktasının y koordinat oranı (y/orijinal görüntü h'ye eşdeğer)
h = h * dh # nesne genişliğinin genişlik oranı (h/orijinal görüntü h'ye eşdeğer)
# Bu beş değeri dosyaya yazın
yolo_data.append([0, x, y, w, h])
yolo_data = np.array(yolo_data)
# bbox'ın resim bilgilerini kaydedin
np.savetxt(
os.path.join(DATA_PATH, f'labels/{title1[0]}.txt'),
yolo_data,
fmt=['%d', '%f', '%f', '%f', '%f']
)
if __name__ == '__main__':
total_infos = Car_Model.load_files(DATA_PATH, True)
title = Car_Model.load_files(DATA_PATH, False)
process_position(total_infos, title)Başka bir dosya işleme_character.pyAmaç, görüntünün mutlak yolunu train.txt ve test.txt dosyasına yazmaktır.
import os import random
# tren oranı %70
tren_percet = 0.7
# Dosya mutlak yolu Mac bilgisayarın adresi Windows bilgisayarınkinden farklıdır, Linux'un adresine benzer
path = "/Users/pengpeng/Resources/Python/ccpd_base/car"
# araba klasörünün altındaki resim klasörü
images = "images"
# Yeni train.txt ve test.txt
names = ["train", "test"]
# Görüntüler klasörüne erişin ve tren ve test dosyalarına mutlak adresi yazın
images_path = os.path.join(yol, resimler)
images_path = os.listdir(images_path)
total_labels = []
images_path içindeki etiket için:
# Mac bilgisayarlar özel olduğu için her dosyada .DS_Store adında gizli bir dosya vardır ve bu dosyanın hariç tutulması gerekir.
if etiketi == ".DS_Store":
devam et
total_labels.append(etiket)
# Verileri önceki olasılığa göre rasgele hale getirin
num = len(total_labels)
digit = range(num)
trd = int(num * train_percet)
ted = int(num * (1-train_percet))
trdr = random.sample(digit, trd) # train_digit_random
tedr = random.sample(trdr, ted) # test_digit_random
# Sırasıyla aşağıdaki iki dosyaya yazın
ftrain = open(path+'/train.txt', 'w')
ftest = open(path+'/test.txt', 'w')
# Rastgele göre tren ve test oranına bölün Bu, tren ve testi makine öğrenimine göre düzenlemek içindir, elbette kendi gereksinimlerinize göre ayarlayabilirsiniz
i için rakam:
name_path = path + "/" + images + "/" + total_labels[i] + "\n"
print(name_path)
if i in trdr:
ftrain.write(name_path)
else:
ftest.write(name_path)
# Dosyayı yazdıktan sonra dosyayı kapatın
ftrain.close()
ftest.close()Yukarıdaki üçünü sırayla yürüttükten sonra, ilgili içeriğini içeren aşağıdaki dosyayı alabiliriz.

Bu noktada plakamızın tespiti tamamlanmıştır.
Ardından yolo'nun kök dizinini bulmak için terminalimizi veya cmd'yi açın, anconda'nın sanal ortamını kullanıyorum

Komut satırına aşağıdaki komutu girin
python train.py --data car.yaml --cfg models/yolov5s.yaml --weights weights/yolov5s.pt --batch-size 10 --epochs 3 # --data'yı yeni yazılan yapılandırma dosyası izler, yolo'nun kök dizininde bulunan dosya # --cfg yapılandırmayı kullan, ardından bu dosyayı değiştir # --ağırlıklar model ağırlıklarını kullanır # --batch-size parti boyutu # --epochs basitçe çalıştırma sayısı olarak anlaşılırmac m1pro kullanıldığı için pytorch'un gpu'su kullanılamaz.Mevcut Haziran 2022'ye göre kullanılamaz ve sadece cpu kullanılabilir. Hesaplama süresi çok uzun, hesaplama süresi 3 kez 2 saat (hatırlamıyorum)
Sonunda, basit bir simya da kabul edilebilir bir sonuç elde edebilir.

Bu sonuçlar, aşağıda bulunan bir klasörle sonuçlanacaktır.

Bu şekilde, sadece kendimize ait bir plaka algılama modeli elde ederiz.
O zaman tek yapmamız gereken, plaka tespitimizin sonucunu tahmin etmektir.
