Procesamiento de conjuntos de datos CCPD (detección de objetos y reconocimiento de texto)


prefacio

  Recientemente, se usó el conjunto de datos CCPD, pero el conjunto de datos CCPD de código abierto no está fácilmente disponible, por lo que escribí un script que hace referencia al formato de imagen para generar un archivo de etiqueta que admita la detección de objetivos y el reconocimiento de texto. Los siguientes son CCPD2019 como ejemplo.


1. Introducción al conjunto de datos CCPD

  El conjunto de datos CCPD se recopila principalmente de un estacionamiento en Anhui durante un período de tiempo. El tamaño de todas las imágenes se fija en 720 × 1160 (ancho × alto) y contiene alrededor de 25 imágenes de w + de varias escenas, como se muestra en la figura a continuación: Al mismo tiempo, también nos da en base
inserte la descripción de la imagen aquí
a que CCPD-Base ha dividido el conjunto de entrenamiento, el conjunto de prueba y el conjunto de verificación, y la ruta del archivo se almacena en divisiones, como se muestra en la figura: los
inserte la descripción de la imagen aquí
textos restantes corresponden a las rutas relativas de las imágenes en cada escena, lo cual es conveniente para nosotros dividir por nosotros mismos Se recomienda que todos dividan el conjunto de datos según sus propias necesidades.

2. Dirección de descarga

  La dirección de descarga es: CCPD

3. Interpretación del formato

  Después de descomprimir la imagen, se ve así.
inserte la descripción de la imagen aquí
Podemos ver que el nombre del archivo está compuesto por un montón de números y símbolos. ¿Qué representan estos? Tomemos el primer nombre de archivo: "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" como ejemplo, separe estos símbolos y números según "-", y cada párrafo representa un significado: 1, 01
 : La matrícula representa la proporción de toda la interfaz; (generalmente inútil, se puede ignorar)
 2, 86_91: ángulo horizontal y ángulo vertical de la matrícula
 3, 298&341_449&414: coordenadas de la esquina superior izquierda y la esquina inferior derecha de la matrícula cuadro de etiqueta 4, 458&394_308
 &410_304&357_454&341: coordenadas de los cuatro vértices de la placa, el orden es abajo a la derecha, abajo a la izquierda, arriba a la izquierda, arriba a la derecha
 5, 0_0_14_28_24_26_29: Esto representa la relación de mapeo con la provincia (primera), prefectura (segunda ), y número de matrícula (el resto) 6, 124
 : Brillo, cuanto mayor sea el valor Cuanto mayor sea el brillo (solo como referencia)
 7, 24: Borrosidad, cuanto menor sea el valor, más borroso (solo como referencia)

Cuarto, generar la etiqueta correspondiente

  Esta vez cargamos directamente el código, debemos especificar nuestra propia ruta en el código, como la ruta del archivo de imagen y la ruta para guardar el txt generado; en segundo lugar, debemos activar el interruptor correspondiente según nuestro propio tareas, como el posicionamiento de matrículas, establezca use_landmarks en True, de lo contrario, como:

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)

Blog de referencia: https://blog.csdn.net/luohenyj/article/details/117752120


Resumir

Lo anterior es todo el contenido de este artículo. Si tiene alguna pregunta, bienvenido a comentar para comunicarse o unirse al grupo QQ: 995760755 para comunicarse.

Supongo que te gusta

Origin blog.csdn.net/qq_55068938/article/details/125807811
Recomendado
Clasificación