TensorFlow入门教程(26)车牌识别之文本检测模型EAST代码实现(二)

更新时间:2023-05-28 07:19:15 阅读: 评论:0

TensorFlow⼊门教程(26)车牌识别之⽂本检测模型EAST代
码实现(⼆)
#
#作者:韦访
#博客:/rookie_wei
#微信:1007895847
#添加微信的备注⼀下是CSDN的
#欢迎⼤家⼀起学习
#
1、概述
上⼀讲,我们简单是介绍了EAST的论⽂,有了理论依据以后,接下来我们来⼀步⼀步实现代码。为了照顾不做车牌检测的⽹友,我们先来实现通⽤的⾃然场景下的⽂本检测,再基于此实现车牌检测。
环境配置:
操作系统:Ubuntu 64位
显卡:GTX 1080ti
Python:Python3.7
TensorFlow:2.3.0
2、ICDAR2017数据集
⽂字检测有很多公开的数据集,我这⾥选择了ICDAR2017,因为这个数据集⽀持的语⾔种类⽐较多,⽽且数据集⼤⼩也不是⼏百G的那种巨⽆霸。
官⽹链接:
百度⽹盘:  密码: k6oj
数据集⼀共由11个压缩包组成,包含了训练集和验证集的数据,我们将ch8_training开头的压缩包都解压到ch8_training_images⽂件夹下,将ch8_validation开头的压缩包解压到ch8_validation_images⽂件夹下,这样⽐较⽅便我们操作。
上图是ch8_training_images⽂件夹下的⽂件总数,可以看到⼀共有14400个⽂件,其中有7200个TXT⽂本⽂件,和7200个jpg或png 图⽚⽂件,他们通过⽂件名来⼀⼀对应。⽐如,图⽚img_1.png对应的⽂件是gt_。gt_⽂件的内容如下图所⽰,
上图中,每⼀⾏代表⼀个⽂本框信息,以逗号为分隔符,其中前8个字段代表的是⽂本框的四个顶点的坐标,分别为左上、右上、右下和左下。第9个字段表⽰⽂本框内的⽂字属于什么语⾔。最后⼀个字段表⽰⽂本框内的⽂字,”###”表⽰⽆法识别⽂本框内的⽂字内容,我们⼀般选择忽略这种⽂本框。
eardrop3、数据增强
3.1、读取⽂本框坐标
⾸先,我们要根据图⽚的⽂件名找到其对应的TXT⽂本⽂件(TXT⽂件名只是⽐图⽚⽂件名多了个“gt_”前缀和后缀为“.txt”),然后再解析其中所有的⽂本框的坐标信息。由于”###”的表⽰不知道⽂本框内的⽂字内容,所以这种⽂本框我们选择忽略,将它们在
ignored_label列表中的值置为“True”。代码如下,
关心的话
'''
获取ICDAR数据集的图⽚的⽂件名所对应的标签⽂本⽂件(包含⽂本框坐标等信息)
'''
def get_icdar_text_file(image_file):
# ⽂本⽂件名跟图⽚⽂件名⼀样,只是多了个gt_前缀
txt_file = place(os.path.baname(image_file).split('.')[1], 'txt')
txt_file_name = os.path.baname(txt_file)
txt_file = place(txt_file_name, 'gt_' + txt_file_name)
return txt_file
'''
通过txt导⼊对应图⽚的⽂本框坐标等信息
'''
def load_icdar_polys(image_file):
o1polys = []
ignored_label = []
# 找到对应的⽂本⽂件
text_file = get_icdar_text_file(image_file)
if not ists(text_file):
return np.array(polys, dtype=np.float32)
with open(text_file, 'r', encoding="utf-8") as fd:
reader = ader(fd)
for line in reader:
# strip BOM. \ufeff for python3,  \xef\xbb\bf for python2
line = [i.strip('\ufeff').strip('\xef\xbb\xbf') for i in line]
# 获取每⾏的⽂本框坐标
x1, y1, x2, y2, x3, y3, x4, y4 = list(map(float, line[:8]))
poly = np.asarray([[x1, y1], [x2, y2], [x3, y3], [x4, y4]])
polys.append(poly)
# 每⾏的最后⼀个属性,即⽂本框内的⽂字
label = line[-1]
# 如果⽂字是###,表⽰该⽂本框内的⽂字不清楚,我们忽略这种⽂本框
if label == '*' or label == "###":
ignored_label.append(True)
el:
ignored_label.append(Fal)
return np.array(polys, dtype=np.float32), np.array(ignored_label, dtype=np.bool)
3.2、随机缩放图⽚
随机缩放是数据增强中常⽤的⼿段,我们随机缩放图⽚的宽和⾼,但是每次缩放的宽⾼⽐例不能相差太⼤,否则就失真了。代码如下,
'''
随机缩放图⽚和⽂本框坐标
'''
def random_scale_image(image, polys):
random_scale = np.array([0.5, 0.75, 1., 1.25, 1.5])
rd_scale = np.random.choice(random_scale)
日语初级学习
x_scale_variation = np.random.randint(-10, 10) / 100.
y_scale_variation = np.random.randint(-10, 10) / 100.
x_scale = rd_scale + x_scale_variation
y_scale = rd_scale + y_scale_variation
image = size(image, dsize=None, fx=x_scale, fy=y_scale)
if len(polys) > 0:
polys[:, :, 0] *= x_scale
polys[:, :, 1] *= y_scale
return image, polys
3.3、随机裁剪
接下来是随机裁剪图⽚了,分两种情况,
第⼀种是裁剪后的图⽚只有背景,没有⽂本框,让模型学会识别背景图。
第⼆种是裁剪后的图⽚⾄少包含⼀个⽂本框,让模型学会识别⽂本框。需要注意的是,裁剪后,如果是带⽂本框的,那么,⽂本框的坐标也要跟裁剪后的图⽚的坐标对应得上,⽂本框是否是应该忽略的标签信息也不能丢。
先来看整体的代码,再具体看应该怎么裁剪,整体代码如下,
'''
随机截取图⽚中的⼀个区域
'''
def random_crop_area(FLAGS, image, polys, ignored_labels):
# DEBUG = True
h, w, _ = image.shape
ecuador# 计算最⼩截取宽度和⾼度什么叫abc
min_crop_w = np.round(FLAGS.min_crop_side_ratio * w).astype(np.int32)
min_crop_h = np.round(FLAGS.min_crop_side_ratio * h).astype(np.int32)
# 如果该图⽚没有⽂本框信息,则直接随机截取
if len(polys) < 1:
return random_crop_backgroup_area(FLAGS, image, min_crop_w, min_crop_h)
rectangle_polys = []
crop_image = []
crop_polys = []
crop_ignored_labels = []
# 将⽂本框变换成矩形的形式
for poly in polys:
# round
beverley
poly = np.round(poly, decimals=0).astype(np.int32)
min_x = np.min(poly[:, 0])
max_x = np.max(poly[:, 0])
min_y = np.min(poly[:, 1])
max_y = np.max(poly[:, 1])
rectangle_polys.append([[min_x, min_y], [max_x, min_y], [max_x, max_y], [min_x, max_y]])
rectangle_polys = np.asarray(rectangle_polys)
# 随机获取背景截图或带⽂本框的截图
if np.random.rand() < FLAGS.background_ratio:
crop_image, crop_polys, crop_ignored_labels = random_crop_backgroup_area_with_polys(image, rectangle_polys, min_crop_w, min_crop_h)
hat是什么意思# print("background")
el:taurus怎么读
crop_image, crop_polys, crop_ignored_labels = random_crop_text_area(image, polys, rectangle_polys, ignored_labels, min_crop_w, min_crop_h)        # print("text")
# 如果⽂本框坐标长度和截图的长度都为0,则表⽰截取失败,则直接返回原图和原坐标
if len(crop_image) < 1 and len(crop_polys) < 1:
crop_image = image
crop_polys = polys
crop_ignored_labels = ignored_labels
if DEBUG:
for poly in crop_polys:
crop_image = draw_line(crop_image, poly)
if  len(crop_image) > 0:
crop_image = size(crop_image, (512, 512))
image = size(image, (800, 800))
cv2.imshow("crop_image", crop_image)
blockout
cv2.imshow("image", image)
cv2.waitKey(0)
# show(image)
return crop_image, crop_polys, crop_ignored_labels
上⾯代码中,如果送进来的图⽚没有⽂本框信息,则随机截取,然后返回。如果送进来的图⽚有⽂本框,那么,根据设置的
FLAGS.background_ratio随机选择这次是裁剪背景图还是裁剪包含⽂本框的图,然后返回裁剪后的图⽚信息、⽂本框坐标和忽略标签即可。
3.3.1、随机裁剪背景图

本文发布于:2023-05-28 07:19:15,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/90/125488.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:坐标   裁剪   信息   本框   框内   识别   包含
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图