基於飛槳復現語義分割網絡HRNet,實現瓷磚缺陷檢測

內容簡介php

本項目講述了HRNet網絡結構,並嘗試使用PaddleSeg中HRNet網絡實現瓷磚缺陷檢測python

PaddleSeg GitHub:git

https://github.com/PaddlePaddle/PaddleSeggithub

本文包含如下4部份內容:算法

  • PaddleSeg介紹編程

  • HRNet網絡分析網絡

  • 基於PaddleSeg使用HRNet網絡進行瓷磚缺陷檢測app

下載安裝命令

## CPU版本安裝命令
pip install -f https://paddlepaddle.org.cn/pip/oschina/cpu paddlepaddle

## GPU版本安裝命令
pip install -f https://paddlepaddle.org.cn/pip/oschina/gpu paddlepaddle-gpu

PaddleSeg介紹框架

 

PaddleSeg是基於PaddlePaddle開發的圖像分割開發套件,覆蓋了DeepLabv3+、U-Net、ICNet、PSPNet、HRNet、Fast-SCNN等主流分割網絡。經過模塊化的設計,以配置化方式驅動模型組合,幫助開發者更便捷地完成從訓練到部署的全流程圖像分割應用。ide

PaddleSeg產品特色:

1. 豐富的數據加強:基於百度視覺技術部的實際業務經驗,內置10+種數據加強策略,可結合實際業務場景進行定製組合,提高模型泛化能力和魯棒性。

2. 模塊化設計:支持DeepLabv3+、U-Net、ICNet、PSPNet、HRNet、Fast-SCNN六種主流分割網絡,結合預訓練模型和可調節的骨幹網絡,知足不一樣性能和精度的要求;選擇不一樣的損失函數如Dice Loss, Lovasz Loss等方式能夠強化小目標和不均衡樣本場景下的分割精度。

3. 高性能:PaddleSeg支持多進程I/O、多卡並行等訓練加速策略,結合飛槳核心框架的顯存優化功能,可大幅度減小分割模型的顯存開銷,讓開發者更低成本、更高效地完成圖像分割訓練。

4. 工業級部署:全面提供服務端和移動端的工業級部署能力,依託飛槳高性能推理引擎和高性能圖像處理實現,開發者能夠輕鬆完成高性能的分割模型部署和集成。經過Paddle-Lite,能夠在移動設備或者嵌入式設備上完成輕量級、高性能的人像分割模型部署。

5. 產業實踐案例:PaddleSeg提供豐富地產業實踐案例,如人像分割、工業表計檢測、遙感分割、人體解析,工業質檢等產業實踐案例,助力開發者更便捷地落地圖像分割技術。

HRNet網絡分析

論文名稱:

High-Resolution Representations for Labeling Pixels and Regions

下載地址:

https://arxiv.org/pdf/1904.04514.pdf

網絡總體結構:

如上圖所示HRNet有四個並行的分支,包含三次下采樣過程。值得注意的是,上圖中的輸入是以原始輸入的1/4開始的,即先經歷了2次步長爲2的3×3卷積。

HRNet網絡結構特色:

  • 始終保持高分辨率表徵

從網絡總體結構能夠看出,每次產生低分辨率特徵圖以後,原有的高分辨特徵還會參與到後續的卷積過程,所以產生了並行的不一樣分辨率的特徵圖。

  • 殘差單元

圖中的直箭頭表明殘差單元,殘差單元由4個殘差卷積(1×一、3×三、1×1)構成。

  • 相似全鏈接的階段性特徵融合

每通過4個殘差單元以後會進行一次不一樣分辨率的特徵融合。低分辨率上採樣與高分辨率融合,高分辨率下采樣與低分辨率融合,最終造成相似於全鏈接形式的特徵融合過程。

  • 簡單明瞭的解碼過程

以下圖所示,解碼過程顯得很輕巧,將四個階段產生的不一樣分辨率的特徵圖直接上採樣至輸入的1/4,通過1次1*1卷積整合各通道的信息,而後進行預測分類,最後上採樣至原圖大小進行損失計算。

關鍵性代碼:

