0


车牌识别数据集(蓝牌、黄牌、绿牌)及相关转换代码

自己整理了一些用在车牌识别的数据集,已经人工一张一张的筛选过了,过滤掉模糊的图片、处理有歧义的区域,可以直接采用。
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")

欢迎私信一起学习交流!


本文转载自: https://blog.csdn.net/weixin_45354497/article/details/129562699
版权归原作者 诶尔法Alpha 所有, 如有侵权,请联系我们删除。

“车牌识别数据集(蓝牌、黄牌、绿牌)及相关转换代码”的评论:

还没有评论