之前,紅色石頭發文介紹過一份很不錯的資源:
52 個深度學習目标檢測模型彙總,論文、源碼一應俱全!深度系統介紹了 52 個目标檢測模型,縱觀 2013 年到 2020 年,從最早的 R-CNN、OverFeat 到後來的 SSD、YOLO v3 再到去年的 M2Det,新模型層出不窮,性能也越來越好!
上文聚焦于源碼和論文,對于各種卷積神經網絡模型的實作,本文将介紹它們的 PyTorch 實作,非常有用!
這份資源已經開源在了 GitHub 上,連結如下:
https://github.com/shanglianlm0525/PyTorch-Networks先來個總結介紹,該系列的卷積神經網絡實作包含了 9 大主題,目錄如下:
1. 典型網絡
2. 輕量級網絡
3. 目标檢測網絡
4. 語義分割網絡
5. 執行個體分割網絡
6. 人臉檢測和識别網絡
7. 人體姿态識别網絡
8. 注意力機制網絡
9. 人像分割網絡
下面具體來看一下:
1. 典型網絡(Classical network)
典型的卷積神經網絡包括:AlexNet、VGG、ResNet、InceptionV1、InceptionV2、InceptionV3、InceptionV4、Inception-ResNet。
以 AlexNet 網絡為例,AlexNet 是 2012 年 ImageNet 競賽冠軍獲得者 Hinton 和他的學生 Alex Krizhevsky 設計的。AlexNet 中包含了幾個比較新的技術點,也首次在 CNN 中成功應用了 ReLU、Dropout 和 LRN 等 Trick。同時 AlexNet 也使用了 GPU 進行運算加速。
AlexNet 網絡結構的 PyTorch 實作方式如下:
import torch
import torch.nn as nn
def Conv3x3BNReLU(in_channels,out_channels,stride,padding=1):
return nn.Sequential(
nn.Conv2d(in_channels=in_channels, out_channels=out_channels, kernel_size=3, stride=stride, padding=1),
nn.BatchNorm2d(out_channels),
nn.ReLU6(inplace=True)
)
def Conv1x1BNReLU(in_channels,out_channels):
return nn.Sequential(
nn.Conv2d(in_channels=in_channels, out_channels=out_channels, kernel_size=1, stride=1, padding=0),
nn.BatchNorm2d(out_channels),
nn.ReLU6(inplace=True)
)
def ConvBNReLU(in_channels,out_channels,kernel_size,stride,padding=1):
return nn.Sequential(
nn.Conv2d(in_channels=in_channels, out_channels=out_channels, kernel_size=kernel_size, stride=stride, padding=padding),
nn.BatchNorm2d(out_channels),
nn.ReLU6(inplace=True)
)
def ConvBN(in_channels,out_channels,kernel_size,stride,padding=1):
return nn.Sequential(
nn.Conv2d(in_channels=in_channels, out_channels=out_channels, kernel_size=kernel_size, stride=stride, padding=padding),
nn.BatchNorm2d(out_channels)
)
class ResidualBlock(nn.Module):
def __init__(self, in_channels, out_channels):
super(ResidualBlock, self).__init__()
mid_channels = out_channels//2
self.bottleneck = nn.Sequential(
ConvBNReLU(in_channels=in_channels, out_channels=mid_channels, kernel_size=1, stride=1),
ConvBNReLU(in_channels=mid_channels, out_channels=mid_channels, kernel_size=3, stride=1, padding=1),
ConvBNReLU(in_channels=mid_channels, out_channels=out_channels, kernel_size=1, stride=1),
)
self.shortcut = ConvBNReLU(in_channels=in_channels, out_channels=out_channels, kernel_size=1, stride=1)
def forward(self, x):
out = self.bottleneck(x)
return out+self.shortcut(x)
2.輕量級網絡(Lightweight)
輕量級網絡包括:GhostNet、MobileNets、MobileNetV2、MobileNetV3、ShuffleNet、ShuffleNet V2、SqueezeNet Xception MixNet GhostNet。
以 GhostNet 為例,同樣精度,速度和計算量均少于此前 SOTA 算法。GhostNet 的核心是 Ghost 子產品,與普通卷積神經網絡相比,在不更改輸出特征圖大小的情況下,其所需的參數總數和計算複雜度均已降低,而且即插即用。
GhostNet 網絡結構的 PyTorch 實作方式如下:
https://github.com/shanglianlm0525/PyTorch-Networks/blob/master/Lightweight/GhostNet.py3. 目标檢測網絡(ObjectDetection)
目标檢測網絡包括:SSD、YOLO、YOLOv2、YOLOv3、FCOS、FPN、RetinaNet Objects as Points、FSAF、CenterNet FoveaBox。
以 YOLO 系列為例,YOLO(You Only Look Once)是一種基于深度神經網絡的對象識别和定位算法,其最大的特點是運作速度很快,可以用于實時系統。目前 YOLOv3 應用比較多。
YOLOV3 網絡結構的 PyTorch 實作方式如下:
https://github.com/shanglianlm0525/PyTorch-Networks/blob/master/ObjectDetection/YOLOv3.py4. 語義分割網絡(SemanticSegmentation)
語義分割網絡包括:FCN、Fast-SCNN、LEDNet、LRNNet、FisheyeMODNet。
以 FCN 為例,FCN 誕生于 2014 的語義分割模型先驅,主要貢獻為在語義分割問題中推廣使用端對端卷積神經網絡,使用反卷積進行上采樣。FCN 模型非常簡單,裡面全部是由卷積構成的,是以被稱為全卷積網絡,同時由于全卷積的特殊形式,是以可以接受任意大小的輸入。
FCN 網絡結構的 PyTorch 實作方式如下:
https://github.com/shanglianlm0525/PyTorch-Networks/blob/master/SemanticSegmentation/FCN.py5. 執行個體分割網絡(InstanceSegmentation)
執行個體分割網絡包括:PolarMask。
6. 人臉檢測和識别網絡(commit VarGFaceNet)
人臉檢測和識别網絡包括:FaceBoxes、LFFD、VarGFaceNet。
7. 人體姿态識别網絡(HumanPoseEstimation)
人體姿态識别網絡包括:Stacked Hourglass、Networks Simple Baselines、LPN。
注意力機制網絡包括:SE Net、scSE、NL Net、GCNet、CBAM。
9. 人像分割網絡(PortraitSegmentation)
人像分割網絡包括:SINet。
綜上,該 GitHub 開源項目展示了近些年來主流的 9 大類卷積神經網絡,總共包含了幾十種具體的網絡結構。其中每個網絡結構都有 PyTorch 實作方式。還是很不錯的。
最後再放上 GitHub 開源位址: