【核心概念】图像分类和目标检测中的正负样本划分以及架构理解_图像分类样本_理心炼丹的博客-程序员秘密

技术标签: YOLO  视觉  计算机视觉  深度学习  

理解有监督学习的深度学习关键在于将 推理训练 阶段进行分开,分别理解各种深度神经网络架构的推理和训练阶段的操作就可以理解某个模型。

推理阶段是将模型看成一个类似于黑箱的非线性函数,比如通过各种卷积模块的组合构成一个 backbone,输出想要的shape的张量,再去做后处理

训练阶段是需要划分正负样本,然后根据任务设计一个损失函数,使用优化算法如SGD以迭代的方式更新神经元的weight和bias,优化的目标是最小化损失函数,因此训练好的模型就可以拟合训练集

我们通常可以把所有的神经网络编码器-解码器 的架构进行理解。

图像分类:

  1. 推理阶段:输入为图像, 然后是编码器(如CNN)进行编码为张量,一般是W/H 减小 x 倍, 而通道数C 增加 y 倍, 编码成新的张量 (W/x, H/x, yC)。然后是 解码器 ,加入FC、softmax 等。当然,也可以将 softmax 之前的全部理解为 编码器, 把softmax 理解为 解码器。
  2. 训练阶段:和推理阶段一样,不过是softmax 输出的 向量 需要和 标注的标签计算交叉熵损失(常用),从而反向传播更新softmax 之前的全部weight和bias。

目标检测:

  1. 推理阶段:目标检测更加复杂,一般来说,目标检测的架构为 Backbone + Neck + Detection head。有趣的是 这个命名, 躯干 然后是 脖子 最后是 决策的检测头。Backbone 常为 我们在大型的图像分类数据集上进行训练的预训练模型(图像分类的编码器),这是因为 分类问题的标注 更加便宜,而网络在两个任务上的提取的特征却可以通用,因此是一种迁移学习的思想。Neck 是 Backbone 输出的张量的一些 特征融合操作,得到更好的组合特征以适应于不同大小目标的检测Detection head Neck 融合后的张量的进行操作,输出想要的shape的张量。最后是后处理,根据阈值删除一部分向量,然后使用NMS去除冗余的边框。

        当然,我们可以将 Backbone + Neck 看成编码器Detection head 看成解码器注意:可能有的架构并没有 Neck , 如 YOLO v1,所以会带来性能损失。 

Backbone + Neck + Detection head 的架构让我们可以分别设计单个模块, 然后进行替换即可构造不同的目标检测模型。

        2. 训练阶段:

训练阶段的核心在于 损失函数的设计。Detection head 输出的张量与标签标注的求损失,从而去更新网络。所以,这部分并不涉及上面的 后处理。 这里的关键在于 正负样本的选择 ,从而来计算损失。

图像分类任务 中 正样本 是该类所有标注的图像,负样本是其他类所有图像。网络输入正样本图像, 然后预测值和标签向量中 1 的地方求损失, 所以预测值会变大, 从而降低损失,由于 softmax 约束, 那么预测向量的其他值会变小;网络输入针对的目前某个类的负样本图像时候, 该图像所属的类的预测值就会变大,其他值也就会变小。所以,对于图像分类来说,我们并不需要关注正负样本的划分,因为通过 标签的one-hot 编码,自然的相当于区分了正负样本。

目标检测任务 中,输入一张图像,和图像分类不同的是,正负样本的单位不再是一张图像,而是一张图像中的某个区域,所以一张图像有多个正负样本,虽然这些区域的大小比图像分类中的图像要小,但是由于数量巨多,所以目标检测相比要的多。那么如何得到这些区域(样本)?如何把这么多的区域分为正负样本?这是两个重要的问题。前者:一种常用的做法是 anchor based 的方法来得到这些区域,每个图像的小块上生成的一些先验框anchor 就是样本。 后者:常用的是基于和 真实标注框IOU来划分正负样本, 不同的算法策略不同。如果anchor 划分为正样本, 那么对该正样本进行回归就可以得到预测框,那么预测框就可以参与损失函数中 定位损失的计算,预测框真实标注框计算距离。

