样本分布
数据增强
队伍方案
- Faster-RCNN+FPN+Multi-stage traing method+Scale Normalization for training+cascade RCNN
- Faster-RCNN+FPN+DCN+ROI Align+anchor(5:1)+OHEM(batch级别)+Soft-NMS+投票平均
- Faster-RCNN+FPN+kmeans+ROIAlign+Soft-NMS
- Faster-RCNN+FPN+Coco预训练+multi-train/test
- Faster-RCNN+FPN+ROI Align+Soft-NMS+box-voting+multi scale+box stacking+Soft-NMS
- Faster-RCNN+FPN+DCN+Contextual ROI Pooling+OHEM+Soft-nms
- Faster-RCNN+FPN+Dilate convolution+dual path aggregation for object detection+MLRP+SWA+HFE
- Faster-RCNN+FPN+Dilation/deformable+roi align+focal loss+rcf-net+SWA(同类模型融合)/DCN+G-R-CNN(不同类模型的融合)
Baseline
Faster-RCNN+FPN+Dilation/DCN+ROI Align+Coco预训练+Focal Loss+Soft-NMS+投票平均+OHEM(batch级别)
1 Faster-RCNN
(1)输入测试图像;
(2)将整张图片输入CNN,进行特征提取;
(3)用RPN生成建议窗口(proposals),每张图片生成300个建议窗口;
(4)把建议窗口映射到CNN的最后一层卷积feature map上;
(5)通过RoI pooling层使每个RoI生成固定尺寸的feature map;
(6)利用Softmax Loss(探测分类概率) 和Smooth L1 Loss(探测边框回归)对分类概率和边框回归(Bounding box regression)联合训练.
1.1 Conv layers
包含了conv,pooling,relu三种层
1.1.1 VGG
Conv layers部分共有13个conv层,13个relu层,4个pooling层。这里有一个非常容易被忽略但是又无比重要的信息,在Conv layers中:
- 所有的conv层都是: k e r n e l _ s i z e = 3 kernel\_size=3 kernel_size=3 , p a d = 1 pad=1 pad=1 , s t r i d e = 1 stride=1 stride=1
- 所有的pooling层都是: k e r n e l _ s i z e = 2 kernel\_size=2 kernel_size=2 , p a d = 0 pad=0 pad=0 , s t r i d e = 2 stride=2 stride=2
- Conv layers中的conv层不改变输入和输出矩阵大小
1.2 Region Proposal Networks(RPN)
- 遍历Conv layers计算获得的feature maps,为每一个点都配备这9种anchors作为初始的检测框,检测框不准确,还需要精修。
- 在原文中使用的是ZFmodel中,其Conv Layers中最后的conv5层num_output=256,对应生成256张特征图,相当于一张feature map每个点用256-D的特征表示。
- 由于输入图像M=800,N=600,且Conv Layers做了4次Pooling,feature map的长宽为[M/16, N/16]=[50, 38]
- 在conv5之后,做了rpn_conv/3x3卷积,num_output=256,相当于每个点使用了周围3x3的空间信息,同时256-d不变,如图3红框,同时对应图4中的红框中的3x3卷积
- 假设一共有k个anchor,而每个anhcor要分foreground和background,所以cls=2k scores;而每个anchor都有[x, y, w, h]对应4个偏移量,所以reg=4k coordinates
- 第一个支路:18表示
2
∗
9
2*9
2∗9,foreground和background,9个锚框
- caffe的数据结构:blob=[batch_size, channel,height,width]
- reshape前在caffe blob中的存储形式为[1, 18, H, W]
- reshape后在caffe blob中的存储形式为[1, 2, 9*H, W],单独“腾空”出来一个维度以便softmax分类
- 经过softmax后再reshape恢复原状
- 第二个支路:36表示 4 ∗ 9 4*9 4∗9,[x, y, w, h]对应4个偏移量,9个锚框
其实RPN就是在原图尺度上,设置了密密麻麻的候选Anchor。然后用cnn去判断哪些Anchor是里面有目标的foreground anchor,哪些是没目标的backgroud,仅仅是个二分类。
anchor
原图800x600,VGG下采样16倍,feature map每个点设置9个Anchor:
其中ceil()表示向上取整,是因为VGG输出的feature map size= 50*38。
1.3 bounding box regression
绿色框为飞机的Ground Truth(GT),红色为提取的foreground anchors,即便红色的框被分类器识别为飞机,但是由于红色的框定位不准,这张图相当于没有正确的检测出飞机。所以我们希望采用一种方法对红色的框进行微调,使得foreground anchors和GT更加接近。
对于窗口一般使用四维向量
(
x
,
y
,
w
,
h
)
(x, y, w, h)
(x,y,w,h)表示,分别表示窗口的中心点坐标和宽高。红色的框A代表原始的Foreground Anchors,绿色的框G代表目标的GT,我们的目标是寻找一种关系,使得输入原始的anchor A经过映射得到一个跟真实窗口G更接近的回归窗口G’。
-
给定: a n c h o r A = ( A x , A y , A w , A h ) anchor A=(A_{x}, A_{y}, A_{w}, A_{h}) anchorA=(Ax,Ay,Aw,Ah) 和 G T = [ G x , G y , G w , G h ] GT=[G_{x}, G_{y}, G_{w}, G_{h}] GT=[Gx,Gy,Gw,Gh]
-
寻找一种变换F,使得: F ( A x , A y , A w , A h ) = ( G x ′ , G y ′ , G w ′ , G h ′ ) F(A_{x}, A_{y}, A_{w}, A_{h})=(G_{x}^{'}, G_{y}^{'}, G_{w}^{'}, G_{h}^{'}) F(Ax,Ay,Aw,Ah)=(Gx′,Gy′,Gw′,Gh′),其中 ( G x ′ , G y ′ , G w ′ , G h ′ ) ≈ ( G x , G y , G w , G h ) (G_{x}^{'}, G_{y}^{'}, G_{w}^{'}, G_{h}^{'})≈(G_{x}, G_{y}, G_{w}, G_{h}) (Gx′,Gy′,Gw′,Gh′)≈(Gx,Gy,Gw,Gh)
-
平移 ( Δ x , Δ y ) (\Delta x,\Delta y) (Δx,Δy)
- 水平方向: Δ x = A w d x ( A ) ⇀ G x ′ = A x + Δ x \Delta x=A_{w}d_{x}(A)\rightharpoonup G^{'}_{x}=A_{x}+\Delta x Δx=Awdx(A)⇀Gx′=Ax+Δx
- 竖直方向: Δ y = A w d y ( A ) ⇀ G y ′ = A y + Δ y \Delta y=A_{w}d_{y}(A)\rightharpoonup G^{'}_{y}=A_{y}+\Delta y Δy=Awdy(A)⇀Gy′=Ay+Δy
-
尺度缩放
- 宽度: G w ′ = A w e ( d w ( A ) ) G^{'}_{w}=A_{w}e^{(d_{w}(A))} Gw′=Awe(dw(A))
- 高度: G h ′ = A h e ( d h ( A ) ) G^{'}_{h}=A_{h}e^{(d_{h}(A))} Gh′=Ahe(dh(A))
当Anchor与Ground Truth 相差较少时(RCNN设置Iou是0.6),可以认为变换是一种线性变换,所以可以用线性回归对建模进行微调。