Projet complet de reconnaissance de plaque d'immatriculation Tensorflow (y compris le code source complet et l'ensemble de formation)

Conception et mise en œuvre d'un système de reconnaissance de plaques d'immatriculation basé sur TensorFlow, utilisant les technologies liées à tensorflow et OpenCV pour réaliser le positionnement des plaques d'immatriculation, la binarisation des plaques d'immatriculation, l'amélioration du débruitage des plaques d'immatriculation, la segmentation d'image, la formation de modèles et la reconnaissance des plaques d'immatriculation, etc.

Problèmes de projet, terminés, Daiso peut discuter avec les blogueurs en privé

contenu

Préparation environnementale

Processus de pensée

Description de la fonction

détail

Cadre général du projet

Affichage du processus

Présentation technique

1. Tensorflow

2. OpenCV

conception du système

Réalisation de projet

finalement


Préparation environnementale

    Anaconda 4.10.3
    Tensorflow 2.6.0 codage
    python3.7.8 : interpréteur
    utf-8
    pycharm : D:\Anaconda\envs\tensorflow\python.exe
    et diverses bibliothèques tierces

Processus de pensée

1. Reconnaître et localiser la plaque d'immatriculation grâce à la découpe opencv, couper et enregistrer

2. Identifiez l'abréviation de la province, identifiez le code de la ville, identifiez le numéro de la plaque d'immatriculation

Description de la fonction

    car_num_main.py     : Convertit l'image en image en niveaux de gris, polarise l'image en niveaux de gris, segmente l'image et l'enregistre
    respectivement sous forme   de fichiers .jpg et .bmp
Reconnaissance de la formation au code de la ville
    train-license-digits.py : Reconnaissance de la formation au numéro de plaque d'immatriculation

Téléchargement de quatre programmes de base

détail

    1. Après avoir coupé les images, enregistrez-
    suivante    les dans deux dossiers     entrée de formation d'abréviation de province : python train-license-province.py predict Exécutez la commande suivante pour l'     entrée de reconnaissance d'abréviation de province : python train-license-letters.py train Exécutez la commande suivante pour l'entrée d'apprentissage du code de la ville     : python train-license-letters.py predict pour l'     entrée de reconnaissance du code de ville et exécutez la commande suivante : python train-license-digits.py train pour l'entrée d'apprentissage du numéro de plaque d'immatriculation     et exécutez ce qui suit commande     : python     train-license-digits.py prédire la reconnaissance du numéro de plaque d'immatriculation Pour le numéro de plaque d'immatriculation qui peut être reconnu avec précision, veuillez vous référer à l'ensemble de formation dans l'ensemble de données







ensemble de données

Cadre général du projet

capture_img : stocke l'image de la plaque d'immatriculation à reconnaître

img_cut : après avoir exécuté car_num_main.py, une image coupée est générée

img_cut_not_3240 : Exécutez car_num_main.py pour générer une image coupée (amélioration du contraste)

test_images : stocke les images de test

train_images : stocke les images d'entraînement

train-saver : former le modèle

Affichage du processus

PS D:\pycharm\pycharm_work> cd .\chepai\
PS D:\pycharm\pycharm_work\chepai> python train-license-province.py train

PS D:\pycharm\pycharm_work\chepai> python train-license-province.py predict

PS D:\pycharm\pycharm_work\chepai> python train-license-digits.py predict

Présentation technique

1. Tensorflow

        TensorFlow est une bibliothèque logicielle open-source pour le calcul numérique haute performance. Grâce à son architecture flexible, les utilisateurs peuvent facilement déployer des tâches informatiques sur plusieurs plates-formes (CPU, GPU, TPU) et appareils (bureaux, clusters de serveurs, appareils mobiles, appareils de périphérie, etc.).

        TensorFlow est une bibliothèque d'apprentissage automatique open source pour la recherche et la production. TensorFlow fournit une variété d'API pour les débutants et les experts à développer dans des environnements de bureau, mobiles, Web et cloud.

        TensorFlow utilise des graphiques de flux de données pour calculer, nous devons donc d'abord créer un graphique de flux de données, puis placer nos données (données sous forme de tenseurs) dans le graphique de flux de données pour le calcul. Les nœuds représentent des opérations mathématiques dans le graphe, et les arêtes du graphe représentent des tableaux de données multidimensionnels qui sont interconnectés entre les nœuds, à savoir des tenseurs. Lors de la formation du modèle, le tenseur circulera en continu d'un nœud dans le graphe de flux de données vers un autre nœud.

