在做目标检测算法模型的时候,有时候会遇到模型预测,效果不好,或者误识别的情况(明明人眼都能识别出来的东西, 模型却识别错误,像狗识别成猫都好理解,但会遇到一个衣服会识别成猫的),出现这些误检问题分几种情况:

1.图像内容问题
2.目标bbox范围问题

解决这样的问题,可以试着使用语义分割来规避掉,但相对成本太大了

增加负样本是最为简单的一种方法,下面也将详细介绍使用负样本相关的问题。

目标检测负样本问题

  • 误检
    • 图像内容问题
    • 目标 bbox 的范围问题
  • 负样本
    • 定义
    • 为什么使用负样本
    • 如何收集负样本
    • 如何训练负样本

误检

图像内容问题

数据增强,会改变目标的一定特征,使其特征发生变化,识别错误

在训练人脸检测网络时,一般都会做数据增强,为图像模拟不同姿态、不同光照等复杂情况,这就有可能产生过亮的人脸图像,“过亮”的人脸看起来就像发光的灯泡一样。。。如果 发光灯泡 经过网络提取得到的特征,和 过亮人脸 经过网络提取得到的特征相似度达到临界值,那么网络把发光灯泡检测为人脸就不足为奇了。

同样的道理,用于训练网络的人脸数据集中,若是存在一些带口罩,带围巾的人脸图像,那么网络就极有可能“记住”口罩、围巾的特征,在预测阶段,要是有物体(比如衣服)表现得像口罩、围巾,那么网络就有可能把该物体检测成人脸。

目标 bbox 的范围问题

标注的目标框,内容有除想要检测的特征以外的特征事物,使其让模型混淆,学习到错误的特征

目前非常流行的深度学习目标检测网络(SSD、YOLO、RetinaFace 等)在训练阶段,我们需要提供目标在图像中的 bbox,所谓 bbox,其实主要就是指目标的外接矩形。这样训练而来的网络在预测阶段,一般给出的也是目标的外接矩形。

问题就出在 bbox 上,接下来的讨论还是以人脸检测为例,请看下图:

这是一个典型的目标 bbox。bbox 本质上是矩形,但通常目标(人脸)不是矩形,bbox 内部包含一些非人脸内容, 我认为这些非人脸内容要对误检负一部分责任 。

常用的人脸检测网络一般使用大量的卷积层提取图像特征,得到的特征图尺寸通常小于原始输入图像数倍(取决于卷积的 stride、padding 等参数),网络对特征图的每一个“像素点”做二分类(人脸类、背景类),“误检”就是在这个二分类过程中产生的。

负样本

定义

负样本是指不包含任务所要识别的目标的图像,也叫负图像(Negtive Image)。以识别限速牌为例,如下所示,左图包含限速牌,为正样本,右图不包含限速牌,为背景图,即负样本增加负样本

为什么使用负样本

训练负样本的目的是为了降低误检测率、误识别率,提高网络模型的泛化能力。通俗地讲就是告诉检测器,这些“不是你要检测的目标”。

如何收集负样本

可以通过下面两种方式收集负样本:

采用本任务场景的不包含目标物体的背景图像,例如你的目标是识别某园区内的行人,那么所有本园区内不包含行人的图片都视作负样本。不要使用不属于本任务场景的负图像,因为其对检测器的性能影响不大。
测试图像中被识别错误的目标所在区域。(通常对原图像进行裁剪,使得裁剪下来的图像只包含误识别的物体,而不包含目标)

如何训练负样本

将正负样本集及其标签作为训练集送入模型训练即可。

注意:正负样本必须放在一起训练,不能单独训练负样本,否则经过训练,网络会把所有的图像都识别为背景。正负样本的比例最好为1:1到1:2左右,数量差距不能太悬殊,特别是正样本数量本来就不太多的情况下。

制作负样本代码,因为我们的Annotations中缺失了一部分没有标注的文件

import os
import xml.dom.minidomimg_path = 'Downloads/DatasetId_1656670_1665712200/Images/'
xml_path = 'Downloads/DatasetId_1656670_1665712200/Annotations/'xmls = os.listdir(xml_path)for img_file in os.listdir(img_path):if img_file.split('.')[0] not in xmls:img_name = os.path.splitext(img_file)[0]#create an empty dom document objectdoc = xml.dom.minidom.Document()#creat a root node which name is annotationannotation = doc.createElement('annotation')#add the root node to the dom document objectdoc.appendChild(annotation)#add the folder subnodefolder = doc.createElement('folder')folder_text = doc.createTextNode('VOC2012')folder.appendChild(folder_text)annotation.appendChild(folder)#add the filename subnodefilename = doc.createElement('filename')filename_text = doc.createTextNode(img_file)filename.appendChild(filename_text)annotation.appendChild(filename)# add the path subnodepath = doc.createElement('path')path_text = doc.createTextNode(img_path + img_file)path.appendChild(path_text)annotation.appendChild(path)#add the source subnodesource = doc.createElement('source')database = doc.createElement('database')database_text = doc.createTextNode('Unknown')source.appendChild(database)database.appendChild(database_text)annotation.appendChild(source)#add the size subnodesize = doc.createElement('size')width = doc.createElement('width')width_text = doc.createTextNode('1920')height = doc.createElement('height')height_text = doc.createTextNode('1080')depth = doc.createElement('depth')depth_text = doc.createTextNode('3')size.appendChild(width)width.appendChild(width_text)size.appendChild(height)height.appendChild(height_text)size.appendChild(depth)depth.appendChild(depth_text)annotation.appendChild(size)#add the segmented subnodesegmented = doc.createElement('segmented')segmented_text = doc.createTextNode('0')segmented.appendChild(segmented_text)annotation.appendChild(segmented)#write into the xml text fileopen(xml_path+'%s.xml'%img_name,'w').close()fp = open(xml_path+'%s.xml'%img_name, 'w+')doc.writexml(fp, indent='\t', addindent='\t', newl='\n', encoding='utf-8')fp.close()

