Traitement des jeux de données CCPD (détection d'objets et reconnaissance de texte)


avant-propos

  Récemment, l'ensemble de données CCPD a été utilisé, mais l'ensemble de données CCPD open source n'est pas facilement disponible, j'ai donc écrit un script faisant référence au format d'image pour générer un fichier d'étiquette qui prend en charge la détection de cible et la reconnaissance de texte. Voici CCPD2019 à titre d'exemple.


1. Introduction à l'ensemble de données CCPD

  L'ensemble de données CCPD est principalement collecté depuis un parking à Anhui pendant une période de temps. La taille de toutes les images est fixée à 720 × 1160 (w × h), et il contient environ 25w + images de diverses scènes, comme indiqué dans le figure ci-dessous : en même temps, il nous donne également en fonction
insérez la description de l'image ici
du fait que CCPD-Base a divisé l'ensemble d'apprentissage, l'ensemble de test et l'ensemble de vérification, et le chemin du fichier est stocké sous des fractionnements, comme indiqué sur la figure : les textes restants
insérez la description de l'image ici
correspondent à les chemins relatifs des images dans chaque scène, ce qui est pratique pour nous de diviser par nous-mêmes. Il est recommandé à chacun de diviser l'ensemble de données en fonction de ses propres besoins.

2. Adresse de téléchargement

  L'adresse de téléchargement est : CCPD

3. Interprétation du format

  Une fois l'image décompressée, elle ressemble à ceci :
insérez la description de l'image ici
nous pouvons voir que le nom du fichier est composé d'un ensemble de chiffres et de symboles. Que représentent-ils ? Prenons le premier nom de fichier : "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" comme exemple, séparez ces symboles et nombres par "-", et chaque paragraphe représente une signification : 1, 01
 : La plaque d'immatriculation représente la proportion de l'ensemble de l'interface ; (généralement inutile, peut être ignoré)
 2, 86_91 : angle horizontal et angle vertical de la plaque d'immatriculation
 3, 298&341_449&414 : coordonnées du coin supérieur gauche et du coin inférieur droit de la plaque d'immatriculation cadre d'étiquette 4, 458&394_308
 &410_304&357_454&341 : coordonnées des quatre sommets de la plaque d'immatriculation, l'ordre est inférieur droit, inférieur gauche, supérieur gauche, supérieur droit
 5, 0_0_14_28_24_26_29 : cela représente la relation cartographique avec la province (première), la préfecture (deuxième ), et numéro de plaque d'immatriculation (le reste) 6, 124
 : Luminosité, plus la valeur est élevée Plus la luminosité est élevée (pour référence uniquement)
 7, 24 : Flou, plus la valeur est petite, plus le flou est important (pour référence uniquement)

Quatrièmement, générer l'étiquette correspondante

  Cette fois, nous téléchargeons directement le code, nous devons spécifier notre propre chemin dans le code, tel que le chemin du fichier image et le chemin pour enregistrer le txt généré ; deuxièmement, nous devons activer le commutateur correspondant selon notre propre tâches, telles que le positionnement de la plaque d'immatriculation, définissez use_landmarks sur True, sinon :

import os
import glob
import cv2
from pathlib import Path
import numpy as np

root_dir=""
txt_dir=""
use_landmarks=False #用于车牌定位,如MTCNN、YOLO5Face
use_xywh=False #用于车牌检测,如YOLO等
use_ocr=False #用于识别
os.makedirs(txt_dir,exist_ok=True)

#返回中心点坐标、宽、高以及四个顶点的位置信息共12个信息,可用于mtcnn或yolo5Face检测定位车牌
def ccpd_landmarks(points_list,imgw,imgh):
    '''
    Args:
        points_list: 车牌四个顶点的位置信息
        imgw: 图片宽度
        imgh: 图片高度
    Returns:
    '''
    annotation=np.zeros((1,12))
    points_list_=[]
    #得到四个端点
    for points in points_list.split("_"):
        points_=list(map(int,points.split("&")))
        points_list_.append(points_)
    points_list_=np.array(points_list_)

    #获的box的坐标
    xmin=min(points_list_[:,0])
    xmax=max(points_list_[:,0])
    ymin=min(points_list_[:,1])
    ymax=max(points_list_[:,1])
    dw=1./imgw
    dh=1./imgh
    w,h=xmax-xmin,ymax-ymin
    #生成对应的信息列表
    annotation[0,0]=((xmin+xmax)/2.-1)*dw #cx
    annotation[0,1]=((ymin+ymax)/2.-1)*dh #cy
    annotation[0,2]=w*dw #w
    annotation[0,3]=h*dh #h
    annotation[0,4]=points_list_[2][0]/imgw #左上x
    annotation[0,5]=points_list_[2][1]/imgh #左上y
    annotation[0,6]=points_list_[3][0]/imgw #右上x
    annotation[0,7]=points_list_[3][1]/imgh #右上y
    annotation[0,8]=points_list_[0][0]/imgw #右下x
    annotation[0,9]=points_list_[0][1]/imgh #右上y
    annotation[0,10]=points_list_[1][0]/imgw #左下x
    annotation[0,11]=points_list_[1][1]/imgh #左下y
    return annotation


#仅返回图片的中心点坐标以及宽高信息,可用于YOLO系列检测车牌
def ccpd_xywh(points_list,imgw,imgh):
    '''
        Args:
            points_list: 车牌四个顶点的位置信息
            imgw: 图片宽度
            imgh: 图片高度
        Returns:
        '''
    annotation = np.zeros((1, 4))
    points_list_ = []
    # 得到四个端点
    for points in points_list.split("_"):
        points_ = list(map(int, points.split("&")))
        points_list_.append(points_)
    points_list_ = np.array(points_list_)

    #获的box的坐标
    xmin=min(points_list_[:,0])
    xmax=max(points_list_[:,0])
    ymin=min(points_list_[:,1])
    ymax=max(points_list_[:,1])
    dw=1./imgw
    dh=1./imgh
    w,h=xmax-xmin,ymax-ymin
    # 生成对应的信息列表
    annotation[0, 0] = ((xmin + xmax) / 2. - 1) * dw  # cx
    annotation[0, 1] = ((ymin + ymax) / 2. - 1) * dh  # cy
    annotation[0, 2] = w * dw  # w
    annotation[0, 3] = h * dh  # h
    return annotation

#返回对应的文本信息,可用于ocr识别车牌
def ccpd_ocr(plate):
    '''
    Args:
        plate: 文件名中的数字
    Returns:
    '''
    #车牌字典
    #省
    provinces = ["皖", "沪", "津", "渝", "冀", "晋", "蒙", "辽", "吉", "黑", "苏", "浙", "京", "闽", "赣", "鲁", "豫", "鄂", "湘", "粤",
                 "桂", "琼", "川", "贵", "云", "藏", "陕", "甘", "青", "宁", "新", "警", "学", "O"]
    #具体信息
    word_lists = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
                 'W','X', 'Y', 'Z', 'O', '1', '2', '3', '4', '5', '6', '7', '8', '9','0']


    label_list=plate.split("_")
    print(len(label_list))
    result=""
    result+=provinces[int(label_list[0])]
    result+=word_lists[int(label_list[1])]
    result+=word_lists[int(label_list[2])]+word_lists[int(label_list[3])]+word_lists[int(label_list[4])]+\
            word_lists[int(label_list[5])]+word_lists[int(label_list[6])]
    return result


