License plate recognition data set (blue plate, yellow plate, green plate) and related conversion codes

I have compiled some data sets used in license plate recognition. I have manually screened them one by one to filter out blurry pictures and process ambiguous areas. They can be used directly.
The label is in labelme's json format, and the target frame is a polygon. The advantage is that license plates from different angles can fit perfectly, as shown in the picture.
Insert image description here
Three types of license plates have been sorted out, namely blue plate , green plate and yellow plate (click to download directly).
If you want to perform yolo target detection training, you can use the following code to convert to yolo's darknet format:

import json
import os
import shutil
import cv2
import os
from numpy.lib.twodim_base import triu_indices_from
import pandas as pd
from glob import glob
import codecs

print(cv2.__version__)


def getBoundingBox(points):              
    xmin = points[0][0]
    xmax = points[0][0]
    ymin = points[0][1]
    ymax = points[0][1]
    for p in points:
        if p[0] > xmax:
            xmax = p[0]
        elif p[0] < xmin:
            xmin = p[0]
        if p[1] > ymax:
            ymax = p[1]
        elif p[1] < ymin:
            ymin = p[1]
    return [int(xmin), int(xmax), int(ymin), int(ymax)]


def json2txt(json_path, midTxt_path):
    json_data = json.load(open(json_path))         
    img_h = json_data["imageHeight"]
    img_w = json_data["imageWidth"]
    shape_data = json_data["shapes"]
    shape_data_len = len(shape_data)
    img_name = os.path.split(json_path)[-1].split(".json")[0]    
    name = img_name + '.jpg'                            
    data = ''
    for i in range(shape_data_len):
        lable_name = shape_data[i]["label"]             
        points = shape_data[i]["points"]                
        [xmin, xmax, ymin, ymax] = getBoundingBox(points)
        if xmin <= 0:
            xmin = 0
        if ymin <= 0:
            ymin = 0
        if xmax >= img_w:  
            xmax = img_w - 1
        if ymax >= img_h:
            ymax = img_h - 1
        b = name + ' ' + lable_name + ' ' + str(xmin) + ' ' + str(ymin) + ' ' + str(xmax) + ' ' + str(ymax)
        print(b)
        data += b + '\n'
    with open(midTxt_path + '/' + img_name + ".txt", 'w', encoding='utf-8') as f:    
        f.writelines(data)          

def txt2darknet(midTxt_path, img_path):
    data = pd.DataFrame()
    filelist = os.listdir(midTxt_path) 
    for file in filelist:                                                   
        file_path = os.path.join(midTxt_path, file)
        filename = os.path.splitext(file)[0]
        imgName = filename + '.jpg'
        imgPath = os.path.join(img_path, imgName)
        # for path in img_path:
        #     imgPath = os.path.join(path, imgName)
        #     if not os.path.exists(imgPath):
        #         continue
        #     else:
        #         break
        
        if not os.path.exists(imgPath):
            imgName = filename + '.png'
            imgPath = os.path.join(img_path, imgName)
            if not os.path.exists(imgPath):
                imgName = filename + '.jpeg'
                imgPath = os.path.join(img_path, imgName)
        img = cv2.imread(imgPath)
        print(imgPath)
        [img_h, img_w, _] = img.shape
        data = ""
        with codecs.open(file_path, 'r', encoding='utf-8',errors='ignore') as f1:
            for line in f1.readlines():
                line = line.strip('\n')
                a = line.split(' ')
                if int(a[5]) - int(a[3]) <= 15 or int(a[4]) - int(a[2]) <= 15:
                    img[int(a[3]):int(a[5]), int(a[2]):int(a[4]), :] = (0,0,0)
                    continue
                if a[1] == 'other' or a[1] == 'del':
                    img[int(a[3]):int(a[5]), int(a[2]):int(a[4]), :] = (0,0,0)
                    continue
                if a[1] == 'plate_p':            # blue
                    a[1] = '0'
                elif a[1] == 'green_plate':      # green
                    a[1] = '1'
                elif a[1] == 'yellow_plate_s':   # yellow
                    a[1] = '2'

                x1 = float(a[2])
                y1 = float(a[3])
                w = float(a[4]) - float(a[2])
                h = float(a[5]) - float(a[3])

                # if w <= 15 and h <= 15: continue

                center_x = float(a[2]) + w / 2
                center_y = float(a[3]) + h / 2
                a[2] = str(center_x / img_w)
                a[3] = str(center_y / img_h)
                a[4] = str(w / img_w)
                a[5] = str(h / img_h)
                b = a[1] + ' ' + a[2] + ' ' + a[3] + ' ' + a[4] + ' ' + a[5]
                print(b)
                data += b + '\n'
        with open(saved_path + '/' + filename + ".txt", 'w', encoding='utf-8') as f2:    
            f2.writelines(data)

