一点就分享系列(理解篇_2)以YOLOv3简述通用检测之道!!——“打通你检测的任督二脉 ” ”

一点就分享系列(理解篇_2)以YOLOv3简述通用检测之道!!——“打通你检测的任督二脉 ”

一点就分享系列(理解篇_2)以YOLOv3简述通用目标检测之道!!——“打通你检测的任督二脉 ”


刚开始写博客,也是以前的存货,水平有限且写的仓促,后面会周更保持质量!
关于网络模型结构什么的,网上资料太多了,我这里不会讲网络比如YOLO3网络53层啥啥de ,我打算以YOLOV3的anchor为例子,来帮助消除入门小伙伴对检测网络的抽象感觉,尽量规避复杂分析!!!!!!举一反三即可,懂得流程即可!


前言

该篇目的是为了给正在学目标检测和还不够理解网络流程的朋友扫个“盲”,顺便水一贴!言归正传。。。大家都知道目标检测器输出的结果是BOX的信息,可以框出原图展示出ROI位置,类别和置信度,但是具体怎么样计算得到的呢?首先,CNN输出后在转换成坐标前是如何?如何转换成BOX信息呢?又是如何映射回原图呢?那anchor最后怎么选定出的结果呢又是?来下面解析一波!


一、检测流程“大白话”

首先CNN在图像输入后,每一次卷积操作都会是一个Featuremap,这玩意是什么,来个照片认识下就行!
一点就分享系列(理解篇_2)以YOLOv3简述通用检测之道!!——“打通你检测的任督二脉 ” ”
看不懂是把?看不懂就对了,这也不是给你看的,这是给网络用的!其实读过我系列理解篇1的朋友们,应该不难理解,卷积后的产物,大饼夹一切的例子仍然可以说明,只是现在变成了进入你胃的样子了。
补课卷积操作地址!!

接下来是正篇!

首先我不管你啥网络,你计算过程里得有featuremap把?来我贴个图(DAO个图)!
一点就分享系列(理解篇_2)以YOLOv3简述通用检测之道!!——“打通你检测的任督二脉 ” ”
就这个了!开篇所有疑点,都可以借此图解答,最终我们得到的featuremap坐标需要把它映射回原图才可以出现图中的BOX(结构为中心点坐标,宽和高,置信度,类别数若干)!图中的B是自己定义的!就是原图划分成了SxS个grid,那么每个格子就预测B个box框. 会结合anchor(w,h)去生成框,尺度w,h可以自己设定也可以通过K聚类生成!!!!!!!

这里要特别提到的就是,YOLOV3是以多尺度为输出的(3个尺度输出,所以呢,他有3个结果,为什么这样?因为用来捕捉小物体的啊,统一的尺度在
小物体上检测经常漏检,图片尺度缩小,感受野会相对大,改善小目标的TricK!所以多尺度在YOLO3中作为FPN是一个很好的套路!)

所以接下来我们从YOLOV3的网络输出告诉你一个你看不懂的图如何映射回原图ROI。为了便于理解,你可想成上面的每一点其实对应着原图的一个BOX!!!!!!!

二、YOLOv3 ——3个知识点分析

1. 数据张量推理生成的过程

好!开始,现在通过多尺度(v3中是3个尺度)的输出,分类类别数定成100,那三个尺度输出为:O1(1,26,26,3,4,1,100),O2(1,52,52,3,4,1,100)、O3(1,104,104,3,4,1,100),我们获得了3个输出张量,解释下第其中的3是指3个anchor,前三维是featuremap张量维度,因为1个维度就是3个anchor这是初始化定好的,而数字4呢,代表BOX信息(x,y,w,h),而1呢就是代表置信度分数,100就是我们要预测的类别数!! 清楚了不?我们会得到预测的若干结果,简称为P!!
然后网络会干什么呢?如上图狗狗,需要把它映射成对应的原图中心点!!!!

2.解析下GT训练的真值生成过程

