4.2. mask
下图阐述了mask r-cnn的mask branch:
在mask r-cnn中的roi align之后有一个"head"部分,主要作用是将roi align的输出维度扩大,这样在预测mask时会更加精确。在mask branch的训练环节,作者没有采用fcn式的softmaxloss,反而是输出了k个mask预测图(为每一个类都输出一张),并采用average binary cross-entropy loss训练,当然在训练mask branch的时候,输出的k个特征图中,也只是对应ground truth类别的那一个特征图对mask loss有贡献。 mask r-cnn的训练损失函数可以描述为:
5. yolo
以上目标检测模型都是two-stage算法,针对于two-stage目标检测算法普遍存在的运算速度慢的缺点,yolo创造性的提出了one-stage,也就是将物体分类和物体定位在一个步骤中完成。yolo直接在输出层回归bounding box的位置和bounding box所属类别,从而实现one-stage。通过这种方式,yolo可实现45帧每秒的运算速度,完全能满足实时性要求(达到24帧每秒,人眼就认为是连续的)。整个系统如下图所示。
主要分为三个部分:卷积层,目标检测层,nms筛选层
5.1 卷积层
采用google inceptionv1网络,对应到上图中的第一个阶段,共20层。这一层主要是进行特征提取,从而提高模型泛化能力。但作者对inceptionv1进行了改造,他没有使用inception module结构,而是用一个1x1的卷积,并联一个3x3的卷积来替代。(可以认为只使用了inception module中的一个分支,应该是为了简化网络结构)
5.2 目标检测层
先经过4个卷积层和2个全连接层,最后生成7x7x30的输出。先经过4个卷积层的目的是为了提高模型泛化能力。yolo将一副448x448的原图分割成了7x7个网格,然后每个单元格负责去检测那些中心点落在该格子内的目标,如下图所示,可以看到狗这个目标的中心落在左下角一个单元格内,那么该单元格负责预测这个狗。每个单元格会预测 个边界框(bounding box)以及边界框的置信度(confidence score)。所谓置信度其实包含两个方面,一是这个边界框含有目标的可能性大小,二是这个边界框的准确度。前者记为 ,当该边界框是背景时(即不包含目标),此时 。而当该边界框包含目标时, 。边界框的准确度可以用预测框与实际框(ground truth)的iou(intersection over union,交并比)来表征,记为 。因此置信度可以定义为 。很多人可能将yolo的置信度看成边界框是否含有目标的概率,但是其实它是两个因子的乘积,预测框的准确度也反映在里面。边界框的大小与位置可以用4个值来表征: ,其中 是边界框的中心坐标,而 和 是边界框的宽与高。还有一点要注意,中心坐标的预测值 是相对于每个单元格左上角坐标点的偏移值,并且单位是相对于单元格大小的,单元格的坐标定义如图6所示。而边界框的 和 预测值是相对于整个图片的宽与高的比例,这样理论上4个元素的大小应该在 范围。这样,每个边界框的预测值实际上包含5个元素: ,其中前4个表征边界框的大小与位置,而最后一个值是置信度。
bounding box坐标: 如上图,7x7网格内的每个grid(红色框),对应两个大小形状不同的bounding box(黄色框)。每个box的位置坐标为(x,y,w,h), x和y表示box中心点坐标,w和h表示box宽度和高度。通过与训练数据集上标定的物体真实坐标(gx,gy,gw,gh)进行对比训练,可以计算出初始bounding box平移和伸缩得到最终位置的模型。
bounding box置信度confidence:这个置信度只是为了表达box内有无物体的概率,并不表达box内物体是什么。
其中前一项表示有无人工标记的物体落入了网格内,如果有则为1,否则为0。第二项代表bounding box和真实标记的box之间的重合度。它等于两个box面积交集,除以面积并集。值越大则box越接近真实位置。 每个网格还需要预测它属于20分类中每一个类别的概率。分类信息是针对每个网格的,而不是bounding box。故只需要20个,而不是40个。而confidence则是针对bounding box的,它只表示box内是否有物体,而不需要预测物体是20分类中的哪一个,故只需要2个参数。虽然分类信息和confidence都是概率,但表达含义完全不同。
5.3 nms筛选层
筛选层是为了在多个结果中(多个bounding box)筛选出最合适的几个,这个方法和faster r-cnn 中基本相同。都是先过滤掉score低于阈值的box,对剩下的box进行nms非极大值抑制,去除掉重叠度比较高的box(nms具体算法可以回顾上面faster r-cnn小节)。这样就得到了最终的最合适的几个box和他们的类别。
5.4 yolo损失函数
yolo的损失函数包含三部分,位置误差,confidence误差,分类误差。具体公式如下
误差均采用了均方差算法,其实我认为,位置误差应该采用均方差算法,而分类误差应该采用交叉熵。由于物体位置只有4个参数,而类别有20个参数,他们的累加和不同。如果赋予相同的权重,显然不合理。故yolo中位置误差权重为5,类别误差权重为1。由于我们不是特别关心不包含物体的bounding box,故赋予不包含物体的box的置信度confidence误差的权重为0.5,包含物体的权重则为1。 yolo算法开创了one-stage检测的先河,它将物体分类和物体检测网络合二为一,都在全连接层完成。故它大大降低了目标检测的耗时,提高了实时性。但它的缺点也十分明显
每个网格只对应两个bounding box,当物体的长宽比不常见(也就是训练数据集覆盖不到时),效果很差。
原始图片只划分为7x7的网格,当两个物体靠的很近时,效果很差
最终每个网格只对应一个类别,容易出现漏检(物体没有被识别到)。
对于图片中比较小的物体,效果很差。这其实是所有目标检测算法的通病,ssd对它有些优化,我们后面再看。
6. ssd
faster r-cnn准确率map较高,漏检率recall较低,但速度较慢。而yolo则相反,速度快,但准确率和漏检率不尽人意。ssd综合了他们的优缺点,对输入300x300的图像,在voc2007数据集上test,能够达到58 帧每秒( titan x 的 gpu ),72.1%的map。 ssd和yolo一样都是采用一个cnn网络来进行检测,但是却采用了多尺度的特征图,ssd网络结构如下图:
和yolo一样,也分为三部分:卷积层,目标检测层和nms筛选层
6.1 卷积层
ssd论文采用了vgg16的基础网络,其实这也是几乎所有目标检测神经网络的惯用方法。先用一个cnn网络来提取特征,然后再进行后续的目标定位和目标分类识别。
6.2 目标检测层
这一层由5个卷积层和一个平均池化层组成。去掉了最后的全连接层。ssd认为目标检测中的物体,只与周围信息相关,它的感受野不是全局的,故没必要也不应该做全连接。ssd的特点如下:
6.2.1 多尺寸feature map上进行目标检测
每一个卷积层,都会输出不同大小感受野的feature map。在这些不同尺度的feature map上,进行目标位置和类别的训练和预测,从而达到多尺度检测的目的,可以克服yolo对于宽高比不常见的物体,识别准确率较低的问题。而yolo中,只在最后一个卷积层上做目标位置和类别的训练和预测。这是ssd相对于yolo能提高准确率的一个关键所在。
如上所示,在每个卷积层上都会进行目标检测和分类,最后由nms进行筛选,输出最终的结果。多尺度feature map上做目标检测,就相当于多了很多宽高比例的bounding box,可以大大提高泛化能力。
下一篇:父母“婴语”好 孩子更健谈