基于AI的计算机视觉识别在Java项目中的使用 (四) —— 准备训练数据

监督学习需要大量数据

我们产品中训练识别模型用的监督学习,监督学习是机器学习的一种。监督学习好比教小朋友识图:拿一本图册,每幅图上标着名称,每天拿着图册教小朋友认读,读多了他就会认了(学到了图片和名称之间的关联)。换成监督学习的概念来类比,图片是样本,名称是标签,图册是训练样本集,教认读的过程就是训练。

相对于深度学习,人的泛化能力是非常强的,可能孩子认识了一张鸭子的图片,就能分辨出现实世界中不同年龄、不同颜色、不同大小的鸭子。而要教会深度学习什么是鸭子,我们需要尽可能用不同年龄、不同颜色、不同大小的鸭子图片来教它,让深度神经模型充分学习鸭子的特征。

我们也可以从函数的角度来理解监督学习的训练过程。如果对《数理统计》有印象的话,应该还记得什么是一元线性回归吧。一个简单的一次函数 :y是因变量,x是自变量,a、b是常量系数,y的值由x、a、b一起来决定。知道了很多个x、y的组合,根据这些x、y,不断地去调整函数中的常量系数a、b,得到最接近理想情况的a、b,把他们带入方程,这样无论你输入什么x,都能得到尽可能准确的y。

深度神经网络的函数远比一次函数复杂。复杂性在于通常情况下,它的自变量很多,常量参数很多,另外它由多层函数嵌套在一起。尽管如此复杂,我们仍可以通过一元线性回归的拟合过程去大概理解深度神经网络的学习过程。

正是因为深度神经网络的复杂性,我们才能利用它来学习和建立(拟合)业务领域各种复杂的x和y之间的内在联系。也正是因为深度神经网络如此复杂,要想算出所有常量参数的理想值,需要特别多的x和y组合(大量的训练样本集)。

制作基础的训练样本

样本素材的制作

获得训练数据之前,需要大量的图片素材。在我们的项目里,图片素材获取采用照片的方式。

首先会人工制作一些纸质素材,但是人工制作的成本是较高的,制作的纸质素材数量有限。所以我会对同一张纸质素材进行多角度,多光线情况的拍照。这样既可以从一张实体纸质素材生成尽可能多的照片电子素材,同时也可以让训练出的深度神经模型对不同光照环境有更好的适应性。

另外,制作纸质素材的时候需要注意,要尽可能让原始素材整齐、规律。随便举个栗子:例如你要做手写体数字识别,需要手写数字素材。那么一张纸上就只写同一个数字。同一张纸上手写字体,大小,粗细可以不一样,但都是同一个数字。这样剪切成单个数字样本的时候,可以减小很多样本标注的工作量。

样本数据的提取

产品中我在采用深度学习方案之前,使用的是传统基于OpenCV的解决方案。后来因为基于OpenCV的方案在实际应用中效果不理想,才改用基于深度学习的方案。

虽然最终在生产中没有采用OpenCV方案,但OpenCV方案却为我们制作基本的训练样本数据提供了一个很好的工具。我从照片中寻找、裁剪并缩放训练样本图片到标准大小都是通过OpenCV。(可以参考前面的文章《基于AI的计算机视觉识别在Java项目中的使用(二) —— OpenCV的使用》)

从基础样本衍生更多样本

基础训练样本有了,但是无论样本数量还是样本能够覆盖的现实中的情况都是不够的。不过没关系,我们可以通过变换和组合的方式生成更多的衍生样本。

这里说的制造衍生样本的方式又叫样本数据增强。常见的针对图片样本的数据增强方式有很多,如:裁剪、翻转、旋转、颜色变换、几何变换、噪声注入、平移、随机擦除、缩放等等,下面要说的“组合”也属于数据增强的一种。

变换

我目前用到的主要是以下三种图片变换:

图像缩放:对样本按指定的比例系数范围随机放大或缩小

图像平移:将样本图像内容按指定的范围向上、下、左、右做随机移动

图像旋转:将样本图像按指定的角度范围向正、反时针做随机转动

组合

产品中有一类问题的样本是几个基本图像拼接而成的。为了得到更多的拼接样本。我将所有用于拼接的基本元素放到一个池里。然后随机从元素池里获取元素生成拼接样本。通过这样的方式,样本数量可以成几何倍数增长。

让 “直男” 找出样本中的混淆项

训练样本集的质量好坏,往往决定了深度神经模型识别质量。如果训练集中有标注错误的或容易引起混淆的样本,那么训练之后的模型在做识别时,面对某些情况会做出错误的判断。

用手写数字MNIST库的识别举栗子,如果数字6的样本中,有个别样本长得像8,那么识别过程中如果某个真正的8长得和那个“冒牌6”比较像,那这些样本训练出来的网络可能会认为它是6。所以面对这种容易引起混淆的样本或错误的样本,最好能尽可能剔除掉。

刚开始我做这类样本剔除完全靠肉眼扫描,可面对几千几万的样本,这样做着实太费眼。搞了几次之后,想到一个解决办法。

我先用所有的样本数据对模型做几轮初步训练,让深度神经模型基本拟合(数万条记录的训练集,识别率到99%左右),具备初步的识别能力,这时的模型就是“直男”。相较于训练很多轮、拟合程度很高的“油腻男”,它的拟合程度较低,还是“直男愣头青”。拟合程度更高的“油腻男”,面对样本中的问题往往会见怪不怪、视而不见。“直男”则容易发现样本中的问题。

将“直男”模型对所有的训练样本做筛选,找到样本中识别结果和标签不一致的项。这些项会被单独拎出来等候“审判”,他们中可能大部分还算正常,有不少确实存在问题。比如1和7混淆,6、9、0混淆等。最后的“审判”过程仍然是肉眼判断,但这个数据量小得多,很容易处理。下面这些样本就是通过“直男”模型从MNIST数据集中挑出来的项。可以看到,有问题的项还是比较明显的。

本期到此为止。《基于AI的计算机视觉识别在Java项目中的使用》专题将按下列章节展开,欢迎关注我的个人公众号( TuXiang )和CSDN( TuXiang++ )。

一、《基于AI的计算机视觉识别在Java项目中的使用 —— 背景》

二、《基于AI的计算机视觉识别在Java项目中的使用 —— OpenCV的使用》

三、《基于AI的计算机视觉识别在Java项目中的使用 —— 搭建基于Docker的深度学习训练环境》

四、《基于AI的计算机视觉识别在Java项目中的使用 —— 准备深度学习训练数据》

五、《基于AI的计算机视觉识别在Java项目中的使用 —— 深度模型的训练调优》

六、《基于AI的计算机视觉识别在Java项目中的使用 —— 深度模型在Java环境中的部署》

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值