思考3个问题?
第一、模型最后一层输出的值,是什么?
第二、模型输出的结果,如何转换计算,得到最终的预测框?
第三、数据处理计算出来的target,如何得到?也就是如何将数据处理得到的真值和模型预测值匹配上,拿去计算loss?
这三个问题,一直困扰我很久,也反反复复得看,当时看的时候,是想明白了,过了一阵子又忘了,所以还是决定记录下来。
第一、模型最后一层输出的值,是什么?
预测框,模型预测出来的结果是,什么意思? 就是我们的网络,最后一层输出的值,
网络最后一层输出值:
第一步结果: 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=pw℮twbh=ph℮th
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,ph是Anchor的宽和高,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的论文。
假设,我想要输入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
第二,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的中心点.