def ccpd2label(all_list):
    for imgpath in all_list:
        img=cv2.imread(imgpath)
        h,w=img.shape[:2]

        imgname=Path(imgpath).name
        points_list,plate_list=imgname.split("-")[3],imgname.split("-")[4]#四个关键点的坐标[右下、左下、左上、右上],车牌号映射表
        if use_landmarks:
            annotation=ccpd_landmarks(points_list,w,h) #获得要写入txt的信息
            txtname = imgname.replace(".jpg", ".txt")
            txt_path = os.path.join(txt_dir, txtname)
            str_label = "0"  # 类别默认为0
            with open(txt_path, "a+") as fw:
                for i in range(len(annotation[0])):
                    str_label = str_label + " " + str(annotation[0][i])
                fw.write(str_label)
        elif use_xywh:
            annotation=ccpd_xywh(points_list,w,h) #获得要写入txt的信息
            txtname = imgname.replace(".jpg", ".txt")
            txt_path = os.path.join(txt_dir, txtname)
            str_label = "0"  # 类别默认为0
            with open(txt_path, "a+") as fw:
                for i in range(len(annotation[0])):
                    str_label = str_label + " " + str(annotation[0][i])
                fw.write(str_label)
        elif use_ocr:
            ocr_label=ccpd_ocr(plate_list)
            txtname=imgname.replace(".jpg",".txt")
            txt_path=os.path.join(txt_dir,txtname)
            with open(txt_path,"a+") as fw:
                fw.write(ocr_label)

if __name__ == '__main__':
    image_list=glob.glob(root_dir+os.sep+"*.jpg")
    ccpd2label(image_list)

Blogue de référence : https://blog.csdn.net/luohenyj/article/details/117752120


Résumer

Ce qui précède est l'intégralité du contenu de cet article. Si vous avez des questions, n'hésitez pas à commenter pour communiquer ou à rejoindre le groupe QQ : 995760755 pour communiquer.

Je suppose que tu aimes

Origine blog.csdn.net/qq_55068938/article/details/125807811
conseillé
Classement