注意这里有三种框:

  1. 真实标注框
  2. 先验框anchor
  3. 预测框

综上,目标检测中的正样本并不是真实标注框, 真实标注框是优化的目标,正如图像分类中的 one-hot 编码的向量一样。正样本是那些选择的部分先验框anchor,正如图像分类中的 某个类的图像。而通过模型先验框anchor得到的结果是预测框正如图像分类中的预测向量,所以预测框和真实框求Loss。当然,像 yolov1 并没有 anchor,所以有部分不同。

Backbone + Neck + Detection head 模块:

  • Input: Image, Patches, Image Pyramid
  • Backbones : VGG16 , ResNet-50 , SpineNet , EffificientNet-B0/B7, CSPResNeXt50, CSPDarknet53, swin transformer
  • Neck :
    • Additional blocks : SPP , ASPP , RFB , SAM
    • Path-aggregation blocks : FPN , PAN , NAS-FPN , Fully-connected FPN, BiFPN , ASFF , SFAM
  • Heads:
    • Dense Prediction (one-stage):
      • RPN, SSD, YOLO(v2-v5), RetinaNet (anchor based)
      • YOLOv1, CornerNet, CenterNet, MatrixNet, FCOS(anchor free)
    • Sparse Prediction (two-stage):
      • Faster R-CNN, R-FCN, Mask R-CNN(anchor based)
      • RepPoints(anchor free)

        注:上面来自于 yolov4 论文。

一部分 正负样本划分策略, 请参考:

目标检测中 Anchor 与 Loss 计算的梳理 | 拾荒志

anchor 生成方法,请参考:

锚框(anchor box)理解和代码实现 - 知乎

参考:

yolov4 论文

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/hymn1993/article/details/122836387

智能推荐

Unity - Cinemachine实现相机抖动_unity cinamachine 抖动效果_Zack-zzh的博客-程序员秘密

