算力和数据是影响深度学习应用效果的两个关键因素,在算力满足条件的情况下,为了到达更好的效果,我们需要将海量、高质量的素材数据喂给神经网络,训练出高精度的网络模型。吴恩达在深度学习公开课中提到,在算力满足要求的前提下,模型效果会随着素材数量的增多而变好,理论上没有上限。实践证明,在普通基于深度学习的应用开发过程中,素材的数量和质量对最终模型效果的影响出乎意料的大。注意这里提到的“素材质量”,光有“素材数量”还不够,我们还要保证素材标注的质量。本文以目标检测应用为例,来说明如何保证图像素材标注过程中的质量。

常见目标检测算法

常见目标检测算法有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一样,容易被忽视,其实它提高效率不是一星半点。

[AI开发]目标检测之素材标注的更多相关文章

  1. AI R-CNN目标检测算法

    Region-CNN,简称R-CNN,是首次将深度学习应用于目标检测的算法. bounding box IOU 非极大值抑制 selective search 参考链接: https://blog.c ...

  2. AI SSD目标检测算法

    Single Shot multibox Detector,简称SSD,是一种目标检测算法. Single Shot意味着SSD属于one stage方法,multibox表示多框预测. CNN 多尺 ...

  3. [AI开发]目标跟踪之行为分析

    基于视频结构化的应用中,目标在经过跟踪算法后,会得到一个唯一标识和它对应的运动轨迹,利用这两个数据我们可以做一些后续工作:测速(交通类应用场景).计数(交通类应用场景.安防类应用场景)以及行为检测(交 ...

  4. [AI开发]目标跟踪之计数

    基于视频结构化的应用中,目标在经过跟踪算法后,会得到一个唯一标识和它对应的运动轨迹,利用这两个数据我们可以做一些后续工作:测速(交通类应用场景).计数(交通类应用场景.安防类应用场景)以及行为检测(交 ...

  5. [AI开发]目标跟踪之速度计算

    基于视频结构化的应用中,目标在经过跟踪算法后,会得到一个唯一标识和它对应的运动轨迹,利用这两个数据我们可以做一些后续工作:测速(交通类应用场景).计数(交通类应用场景.安防类应用场景)以及行为检测(交 ...

  6. 带你了解CANN的目标检测与识别一站式方案

    摘要: 了解通用目标检测与识别一站式方案的功能与特性,还有实现流程,以及可定制点. 本文分享自华为云社区<玩转CANN目标检测与识别一站式方案>,作者: Tianyi_Li. 背景介绍 目 ...

  7. 语义分割(semantic segmentation) 常用神经网络介绍对比-FCN SegNet U-net DeconvNet,语义分割,简单来说就是给定一张图片,对图片中的每一个像素点进行分类;目标检测只有两类,目标和非目标,就是在一张图片中找到并用box标注出所有的目标.

    from:https://blog.csdn.net/u012931582/article/details/70314859 2017年04月21日 14:54:10 阅读数:4369 前言 在这里, ...

  8. AI佳作解读系列(五) - 目标检测二十年技术综述

    计算机视觉中的目标检测,因其在真实世界的大量应用需求,比如自动驾驶.视频监控.机器人视觉等,而被研究学者广泛关注.   上周四,arXiv新出一篇目标检测文献<Object Detection ...

  9. Google AI推出新的大规模目标检测挑战赛

    来源 | Towards Data Science 整理 | 磐石 就在几天前,Google AI在Kaggle上推出了一项名为Open Images Challenge的大规模目标检测竞赛.当今计算 ...

随机推荐

  1. Hadoop —— 单机环境搭建

    一.前置条件 Hadoop的运行依赖JDK,需要预先安装,安装步骤见: Linux下JDK的安装 二.配置免密登录 Hadoop组件之间需要基于SSH进行通讯. 2.1 配置映射 配置ip地址和主机名 ...

  2. 【协议】TCP与UDP

    转载地址:https://blog.csdn.net/qq_34988624/article/details/85856848 1.为什么会有TCP/IP协议 在世界上各地,各种各样的电脑运行着各自不 ...

  3. Codeforces Round #565 (Div. 3) B

    B. Merge it! 题目链接:http://codeforces.com/contest/1176/problem/B 题目 You are given an array a consistin ...

  4. 如何用css实线所需要的小三角

    使用css实现三角符号 关于使用css制作三角符号,网上有很多的例子了,在这里只是为了详细的向各位解释一下三角符号的原理 下图,是一个长宽为100px,边框宽度为100px的一个元素,由此可见,在cs ...

  5. C# 异步转同步 TaskCompletionSource

    本文通过TaskCompletionSource,实现异步转同步 首先有一个异步方法,如下异步任务延时2秒后,返回一个结果 private static async Task<string> ...

  6. ZOJ 3962:Seven Segment Display(思维)

    https://vjudge.net/problem/ZOJ-3962 题意:有16种灯,每种灯的花费是灯管数目,代表0~F(十六进制),现在从x开始跳n-1秒,每一秒需要的花费是表示当前的数的花费之 ...

  7. 蓝桥杯:矩阵乘法(区间DP)

    http://lx.lanqiao.cn/problem.page?gpid=T417 题意:…… 思路:n=1000,一开始觉得区间DP会超时,后来想不到其他做法就这样做了,居然没超时. 状态转移: ...

  8. C++智能指针的几种用法

    auto在c++11中已经弃用. 一.auto_ptr模板 auto_ptr与shared_ptr.unique_ptr都定义了类似指针的对象,可以将new到的地址赋给这一对象,当智能指针过期时,析构 ...

  9. 利用consul在spring boot中实现最简单的分布式锁

    因为在项目实际过程中所采用的是微服务架构,考虑到承载量基本每个相同业务的服务都是多节点部署,所以针对某些资源的访问就不得不用到用到分布式锁了. 这里列举一个最简单的场景,假如有一个智能售货机,由于机器 ...

  10. React躬行记(7)——表单

    表单元素是一类拥有内部状态的元素,这些状态由其自身维护,通过这类元素可让用户与Web应用进行交互.HTML中的表单元素(例如<input>.<select>和<radio ...