TensorFlow⼊门教程(28)车牌识别之使⽤EAST模型进⾏车
牌检测(四)
#
#作者:韦访
#博客:/rookie_weibbkxw net
#微信:1007895847
#添加微信的备注⼀下是CSDN的
#欢迎⼤家⼀起学习
#
1、概述
上⼀讲,我们实现了EAST的代码,但是我们使⽤的是ICDAR2017数据集,实现的是对⾃然场景下的⽂本检测,现在,我们在原来的代码的基础上,来实现针对车牌的检测。
可口可乐英文
环境配置:
操作系统:Ubuntu 64位
初级日语学习显卡:GTX 1080ti
Python:Python3.7
TensorFlow:2.3.0
2、CCPD2019数据集
下载链接:
CCPD2019是中科⼤开源的数据集,⽤于车牌检测以及识别的任务。数据集包含了远/近距离、⽔平/倾斜⾓度、不同光照、不同天⽓等等的包含车牌的照⽚。但是它也有很多缺陷,⽐如,⼤部分都是皖A车牌,都是7位数的燃油车牌,没有新能源车牌等等,不过作为学习使⽤也够了。
下载解压数据集后,得到如下所⽰⽂件夹,
其中,ccpd_开头的⽂件夹下都是图⽚数据,splits⽂件夹下则是⽂本⽂件。splits⽂件夹如下图所⽰,
随便打开⼀个⽂本看看,如下图所⽰,
可以看到,⽂件⾥的每⼀⾏都指向ccpd_blur⽂件夹下的⼀个图⽚⽂件,其他的也是类似的。
CCPD车牌坐标等信息是直接写在⽂件名⾥,格式如下,
info1-info2-info3-info4-info5-info6-info7.jpg
其含义如下,
info1:地域area
info2:倾斜程度Tilt degree
info3:标注框坐标Bounding box coordinates
info4:四个车牌顶⾓坐标Four vertices locations
info5:车牌号码Licen plate number
info6:车牌区域亮度信息Brightness
info7:车牌区域模糊程度Blurriness
我们写个代码来分别根据标注框坐标和顶点坐标画出车牌框,代码如下,
import cv2
import numpy as np
import csv
scale
import os
def line(image, polys, color=(0,0,255)):
image = cv2.line(image, tuple(polys[0]), tuple(polys[1]), color, thickness=5) image = cv2.line(image, tuple(polys[1]), tuple(polys[2]), color, thickness=5) image = cv2.line(image, tuple(polys[2]), tuple(polys[3]), color, thickness=5) image = cv2.line(image, tuple(polys[3]), tuple(polys[0]), color, thickness=5) return image
def get_polys(image_file):
polys = []
print("image_file:", image_file)
if not ists(image_file):
return np.array(polys, dtype=np.float32)
parts = image_file.split("-")
polys_part = parts[3].split("_")
print(polys_part)
poly = []
for p in polys_part:
poly.append(p.split("&"))
polys.append(np.asarray(poly).astype(np.int32))
print("polys:", polys)
return polys
def get_rectangle(image_file):
emt
polys = []
print("image_file:", image_file)
if not ists(image_file):
mns是什么
return np.array(polys, dtype=np.float32)
parts = image_file.split("-")
rect_part = parts[2].split("_")
poly = []
for p in rect_part:
poly.append(p.split("&"))
poly = np.asarray(poly).astype(np.int32)
polys.append([poly[0], [poly[1][0], poly[0][1]], poly[1], [poly[0][0], poly[1][1]]]) print(polys)
print(polys)
alike是什么意思return polys
def show(filename):
rects = get_rectangle(filename)
polys = get_polys(filename)
image = cv2.imread(filename)
for rect in rects:
print("rect:", rect)
image = line(image, rect, (0,0,255))
for poly in polys:
print("poly:", poly)
image = line(image, poly, (255,0,0))
image = size(image, (512, 512))
cv2.imshow("demo1", image)
cv2.imwrite("demo1.jpg", image)
cv2.waitKey(0)
show("ccpd_blur/0359-5_21-151&285_417&398-417&398_179&377_151&285_389&306-0_0_4_33_32_25_12-59-4.jpg")运⾏结果,
3、修改代码
现在,我们基于上⼀讲的代码来修改。
3.1导⼊坐标
显然,数据集中使⽤车牌4个顶点坐标更适合我们的EAST算法,根据⽂件名获取车牌4个顶点坐标的代码如下,
'''
ccpd数据集的坐标等信息直接在⽂件名中,所以解析⽂件名即可拿到坐标信息
'''
def load_ccpd_polys(filename):
text_polys = []
ignored_label = []
parts = filename.split("-")
polys_part = parts[3].split("_")
ohyeah
poly = []
for p in polys_part:
poly.append(p.split("&"))
text_polys.append(np.asarray(poly).astype(np.int32))
ignored_label.append(Fal)
# print(text_polys)
return np.array(text_polys, dtype=np.float32), np.array(ignored_label, dtype=np.bool) 3.2、导⼊数据集并创建tf.data.Datat
数据增强的代码跟上⼀讲中类似,代码如下,
def par_func(image_file, FLAGS):
[image, score_map, geo_map] = tf.py_function(lambda image_file: preprocess(image_file, FLAGS=FLAGS), [image_file], [tf.float32, tf.float32, tf.float32]) return image, score_map, geo_map
class CCPD2019_Datat:
def __init__(lf, FLAGS):
沈阳英语学校
snookerlf.FLAGS = FLAGS
ccpd_train_dir = os.path.pd_datat_dir, pd_train_txtfile)
ccpd_valid_dir = os.path.pd_datat_dir, pd_valid_txtfile)
asrt ists(ccpd_train_dir) and ists(ccpd_valid_dir)
lf.valid_filelist = get_iamges_from_pd_datat_dir, ccpd_valid_dir)
asrt ain_filelist) > 0 and len(lf.valid_filelist) > 0
# 如果有ICDAR数据集,那么将该数据集也加⼊训练,让其全部当背景图,这样模型对不是车牌的字符能更好的判断
if ists(FLAGS.icadr_datat_dir) and ists(FLAGS.icadr_datat_dir):
icadr_train_dir = os.path.join(FLAGS.icadr_datat_dir, "ch8_training_images")
icadr_valid_dir = os.path.join(FLAGS.icadr_datat_dir, "ch8_validation_images")
asrt ists(icadr_train_dir) and ists(icadr_valid_dir)
icadr_train_filelist = get_images_from_dir(icadr_train_dir)
icadr_valid_filelist = get_images_from_dir(icadr_valid_dir)
asrt len(icadr_train_filelist) > 0 and len(icadr_valid_filelist) > 0
lf.d(icadr_valid_filelist)
lf.valid_filelist = np.asarray(lf.valid_filelist)
np.random.ain_filelist)
np.random.shuffle(lf.valid_filelist)
def create_datat(lf, subt):
if subt == "train":
filelist = lf.train_filelist
el:
filelist = lf.valid_filelist
ds = tf.data.Datat.from_tensor_slices(filelist)
ds = ds.map(lambda image_file: par_func(image_file, FLAGS=lf.FLAGS))
ds = ds.batch(lf.FLAGS.batch_size)
ds = ds.prefetch(AUTOTUNE)
return ds
从代码中可以看到,如果存在ICDAR数据集,最好将它也加⼊训练,这样模型能对⾮车牌的字符能有更好的判断,只⽤CCPD数据集的话,对于⼀些不是车牌的字符,模型可能误认为它是车牌的。
3.2、preprocess
因为同时使⽤两个数据集,所以preprocess函数也要微改⼀下,代码如下,