• 11-06-2022, 18:07:30
    #1
    Kişisel Rütbe
    Merhabalar Çinli Ücretli kaynaktan aldığım bilgiyi sizinle paylaşmak istiyorum. Amacımız dostuna yakın düşmanına daha yakın ol ve daha yakından izle prensibinden gelmektedir. Yani belki çok işimize yarayacak.

    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 dizini
    tren: 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_info
    YOLO'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.py
    Amaç, 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ır
    mac 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.
  • 13-07-2022, 13:23:44
    #2
    Anlatım ve bilgi için teşekkürler.

    Konuyla çok alakam yok açıkcası yorumsuzda görünce emeğinize bir saygı duruşu atmak güzel olur diye düşündüm
  • 13-07-2022, 17:21:46
    #3
    Kişisel Rütbe
    zoeken adlı üyeden alıntı: mesajı görüntüle
    Anlatım ve bilgi için teşekkürler.

    Konuyla çok alakam yok açıkcası yorumsuzda görünce emeğinize bir saygı duruşu atmak güzel olur diye düşündüm
    Teşekkür ederim hocam