如下展現了網絡搭建過程當中重要的方法及註釋。

    #獲取各階段的通道數{18,36,72,144}
    channels_2 = cfg.MODEL.HRNET.STAGE2.NUM_CHANNELS
    channels_3 = cfg.MODEL.HRNET.STAGE3.NUM_CHANNELS
    channels_4 = cfg.MODEL.HRNET.STAGE4.NUM_CHANNELS
    #獲取各階段殘差單元的循環次數{1,4,3}
    num_modules_2 = cfg.MODEL.HRNET.STAGE2.NUM_MODULES
    num_modules_3 = cfg.MODEL.HRNET.STAGE3.NUM_MODULES
    num_modules_4 = cfg.MODEL.HRNET.STAGE4.NUM_MODULES 
    #步長爲2的跨步卷積 f=3*3
    x = conv_bn_layer(input=input,filter_size=3,num_filters=64,stride=2,if_act=True,name='layer1_1')
    #步長爲2的跨步卷積 f=3*3
    x = conv_bn_layer(input=x,filter_size=3,num_filters=64,stride=2,if_act=True,name='layer1_2')
    #執行1個殘差單元
    la1 = layer1(x, name='layer2')
    #根據輸入中最低分辨率特徵圖生成低分辨率特徵圖,並規範特徵圖的通道數
    tr1 = transition_layer([la1], [256], channels_2, name='tr1')
    #執行4次殘差卷積,並在每次殘差單元結束時進行特徵融合
    st2 = stage(tr1, num_modules_2, channels_2, name='st2')
    #根據輸入中最低分辨率特徵圖生成低分辨率特徵圖,並規範特徵圖的通道數
    tr2 = transition_layer(st2, channels_2, channels_3, name='tr2')
    #執行3次殘差卷積,並在每次殘差單元結束時進行特徵融合
    st3 = stage(tr2, num_modules_3, channels_3, name='st3')
    #根據輸入中最低分辨率特徵圖生成低分辨率特徵圖,並規範特徵圖的通道數
    tr3 = transition_layer(st3, channels_3, channels_4, name='tr3')
    #執行1次殘差卷積,並在每次殘差單元結束時進行特徵融合
    st4 = stage(tr3, num_modules_4, channels_4, name='st4')
    shape = st4[0].shape
    ##獲取st4[0]寬高,並進行雙線性插值
    height, width = shape[-2], shape[-1]
    st4[1] = fluid.layers.resize_bilinear(st4[1], out_shape=[height, width])
    st4[2] = fluid.layers.resize_bilinear(st4[2], out_shape=[height, width])
    st4[3] = fluid.layers.resize_bilinear(st4[3], out_shape=[height, width])
    #特徵通道合併
    out = fluid.layers.concat(st4, axis=1)
    #求總通道數
    last_channels = sum(channels_4)
    #使用1*1卷積進行跨通道的特徵融合
    out = conv_bn_layer(input=out,filter_size=1,num_filters=last_channels,stride=1,if_act=True,name='conv-2')
    #使用1*1卷積進行最後的像素分類       
    out = fluid.layers.conv2d(input=out,num_filters=num_classes,filter_size=1,stride=1,padding=0,act=None,
    param_attr=ParamAttr(initializer=MSRA(), name='conv-1_weights'),bias_attr=False)
    #恢復至網絡輸入的大小
    out = fluid.layers.resize_bilinear(out, input.shape[2:])

網絡的整理流程與細節以下所示:

網絡過程當中特徵的維度變化以下所示:

 

基於PaddleSeg使用HRNet進行瓷磚缺陷檢測

1. 數據準備

  • 表面缺陷檢測是篩選不合格產品的核心過程,但該過程不多能自動完成。

  • 據記載,在世界上最大的瓷磚生產基地浙江省的瓷磚廠,有近3/4的工人在檢查產品質量。

  • 爲了減輕人類的勞動強度,已經提出了許多圖像處理技術來嘗試這樣的檢查任務。

  • 瓷磚的自動損傷檢測存在紋理複雜、缺陷形狀多樣、瓷磚光照條件隨機性等幾個瓶頸問題。

  • 目標缺陷如氣孔、裂紋、斷裂、磨損如圖所示。

2. 環境搭建

環境要求:

PaddlePaddle >= 1.7.0

Python >= 3.5+

因爲圖像分割模型計算開銷大,推薦在GPU版本的PaddlePaddle下使用PaddleSeg

pip install -U paddlepaddle-gpu

安裝過程

安裝PaddleSeg套件:

git clone https://github.com/PaddlePaddle/PaddleSeg

安裝PaddleSeg依賴:

cd PaddleSeg
pip install -r requirements.txt

 

3. 標籤數據

 

PaddleSeg採用單通道的標註圖片,每一種像素值表明一種類別,像素標註類別須要從0開始遞增,例如0,1,2,3表示有4種類別。3. 標籤數據

NOTE: 

  • 標註圖像請使用PNG無損壓縮格式的圖片,標註類別最多爲256類。

  • PaddleSeg支持灰度標註同時也支持僞彩色標註。

  • PaddleSeg支持灰度標註轉換爲僞彩色標註,如需轉換成僞彩色標註圖,可以使用PaddleSeg自帶的的轉換工具

