Light-Head R-CNN論文筆記

Light-Head R-CNN論文筆記

轉載地址:https://blog.csdn.net/u013010889/article/details/78647389
其他鏈接:https://blog.csdn.net/u014380165/article/details/78651060
https://blog.csdn.net/dlyldxwl/article/details/78714195

論文鏈接:Light-Head R-CNN: In Defense of Two-Stage Object Detector,名字很有趣,守護two stage檢測器的尊嚴。

Motivation

region-free的方法如YOLO,SSD,速度是很快,但是總體來說精度上還是不如兩段的region-based系列的Faster rcnn(及加速版R-FCN),那我們想要精度最高速度最快,就有兩個做法了,提升region-free系列的精度(這個等我再二刷SSD後再想想有木有什麼思路),另一個就是提升region-based系列的速度了,本文就是後者。

首先Faster rcnn爲什麼還是很慢,在我上一篇博客R-FCN解讀中已經提過,它的第二階段每個proposal是不共享計算的,fc大量的參數和計算嚴重拖了速度(其實faster rcnn+res101已經做了努力,在res5c有個global pool到2014*1*1,不然第二階段第一個fc參數參數更多。kaiming論文是C5作爲fc6 fc7的,C5後面也依然有global pool,最後分類肯定要有一個全連接的,global pool之後參數也少很多(2048*1*1*C,不然就是2048*7*7*C))。而R-FCN就在着力於解決這個第二階段的問題,通過生成一個k^2(C+1) channel的score map和PSRoIpooling可以去掉第二階段的隱層fc,加速了很多。

但是R-FCN生成的score map是和C相關的,在MSCOCO上有81類需要生成7*7*81=3969個channel的score map,這個是耗時耗內存的。所以本文想生成一個thin 的feature map,這樣可以顯著加速還可以騰出“時間”在後面的rcnn部分做點文章提升精度。

Approach

在Resnet101 res5c後利用大的可分離卷積,生成(α * p * p)channel的feature map,α本文取10,p和其他框架一致取7,這個最終只有10*7*7=490,而且與類別數C無關,大大減少了計算量,第二階段的rcnn 子網絡,本文爲了提升精度,相比R-FCN多了一個隱層fc,這是thin feature map爲它省來的計算空間,所以速度依然很快。

這裏寫圖片描述

Basic feature extractor.

兩種設置,一種是ResNet101,設爲L,一種是自己設計的簡單的Xception網絡,設爲S

thin feature map

參考論文Large Kernel Matters – Improve Semantic Segmentation by Global Convolutional Network
本文設置k=15, Cmid = 64 for setting S,and Cmid = 256 for setting L

這裏寫圖片描述

Ablation experiment

thin feature map

首先說明直接把feature map變爲thin feature map有什麼影響啊?
做法就是直接把R-FCN得到的feature map用1*1的卷積降維到490,然後由於channel減少和類別樹無關了,不能像R-FCN直接vote了(R-FCN vote後得到(C+1)*1*1,然後可以直接softmax,而本文vote的話得到10*1*1,不能直接softmax,所以加個10*1*1*C的全連接分類,加個10*1*1*4*C的全連接回歸,圖中那個fc應該是cls和loc都有的)。B1是直接復現的R-FCN,B2是改了點配置(1, 圖片尺度和anchor scale增多 2, 迴歸的loss比重擴大1倍 3, 只選前256個loss大的樣本進行反向傳播)
從表中可以看到,channel變少了那麼多後,精度並沒有損失太多,把PSRoIpooing換成roipooling情況是一樣的,甚至有些提升(因爲PSRoIpooing後channel變成10channel了,而RoIPooling後channel還是490,參數多了些精度有些許提升)。而且這地方channel變少後集成FPN很方便,因爲fpn會在很多level的feature上通過3*3卷積生成這個(C+1)*k*k channel的feature map,十分耗內存和計算,詳見我的另一篇博客FPN解讀
這裏寫圖片描述
這裏寫圖片描述

large separable convolution

把粗暴的1*1降維換成Large separable convolution,k=15, Cmid = 256,其他和R-FCN一樣

這裏寫圖片描述

R-CNN subnet

我們在R-CNN subnet中多加了一個2048channel的隱層fc(無dropout,注意區別於前面的實驗是直接加個10*1*1*C的全連接分類(對應表格第3行的數據),這裏要有個10*1*1*2048的隱層fc,然後再有個2048*C的全連接分類,loc類似),這個隱層fc是2048和1024 channel都差不多,參數變化很少,精度速度影響也不大。
從表上看到最終提升了2個點左右,而且注意由於用了thin feature map,速度是比它們快的。
這裏寫圖片描述

High Accuracy and High Speed

本文把PSRoIpooling改成和RoIalign那樣的插值,然後加上和其他model的同樣配置和數據增強,精度是可以達到state-of-art的

這裏寫圖片描述

然後速度方面,把base model換成自己設計的”S”,速度也是可以秒掉SSD、YOLO等region-free以追求速度爲主的model,同時精度和它們相當

這裏寫圖片描述

這裏寫圖片描述

下一步是不是要精度達到region-based,速度達到region-free呢,期待中(實力暫時不夠,只能期待了)

部分代碼

# light head
# large kernel
conv_new_1 = mx.sym.Convolution(data=relu1, kernel=(15, 1), pad=(7, 0), num_filter=256, name="conv_new_1", lr_mult=3.0)
relu_new_1 = mx.sym.Activation(data=conv_new_1, act_type='relu', name='relu1')
conv_new_2 = mx.sym.Convolution(data=relu_new_1, kernel=(1, 15), pad=(0, 7), num_filter=10*7*7, name="conv_new_2", lr_mult=3.0)
relu_new_2 = mx.sym.Activation(data=conv_new_2, act_type='relu', name='relu2')
conv_new_3 = mx.sym.Convolution(data=relu1, kernel=(1, 15), pad=(0, 7), num_filter=256, name="conv_new_3", lr_mult=3.0)
relu_new_3 = mx.sym.Activation(data=conv_new_3, act_type='relu', name='relu3')
conv_new_4 = mx.sym.Convolution(data=relu_new_3, kernel=(15, 1), pad=(7, 0), num_filter=10*7*7, name="conv_new_4", lr_mult=3.0)
relu_new_4 = mx.sym.Activation(data=conv_new_4, act_type='relu', name='relu4')
light_head = mx.symbol.broadcast_add(name='light_head', *[relu_new_2, relu_new_4])
# PSROIPooling
roi_pool = mx.contrib.sym.PSROIPooling(name='roi_pool', data=light_head, rois=rois, group_size=7, pooled_size=7, output_dim=10, spatial_scale=0.0625)
# 隱層fc
fc_new_1 = mx.symbol.FullyConnected(name='fc_new_1', data=roi_pool, num_hidden=2048)
fc_new_1_relu = mx.sym.Activation(data=fc_new_1, act_type='relu', name='fc_new_1_relu')
# 分類和迴歸
cls_score = mx.symbol.FullyConnected(name='cls_score', data=fc_new_1_relu, num_hidden=num_classes)
bbox_pred = mx.symbol.FullyConnected(name='bbox_pred', data=fc_new_1_relu, num_hidden=num_reg_classes * 4)

參考:
terrychenism/Deformable-ConvNets

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章