9 大主題卷積神經網路(CNN)的 PyTorch 實現

红色石头發表於2020-11-27

大家還記得這張圖嗎?

之前,紅色石頭髮文介紹過一份很不錯的資源:

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.py

3. 目標檢測網路(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.py

4. 語義分割網路(SemanticSegmentation)

語義分割網路包括:FCN、Fast-SCNN、LEDNet、LRNNet、FisheyeMODNet。

以 FCN 為例,FCN 誕生於 2014 的語義分割模型先驅,主要貢獻為在語義分割問題中推廣使用端對端卷積神經網路,使用反摺積進行上取樣。FCN 模型非常簡單,裡面全部是由卷積構成的,所以被稱為全卷積網路,同時由於全卷積的特殊形式,因此可以接受任意大小的輸入。

FCN 網路結構的 PyTorch 實現方式如下:

https://github.com/shanglianlm0525/PyTorch-Networks/blob/master/SemanticSegmentation/FCN.py

5. 例項分割網路(InstanceSegmentation)

例項分割網路包括:PolarMask。

6. 人臉檢測和識別網路(commit VarGFaceNet)

人臉檢測和識別網路包括:FaceBoxes、LFFD、VarGFaceNet。

7. 人體姿態識別網路(HumanPoseEstimation)

人體姿態識別網路包括:Stacked Hourglass、Networks Simple Baselines、LPN。

8. 注意力機制網路

注意力機制網路包括:SE Net、scSE、NL Net、GCNet、CBAM。

![])(https://pic1.zhimg.com/v2-c0bc8d8a2462870977851f085c75766c_b.jpg)

9. 人像分割網路(PortraitSegmentation)

人像分割網路包括:SINet。

綜上,該 GitHub 開源專案展示了近些年來主流的 9 大類卷積神經網路,總共包含了幾十種具體的網路結構。其中每個網路結構都有 PyTorch 實現方式。還是很不錯的。

最後再放上 GitHub 開源地址:

https://github.com/shanglianlm0525/PyTorch-Networks


本文首發於公眾號:AI有道(ID: redstonewill),歡迎關注!

相關文章