4. 模型選擇參數配置

  • 模型選擇:根據本身的需求選擇合適的模型進行訓練。本文選擇HRNet-W18做爲訓練模型。

  • 預訓練模型:

    pretrained_model/download_model.py中提供了相應的預訓練模型下載地址,能夠根據本身的需求在其中尋找相應的預訓練模型,如不存在,能夠按照一樣的格式添加對應的模型名稱與下載地址。

  • 參數配置:參數由config.py和hrnet_Magnetic.yaml共同決定,.yaml文件的優先級高於config.py 。

經常使用參數配置詳細說明:

  • DATASET:關於數據集的相關配置,如類別數、訓練數據列表、測試數據列表

  • MODEL:模型配置:

    • MODEL_NAME: "hrnet" 模型名稱

    • HRNET:配置各個stage中不一樣分辨率特徵圖的通道數

                    STAGE2:

                        NUM_CHANNELS: [18, 36]

                    STAGE3:

                        NUM_CHANNELS: [18, 36, 72]

                    STAGE4:

                        NUM_CHANNELS: [18, 36, 72, 144]

  • MULTI_LOSS_WEIGHT:模型輸出權重配置

  • TRAIN_CROP_SIZE:訓練時輸入數據大小  

  • EVAL_CROP_SIZE:測試時輸入數據大小

  • BATCH_SIZE:輸入網絡中的BATCH_SIZE,須要適配顯存

  • SNAPSHOT_EPOCH: 階段性保存EPOCH

  • NUM_EPOCHS:總的訓練輪數

  • LOSS:損失函數類別

  • LR:學習率

5. 參數校驗

在開始訓練和評估以前,對配置和數據進行一次校驗,確保數據和配置是正確的。使用下述命令啓動校驗流程:

python pdseg/check.py --cfg ./configs/hrnet_Magnetic.yaml

6. 模型訓練

本次項目中設置的是階段性模型評估,同時保存評估結果最好的模型參數在下述目錄:

PaddleSeg/saved_model/unet_optic/best_model

best_model文件夾下包含ppcls.pdmodel、ppcls.pdopt、ppcls.pdparams三個文件用來進行後續的評估推理使用。

python pdseg/train.py --use_gpu --cfg ./configs/hrnet_Magnetic.yaml --do_eval

7. 模型評估

python pdseg/train.py --use_gpu --cfg ./configs/hrnet_Magnetic.yaml --do_eval

[EVAL]#image=81 acc=0.9853 IoU=0.8434
[EVAL]Category IoU: [0.9842 0.7891 0.8468 0.7010 0.9258 0.8136]
[EVAL]Category Acc: [0.9927 0.8871 0.9407 0.9106 0.9597 0.8829]
[EVAL]Kappa:0.9037

 

8. 結果可視化

python pdseg/vis.py --use_gpu --cfg ./configs/hrnet_Magnetic.yaml


獲得可視化結果以後,可使用以下代碼展現可視化結果:

import matplotlib.pyplot as plt
import os
import cv2 
# 定義顯示函數
def display(img_name):
    image_dir = os.path.join("./dataset/Magnetic/images", img_name.split(".")[0]+".jpg")
    label_dir = os.path.join("./dataset/Magnetic/color",img_name)
    mask_dir = os.path.join("./visual", img_name)
    img_dir = [image_dir, label_dir, mask_dir]
    plt.figure(figsize=(1515))
    title = ['Image''label''Predict']  
    for i in range(len(title)):
        plt.subplot(1, len(title), i+1)
        plt.title(title[i])
        if i==0:
            img_rgb = cv2.imread(img_dir[i])
        else:
            img = cv2.imread(img_dir[i])
            b,g,r = cv2.split(img)
            img_rgb = cv2.merge([r,g,b])            
        plt.imshow(img_rgb)
        plt.axis('off')
    plt.show()
# 注:第一次運行可能沒法顯示,再運行一次便可。
img_list=os.listdir("./visual")
for img_name in img_list:    
    display(img_name)

輸出結果以下所示:

心得體會

 

本項目詳細介紹了HRNet網絡關鍵性技術點,最後使用基於飛槳開源深度學習框架的圖像分割套件PaddleSeg,在AI Studio上完成了數據處理、模型訓練、模型評估等工做。PaddleSeg套件讓圖像分割技術變得更爲簡單便捷,下降了開發者的上手難度。

在此強烈安利AI Studio。AI Studio是基於百度深度學習平臺飛槳的人工智能學習與實訓社區,提供在線編程環境、免費GPU算力、海量開源算法和開放數據,幫助開發者快速建立和部署模型。對於像筆者同樣沒有硬件條件的學習者是一個很大的助力。

下載安裝命令

## CPU版本安裝命令
pip install -f https://paddlepaddle.org.cn/pip/oschina/cpu paddlepaddle

## GPU版本安裝命令
pip install -f https://paddlepaddle.org.cn/pip/oschina/gpu paddlepaddle-gpu
相關文章
相關標籤/搜索