上一次使用了text_renderer尝试生成类似于银行卡的数据,但是实际下来效果并不好,我分析了一下原因:
①:text_renderer输出的背景和真实银行卡图片有很大的差异
②:大多数银行卡采用的是突出的字体,text_renderer很难去模拟
分析出以上的问题后,现在的重点开始转换成如何去近似的模拟银行卡数据集,最好的方法就是使用真实的银行卡卡号片段来拼接成数据。
一边说代码,一边捋顺思路:
一:准备数据
首先准备了大概50张的银行卡卡号片段的真实图片,尽量保证每张图片的长度为3-4位,为什么分为3-4位?分析了大多数的银行卡后,发现一个规律:
信用卡卡号:0000 0000 0000 0000
储蓄卡卡号:0000 0000 0000 0000 000
我们用CTPN检测的时候,往往会一段一段的检测,然后拼接起来,这种效果理论上会更好准备的数据如下:
图片的分辨率180*46
现在分析代码:
第一步:选择生成数量,读取图片
这部分注释很清楚,不再赘述
二:裁剪图片,拼接图片
这部分是整个程序之中的关键,我绘制了一个图,结合图来说一下
因为准备的数据集是3-4个字符一张图,DenseNet的输入长度为10时比较合适(具体为什么还没搞清楚),因此拼接的图片字符长度也是10个字符:读取图片
这里用到cut_image函数对image3进行裁剪:
裁剪前后对比:
对图片进行拼接:
拼接后效果:
三:数据增强
因为DenseNet的输入为280*32的图像,并且为减少计算,需要将图像转换为灰度图像
转换为灰度图像后,这里需要使用ImageDataGenerator类,简单的说ImageDataGenerator是keras.processing.image模块里的图片生成器,每次喂进去一个batch_size的数据,然后对这个批次的数据进行样本增强,用来扩充样本数据集的大小,增强模型的泛化能力,更模拟真实情况,比如旋转,缩放,对比度转换等等。
四:划分训练集和测试集
我们将训练集和测试集按照8:2的比例进行划分
运行,数据生成完毕
网友评论