Yolo系列论文-自问自答

思考3个问题?
第一、模型最后一层输出的值,是什么?
第二、模型输出的结果,如何转换计算,得到最终的预测框?
第三、数据处理计算出来的target,如何得到?也就是如何将数据处理得到的真值和模型预测值匹配上,拿去计算loss?

这三个问题,一直困扰我很久,也反反复复得看,当时看的时候,是想明白了,过了一阵子又忘了,所以还是决定记录下来。

第一个问题

第一、模型最后一层输出的值,是什么?

先来看看论文给出的预测框,这个图
Yolo系列论文-自问自答_第1张图片

预测框,模型预测出来的结果是,什么意思? 就是我们的网络,最后一层输出的值,

网络最后一层输出值:
第一步结果: t x , t y , t w , t h 第一步结果:t_x,t_y,t_w,t_h\\ 第一步结果:tx,ty,tw,th

从yolov1那里,我们是可以知道,
t x , t y , t w , t h t_x,t_y,t_w,t_h\\ tx,ty,tw,th是可以直接用来当做最终的预测框,但作者在yolov2中,引入anchor计算的机制,采用归一化,Anchor转换,得到最终预测框。

归一化处理:
第二步结果: σ ( t x ) , σ ( t y ) , ℮ t w , ℮ t h 第二步结果:\sigma\left(t_x\right),\sigma\left(t_y\right),℮^{t_w},℮^{t_h}\\ 第二步结果:σ(tx),σ(ty),tw,th
σ 是 s i g m o i d 函数, , ℮是 l o g 函数,论文没有直接给出 \sigma是sigmoid函数, ,℮是log函数,论文没有直接给出 \\ σsigmoid函数,,log函数,论文没有直接给出

为什么要归一化处理,不做行不行,答案是行的,放进去做实验,可能模型在收敛和精度上,有比较大的差别。

转换处理:
第三步结果: b x = σ ( t x ) + c x b y = σ ( t y ) + c y b w = p w ℮ t w b h = p h ℮ t h 第三步结果:\\ b_x= \sigma\left(t_x\right)+c_x\\ b_y= \sigma\left(t_y\right)+c_y\\ b_w= p_w℮^{t_w}\\ b_h= p_h℮^{t_h}\\ 第三步结果:bx=σ(tx)+cxby=σ(ty)+cybw=pwtwbh=phth

b x , b y , b w , b h 就是我们最终得到的框,就像手工标注的框一样 . b_x,b_y,b_w,b_h 就是我们最终得到的框,就像手工标注的框一样.\\ bx,by,bw,bh就是我们最终得到的框,就像手工标注的框一样.
其中

p w , p h 是 A n c h o r 的宽和高, c x , c y 是格子的左上角坐标 . (下文,进一步解析这两个参数值,是已知的,固定的) p_w,p_h是Anchor的宽和高,c_x,c_y是格子的左上角坐标. \\ (下文,进一步解析这两个参数值,是已知的,固定的) pw,phAnchor的宽和高,cx,cy是格子的左上角坐标.(下文,进一步解析这两个参数值,是已知的,固定的)

第一个问题,小结:
从模型计算出来的计算,经过第一、二、三步,最后才得到我们想要的预测值。

第三个问题

数据处理,target值如何计算出来?

第一,输入到loss函数的预测值是什么?
在前面,我们谈到,预测值,有三个阶段的值,可以作为预测输出,但取哪一个送到loss中呢?

答案:
σ ( t x ) , σ ( t y ) , ℮ t w , ℮ t h \sigma\left(t_x\right),\sigma\left(t_y\right),℮^{t_w},℮^{t_h}\\ σ(tx),σ(ty),tw,th
这个数值,将会作为预测值输入给loss。

第二, 如何得到对应的GT值呢?

一个GT框,分2部分: x,y和w,h。
为什么要这样分? 因为获取x,y,w,h的值,方式是不同的。

先看x,y
一张416x416的图上,可以生成13x13x5个anchor,也就是每个格子里面,先画5个anchor(锚框)。下图是7x7格子的路,来自yolov1的论文。
Yolo系列论文-自问自答_第2张图片

假设,我想要输入loss的target是这样的:
t a r g e t x , t a r g e t y , t a r g e t w , t a r g e t h target_x,target_y,target_w,target_h\\ targetx,targety,targetw,targeth
开始计算
t a r g e t x , t a r g e t y target_x,target_y\\ targetx,targety

  1. 计算GT真实框的中心点坐标,落在哪个gird(格子), 原图大小(416x416)划分为13x13个格子;
    tx = GT真实框中心点坐标cx - 格子左上角x
    然后,再针对格子,把值归一化到 [0,1],即
    sigmoid(tx) = (GT真实框中心点坐标cx - 格子左上角x) / (416/13)
    同理,可得 sigmoid(ty)

第二,w, h
yolov2中,416x416划分为13x13个格子,可以想象为13x13个点,每个点生成5个不同大小的anchor。
那用哪一个anchor 对应给GT真实框呢? 答案是 求最大IOU值。

格子的左上角坐标,其实 刚好就是anchor的中心点,因为5个anchor,就是在这个点上生成出来的。

在第一步中,已经知道GT真实框落到某个格子上,然后这个格子有5个不同大小的anchor,
求5个anchor与GT真实框的IOU,IOU最大的,就是选中的anchor。

exp(th) = GT真实框的H / anchor的H

计算公式:
bx = sigmoid(tx)+cx

通过观察,我们发现,
每个格子的左上角这个点,就是anchor的中心点.

参考

  • Understanding a Real-Time Object Detection Network: You Only Look Once (YOLOv1)

你可能感兴趣的:(深度学习,计算机视觉,人工智能)