2. OpenCV

        OpenCV est une bibliothèque de logiciels de vision par ordinateur et d'apprentissage automatique multiplateforme publiée sous la licence BSD (open source) et peut fonctionner sur les systèmes d'exploitation Linux , Windows , Android et Mac OS . Il est léger et efficace - il se compose d'une série de fonctions C et d'un petit nombre de classes C++, et fournit des interfaces avec des langages tels que Python, Ruby et MATLAB, et implémente de nombreux algorithmes généraux de traitement d'image et de vision par ordinateur.

        Les algorithmes de traitement visuel fournis par OpenCV sont très riches, et il est en partie écrit en langage C. Grâce à ses fonctionnalités open source, il peut être manipulé correctement sans ajouter de nouveau support externe. Il peut également être complètement compilé et lié pour générer des programmes d'exécution, tant de gens l'utilisent pour transplanter l'algorithme, le code d' OpenCV peut fonctionner normalement dans le système DSP et le système embarqué ARM après une réécriture appropriée. Ses domaines d'application tels que : l'interaction homme-machine, la reconnaissance d'objets, la segmentation d'images , la reconnaissance faciale , la reconnaissance d'action, le suivi de mouvement , la robotique, l'analyse de mouvement, la vision artificielle, l'analyse structurelle, la conduite en toute sécurité des véhicules et d'autres domaines.

conception du système

        La reconnaissance automatique des plaques d'immatriculation est basée sur le traitement de vision par ordinateur, le traitement d'images numériques, la reconnaissance de formes et d'autres technologies. Elle traite et analyse les images de véhicules ou les images vidéo capturées par des caméras pour obtenir le numéro de plaque d'immatriculation de chaque véhicule, complétant ainsi le processus de reconnaissance. Sur cette base, diverses fonctions de surveillance du trafic telles que la gestion des frais d'entrée et de sortie des parkings, la gestion des véhicules de vol, la gestion de l'automatisation de la survitesse des autoroutes, la police électronique des feux rouges et la gestion des péages autoroutiers peuvent être réalisées.

1. Flux de traitement du système

        La conception du système de reconnaissance automatique des plaques d'immatriculation comprend l'acquisition d'images de véhicules, le positionnement de la zone des plaques d'immatriculation, l'extraction des contours des caractéristiques des plaques d'immatriculation et la reconnaissance du contenu des plaques d'immatriculation.

2. Acquisition de la plaque d'immatriculation

         L'acquisition de l'image de la plaque d'immatriculation est la première étape de la reconnaissance de la plaque d'immatriculation. L'image de la plaque d'immatriculation peut être extraite de l'image du véhicule ou de l'image vidéo capturée par la caméra. L'image de la plaque d'immatriculation peut également être obtenue par le téléphone portable de l'utilisateur, puis transmise au système de reconnaissance de plaque d'immatriculation.

3. Génération d'images en niveaux de gris

        L'image du véhicule contenant les informations de la plaque d'immatriculation capturées par la caméra est colorée.Afin d'améliorer la capacité anti-interférence de la reconnaissance de la plaque d'immatriculation, l'image du véhicule en couleur est d'abord générée dans une image binaire en niveaux de gris pour réaliser l'emplacement de la zone de la plaque d'immatriculation en fonction sur le ton. Étant donné que les plaques d'immatriculation nationales sont souvent blanches sur fond bleu, une image binaire en niveaux de gris peut être générée en utilisant les caractéristiques de teinte ou de saturation des couleurs de l'image, afin de localiser plus précisément la position de la plaque d'immatriculation.

Quatrièmement, le positionnement de la zone de la plaque d'immatriculation

        La localisation de la zone de la plaque d'immatriculation adopte une méthode basée sur la forme. Étant donné que l'arrière-plan de l'image du véhicule est relativement complexe, le dépistage initial doit être effectué en fonction des caractéristiques de la plaque d'immatriculation. Les caractéristiques de la plaque d'immatriculation peuvent être sélectionnées à partir de la taille et de la proportion de la plaque d'immatriculation chinoise, car la plaque d'immatriculation est une forme rectangulaire fixe, en recherchant d'abord les zones avec des caractéristiques rectangulaires sur l'image, puis en extrayant ces zones, puis en combinant la longueur et la largeur de la plaque d'immatriculation.La zone rectangulaire correspondante est obtenue, de manière à réaliser le positionnement précis de la plaque d'immatriculation.

5. Extraction de contours de caractéristiques

        La fonction cv2.fifindContours() est utilisée dans l'interface entre OpenCV et Python pour trouver les contours des objets détectés.

La figure 3 et la figure 4 sont les diagrammes de comparaison des effets avant et après l'extraction des contours des caractéristiques :

6. Reconnaissance du contenu de la plaque d'immatriculation

        Lorsque le contenu de la plaque d'immatriculation est reconnu, la zone de plaque d'immatriculation finale est déterminée en calculant la valeur maximale de la valeur bleue (valeur moyenne) de la zone de plaque d'immatriculation candidate. Pour le contour de plaque d'immatriculation sélectionné, effectuez d'abord un positionnement approximatif, c'est-à-dire effectuez un traitement de régression des limites gauche et droite sur la plaque d'immatriculation, supprimez les parties redondantes des deux côtés de la plaque d'immatriculation, puis effectuez un positionnement fin, c'est-à-dire envoyez le plaque d'immatriculation au réseau CRNN pour la reconnaissance des caractères, et utilisez le modèle de régression des limites gauche et droite pour prédire Les bordures gauche et droite de la plaque d'immatriculation sont dessinées et rognées pour un positionnement précis. La méthode basée sur les caractéristiques du texte consiste à identifier en fonction des caractéristiques du contour du texte et à obtenir le résultat après l'analyse de l'algorithme correspondant.

Réalisation de projet

affichage du code de base

1. Vérifiez la plaque d'immatriculation

def find_car_num_brod():
    watch_cascade = cv2.CascadeClassifier('D:\pycharm\pycharm_work\chepai\cascade.xml')
    # 先读取图片
    image = cv2.imread("D:\pycharm\pycharm_work\chepai\capture_img\car1.jpg")
    resize_h = 1000
    height = image.shape[0]
    scale = image.shape[1] / float(image.shape[0])
    image = cv2.resize(image, (int(scale * resize_h), resize_h))
    image_gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
    watches = watch_cascade.detectMultiScale(image_gray, 1.2, 2, minSize=(36, 9), maxSize=(36 * 40, 9 * 40))

    print("检测到车牌数", len(watches))
    for (x, y, w, h) in watches:
        cv2.rectangle(image, (x, y), (x + w, y + h), (0, 0, 255), 1)
        cut_img = image[y + 5:y - 5 + h, x + 8:x  + w]  # 裁剪坐标为[y0:y1, x0:x1]
        cut_gray = cv2.cvtColor(cut_img, cv2.COLOR_RGB2GRAY)

        cv2.imwrite("D:\pycharm\pycharm_work\chepai\\num_for_car.jpg", cut_gray)
        im = Image.open("D:\pycharm\pycharm_work\chepai\\num_for_car.jpg")
        size = 720, 180
        mmm = im.resize(size, Image.ANTIALIAS)
        mmm.save("D:\pycharm\pycharm_work\chepai\\num_for_car.jpg", "JPEG", quality=90)
        break

2. Image binarisée

def cut_car_num_for_chart():
    # 1、读取图像,并把图像转换为灰度图像并显示
    img = cv2.imread("D:\pycharm\pycharm_work\chepai\\num_for_car.jpg")  # 读取图片
    img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 转换了灰度化
    cv2.imshow('gray', img_gray)  # 显示图片
    cv2.waitKey(0)
    # 2、将灰度图像二值化,设定阈值是100   转换后 白底黑字 ---》 目标黑底白字
    img_thre = img_gray
    # 灰点  白点 加错
    # cv2.threshold(img_gray, 130, 255, cv2.THRESH_BINARY_INV, img_thre)

    # 二值化处理 自适应阈值   效果不理想
    # th3 = cv2.adaptiveThreshold(img_gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)

    # 高斯除噪 二值化处理
    blur = cv2.GaussianBlur(img_gray, (5, 5), 0)
    ret3, th3 = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

    cv2.imshow('threshold', th3)
    cv2.imwrite('D:\pycharm\pycharm_work\chepai\wb_img.jpg', th3)
    cv2.waitKey(0)

        La première ligne de imread(), parce que l'indicateur est défini sur 1, lit une image en couleur et utilise la fonction cvtColor pour la convertir en une image en niveaux de gris. Si vous lisez une image en niveaux de gris, vous pouvez omettre la deuxième ligne de code, puis la convertir en une fonction de binarisation. La valeur de seuil de 180 peut être modifiée, puis améliorée. L'effet est comme illustré dans la figure :

 Découpe de trois caractères uniques

        La principale stratégie de segmentation à caractère unique consiste à détecter le changement total des pixels de la colonne, car la zone sans caractères est fondamentalement noire et la valeur du pixel est faible ; la zone avec des caractères est plus blanche et la somme des pixels de la colonne devient plus grande !

        Le seuil de changement de pixel de colonne est un problème. Je vois que de nombreux blogs utilisent un seuil fixe pour la détection. À moins que l'image binarisée après votre traitement ne soit parfaite, certaines images seront mélangées dans la zone blanche et la segmentation sera fausse !

        Considérant qu'il n'y a que 7 caractères dans la plaque d'immatriculation, déterminez d'abord la largeur. Si elle est inférieure à un septième de la largeur totale, elle sera considérée comme une interférence ; en fait, elle peut être augmentée à un huitième de la largeur totale (car il peut y avoir des connexions au milieu du symbole de la plaque d'immatriculation).

    n = 1
    start = 1
    end = 2
    temp = 1
    while n < width - 2:
        n += 1
        if (white[n] if arg else black[n]) > (0.05 * white_max if arg else 0.05 * black_max):
            # 上面这些判断用来辨别是白底黑字还是黑底白字
            # 0.05这个参数请多调整,对应上面的0.95
            start = n
            end = find_end(start, white, black, arg, white_max, black_max, width)
            n = end
            # 车牌框检测分割 二值化处理后 可以看到明显的左右边框  毕竟用的是网络开放资源 所以车牌框定位角度真的不准,
            # 所以我在这里截取单个字符时做处理,就当亡羊补牢吧
            # 思路就是从左开始检测匹配字符,若宽度(end - start)小与20则认为是左侧白条 pass掉  继续向右识别,否则说明是
            # 省份简称,剪切,压缩 保存,还有一个当后五位有数字 1 时,他的宽度也是很窄的,所以就直接认为是数字 1 不需要再
            # 做预测了(不然很窄的 1 截切  压缩后宽度是被拉伸的),
            # shutil.copy()函数是当检测到这个所谓的 1 时,从样本库中拷贝一张 1 的图片给当前temp下标下的字符
            if end - start > 5:  # 车牌左边白条移除
                print(" end - start" + str(end - start))
                if temp == 1 and end - start < 20:
                    pass
                elif temp > 3 and end - start < 20:
                    #  认为这个字符是数字1   copy 一个 32*40的 1 作为 temp.bmp
                    shutil.copy(
                        os.path.join("D:\pycharm\pycharm_work\chepai\fuzhi", "111.bmp"),  # 111.bmp 是一张 1 的样本图片
                        os.path.join("D:\pycharm\pycharm_work\chepai\\img_cut\\", str(temp) + '.bmp'))
                    pass
                else:
                    cj = th3[1:height, start:end]
                    cv2.imwrite("D:\pycharm\pycharm_work\chepai\img_cut_not_3240\\" + str(temp) + ".jpg", cj)

                    im = Image.open("D:\pycharm\pycharm_work\chepai\img_cut_not_3240\\" + str(temp) + ".jpg")
                    size = 32, 40
                    mmm = im.resize(size, Image.ANTIALIAS)
                    mmm.save("D:\pycharm\pycharm_work\chepai\img_cut\\" + str(temp) + ".bmp", quality=95)
                    temp = temp + 1

L'effet de coupe de la plaque d'immatriculation est illustré sur la figure :

 Quatre, reconnaissance de caractère unique

            max1 = 0
            max2 = 0
            max3 = 0
            max1_index = 0
            max2_index = 0
            max3_index = 0
            for j in range(NUM_CLASSES):
                if result[0][j] > max1:
                    max1 = result[0][j]
                    max1_index = j
                    continue
                if (result[0][j] > max2) and (result[0][j] <= max1):
                    max2 = result[0][j]
                    max2_index = j
                    continue
                if (result[0][j] > max3) and (result[0][j] <= max2):
                    max3 = result[0][j]
                    max3_index = j
                    continue

            license_num = license_num + LETTERS_DIGITS[max1_index]
            print("概率:  [%s %0.2f%%]    [%s %0.2f%%]    [%s %0.2f%%]" % (
            LETTERS_DIGITS[max1_index], max1 * 100, LETTERS_DIGITS[max2_index], max2 * 100, LETTERS_DIGITS[max3_index],
            max3 * 100))

        print("车牌编号是: 【%s】" % license_num)

L'effet final est montré dans la figure:

         Remarque : Cette image est le résultat courant des trois programmes suivants. J'ai assemblé les images. .

train-license-province.py : reconnaissance de la formation en abréviation de province  
train-license-letters.py : reconnaissance de la formation en code de ville
train-license-digits.py : reconnaissance de la formation en numéro de plaque d'immatriculation

finalement

        La reconnaissance de la plaque d'immatriculation ne peut pas être réussie à 100 %, mais elle peut essentiellement atteindre un degré de reconnaissance de plus de 95 % grâce à la formation. Vous pouvez modifier l'image dans le fichier capture_img ( notez que le format et la taille de l'image affecteront indirectement le degré de reconnaissance, et le nom de la plaque d'immatriculation est remplacé par car1.jpg ) est remplacé par votre propre plaque d'immatriculation pour reconnaître la plaque d'immatriculation grâce à la formation.

Cadre du programme cliquez ici pour télécharger

        Il suffit de mettre les test_images, train_images, train-saver et les quatre programmes de base ci-dessus en fonction du cadre général du projet ( le vert clair dans le texte est le lien de téléchargement )

Je suppose que tu aimes

Origine blog.csdn.net/m0_54925305/article/details/123246627
conseillé
Classement