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.
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!