DeepLabv3+訓練模型學習總結
一、DeepLabs3+介紹
DeepLabv3是一種語義分割架構,它在DeepLabv2的基礎上進行了一些修改。為了處理在多個尺度上分割對象的問題,設計了在級聯或並行中采用多孔卷積的模塊,通過采用多個多孔速率來捕獲多尺度上下文。此外,來自 DeepLabv2 的 Atrous Spatial Pyramid Pooling模塊增加了編碼全局上下文的圖像級特征,並進一步提高了性能。
ASSP 模塊的變化是作者在模型的最后一個特征圖上應用全局平均池化,將生成的圖像級特征饋送到具有 256 個濾波器(和批量歸一化)的 1×1 卷積,然后對模型進行雙線性上采樣特征到所需的空間維度。最后,改進的ASPP由 (a) 一個 1×1 卷積和三個 3×3 卷積組成,當輸出步幅 = 16 時,速率 = (6, 12, 18)(均具有 256 個濾波器和批量歸一化),以及( b) 圖像級特征。
另一個有趣的區別是不再需要來自 DeepLabv2 的 DenseCRF 后處理。
二、DeepLabv3+圖像語義分割原理
2.1 圖像分割任務及常用數據集
2.1.1 圖像分割任務
圖像分割(image segmentation):根據某些規則將圖片分成若干個特定的、具有獨特性質的區域,並抽取出感興趣目標。
• 目前圖像分割任務發展出了以下幾個子領域:
➢ 語義分割(semantic segmentation)
➢ 實例分割(instance segmentation)
➢ 以及剛興起的新領域:全景分割(panoptic segmentation)
在這里DeepLabv3+就屬於一種語義分割的架構模型,
語義分割從任務上來看,要實現的最終目標是:
從像素層次來識別圖像,也即為圖像中的每個像素指定類別標記。
2.1.2 常用數據集
常用數據集
• PASCAL VOC 2012 Segmentation Competition
VOC2012數據集分為20類,包括背景為21類,分別如下:
- 人 :人
- 動物:鳥、貓、牛、狗、馬、羊
- 車輛:飛機、自行車、船、巴士、汽車、摩托車、火車
- 室內:瓶、椅子、餐桌、盆栽植物、沙發、電視/監視器
挑戰任務:
Classification/Detection Competitions
Segmentation Competition
Action Classification Competition
ImageNet Large Scale Visual Recognition Competition
Person Layout Taster Competition
• COCO 2018 Stuff Segmentation Task
MS COCO的全稱是Microsoft Common Objects in Context,起源於是微軟於2014年出資
標注的Microsoft COCO數據集,與ImageNet 競賽一樣,被視為是計算機視覺領域最受關
注和最權威的比賽之一。而在ImageNet競賽停辦后,COCO競賽就成為是當前物體識別、檢測等領域的一個最權威、
最重要的標桿,也是目前該領域在國際上唯一能匯集Google、微軟、Facebook以及國內外
眾多頂尖院校和優秀創新企業共同參與的大賽目前為止有語義分割的最大數據集,提供的類別有 80 類,有超過 33 萬張圖片,其中 20 萬張有標注,
整個數據集中個體的數目超過 150 萬個。
• BDD100K: A Large-scale Diverse Driving Video Database
URL:https://bair.berkeley.edu/blog/2018/05/30/bdd/
2018年5月伯克利大學AI實驗室(BAIR)發布了目前最大規模、內容最具多樣性的公開駕駛數據集BDD100K,同時設計了一個圖片標注系統。
BDD100K 數據集包含10萬段高清視頻,每個視頻約40秒,720p,30 fps 。每個視頻的第10秒對關鍵幀進行采樣,得到10萬張圖片(圖片尺寸:1280720 ),並進行標注。
• Cambridge-driving Labeled Video Database (CamVid)
CamVid是第一個具有目標類別語義標簽的視頻集合。
數據庫提供32個ground truth語義標簽,將每個像素與語義類別之一相關聯。
該數據庫解決了對實驗數據的需求,以定量評估新興算法。 數據是從駕駛汽車的角度拍攝的。
包含戴姆勒在內的三家德國單位聯合提供,包含50多個城市的立體視覺數據;像素級標注;提供算法評估接口。
• Cityscapes Dataset
• Mapillary Vistas Dataset
Mapillary Vistas是世界上最大最多樣化的像素精確和特定實例標注的街道級圖像公開數據集。
• ApolloScape Scene Parsing
百度公司提供的ApolloScape數據集將包括具有高分辨率圖像和每像素標注的RGB視頻,具有語義
分割的測量級密集3D點,立體視頻和全景圖像。Scene Parsing數據集是ApolloScape的一部分,它為高級自動駕駛研究提供了一套工具和數據集。
場景解析旨在為圖像中的每個像素或點雲中的每個點分配類別(語義)標簽。
2.2 DeepLabv3+語義分割原理
編碼器/解碼器(encoder/decoder)結構
卷積(Convolution)運算
語義分割網絡中引入膨脹卷積
- 增大網絡的感受野
- 特征圖像尺寸的損失
采用不同的方式來增大神經元的感受野
- 傳統卷積通過添加池化層
- 膨脹卷積在卷積核中插入零元素,對卷積核上采樣,可避免池化層引起的信息損失
(a) 在低分辨率輸入特征圖上使用標准卷積(rate=1)進行稀疏特征提取
(b) 在高分辨率輸入特征圖上利用rate = 2的膨脹卷積進行密集特征提取
頂行:在低分辨率輸入特征圖上使用標准卷積進行稀疏特征提取
底行:在高分辨率輸入特征圖上利用rate = 2的膨脹卷積進行密集特征提取
DeepLabv3介紹
Liang-Chieh Chen, George Papandreou, Florian Schroff, Hartwig Adam.
Rethinking Atrous Convolution for Semantic Image Segmentation. CVPR, 2017
https://arxiv.org/abs/1706.05587
主要特點
- 采用預訓練的ResNet-50, 或ResNet-101來提取特征
- 修改第4個殘差塊,采用膨脹卷積(模塊內的三個卷積采用不同的膨脹率)
- 加入image-level的ASPP
獲取多尺度上下文的架構比較
(a) 圖像金字塔(如SIFT)
(b) 編碼-解碼框架
(c) 采用不同尺度的膨脹卷積
(d) 空間金字塔池化
空間金字塔池化:使得任意大小的特征圖利用多尺度特征提取都能夠轉換成固定大小的特征向量
采用級聯模塊和帶孔卷積提取多尺度信息
- (a) 傳統卷積,隨着深度增大,特征圖尺寸減小
- (b) 采用帶孔卷積,可避免特征圖尺寸縮小
- output stride: the ratio of input image spatial resolution to the final output resolution
(before global pooling or fully connected layer).
采用有ASPP的並行模塊增加圖像級特征
DeepLab-v3+介紹
Liang-Chieh Chen, Yukun Zhu, George Papandreou, Florian Schroff, Hartwig Adam.
Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation. Feb. 2018
https://arxiv.org/abs/1802.02611v1
We improve DeepLabv3, which employs the spatial pyramid pooling module (a),
with the encoder-decoder structure (b).
- 通過添加一個簡單有效的解碼器模塊來擴展DeepLab-v3,以優化分割結果,尤其是沿着目標邊界
- 將深度可分離卷積(參考Xception)應用於ASPP和解碼器模塊,從而產生用於語義分割的更快和更強的
編碼器 - 解碼器網絡
3×3 Depthwise separable convolution decomposes a standard convolution into
(a) a depthwise convolution (applying a single filter for each input channel) and
(b) a pointwise convolution (combining the outputs from depthwise convolution across
channels).
(c) In this work, we explore atrous separable convolution where atrous convolution
is adopted in the depthwise convolution, as shown in (c) with rate = 2.
DeepLab系列語義分割架構模型比較
- 1.DeepLabv1:使用空洞卷積來明確控制在深度卷積神經網絡中計算特征響應的分辨率。
- 1.DeepLabv2:使用ASPP以多個采樣率和有效視野的濾波器對多個尺度的目標進行魯棒分割
- 3.DeepLabv3:使用圖像級別特征增強ASPP模塊以捕獲更長距離的信息。還引入BN,以促進訓練。
- 4.DeepLabv3+:用一個簡單有效的解碼器模塊擴展DeepLabv3優化細分結果,尤其是沿目標邊界。
此外,在這種編碼器 - 解碼器結構中,可以通過空洞卷積任意地控制所提取的編碼器
特征的分辨率,以折衷准確率和運行時間。
三、環境安裝與測試
3.1 安裝pytorch
3.1.1 安裝Anaconda
Anaconda 是一個用於科學計算的 Python 發行版,支持 Linux, Mac, Windows, 包含了眾多流行的科學
計算、數據分析的 Python 包。
-
先去官方地址下載好對應的安裝包
下載地址:https://www.anaconda.com/download/#linux -
然后安裝anaconda
bash ~/Downloads/Anaconda3-2021.05-Linux-x86_64.sh
anaconda會自動將環境變量添加到PATH里面,如果后面你發現執行conda提示沒有該命令,那么
你需要執行命令 source ~/.bashrc 更新環境變量,就可以正常使用了。
如果發現這樣還是沒用,那么需要添加環境變量。
編輯~/.bashrc 文件,在最后面加上
export PATH=/home/bai/anaconda3/bin:$PATH
保存退出后執行: source ~/.bashrc
再次輸入 conda list 測試看看,應該沒有問題。
3.1.2 添加Anaconda國內鏡像配置
清華TUNA提供了 Anaconda 倉庫的鏡像,運行以下命令:
conda config --add channels
https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels
https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --set show_channel_urls yes
3.1.3 安裝Pytorch
首先創建一個anaconda虛擬環境,環境名字可自己確定,這里本人使用mypytorch作為環境名:
conda create -n mypytorch python=3.8
安裝成功后激活mypytorch環境:
conda activate mypytorch
在所創建的虛擬環境下安裝, 執行命令:
conda install pytorch torchvision cudatoolkit=10.2 -c pytorch
注意:10.2處應為cuda的安裝版本號
編輯~/.bashrc 文件,設置使用mypytorch環境下的python3.8
alias python='/home/linxu/anaconda3/envs/mypytorch/bin/python3.8'
注意:python路徑應改為自己機器上的路徑
保存退出后執行: source ~/.bashrc
該命令將自動回到base環境,再執行 conda activate mypytorch 到mypytorch環境。
3.2 安裝Deeplabsv3+及測試
3.2.1 克隆和安裝deeplabv3+
git clone https://github.com/VainF/DeepLabV3Plus-Pytorch.git
在路徑DeepLabV3Plus-Pytorch下執行
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
3.2.2 測試圖片
3.2.2.1 下載PASCAL VOC文件
說明:本課程數據集和程序文件可從百度網盤下載,網盤鏈接如下:
鏈接:https://pan.baidu.com/s/1WWEyIT2aC8HB20uBhBsVbQ
提取碼:srpb
從百度網盤下載, 下載到DeepLabV3Plus-Pytorch/datasets/data目錄下並解壓
- VOCtrainval_06-Nov-2007.tar
- VOCtrainval_11-May-2012.tar
- VOCtest_06-Nov-2007.tar
3.2.2.2 解壓建立數據集
tar xvf VOCtrainval_06-Nov-2007.tar
tar xvf VOCtest_06-Nov-2007.tar
tar xvf VOCtrainval_11-May-2012.tar
PASCAL VOC數據集的目錄結構:
建立文件夾層次為 VOCdevkit/VOC2007 和 VOCdevkit/VOC2012
VOC2007和VOC2012下面的文件夾:Annotations,JPEGImages和ImageSets
其中JPEGImages放所有的數據集圖片;
Annotations放所有的xml標記文件;
SegmentationClass放標注的數據集掩碼文件;
ImageSets/Segmentation下存放訓練集、驗證集、測試集划分文件
train.txt給出了訓練集圖片文件的列表(不含文件名后綴)
val.txt給出了驗證集圖片文件的列表
trainval.txt給出了訓練集和驗證集圖片文件的列表
test.txt給出了測試集圖片文件的列表
3.2.2.3 下載預訓練權重文件
放置在DeepLabV3Plus-Pytorch下新建的weights文件夾下,例如
best_deeplabv3plus_mobilenet_voc_os16.pth
best_deeplabv3_mobilenet_voc_os16.pth
best_deeplabv3plus_resnet50_voc_os16
best_deeplabv3plus_resnet101_voc_os16
3.2.2.4 測試圖片
使用deeplabv3plus_mobilenet模型
python predict.py --input datasets/data/VOCdevkit/VOC2007/JPEGImages/000001.jpg
--dataset voc --model deeplabv3plus_mobilenet --ckpt
weights/best_deeplabv3plus_mobilenet_voc_os16.pth --save_val_results_to
test_results
使用deeplabv3_mobilenet模型
python predict.py --input datasets/data/VOCdevkit/VOC2007/JPEGImages/000001.jpg
--dataset voc --model deeplabv3_mobilenet --ckpt
weights/best_deeplabv3_mobilenet_voc_os16.pth --save_val_results_to test_results
四、labelme圖像標注及格式轉換
4.1 labelme圖像標注工具的安裝與使用
4.1.1 安裝圖像標注工具labelme
Ubuntu下的安裝:
pip install pyqt5
pip install labelme
如果安裝過程中提示缺少某個包,可再安裝上,如:
pip install pyyaml
如上述安裝方法不能成功,使用下面的命令安裝:
pip install git+https://github.com/wkentaro/labelme.git
4.1.2 使用labelme進行圖像標注
執行:
labelme
標注后生成json文件
課程pothole項目案例的數據集為1280*720的圖片,136張用於訓練,16張用於測試。
這里的數據集有5個類別:"car", "dashedline", "midlane", "pothole", "rightlane"
數據集圖像文件及標注的json文件放置在~/mydataset目錄下
4.2 標注數據格式轉換
4.2.1 圖像標注后的數據轉換
在mydataset路徑下執行
python labelme2voc.py roadscene_train roadscene_train/data_dataset_voc --labels labels.txt
python labelme2voc.py roadscene_val roadscene_val/data_dataset_voc --labels labels.txt
4.2.2 項目數據准備
把轉成數據集的目錄結構准備成PASCAL VOC目錄結構格式。
在DeepLabV3Plus-Pytorch/datasets/data文件夾下,創建目錄結構如下:
└── VOCdevkit
├── VOC2007
├── ImageSets
├── JPEGImages
└── SegmentationClass
其中:
JPEGImages放所有的數據集圖片;
SegmentationClass放標注的數據集掩碼文件;
ImageSets/Segmentation下存放訓練集、驗證集、測試集划分文件
train.txt給出了訓練集圖片文件的列表(不含文件名后綴)
val.txt給出了驗證集圖片文件的列表
trainval.txt給出了訓練集和驗證集圖片文件的列表
test.txt給出了測試集圖片文件的列表
課程中train.txt包括136 張圖片列表;
trainval.txt包括136 張+16張圖片列表;
val.txt和test.txt內容相同,包括16張圖片列表
五、deeplabv3+網絡訓練和測試
5.1 網絡訓練
5.1.1 安裝訓練可視化工具visdom
1)下載static.zip文件到anaconda3/envs/mypytorch/lib/python3.8/site-packages/visdom並解壓
更正:此處應該為anaconda3/envs/mypytorch/lib/python3.8/site-packages/visdom
2)注釋掉server.py文件中函數download_scripts_and_run()中的一句
download_scripts()
3)啟動visdom server
# Run visdom server
python -m visdom.server
5.2 訓練網絡
使用deeplabv3plus_mobilenet模型
python main.py --model deeplabv3plus_mobilenet --enable_vis --vis_port 8097 --gpu_id 0 --year 2007 --crop_val --lr 0.01 --crop_size 513 --batch_size 16 --output_stride 16 --num_classes 6 --total_itrs 1000 --ckpt weights/best_deeplabv3plus_mobilenet_voc_os16.pth
如果出現RuntimeError: CUDA out of memory. Tried to allocate 338.00 MiB (GPU 0; 9.78 GiB total capacity; 7.36 GiB already allocated; 282.06 MiB free; 7.44 GiB reserved in total by PyTorch),
說明GPU 顯存不夠,則可將crop_size 513適當調低,建議設置為300,224,112等。
其中num_classes設置為類別數+1
訓練好的權重在checkpoints文件夾下
使用deeplabv3_mobilenet模型
python main.py --model deeplabv3_mobilenet --enable_vis --vis_port 8097 --gpu_id
0 --year 2007 --crop_val --lr 0.01 --crop_size 513 --batch_size 16 --
output_stride 16 --num_classes 6 --total_itrs 1000 --ckpt
weights/best_deeplabv3_mobilenet_voc_os16.pth
使用deeplabv3plus_resnet50模型
python main.py --model deeplabv3plus_resnet50 --enable_vis --vis_port 8097 --
gpu_id 0 --year 2007 --crop_val --lr 0.01 --crop_size 513 --batch_size 8 --
output_stride 16 --num_classes 6 --total_itrs 2000 --ckpt
weights/best_deeplabv3plus_resnet50_voc_os16.pth
六、網絡模型測試
6.1 性能指標統計
python main.py --model deeplabv3plus_mobilenet --gpu_id 0 --year 2007 --crop_val
--lr 0.01 --crop_size 513 --batch_size 16 --output_stride 16 --ckpt
checkpoints/best_deeplabv3plus_mobilenet_voc_os16.pth --test_only --
save_val_results
6.2 圖片測試
單張圖片測試
python predict.py --input datasets/data/VOCdevkit/VOC2007/JPEGImages/img001.jpg --dataset voc --model deeplabv3plus_mobilenet --ckpt checkpoints/best_deeplabv3plus_mobilenet_voc_os16.pth --save_val_results_to test_results1 --crop_size 513
多張圖片測試
如果是jpg圖片,修改predict.py中的一句
files = glob(os.path.join(opts.input, '**/*.png'), recursive=True)
為
files = glob(os.path.join(opts.input, '**/*.jpg'), recursive=True)
然后,執行命令
使用deeplabv3plus_mobilenet模型
python predict.py --input datasets/data/VOCdevkit/VOC2007/JPEGImages --dataset
voc --model deeplabv3plus_mobilenet --ckpt
checkpoints/best_deeplabv3plus_mobilenet_voc_os16.pth --save_val_results_to
test_results2
使用deeplabv3plus_resnet50模型
python predict.py --input datasets/data/VOCdevkit/VOC2007/JPEGImages --dataset
voc --model deeplabv3plus_resnet50 --ckpt
checkpoints/best_deeplabv3plus_resnet50_voc_os16.pth --save_val_results_to
test_results2
參考材料:
[1] 白勇老師課程及課件:https://edu.csdn.net/course/detail/36456
[2] https://paperswithcode.com/method/deeplabv3
[3] Code:https://github.com/VainF/DeepLabV3Plus-Pytorch