程序簡介
圖像語義分割就是把圖像分成若干個特定的、具有獨特性質的區域並提出感興趣目標的技術和過程。本文提供了一個可進行自定義數據集訓練基於pytorch的deeplabv3+圖像分割模型的方法,訓練了一個動漫人物分割模型,不過數據集較小,僅供學習使用
程序輸入:動漫圖片
程序輸出:分割好的動漫人物圖片
deeplabv3+是一種比較流行的圖像語義分割模型,本文經過多次實驗,對比了deeplabv3+、pspnet和unet,查看效果后,最終選擇了deeplabv3+,下圖是程序生成結果
程序/數據集下載
數據集准備
在VOCdevkit/VOC2007/JPEGImages文件夾中,放入原圖
在VOCdevkit/VOC2007SegmentationClass文件夾中,放入mask圖片
mask圖片雖然看起來是全黑色的,但它實際上是單通道的、像素值記錄了分類id的圖片,它的本質類似於下圖,即每個點都被分類,不同數據集轉換得到mask圖片的方法不同,所以這一步需要自行處理
訓練步驟
在voc_annotation.py中,可更換下列參數,其中最值得注意的是RATIO,當這個參數等於[0.1, 0.85]時,如果目標占據整張圖片小於10%或者大於85%時,圖片會被過濾掉,不被計入數據集
trainval_percent = 1#參與訓練和驗證的數據集比例
train_percent = 0.8#訓練集比例
RATIO = [0.1, 0.85]#目標大小不在這個范圍會被過濾掉
運行voc_annotation.py,數據集被分割成訓練和驗證集
修改train.py下的參數,本文提供的程序只有基於mobilenet主干網絡的預訓練模型,相比xception,它更小且性能減少不大,適合大多數人的電腦設備,所以我們主要修改的參數主要如下,其中num_classes是加上背景的分類數,比如本文的分類就是背景、動漫人物,所以是2類,其他參數最好不要改
#-------------------------------#
# 是否使用Cuda
# 沒有GPU可以設置成False
#-------------------------------#
Cuda = True
#-------------------------------#
# 訓練自己的數據集必須要修改的
# 自己需要的分類個數+1,如2+1
#-------------------------------#
num_classes = 2
運行train.py,可以看到mIOU在一直上升,mIOU可以理解為模型分割部分和正確分割部分的重合程度,是語義分割模型的一個重要指標,最終訓練集mIOU為90%,驗證集mIOU為84%
程序會記錄loss,並繪圖,在logs/loss文件夾可找到
每次迭代,最新模型和最佳模型也會保存在logs文件夾下,last.pth為最新模型,best.pth為最佳模型
預測演示步驟
修改deeplab.py中的參數,除了model_path其他參數保證它跟train.py中的一樣就行,如果已經是按本文的數據集進行學習的話,不需要修改,logs/best.pth是訓練好的模型,本文會提供下載,如果按照上述步驟自行訓練,因為模型和數據集較小,使用3070顯卡訓練只需要2分鍾,就算是用CPU,時間也不會太久
_defaults = {
#----------------------------------------#
# model_path指向logs文件夾下的權值文件
#----------------------------------------#
"model_path" : 'logs/best.pth',
#----------------------------------------#
# 所需要區分的類的個數+1
#----------------------------------------#
"num_classes" : 2,
#----------------------------------------#
# 所使用的的主干網絡:mobilenet、xception
#----------------------------------------#
"backbone" : "mobilenet",
#----------------------------------------#
# 輸入圖片的大小
#----------------------------------------#
"input_shape" : [400, 400],
#----------------------------------------#
# 下采樣的倍數,一般可選的為8和16
# 與訓練時設置的一樣即可
#----------------------------------------#
"downsample_factor" : 16,
#--------------------------------#
# blend參數用於控制是否
# 讓識別結果和原圖混合
#--------------------------------#
"blend" : True,
#-------------------------------#
# 是否使用Cuda
# 沒有GPU可以設置成False
#-------------------------------#
"cuda" : True,
}
運行predict.py,程序就會提示輸入圖片,將圖片拖入終端回車就能看到圖像分割結果