目标检测误检与负样本问题

这篇具有很好参考价值的文章主要介绍了目标检测误检与负样本问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

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

误检

图像内容问题

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

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

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

目标 bbox 的范围问题

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

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

问题就出在 bbox 上,接下来的讨论还是以人脸检测为例,请看下图:
目标检测误检与负样本问题
这是一个典型的目标 bbox。bbox 本质上是矩形,但通常目标(人脸)不是矩形,bbox 内部包含一些非人脸内容, 我认为这些非人脸内容要对误检负一部分责任 。

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

负样本

定义

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

为什么使用负样本

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

如何收集负样本

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

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

如何训练负样本

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

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

制作负样本代码,因为我们的Annotations中缺失了一部分没有标注的文件文章来源地址https://www.toymoban.com/news/detail-458020.html

import os
import xml.dom.minidom
 
img_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 object
        doc = xml.dom.minidom.Document()
        #creat a root node which name is annotation
        annotation = doc.createElement('annotation')
        #add the root node to the dom document object
        doc.appendChild(annotation)
     
        #add the folder subnode
        folder = doc.createElement('folder')
        folder_text = doc.createTextNode('VOC2012')
        folder.appendChild(folder_text)
        annotation.appendChild(folder)
     
        #add the filename subnode
        filename = doc.createElement('filename')
        filename_text = doc.createTextNode(img_file)
        filename.appendChild(filename_text)
        annotation.appendChild(filename)
     
        # add the path subnode
        path = doc.createElement('path')
        path_text = doc.createTextNode(img_path + img_file)
        path.appendChild(path_text)
        annotation.appendChild(path)
     
        #add the source subnode
        source = 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 subnode
        size = 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 subnode
        segmented = doc.createElement('segmented')
        segmented_text = doc.createTextNode('0')
        segmented.appendChild(segmented_text)
        annotation.appendChild(segmented)
     
        #write into the xml text file
        open(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()

到了这里,关于目标检测误检与负样本问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 小样本目标检测综述__刘浩宇(导航与控制2021)论文阅读

    早期采用了大量标注样本回归候选框的位置,但后来 目标集和训练集数据分布不同导致检测效果下降 。 对于没有大量样本支持的小样本检测应用就需要使用 先验知识 来弥补样本的不足。 可以分为三类: 数据域 通过先验知识来做数据增强,以弥补样本不足的问题,解决模

    2024年02月12日
    浏览(52)
  • FSOD论文阅读 - 基于卷积和注意力机制的小样本目标检测

    标题:基于卷积和注意力机制的小样本目标检测 作者:郭永红,牛海涛,史超,郭铖 郭永红,牛海涛,史超,郭铖.基于卷积和注意力机制的小样本目标检测 [J/OL].兵工学报. https://link.cnki.net/urlid/11.2176.TJ.20231108.1418.002 典型的FSOD使用Fast R-CNN作为基本的检测框架 本文亮点:引入

    2024年01月24日
    浏览(53)
  • 【python脚本】python实现:目标检测裁剪图片样本,根据类标签文件进行裁剪保存

    我在进行目标检测时候,比如红绿灯检测,目标区域很小,样本杂乱。 想要筛选错误样本的话,很困难。可以把目标区域裁剪出来。人大脑处理对于这样的异己比较敏感。样本量较少的话可以自己筛一筛。样本量较大的话,可以训练一个分类模型帮你筛一下。 它就可以实现

    2024年02月15日
    浏览(41)
  • 经典目标检测YOLO系列(二)YOLOV2的复现(2)正样本的匹配、损失函数的实现及模型训练

    我们在之前实现YOLOv1的基础上,加入了先验框机制,快速的实现了YOLOv2的网络架构,并且实现了前向推理过程。 经典目标检测YOLO系列(二)YOLOV2的复现(1)总体网络架构及前向推理过程 如前所述,我们使用基于先验框的正样本匹配策略。 由于每个网格只输出一个边界框,因此在

    2024年01月19日
    浏览(62)
  • 遥感图像中的小样本目标检测:Few-shot Object Detection on Remote SensingImages

    论文下载:https://arxiv.org/pdf/2006.07826v2.pdf        在本文中,我们处理遥感图像上的目标检测问题。以前的方法已经发展了许多基于深度卷积的遥感图像目标检测方法,在检测性能和效率方面取得了显著的成就。然而,目前基于CNN的方法大多需要大量带注释的样本来训练深层

    2024年02月03日
    浏览(44)
  • 目标检测一般性问题

    Precision(查准率/精确率) 所有预测为正样本的结果中,预测正确的比率。 Recall (查全率/召回率) 所有正样本中被正确预测的比率。 正样本 负样本 预测为正 True Positive(TP) False Positive(FP) 预测为负 False Negative(FN) True Negative(TN) 精确率(precision)和call)计算时不涉及NMS,也就是说如

    2024年02月19日
    浏览(27)
  • 3D 目标检测 SFD 问题记录

    顺着网址手动下载,然后放入相应的目录下 import spconv 要改写成 import spconv.pytorch as spconv pip install scikit-image -i https://pypi.tuna.tsinghua.edu.cn/simple Numpy 版本不对导致, 手动 default 加入 yaml 路径 绝对引用 相对引用 from ..ops.roiaware_poo3d import roiaware_pool3d_utils 把“2”改成“0”,就好了

    2024年02月15日
    浏览(31)
  • 目标检测中遇到的问题和 docker导出日志

    导出日志在Linux服务器的本地目录下,可以直接下载 1 改dockerfile 文件内容 2 改 app.py 中的内容 将模型在主程序 main 中加载,进行flask交互时,将全局变量直接导入使用模块中,比如提前加载YOLOv5模型。 四 提取图片中的识别区,将无关部分去除 返回图片中固定比例的点

    2024年02月13日
    浏览(31)
  • 基于FPGA:运动目标检测(包围盒仿真工程,及一些调试问题)

          前面写了几篇关于运动目标检测的文章了: 1、基于FPGA:运动目标检测(VGA显示,原理图+源码+硬件选择) 2、基于FPGA:运动目标检测(LCD显示+串口输出,纯Verilog工程) 3、基于FPGA:运动目标检测(补充仿真结果,可用毕设)       LCD显示、VGA显示都做完了,这

    2024年02月06日
    浏览(43)
  • 【问题记录】树莓派+OpenCV+YOLOv5目标检测(Pytorch框架)

     -【学习资料】 子豪兄的零基础树莓派教程 https://github.com/TommyZihao/ZihaoTutorialOfRaspberryPi/blob/master/%E7%AC%AC2%E8%AE%B2%EF%BC%9A%E6%A0%91%E8%8E%93%E6%B4%BE%E6%96%B0%E6%89%8B%E6%97%A0%E7%97%9B%E5%BC%80%E6%9C%BA%E6%8C%87%E5%8D%97.md#%E7%83%A7%E5%BD%95%E9%95%9C%E5%83%8F 第2讲:树莓派新手无痛开机指南【子豪兄的树莓派

    2024年02月02日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包