自己整理了一些用在车牌识别的数据集,已经人工一张一张的筛选过了,过滤掉模糊的图片、处理有歧义的区域,可以直接采用。
label为labelme的json格式,目标框是polygon多边形,好处是不同角度的车牌都能完全贴合,如图。
整理了三类车牌,分别是蓝牌、绿牌、黄牌(直接点击即可下载)。
若是要进行yolo的目标检测训练,可用以下代码进行转换为yolo的darknet格式:
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__)defgetBoundingBox(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)]defjson2txt(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 inrange(shape_data_len):
lable_name = shape_data[i]["label"]
points = shape_data[i]["points"][xmin, xmax, ymin, ymax]= getBoundingBox(points)if xmin <=0:
xmin =0if ymin <=0:
ymin =0if xmax >= img_w:
xmax = img_w -1if ymax >= img_h:
ymax = img_h -1
b = name +' '+ lable_name +' '+str(xmin)+' '+str(ymin)+' '+str(xmax)+' '+str(ymax)print(b)
data += b +'\n'withopen(midTxt_path +'/'+ img_name +".txt",'w', encoding='utf-8')as f:
f.writelines(data)deftxt2darknet(midTxt_path, img_path):
data = pd.DataFrame()
filelist = os.listdir(midTxt_path)forfilein 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:# breakifnot os.path.exists(imgPath):
imgName = filename +'.png'
imgPath = os.path.join(img_path, imgName)ifnot 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(' ')ifint(a[5])-int(a[3])<=15orint(a[4])-int(a[2])<=15:
img[int(a[3]):int(a[5]),int(a[2]):int(a[4]),:]=(0,0,0)continueif a[1]=='other'or a[1]=='del':
img[int(a[3]):int(a[5]),int(a[2]):int(a[4]),:]=(0,0,0)continueif 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'withopen(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'ifnot os.path.exists(midTxt_path):
os.mkdir(midTxt_path)
filelist = os.listdir(json_path)forfilein 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)
如果想要矩形rectangle形状的目标框的json格式,再用以下代码转换:
# -*- 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)forfilein files:print(file)
txt_file = txt_path +file+'.txt'
img_file = img_path +file+'.jpg'ifnot os.path.exists(img_file):
img_file = img_path +file+'.png'ifnot 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 =[]withopen(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 inrange(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")
欢迎私信一起学习交流!
版权归原作者 诶尔法Alpha 所有, 如有侵权,请联系我们删除。