json_path = "/data/license_plate/blue"
midTxt_path = "/data/license_plate/blue/mid"
img_path = "/data/license_plate/blue"
saved_path = '/data/license_plate/save'

if not os.path.exists(midTxt_path):
    os.mkdir(midTxt_path)

filelist = os.listdir(json_path)                   
for file in filelist:
    old_dir = os.path.join(json_path, file)         
    if os.path.isdir(old_dir):
        continue                                    
    filetype = os.path.splitext(file)[1]            
    if(filetype != ".json"): continue               
    json2txt(old_dir, midTxt_path)

txt2darknet(midTxt_path, img_path)
shutil.rmtree(midTxt_path)

If you want the json format of the rectangle-shaped target box, use the following code to convert it:

# -*- coding: utf-8 -*-
import json
import cv2
from glob import glob
import os


txt_path = '/license_plate/save/'   # darknet格式
saved_path = '/data/license_plate/json/'
img_path = '/data/license_plate/blue/images/'


files = glob(txt_path + "*.txt")               
# files = os.listdir(txt_path)
# print(files)
files = [i.split('/')[-1].split('.txt')[0] for i in files]
print(files)

for file in files:
    print(file)
    txt_file = txt_path + file + '.txt'
    img_file = img_path + file + '.jpg'
    if not os.path.exists(img_file):
        img_file = img_path + file + '.png'
        if not os.path.exists(img_file):
            img_file = img_path + file + '.jpeg'
    print(img_file)
    img = cv2.imread(img_file)
    # print(img)
    imgw = img.shape[1]
    imgh = img.shape[0]
    xi = []
    yi = []
    xa = []
    ya = []
    Label = []

    with open(txt_file, 'r') as f:             
        for line in f.readlines():
            line = line.strip('\n')            
            a = line.split(' ')  
            label = 'other'
            if a[0] == '0':
                label = 'plate_p'   
            elif a[0] == '1':
                label = 'green_plate'   
            elif a[0] == '2':
                label = 'yellow_plate_s'  
            
            Label.append(label)
            print(Label)

            centerx=float(a[1])*imgw
            centery=float(a[2])*imgh
            w=float(a[3])*imgw
            h=float(a[4])*imgh
            xmin = centerx - w/2
            xmax= centerx + w/2
            ymin= centery - h/2
            ymax = centery + h/2

            xi.append(xmin)
            yi.append(ymin)
            xa.append(xmax)
            ya.append(ymax)

    # for j in range(0, len(files)):
    labelme_formate = {
    
    
        "version": "4.2.9",
        "flags": {
    
    },
        "lineColor": [0, 255, 0, 128],
        "fillColor": [255, 0, 0, 128],
        "imagePath": os.path.split(img_file)[-1],
        "imageHeight": imgh,
        "imageWidth": imgw
    }
    labelme_formate['imageData'] = None
    shapes = []
    for i in range(0, len(xi)):
        s = {
    
    "label": Label[i], "line_color": None, "fill_color": None, "shape_type": "rectangle"}
        points = [
            [xi[i], yi[i]],
            [xa[i], ya[i]]
        ]
        s['points'] = points
        shapes.append(s)

    labelme_formate['shapes'] = shapes
    json.dump(labelme_formate, open(saved_path + file + ".json", 'w'), ensure_ascii=False, indent=2)
    print(saved_path + file + ".json")

Welcome to send private messages to learn and communicate together!

Guess you like

Origin blog.csdn.net/weixin_45354497/article/details/129562699
Recommended