普通相机抖动脚本较易实现,但在使用cinemachine相机下,其Transform组件不可被代码修改,那么Cinemachine的相机抖动如何实现呢?本文结合实际项目,对实现相机抖动的三大步骤进行系统讲解:项目地址:Hero - SouthBegoniaversion 2.2.9 packageManager 下载配置流程项目背景:一款2D像素动作游戏,我们操控着Player(...

Box86源码剖析(三)_box86原理_跑不了的你的博客-程序员秘密

Box86源码剖析Box86前文回顾源码阅读Run()跳转系统调用函数实现:x86Syscall(emu);Box86前文回顾在前面的代码阅读过程中,我们已经成功找到了真正去翻译程序并执行的入口函数 Run(),具体内容可以参考下面链接:Box86源码剖析(一)Box86源码剖析(二)前面看到的内容概况下来如下:源码阅读Run()从前面,我们看到 Box86 的真正进行指令翻译和执行的入口在于 x86run.c 文件中的 Run() 函数,该函数的实现太长,这里就取前半部分看一下:

geatpy模板sga_real_templet简单应用_「已注销」的博客-程序员秘密

实值编码[1]实值编码遗传算法(RCGA)的染色体空间和问题解空间是同一个空间,较好的解决了二进制编码遗传算法(BCGA)存在的求解精度和冗余代码等问题。代码(aimfuc)import numpy as npdef aimfuc(Phen, LegV): x = Phen[:, [0]] f = x + 10 * np.sin(5 * x) + 7 * np.cos(4 * ...

分治递归————大整数乘法_递归大数乘法_Whb369的博客-程序员秘密

大整数乘法(分治)算法分析设x,y十进制整数,计算乘积xy。用小学方法设计算法,计算步骤太多,而且效率低。T(n)=O(n^2)所以用分治方法设计更有效的大整数乘法。将n为十进制整数x,y分为两段,每段长为n/2(若位数为奇数,每段长为[n/2],[n/2]+1)。x分为A和B,y分为C和D.比如 8945456 ,即A=89,B=45,C=4,D=56.引入公式:XY=AC(n^2...

Matlab画图-非常具体,非常全面_weixin_33675507的博客-程序员秘密

Matlab画图强大的画图功能是Matlab的特点之中的一个,Matlab提供了一系列的画图函数,用户不须要过多的考虑画图的细节,仅仅须要给出一些基本參数就能得到所需图形,这类函数称为高层画图函数。此外,Matlab还提供了直接对图形句柄进行操作的低层画图操作。这类操作将图形的每一个图形元素(如坐标轴、曲线、文字等)看做一个独立的对象,系统给每一个对象分配一个句柄,能够通过句柄对该图形...

EDA软件_Cadence_OrCAD Capture常用快捷键_黑崎江的博客-程序员秘密

本文简单介绍了Cadence Capture的常用快捷键。

随便推点

springmvc简单教程_dichi4045的博客-程序员秘密

引子,其实从.NET转Java已经有几个月时间了,项目也做了不少,但是很多配置都是根据公司模板或者网上教程比忽略画瓢,对其中最简单的配置和设置并不完全理解,依旧是小白用户。最近项目不忙,重新梳理了一下Spring MVC的相关配置,顺便保存下来,希望也能帮到其他同学……高手忽略~~~目录通过IDEA新建Spring MVC项目设置运行、调试相关配置导入Spring M...

转发技术风雨三十年,你经历过……_confirmwz的博客-程序员秘密

前言记得刚到大学报道的那天,为了给家人报个平安,我在电话亭里足足等了两个小时,而我的父亲为了接这个电话也赶到近百米的土豪家。作为我人生第一个通信工具Motorola BP机在我大学毕业使用两个月后迅速下岗,换了第一台GSM数字移动电话飞利浦989,从此满足了随时随地沟通和被沟通的需求;那个年代最蛋疼的莫过于双向收费,朋友为了测试通话质量是否OK浪费我六角钱让我至今还难以忘怀,因此成...

如何解决Ubuntu 14.04编译make menuconfig时缺少'ncurses-devel'库_ubuntu 14 ncurses_leon1741的博客-程序员秘密

今天在使用64位的Ubuntu 14.04系统编译linux源码的make menuconfig命令时,得到了一个错误的提示,说我没有安装相应的库:Unable to find the ncurses libraries or the required header files.'make menuconfig' requires the ncurses libraries.Instal...

Android 拦截Tablayout 点击事件_android tablayout禁止点击_安卓开发-顺的博客-程序员秘密

背景:特定需求,点击某一个tab时,直接跳转到其他页面,不做任何选中操作,如下图点击小视频要跳转而不是选中这个tab思考:Tablayout是安卓官方提供的,内部的点击事件都在内部封装,没有暴露类似的回调接口让用户自己处理某个tab的点击事件,但是通过看源码发现 每一个tab的点击事件其实是一个内部封装的继承自LinearLayout的一个TabView来触发的看14...

EJB 3.1五大模式改进令Java EE 6更好用_ejb 3.0 3.1.3.2_鹅的博客-程序员秘密

EJB(EnterpriseJavaBeans)是使用JavaEE开发和部署业务应用系统的服务端组件架构,使用EJB编写的应用系统是可扩展的、事务型和安全的。EJB3.0是JavaEE5平台的一部分,相对前面的版本,它更加易于使用,它的最新版本—JSR318:EJB3.1—随JavaEE6发布,进一步简化了使用,并提供了许多反应常见使用模式的改进,如:   1、无接口视图:允许你指

ADSL拨号代理服务器实现HTTP代理的搭建过程_TesterT的博客-程序员秘密

最近做一个项目时,发现购mai的厂商的代理似乎被识别了,总是拿不到正确的响应。于是尝试自己搭建了一个ADSL代理实现HTTP代理。ADSL拨号代理:电信宽带每一次拨号后会更换IP,利用这一点在IP更换后将新的IP存入到代理池中。代理的搭建过程分为以下几步:(1)购买代理服务器,笔者选择了淘b_a_o上销Liang最高的一家;(2)远程客fu给的代理服务器,拨号成功后,安装必要的软件...

推荐文章

热门文章

相关标签