你说我是不是和目标检测算法杠上了,明明自己不搞这一块,却把效果最好的算法都看完了,唉,真搞不懂自己,改天在花时间好好整理一下,他们这么搞CV的人,真麻烦。
今天说的是SSD算法,论文的名字是:SSD: Single Shot MultiBox Detector。这是一篇我看了很久很久都没看懂,看了很多遍很多遍都没有看懂,写的比Faster RCNN还晦涩的一篇论文,不过在我的软磨硬泡下,终于还是给啃下了。
SSD的核心就是多层的Feature map进行类别的判断以及坐标偏移的计算,基本架构如下图所示,截取至原论文:
看到后面哪些和最后mAP直连的层了没,这些层都是用来进行类别判断以及坐标回归的(坐标回归是很重要的一点,后面会详细阐述这些内容)。其中每一层的每一个特征值通道,都会产生相应的类别判断以及坐标回归,感觉这篇文章已经将Feature map的使用达到了极致了。
对了想知道8732怎么来得么,来,给你算算,38*38*4+19*19*6+10*10*6+5*5*6+3*3*4+1*1*4 = 8732,其中的4和6分别表示每个Feature map上对应的default box的数量,每个层的个数是不相等的,唉,都特别想知道这些参数是如何得到的,鬼知道他们这群人做了多少天的实验才会有这样的实验效果,总感觉他们这群搞CV的人一定有秘密武器。
当然原文也和目前最好的OD算法进行了比较,这些内容自己看吧,我就不讲解他们是如何吹XX了吧。
当然上面也提到了网络结构,论文在实现的时候,FC6使用的不是卷积网络结构而是使用的atrous convolution的方式,AtrousConvolution和dilated convolution中描述了是怎么回事。
下面描述一下default box是怎么一回事,这个就是在不同的Feature map层定义不同大小以及不同比例的box,这些box确定大小以及比例之后会以1:1的比例映射到原始图像上面。
一共有6中不同的比例,分别是1,2,3,0.5,0.33333,这些比例计算box宽和高的公式是:$w_{k}^{a}=s_{k}*sqrt{a_{r}}$,$h_{k}^{a}=s_{k}/sqrt{a_{r}}$。当比例等于1的时候,还有另外尺度。在论文的源码中,确定box的方式是使用x_min,x_max,y_min,y_max一个4元组,同时还进行了归一化(除以原始图片的长和宽)。