长春网站建设 找源晟,白云区网站建设公,wordpress academia,沉默是金 张国荣一、任务介绍 这次的任务是对两百余张图片里面特定的编号进行识别#xff0c;涉及保密的原因#xff0c;这里就不能粘贴出具体的图片了#xff0c;下面粘贴出一张类似需要识别的图片。 假如说我的数据源如上图所示#xff0c;那么我需要做的工作就是将上面图片里面标红的数…
一、任务介绍 这次的任务是对两百余张图片里面特定的编号进行识别涉及保密的原因这里就不能粘贴出具体的图片了下面粘贴出一张类似需要识别的图片。 假如说我的数据源如上图所示那么我需要做的工作就是将上面图片里面标红的数字给识别出来。 我采用的算法是GitHub - YCG09/chinese_ocr: CTPN DenseNet CTC based end-to-end Chinese OCR implemented using tensorflow and keras这是基于Tensorflow和keras框架采用ctpndensenetCTC算法来完成对图片指定内容的字符识别。
二、 图像标注 既然要进行OCR识别那么一定要对已有的数据源进行图像标注工作这里采用的工具是labelImg相信大家如果有搞深度学习这块的话一定对这个工具不会陌生。 对图像具体的标注流程我这里就不做说明了网上有很多资料可以查找。这里需要作特别说明的是对于ctpn的训练label的名字为text对于densenet的训练来说的话就需要把标注框里面的内容当作label。 然后就是数据增强这块这里需要记录的有两点一就是原始的数据源比较少就必须做数据增强不然做出来的效果肯定不太行二就是怎么做数据增强由于这里的数据比较简单需要识别的内容也是有规律可行的那这里就用不着采用比较复杂的数据增强所以我做的数据增强就是对图像随机进行裁剪和倾斜当然这里裁剪的尺寸和倾斜的角度一定要控制好不然就会影响图片的质量。
import cv2
import numpy as np
import random
import os
from PIL import Image# 数据增强的代码img_path r *****************
save_path r ****************# 随机倾斜图片
def rotate_ima(img_path,save_path):for file in os.listdir(img_path):img cv2.imread(os.path.join(img_path, file ), 0 )rows,cols img.shape# cols-1 and rows-1 are the coordinate limits.# 每张图片倾斜4张for i in range ( 4 ):a random.randint( 2 , 6 )print (a)# 指定左右倾斜for j in range ( 2 ):a - aM cv2.getRotationMatrix2D(((cols - 1 ) / 2.0 ,(rows - 1 ) / 2.0 ),a, 1 )dst cv2.warpAffine(img,M,(cols,rows))#cv2.imshow(img,img)#cv2.imshow(dst,dst)cv2.imwrite(os.path.join(save_path, rot_ str (i) _ str (j) file ),dst)#cv2.waitKey(0)cv2.destroyAllWindows()# 随机裁剪图片
def cut_img(img_path,save_path):all_file []for file in os.listdir(img_path):all_file.append( file )file1 random.sample(all_file, 2 )for x in file1:im Image. open (os.path.join(img_path,x))crop_all []for c in range ( 5 ): # 对每张图片随机生成5张for i in range ( 4 ):a random.randint( 100 , 400 )crop_all.append(a)region im.crop((crop_all[ 0 ],crop_all[ 1 ],im.size[ 0 ] - crop_all[ 2 ],im.size[ 1 ] - crop_all[ 3 ]))region.save(os.path.join(save_path, cut_ str (c) _ x))#rotate_ima(img_path,save_path)
cut_img(img_path,save_path) 然后我大概生成了3000张左右的图片就开始进行数据标注了标注了大概六七个小时才把这些数据标注给完成。 有了这些标注数据过后就可以正式开始训练了。
三、CTPN训练 关于CTPN训练流程在chinese_ocr/ctpn at master · YCG09/chinese_ocr · GitHub的readme已经说的很清楚了。但是我这里就列出我所踩的坑吧。 最开始我直接把标注的数据制作成VOC2007数据集的格式丢进去训练然后训练出来的效果并不好后面我才在周围同事的提醒下有一个关键的步骤忘了做。 因为CTPN是进行文字检测并不同于普通的目标检测它的检测原理是对单个的字符进行检测然后拼接在一起。 因为我们在进行数据标注的时候是对一整行文本进行拉框标注但是如果要进行CTPN训练的话就需要对这个框划分成很多个矩形小框划分的方法就是上面的split_label.py程序。 但是要进行上面一步的前提就是需要更改标注文件使用labelImg标注出来的文件是一个图像对应一个xml文件但是这里需要更改成一个图像对应一个txt文件txt里面存放的是标注框的四个坐标共计八个点注意坐标点的顺序。如下所示
410,1554,1723,1554,1723,1736,410,1736 然后在运行split_label.py接着ToVoc.py这里面的代码细节需要自行更改这里就不做说明了。 然后就可以正式开始训练了截图如下 这里粘贴出一个错误需要注意 解决方案就是删除cache文件夹
四、DenseNetCTC训练 DenseNetCTC训练主要分为两个步骤一是图像处理二是txt文件处理。 图像处理的话在我们拿到标注好的数据之后需要对原始图像进行裁剪工作就是根据标注的坐标裁剪出具体的图像就拿上面的图像来说我们需要的图像如下所示。 然后再对裁剪后的图像进行resize工作resize成(280,32)这样的话图像处理这一部分就算完成了。 txt处理的话这里我们需要对xml文件进行一系列处理来达到下面的效果。 前面card_900.jpg代表图像名称后面这一串字符代表需要识别的字符在下面这个文件里面的位置索引。 注意这里txt里面存放的是所有图像里面待识别字符的编号不是一个图像对应一个txt。 做到这一步过后在把生成的txt划分成训练集和测试集就算成功制作出来训练DenseNet的数据集了。 然后就可以开始训练了截图如下 五、总结 这次这个小的OCR项目历时大概十天左右从数据标注再到训练模型里面踩了很多坑也做了很多次尝试也查阅了很多资料也向周围同事请教了很多次总算功夫不负有心人总算完成了这次项目。 这个记录只是记录了大概的流程很多代码细节并不方便透露更多详情参阅上面给出的GitHub地址。记录下这个更多是方便自己以后查阅。