然后,这里先讲下训练时候的GT如何找到BOX属于哪个格子:
以输入网络v3的图像(416,416,3)说明,那么它的Gt 定为【A,B,C,D,0】,前四维度是BOX坐标,0作为类别表示对应第0类,那么该图像GT的网络输出维度仍然是O1,O2,O3…这3个维度一共是9个anchorBOX(每个维度是3个BOX),具体看你的参数配置文件Anchor设定!!小尺度对应大BOX,大尺度的对应小BOX,然后我们的真值变成了tensor形态。
开始计算!将GT的BOX【A=1,B,C,D,0】,坐标值归一化,【A1,B1,C1,D1,0】,3个维度3个结果,计算IOU比例来筛选,取3个维度中的最符合的,也就是我GT的BOX和生成的9个Anchor哪个最像(亲子鉴定)!!方法是:计算IOU比例来筛选,通过score祛除和执行nms去掉多余的框,取3个维度中的最符合某一维度(M,N),那么将归一化的中心坐标会和你属于的某一维度相乘=(X,Y),为原图中心点位置!对!!!!还是如上图狗狗,需要把它映射成对应的原图中心点!!!!
然后解这GT需要来到终极形态Tensor:O_final(1,X,Y,1,A1,B1,C1,D1,置信度=1,【独热编码,1是代表属于对应类】(0…1…0)) ,这样的tensor真值GT和P 会用于后续计算loss操作了。。

**3.映射边框计算
好累,来个经典图一点就分享系列(理解篇_2)以YOLOv3简述通用检测之道!!——“打通你检测的任督二脉 ” ”

我们通过以上已经得到了预测P和真值GT的最终形态!那么我们对于CNN的输出结果,在预测中是需要按照公式进行计算,先解析下公式:
bx和by分别对tx和ty进行sigmoid,并加上对应的offset(Cx, Cy);
Yolov3中每个grid cell在feature map中的宽和高均为1,所以Cx,Cy=1;Pw、Ph是预设的anchor box映射到feature map中的宽和高!除以设定好的步长!!!映射到feature map坐标系中!
我不想往下写了(水了)!!

这里看到一个文章说,YOLO不是直接回归bounding box的长宽而是尺度缩放到对数空间,是怕训练会带来不稳定的梯度。因为如果不做变换,直接预测相对形变tw,那么要求tw>0,因为你的框的宽高不可能是负数。这样,是在做一个有不等式条件约束的优化问题,没法直接用SGD来做。所以先取一个对数变换,将其不等式约束去掉,就可以了

糟糕!我感觉这么扣计算已经违背了我这篇梳理的初衷!那么,看着迷糊的朋友,可以自行补课YOLO3 LOSS等计算过程!!!简单总结下!你只需要知道一下几点!!!!!!!!!!!!
1)这里看图可以了解到,平移(tx,ty)和尺度缩放(tw,th)算是一个“调节”,在训练中和GT重合,也是回归的基本操作,前面的你就算看不懂,一句话,本质上YOLO网络学习的就是这4个平移量!!!!!!!!!!!!!!!!!!
2)为什么需要做归一化?简单理解为,大框小框长边短边,需要消除这个量纲差距,这样网络训练收敛会更快
3)明白网络卷积层的输出形式,最终需要从featuremap通过映射计算还原成BOX的真实坐标,参考计算解析第三点——边框计算
4) 训练中对于某个ground truth框,究竟是哪个anchor负责匹配它呢?答案在刚才第二点——解析下GT训练的真值生成过程!!!

知道这4个点,其实对于模型检测流程就不会感到抽象了把 !

总结

这期其实挺失败的。。为了保证质量以后变成周更!!!!!!下个理论篇筹备中预告!!!(YoLoV4的改良放缩版本系列更新后,引来一阵热议,优秀的工作带来了速度和精度的完美结合,老实说个人觉得是优化的产物,而非创新。稍微了解你就会明白为什么这么说?在非官方的V5版本给从业人士带来的便利后,V4的更新你会发现对迎合不同硬件落地的需求:做法仍然是改变网络层的结构(网络深度和宽度)以及图片分辨率,这在去年的efficient系列里已经首次验证过了,而此之前V5的4个子模型做法也类似,后续有空会给出详细对比(这里是我因时间原因还未能将这些模型理解透彻)冷静下来,efficient系列也好,YoLoV4还是V5也好,同样帮也存在很多相似之处,刚才说的这个就是其一,下次想给大家分享的就是网络的基础设计,没错就是助攻者-XXXX不可说(下篇更新)