目标检测算法通常会在输入图像中采样大量区域,然后判断这些区域是否包含感兴趣的目标,并调整区域边缘从而更准确地预测目标的真实边界框 (ground-truth bounding box)。
不同的模型使用的区域采样方法可能不同,这里介绍其一:以每个像素为中心生成多个大小和宽高比 (aspect ratio)不同的边界框,称为锚框 (anchor box)。
设输入图像的高宽为 h h h和 w w w。我们分别以图像的每个像素为中心生成不同形状的锚框。
设大小为 s ∈ ( 0 , 1 ] s \in (0, 1] s∈(0,1]且宽高比 r > 0 r > 0 r>0,那么锚框的宽和高分别为 w s r ws\sqrt{r} wsr 和 h s / r hs/\sqrt{r} hs/r 。当中心位置给定时,锚框的高宽是确定的。
以下分别设好一组大小 s 1 , … , s n s_1,\dots,s_n s1,…,sn和 r 1 , … , r m r_1,\dots,r_m r1,…,rm。如果以每个像素为中心时使用所有的组合,则一共输出 w h n m whnm whnm个锚框。虽然这些锚框可能覆盖了所有的真实边界框,但计算复杂度容易过高。因此,我们通常只对包含 s 1 s_1 s1或 r 1 r_1 r1的组合感兴趣,即
( s 1 , r 1 ) , ( s 1 , r 2 ) , … , ( s 1 , r m ) , ( s 2 , r 1 ) , ( s 3 , r 1 ) , … , ( s n , r 1 ) . (s_1,r_1),(s_1,r_2),\dots,(s_1,r_m),(s_2,r_1),(s_3,r_1),\dots,(s_n,r_1). (s1,r1),(s1,r2),…,(s1,rm),(s2,r1),(s3,r1),…,(sn,r1).也就是说,以相同像素为中心的锚框数量为 n + m − 1 n+m-1 n+m−1。对于整个输入图像,一共将生成 w h ( n + m − 1 ) wh(n+m-1) wh(n+m−1)个锚框。
以上生成锚框的方法已经在MultiBoxPrior函数中实现。指定输入、一组大小和一组宽高比,将返回所有锚框:
我的mxnet库报错了,淦,暂时解决不了
感谢李沐、Aston Zhang等老师的这本《动手学深度学习》一书,为鄙人学习深度学习提供了很大的帮助。本文一系列关于深度学习的博客均无侵权之意,只为记录自己的深度学习历程。
项目Github地址:https://github.com/ShusenTang/Dive-into-DL-PyTorch