目标检测误检与负样本问题相关推荐

  1. 让AI帮你玩游戏(一) 基于目标检测用几个样本帮你实现在魔兽世界中钓鱼(群已满)

    让AI帮你玩游戏 让AI帮你玩游戏(一) 基于目标检测用几个样本实现在魔兽世界中钓鱼 前言 思路 环境 获取图像(几个样本即可) 标记图片 从标记文件中获取Boxes坐标 搭建目标检测模型 准备训练数 ...

  2. 目标检测中的正负样本

    参考地址:https://www.cnblogs.com/rainsoul/p/6247779.html 以人脸识别为例,如果你的任务是识别教室中的人脸,那么负样本的选取应该是教室中的窗户.椅子.墙. ...

  3. 2016CVPR目标检测论文简介

    目标检测的指标: 1)识别精度 2)识别效率 3)定位准确性 CVPR2016专题: CVPR/ICCV目标检测最新论文 2016年的CVPR目标检测(这里讨论的是2D的目标检测)的方法主要是 基于C ...

  4. yolo 负样本_目标检测正负样本区分策略和平衡策略总结(二)

    0 简介 本文抛弃网络具体结构,仅仅从正负样本区分和正负样本平衡策略进行分析,大体可以分为正负样本定义.正负样本采样和平衡loss设计三个方面,主要是网络预测输出和loss核心设计即仅仅涉及网络的he ...

  5. 综述:解决目标检测中的样本不均衡问题

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者丨SFXiang 来源丨AI算法修炼营 编辑丨极市平台 极市导 ...

  6. 单阶段目标检测重要论文总结

    文章目录 一.Yolov1 1.论文简介 2.检测原理 3.结构设计 4.疑难问题 5.论文总结 二.Yolov2 1.论文简介 2.更好.更快.更强 1)为什么更好? 2)为什么更快? 3)为什么更 ...

  7. Detection:目标检测常用评价指标的学习总结(IoU、TP、FP、TN、FN、Precision、Recall、F1-score、P-R曲线、AP、mAP、 ROC曲线、TPR、FPR和AUC)

    目录 前言 1. IoU 2. TP.FP.TN.FN 2.1 混淆矩阵 2.2 TP.FP.TN.FN的定义 2.3 TP.FP.TN.FN在目标检测中的对应内容 2.3.1 TP,FP在目标检测中 ...

  8. 找不到匹配的key exchange算法_目标检测--匹配策略

    CVPR2020中的文章ATSS揭露到anchor-based和anchor-free的目标检测算法之间的效果差异原因是由于正负样本的选择造成的.而在目标检测算法中正负样本的选择是由gt与anchor ...

  9. 【目标检测_概述】recent advances in deep learning for object detection_2019

    文章目录 Abstract 1.Introduction 2. Problem Setting 3.Detection Components 3.1 Detection Settings 3.2 De ...

最新文章

  1. python 爬虫ip代理
  2. mysql生成100000个数据并检验索引的效果
  3. python高通滤波器设计_python实现直方图均衡化,理想高通滤波与高斯低通滤波
  4. C++利用gSoap调用WebService服务
  5. OpenCV几何变换的实例(附完整代码)
  6. 零位扩展和符号位扩展
  7. 宏定义和内联函数的学习
  8. pca 累积方差贡献率公式_机器学习数据降维方法:PCA主成分分析
  9. 突发!哈佛要求本科生5天内搬走,国际学生恐无家可归
  10. HTML+CSS+JS实现 ❤️鼠标悬停性感美女图片特效❤️
  11. 【CodeForces 1260D --- A Game with Traps】二分
  12. java security md5_java自带的加密--java.security.MessageDigest(md5加密)
  13. 痛与教训,我所亲历的3个失败游戏创业公司
  14. 【C语言小游戏】答题系统
  15. 数据分析的三大时间轴:过去、现在和未来(转发有福利哦)
  16. Norm(范式)的讲解
  17. Intent Service 和Service的区别
  18. Gradle 2.0 用户指南翻译——第五十一章. 发布工件
  19. 大量从IT培训班出来的程序员们最后都怎样了?
  20. 英语自我介绍及问答整理

热门文章

  1. Java缓存学习:CDN缓存机制
  2. Algorithms—抽签
  3. Unity切割Sprite图集转换为多张图片
  4. Android.mk error: unused parameter 处理方法
  5. 浅析什么是伪类和伪元素?伪类和伪元素的区别解析
  6. AudioRecord实现实时录音和MediaCode转码
  7. Android音频子系统(一)------openOutput打开流程
  8. 幕墙:单元式铝合金挂件槽口、钢挂件及配套紧定螺钉、螺栓标准化
  9. 搭建个人博客:域名解析 + 备案
  10. Linux下的 c 多线程与线程同步(二)