He recopilado algunos conjuntos de datos utilizados en el reconocimiento de matrículas, los he examinado manualmente uno por uno para filtrar imágenes borrosas y procesar áreas ambiguas, y se pueden utilizar directamente.
La etiqueta está en formato json de labelme y el marco de destino es un polígono. La ventaja es que las matrículas desde diferentes ángulos pueden encajar perfectamente, como se muestra en la imagen.
Se han clasificado tres tipos de matrículas: placa azul , placa verde y placa amarilla (haga clic para descargar directamente).
Si desea realizar un entrenamiento de detección de objetivos de yolo, puede utilizar el siguiente código para convertirlo al formato darknet de yolo:
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)
Si desea el formato json del cuadro de destino con forma de rectángulo, use el siguiente código para convertirlo:
# -*- 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")
¡Bienvenidos a enviar mensajes privados para aprender y comunicarnos juntos!