算力和数据是影响深度学习应用效果的两个关键因素, 在算力满足条件的情况下, 为了到达更好的效果, 我们需要将海量, 高质量的素材数据喂给神经网络, 训练出高精度的网络模型. 吴恩达在深度学习公开课中提到, 在算力满足要求的前提下, 模型效果会随着素材数量的增多而变好, 理论上没有上限. 实践证明, 在普通基于深度学习的应用开发过程中, 素材的数量和质量对最终模型效果的影响出乎意料的大. 注意这里提到的 "素材质量", 光有 "素材数量" 还不够, 我们还要保证素材标注的质量. 本文以目标检测应用为例, 来说明如何保证图像素材标注过程中的质量.
常见目标检测算法
常见目标检测算法有 SSD,Yolo 以及 Faster-RCNN 等(实际上这是我用过的几种), 之间的区别可以上网搜到, 我之前的博客也有提到过, 各有优劣. 三种算法模型训练需要的素材格式基本相同:
二维图像文件;
对应二维图像中人工标注出的感兴趣目标信息, 包括目标坐标 / 大小, 目标类型, 一般用 (left,top,width,height,class) 来表示;
模型训练的过程就是将上述素材数据喂给神经网络, 反复优化, 最后得到效果相对比较好的模型, 然后模型就可以上线做推理了. 各种目标检测算法模型最终推理输出来的结果也基本一样, 对于给定的二维输入图像, 输出该图像中检测到的目标信息, 包括目标坐标 / 大小, 目标类型以及该目标的可信度, 一般用一个 list 表示, list 中每个元素格式为(left,top,width,height,class,score).Score 代表模型认为该目标的可信度, 可以通过该值过滤部分检测结果.
图像素材标注
通过这个 PPT 我们知道, 深度学习模型训练的过程就是不断地调整参数, 使用预先标注的具体素材数据不停地去拟合通用场景, 最后能够准确预测非素材集中的输入. 模型训练需要大量素材标注作为基础, 就目标检测而言, 素材标注的过程就是人工用工具在图像中标出感兴趣的目标, 并生成标签数据.
图像素材标注工具有很多, 很多人在用的是 labelimg, 主要用于目标检测素材标注:
如上图, 对于每张图片, 人工标出图片中感兴趣的目标, 比如图像中的人, 汽车, 卡车等等. 保存后, 每张图片对应生成一个 txt 文件, 该 txt 文件中记录人工标注的结果:
如上图, 该图片一共标出 9 个目标, 2 个 Person,3 个 Car,4 个 Truck, 每个目标对应一行, 第一列表示类型 ID(从 0 开始). 模型训练时, 将图片和标注数据同时喂进神经网络, 不断调整参数, 到达效果最优.
素材标注质量如何影响模型的准确性?
图像素材标注时, 需要人工标出目标的大小 / 位置, 用一个矩形方框表示, 并给出目标类型, 模型训练时会根据标注的素材来调整参数. 人工标注有时会出一些问题, 比如目标矩形框位置不对(框子太大, 太小, 位置偏了), 或者目标类型标错, 本来是一个人, 人工给它标成了汽车. 这些标注时的问题都会影响最终模型训练的效果, 仔细想一下, 你不断告诉神经网络人是车, 而车是人, 最后神经网络都分不清了. 正常情况下, 人工标注的方框大小, 位置应该合适, 矩形方框刚好将目标包围住, 如果框子太大, 或者太小, 甚至位置偏移了, 都会影响神经网络对矩形方框中真实内容的判断.
如果仅仅追求素材的数量而不顾素材标注的质量, 即使数量再多, 也没有效果, 实践证明, 模型效果反而越来越差.
图像素材标注重点
目标检测用到的素材, 在标注过程中需要注意以下几点:
1. 标注方框大小合适
所谓大小合适, 即矩形方框应该刚好将目标包围住, 之间的间隙不能太大, 也不能太小. 太大太小的话, 最后模型在推理时, 也会出现目标框得不准的情况, 或者在视频图像检测中, 出现前后帧目标抖动严重, 不能锁定. 同时在标注的时候, 一定要保证矩形方框包含了目标的轮廓信息, 因为轮廓信息对于模型训练来讲很重要, 它可以区分不同类型的目标. 下图标注的矩形方框太小:
2. 标注方框位置合适
原因跟上一条类似, 下图虽然矩形方框大小合适, 但是明显位置偏太远了:
3. 需要丰富多视角的素材
这个其实跟素材的准备有关, 我们不能只标几种视角的素材图片. 在道路监控应用场景中, 素材应该涵盖各种摄像机视角, 正前方, 正后方, 左侧前方, 右侧前方, 左侧后方, 右侧后方以及俯视视角等等. 每种视角的素材都应该被标注, 这样训练出来的模型才有更大的通用性.
4. 目标被遮挡也要标注
不能只标注图像中完整的目标, 被遮挡的目标, 只要人眼能看清是啥的都应该被标注, 并且矩形框只需要包含看得见的部分即可. 这样做的原因跟上一条类似, 提高模型的通用性, 实际应用场景中, 很多目标被遮挡, 模型仍然需要将其检测出来, 所以我们需要标注类似的素材. 下图道路拥堵, 一些车身被遮挡, 但是明显可以分辨出是什么目标:
5. 小目标也不能漏掉
虽然不同的算法对小目标的检测效果不同, 比如 Yolo 对小目标检测效果比较好, 但是前提是我们需要准备小目标的素材标注. 一张图片素材中, 近处的大目标需要标注, 远处人眼看得清的小目标同样需要标注. 原理跟上一条类似: 只要人眼能分清是啥的小目标, 都应该标出来. 下图远处的小目标可以认出是小汽车:
6. 人眼分不清是啥的不要标
很多时候, 由于素材图片本身的原因, 或者目标被遮挡大部分, 或者远处目标实在太远, 人眼无法分辨是什么, 虽然知道是一个目标, 但是不知道它到底是汽车 Car 还是客车 Bus 甚至是人, 这种时候不要标注. 否则会给神经网络带来误导. 下图被遮挡部分太多, 可以忽略不用标注:
如何保证素材标注的质量
上面说了这么多, 其实要保证素材标注质量的有效方式有两条:
1. 不要光追求速度
给做素材标注的团队强调, 虽然有数量上的指标, 但是指标不能定得太高, 如果定得太高, 大家都为了完成数量任务, 自然会忽略了质量. 最后标注质量肯定上不去, 类型出错, 方框位置忽大忽小, 必然需要大量返工.
2. 专人做素材审核
专门找一小撮人做素材审核, 主要负责素材标注后的验证, 看看类型是否出错, 方框的位置, 大小是否错得离谱等等. 千万不要小看这项工作, 它的作用跟 code review 一样, 容易被忽视, 其实它提高效率不是一星半点.
来源: https://www.cnblogs.com/xiaozhi_5638/p/11288118.html