理解有监督学习的深度学习的关键在于将 推理 和 训练 阶段进行分开,分别理解各种深度神经网络架构的推理和训练阶段的操作就可以理解某个模型。
推理阶段是将模型看成一个类似于黑箱的非线性函数,比如通过各种卷积模块的组合构成一个 backbone,输出想要的shape的张量,再去做后处理。
训练阶段是需要划分正负样本,然后根据任务设计一个损失函数,使用优化算法如SGD以迭代的方式更新神经元的weight和bias,优化的目标是最小化损失函数,因此训练好的模型就可以拟合训练集。
我们通常可以把所有的神经网络以 编码器-解码器 的架构进行理解。
当然,我们可以将 Backbone + Neck 看成编码器,Detection head 看成解码器。注意:可能有的架构并没有 Neck , 如 YOLO v1,所以会带来性能损失。
Backbone + Neck + Detection head 的架构让我们可以分别设计单个模块, 然后进行替换即可构造不同的目标检测模型。
2. 训练阶段:
训练阶段的核心在于 损失函数的设计。Detection head 输出的张量与标签标注的求损失,从而去更新网络。所以,这部分并不涉及上面的 后处理。 这里的关键在于 正负样本的选择 ,从而来计算损失。
在图像分类任务 中 正样本 是该类所有标注的图像,负样本是其他类所有图像。网络输入正样本图像, 然后预测值和标签向量中 1 的地方求损失, 所以预测值会变大, 从而降低损失,由于 softmax 约束, 那么预测向量的其他值会变小;网络输入针对的目前某个类的负样本图像时候, 该图像所属的类的预测值就会变大,其他值也就会变小。所以,对于图像分类来说,我们并不需要关注正负样本的划分,因为通过 标签的one-hot 编码,自然的相当于区分了正负样本。
目标检测任务 中,输入一张图像,和图像分类不同的是,正负样本的单位不再是一张图像,而是一张图像中的某个区域,所以一张图像有多个正负样本,虽然这些区域的大小比图像分类中的图像要小,但是由于数量巨多,所以目标检测相比要慢的多。那么如何得到这些区域(样本)?如何把这么多的区域分为正负样本?这是两个重要的问题。前者:一种常用的做法是 anchor based 的方法来得到这些区域,每个图像的小块上生成的一些先验框anchor 就是样本。 后者:常用的是基于和 真实标注框 的IOU来划分正负样本, 不同的算法策略不同。如果anchor 划分为正样本, 那么对该正样本进行回归就可以得到预测框,那么预测框就可以参与损失函数中 定位损失的计算,预测框和真实标注框计算距离。
注意这里有三种框:
综上,目标检测中的正样本并不是真实标注框, 真实标注框是优化的目标,正如图像分类中的 one-hot 编码的向量一样。正样本是那些选择的部分先验框anchor,正如图像分类中的 某个类的图像。而通过模型先验框anchor得到的结果是预测框,正如图像分类中的预测向量,所以预测框和真实框求Loss。当然,像 yolov1 并没有 anchor,所以有部分不同。
注:上面来自于 yolov4 论文。
一部分 正负样本划分策略, 请参考:
目标检测中 Anchor 与 Loss 计算的梳理 | 拾荒志
anchor 生成方法,请参考:
普通相机抖动脚本较易实现,但在使用cinemachine相机下,其Transform组件不可被代码修改,那么Cinemachine的相机抖动如何实现呢?本文结合实际项目,对实现相机抖动的三大步骤进行系统讲解:项目地址:Hero - SouthBegoniaversion 2.2.9 packageManager 下载配置流程项目背景:一款2D像素动作游戏,我们操控着Player(...
Box86源码剖析Box86前文回顾源码阅读Run()跳转系统调用函数实现:x86Syscall(emu);Box86前文回顾在前面的代码阅读过程中,我们已经成功找到了真正去翻译程序并执行的入口函数 Run(),具体内容可以参考下面链接:Box86源码剖析(一)Box86源码剖析(二)前面看到的内容概况下来如下:源码阅读Run()从前面,我们看到 Box86 的真正进行指令翻译和执行的入口在于 x86run.c 文件中的 Run() 函数,该函数的实现太长,这里就取前半部分看一下:
实值编码[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 * ...
大整数乘法(分治)算法分析设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画图强大的画图功能是Matlab的特点之中的一个,Matlab提供了一系列的画图函数,用户不须要过多的考虑画图的细节,仅仅须要给出一些基本參数就能得到所需图形,这类函数称为高层画图函数。此外,Matlab还提供了直接对图形句柄进行操作的低层画图操作。这类操作将图形的每一个图形元素(如坐标轴、曲线、文字等)看做一个独立的对象,系统给每一个对象分配一个句柄,能够通过句柄对该图形...
本文简单介绍了Cadence Capture的常用快捷键。
引子,其实从.NET转Java已经有几个月时间了,项目也做了不少,但是很多配置都是根据公司模板或者网上教程比忽略画瓢,对其中最简单的配置和设置并不完全理解,依旧是小白用户。最近项目不忙,重新梳理了一下Spring MVC的相关配置,顺便保存下来,希望也能帮到其他同学……高手忽略~~~目录通过IDEA新建Spring MVC项目设置运行、调试相关配置导入Spring M...
前言记得刚到大学报道的那天,为了给家人报个平安,我在电话亭里足足等了两个小时,而我的父亲为了接这个电话也赶到近百米的土豪家。作为我人生第一个通信工具Motorola BP机在我大学毕业使用两个月后迅速下岗,换了第一台GSM数字移动电话飞利浦989,从此满足了随时随地沟通和被沟通的需求;那个年代最蛋疼的莫过于双向收费,朋友为了测试通话质量是否OK浪费我六角钱让我至今还难以忘怀,因此成...
今天在使用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...
背景:特定需求,点击某一个tab时,直接跳转到其他页面,不做任何选中操作,如下图点击小视频要跳转而不是选中这个tab思考:Tablayout是安卓官方提供的,内部的点击事件都在内部封装,没有暴露类似的回调接口让用户自己处理某个tab的点击事件,但是通过看源码发现 每一个tab的点击事件其实是一个内部封装的继承自LinearLayout的一个TabView来触发的看14...
EJB(EnterpriseJavaBeans)是使用JavaEE开发和部署业务应用系统的服务端组件架构,使用EJB编写的应用系统是可扩展的、事务型和安全的。EJB3.0是JavaEE5平台的一部分,相对前面的版本,它更加易于使用,它的最新版本—JSR318:EJB3.1—随JavaEE6发布,进一步简化了使用,并提供了许多反应常见使用模式的改进,如: 1、无接口视图:允许你指
最近做一个项目时,发现购mai的厂商的代理似乎被识别了,总是拿不到正确的响应。于是尝试自己搭建了一个ADSL代理实现HTTP代理。ADSL拨号代理:电信宽带每一次拨号后会更换IP,利用这一点在IP更换后将新的IP存入到代理池中。代理的搭建过程分为以下几步:(1)购买代理服务器,笔者选择了淘b_a_o上销Liang最高的一家;(2)远程客fu给的代理服务器,拨号成功后,安装必要的软件...