python調用pytorch實現deeplabv3+圖像語義分割——以分割動漫人物為例


程序簡介

圖像語義分割就是把圖像分成若干個特定的、具有獨特性質的區域並提出感興趣目標的技術和過程。本文提供了一個可進行自定義數據集訓練基於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,程序就會提示輸入圖片,將圖片拖入終端回車就能看到圖像分割結果


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM