主要根據具體任務的數據集特點以及相關評價指標來確定一個網絡結構的輸入圖像分辨率,深度,每一層寬度,拓撲結構等細節
大部分的論文基於imagenet這種公開數據集進行通用網絡結構設計,早期只是通過分類精度來證明設計的優劣,后期進行網絡參數量(Params)和計算量(FLOPs)的對比,因為基於imagenet這種大型數據集進行訓練的模型具有一定的泛化能力,所以在其他視覺任務中有一定的性能保證,但是在實際應用中,還是要結合已公開發表的優秀網絡結構和任務特點適當進行修改得到自己需要的模型結構.
一般部署在邊緣設備上的網絡需要輕量級的網絡結構,因此目前最好的辦法是直接設計輕量級的架構,然后結合剪枝量化進行模型的進一步壓縮
基本概念:
1.感受野
感受野指的是卷積神經網絡每一層輸出的特征圖(feature map)上每個像素點映射回輸入圖像上的區域大小,神經元感受野的范圍越大表示其能接觸到的原始圖像范圍就越大,也意味着它能學習更為全局,語義層次更高的特征信息,相反,范圍越小則表示其所包含的特征越趨向局部和細節。因此感受野的范圍可以用來大致判斷每一層的抽象層次,並且我們可以很明顯地知道網絡越深,神經元的感受野越大。
2.分辨率
分辨率指的是輸入模型的圖像尺寸,即長寬大小。通常情況會根據模型下采樣次數n和最后一次下采樣后feature map的分辨率k×k來決定輸入分辨率的大小,即: r=k*2^n
從輸入r×r到最后一個卷積特征feature map的k×k,整個過程是一個信息逐漸抽象化的過程,即網絡學習到的信息逐漸由低級的幾何信息轉變為高級的語義信息,這個feature map的大小可以是3×3,5×5,7×7,9×9等等,k太大會增加后續的計算量且信息抽象層次不夠高,影響網絡性能,k太小會造成非常嚴重的信息丟失,如原始分辨率映射到最后一層的feature map有效區域可能不到一個像素點,使得訓練無法收斂。
在ImageNet分類任務中,通常設置的5次下采樣,並且考慮到其原始圖像大多數在300分辨率左右,所以把最后一個卷積特征大小設定為7×7,將輸入尺寸固定為224×224×3。在目標檢測任務中,很多采用的是416×416×3的輸入尺寸,當然由於很多目標檢測模型是全卷積的結構,通常可以使用多尺寸訓練的方式,即每次輸入只需要保證是32×的圖像尺寸大小就行,不固定具體數值。但這種多尺度訓練的方式在圖像分類當中是不通用的,因為分類模型最后一層是全連接結構,即矩陣乘法,需要固定輸入數據的維度。
3.深度
神經網絡的深度決定了網絡的表達能力,它有兩種計算方法,早期的backbone設計都是直接使用卷積層堆疊的方式,它的深度即神經網絡的層數,后來的backbone設計采用了更高效的module(或block)堆疊的方式,每個module是由多個卷積層組成,它的深度也可以指module的個數,這種說法在神經架構搜索(NAS)中出現的更為頻繁。通常而言網絡越深表達能力越強,但深度大於某個值可能會帶來相反的效果,所以它的具體設定需要不斷調參得到。
4.寬度
寬度決定了網絡在某一層學到的信息量,但網絡的寬度時指的是卷積神經網絡中最大的通道數,由卷積核數量最多的層決定。通常的結構設計中卷積核的數量隨着層數越來越多的,直到最后一層feature map達到最大,這是因為越到深層,feature map的分辨率越小,所包含的信息越高級,所以需要更多的卷積核來進行學習。通道越多效果越好,但帶來的計算量也會大大增加,所以具體設定也是一個調參的過程,並且各層通道數會按照8×的倍數來確定,這樣有利於GPU的並行計算。
5.下采樣
下采樣層有兩個作用,一是減少計算量,防止過擬合,二是增大感受野,使得后面的卷積核能夠學到更加全局的信息。下采樣的設計有兩種:
1.采用stride為2的池化層,如Max-pooling或Average-pooling,目前通常使用Max-pooling,因為它計算簡單且最大響應能更好保留紋理特征;
2.采用stride為2的卷積層,下采樣的過程是一個信息損失的過程,而池化層是不可學習的,用stride為2的可學習卷積層來代替pooling可以得到更好的效果,當然同時也增加了一定的計算量。
6.上采樣
在卷積神經網絡中,由於輸入圖像通過卷積神經網絡(CNN)提取特征后,輸出的尺寸往往會變小,而有時我們需要將圖像恢復到原來的尺寸以便進行進一步的計算(如圖像的語義分割),這個使圖像由小分辨率映射到大分辨率的操作,叫做上采樣,它的實現一般有三種方式:
- 插值,一般使用的是雙線性插值,因為效果最好,雖然計算上比其他插值方式復雜,但是相對於卷積計算可以說不值一提;
- 轉置卷積又或是說反卷積,通過對輸入feature map間隔填充0,再進行標准的卷積計算,可以使得輸出feature map的尺寸比輸入更大;
- Max Unpooling,在對稱的max pooling位置記錄最大值的索引位置,然后在unpooling階段時將對應的值放置到原先最大值位置,其余位置補0;
7.參數量
參數量指的網絡中可學習變量的數量,包括卷積核的權重weight,批歸一化(BN)的縮放系數γ,偏移系數β,有些沒有BN的層可能有偏置bias,這些都是可學習的參數 ,即在模型訓練開始前被賦予初值,在訓練過程根據鏈式法則中不斷迭代更新,整個模型的參數量主要由卷積核的權重weight的數量決定,參數量越大,則該結構對運行平台的內存要求越高,參數量的大小是輕量化網絡設計的一個重要評價指標。
8.計算量
神經網絡的前向推理過程基本上都是乘累加計算,所以它的計算量也是指的前向推理過程中乘加運算的次數,通常用FLOPs來表示,即floating point operations(浮點運算數)。計算量越大,在同一平台上模型運行延時越長,尤其是在移動端/嵌入式這種資源受限的平台上想要達到實時性的要求就必須要求模型的計算量盡可能地低,但這個不是嚴格成正比關系,也跟具體算子的計算密集程度(即計算時間與IO時間占比)和該算子底層優化的程度有關。
卷積計算類型
1.標准卷積
2.深度卷積
3.分組卷積
4.空洞卷積
5.轉置卷積
6.可變形卷積
其他算子
池化---(最大池化,平均池化,全局平均池化,最大向上池化)
全鏈接計算
addition/concatenate分支
channel shuffle
channel shuffle是ShuffleNet中首次提出,主要是針對分組卷積中不同組之間信息不流通,對不同組的feature map進行混洗的一個操作,如下圖所示,假設原始的feature map維度為(1,9,H,W),被分成了3個組,每個組有三個通道,那么首先將這個feature map進行reshape操作,得到(1,3,3,H,W),然后對中間的兩個大小為3的維度進行轉置,依然是(1,3,3,H,W),最后將通道拉平,變回(1,9,H,W),就完成了通道混洗,使得不同組的feature map間隔保存,增強了信息的交互。
常用激活函數
relu系列---(relu,relu6,leaky relu)
sigmiod系列
金典輕量化模型
squeezeNet
mobilenet系列
shufflenet系列
Shift: A Zero FLOP, Zero Parameter Alternative to Spatial Convolutions
Ghostnet
efficientdet
yolov*-tiny
基於特定硬件的神經架構搜索
基於特定硬件的神經架構搜索(MIT HAN Lab論文總結
https://zhuanlan.zhihu.com/p/320290820)
設計方法總結
該總結來自極市平台的Ironboy
輕量級CNN架構設計總的思路:選定合適的結構+通道剪枝+量化
訓練:imagenet pretrain model + data normalization(統計自己數據集的均值和方差)+BN+大batch size+一堆數據增強tricks+嘗試各種花里胡哨的loss function和optimizer
1. 絕對貧窮人口
a) 輸入分辨率要小,如128,160,192或者256
b) 下采樣使用maxpooling
c) 特征學習層使用depthwise separable convolution
d)激活函數使用relu
(推薦閱讀 MCUNet)
2.相對貧窮人口
a)輸入分辨率依舊要小,分辨率對計算量的影響是翻倍的
b)下采樣使用maxpooling或者stride 為2的depthwise separable convolotion
c)特征學習使用depthwise separable convolution 或者mobilenbet v2的倒殘差結構,由或是shufflenet v2的unit,1*1的group conv能處理的比較好的話也比較推薦使用
d)激活函數使用relu或者relu6
3.低收入人口
a) 輸入使用小分辨率,如果對精度要求較高可以適當增大
b)下采樣可以使用maxpooling或者stride為2 的depthwise separable conv
c)特征學習可以使用mobilenet v2的倒殘差結構,又或是shufflenet v2的unit,也可以使用通道數小點的3*3標准卷積
d)激活函數使用relu,relu6或者leaky relu
4.一般收入人口
a)輸入可以稍微大一點,280,320,384
b)下采樣使用stride為2的depthwise separable conv或者stride為2 的3*3卷積
c)特征學習即可以使用上述的,也可以使用3*3標准卷積+1*1標准卷積的堆疊形式,se block這種硬件支持的還不錯的可以考慮加上
d)激活函數除了上上述的可以試試H-sigmoi和H-swish
5.高收入人口
a) 輸入數據的分辨率可以往500-600靠攏
b)下采樣和上述一樣
c)特征學習可以使用resnet+se block,資源較多可以增加通道數和深度
d)激活函數使用H-swish
另外使用mobilenetv2的倒殘差模塊+se block+H-swish,MIt han lab在很多比賽中都拿到了冠軍
以上內容摘自:極市平台 綜述:輕量級CNN架構設計(https://mp.weixin.qq.com/s?__biz=MzI5MDUyMDIxNA==&mid=2247525207&idx=1&sn=6cc236e12d4e12233e602c4c4799f1d2&exportkey=AfvZMyUGPnNgi6Or3FL5S8s%3D&pass_ticket=cKLS6DEwmLKBKlYmdU%2B1PU1NN%2FN9MAg%2BC9oQPyVamkGrCtpJmcVXCKuNXRM5iJGa&wx_header=0)
以下內容為根據相關論文的閱讀以及項目經驗進行的總結:
匯總|目標檢測中的數據增強、backbone、head、neck、損失函數
一、數據增強方式
1. random erase
2. CutOut
3. MixUp
4. CutMix
5. 色彩、對比度增強
6. 旋轉、裁剪
解決數據不均衡:
- Focal loss
- hard negative example mining
- OHEM
- S-OHEM
- GHM(較大關注easy和正常hard樣本,較少關注outliners)
- PISA
二、常用backbone
1. VGG
2. ResNet(ResNet18,50,100)
3. ResNeXt
4. DenseNet
5. SqueezeNet
6. Darknet(Darknet19,53)
7. MobileNet
8. ShuffleNet
9. DetNet
10. DetNAS
11. SpineNet
12. EfficientNet(EfficientNet-B0/B7)
13. CSPResNeXt50
14. CSPDarknet53
15. Thundernet
16. Ghostnet
三、常用Head
Dense Prediction (one-stage):
1. RPN
2. SSD
3. YOLO
4. RetinaNet
5. (anchor based)
6. CornerNet
7. CenterNet
8. MatrixNet
9. FCOS(anchor free)
10. GFCOS
Sparse Prediction (two-stage):
1. Faster R-CNN
2. R-FCN
3. Mask RCNN (anchor based)
4. RepPoints(anchor free)
四、常用neck
Additional blocks:
1. SPP
2. ASPP
3. RFB
4. SAM
Path-aggregation blocks:
1. FPN
2. PAN
3. NAS-FPN
4. Fully-connected FPN
5. BiFPN
6. ASFF
7. SFAM
8. NAS-FPN
五、Skip-connections
1. Residual connections
2. Weighted residual connections
3. Multi-input weighted residual connections
4. Cross stage partial connections (CSP)
六、常用激活函數和loss
激活函數:
- ReLU
- LReLU
- PReLU
- ReLU6
- Scaled Exponential Linear Unit (SELU)
- Swish
- hard-Swish
- Mish
loss:
- MSE
- Smooth L1
- Balanced L1
- KL Loss
- GHM loss
- IoU Loss
- Bounded IoU Loss
- GIoU Loss
- CIoU Loss
- DIoU Loss
- Generalized Focal Loss v1 v2
- ATSS
七、正則化和BN方式
正則化:
- DropOut
- DropPath
- Spatial DropOut
- DropBlock
BN:
- Batch Normalization (BN)
- Cross-GPU Batch Normalization (CGBN or SyncBN)
- Filter Response Normalization (FRN)
- Cross-Iteration Batch Normalization (CBN)
八、訓練技巧
- Label Smoothing
- Warm Up
若有不對或者表述不正確的地方請指出