在人工智能的輔助下,只需要數(shù)秒,即可初步判斷被檢者是否存在眼底疾病,這將有助緩解專業(yè)眼科醫(yī)生不足的瓶頸,開啟眼底疾病的基層篩查新模式。而圖像分割就是實(shí)現(xiàn)這項(xiàng)功能的基礎(chǔ),可見(jiàn)其重要性。
下面就給大家講講如何基于 PaddlePaddle 平臺(tái),訓(xùn)練并測(cè)試一個(gè)視盤圖像分割的基本模型。
1.準(zhǔn)備
為了實(shí)現(xiàn)這個(gè)實(shí)驗(yàn),Python 是必不可少的,如果你還沒(méi)有安裝 Python,建議閱讀我們的這篇文章:超詳細(xì)Python安裝指南。
在安裝前,確認(rèn)自己需要的 PaddlePaddle 版本,比如 GPU版 或 CPU版,GPU 在計(jì)算上具有絕對(duì)優(yōu)勢(shì),但是如果你沒(méi)有一塊強(qiáng)力的顯卡,建議選擇CPU版本。
(GPU版) 如果你想使用GPU版,請(qǐng)確認(rèn)本機(jī)安裝了 CUDA 計(jì)算平臺(tái)及 cuDNN,它們的下載地址分別是:
https://developer.nvidia.com/cuda-downloads
https://developer.nvidia.com/cudnn-download-survey
具體 CUDA 和 cuDNN 對(duì)應(yīng)的版本要求如下:
- CUDA 工具包10.1/10.2配合cuDNN v7.6+
- CUDA 工具包11.2配合cuDNN v8.1.1
CUDA安裝流程很簡(jiǎn)單,下載exe程序,一路往下走。cuDNN安裝流程復(fù)雜一些,你需要轉(zhuǎn)移壓縮包解壓后的部分文件到CUDA中,具體可見(jiàn)這篇cuDNN的官方安裝指引:
https://docs.nvidia.com/deeplearning/cudnn/install-guide/index.html
(CPU版) CPU版安裝過(guò)程比較簡(jiǎn)單,直接按照下面 PaddlePaddle 的安裝指引輸入命令即可。
**(通用)**選擇完你想要安裝的版本,并做好基礎(chǔ)工作后,接下來(lái)就是安裝 PaddlePaddle 的具體步驟,打開安裝指引流程頁(yè)面:
https://www.paddlepaddle.org.cn/install/quick
根據(jù)你自己的情況選擇這些選項(xiàng),最后一個(gè)選項(xiàng)計(jì)算平臺(tái)指的是 GPU 加速工具包或CPU,如果你不想用GPU,請(qǐng)選CPU版;想用GPU版的同學(xué)請(qǐng)按剛剛下載的CUDA版本進(jìn)行選擇。
選擇完畢后下方會(huì)出現(xiàn)安裝信息,輸入安裝信息里的命令即可安裝成功,不得不說(shuō),PaddlePaddle 這些方面做的還是比較貼心的。
在頁(yè)面下方還有具體的從頭到尾的安裝步驟,對(duì) Python 基本的虛擬環(huán)境安裝流程不了解的同學(xué)可以看著這些步驟進(jìn)行安裝。
2.初嘗paddleseg
安裝完 paddle 后,為了能夠?qū)崿F(xiàn)圖像分割功能,我們還需要安裝 paddleseg:
pip install paddleseg
并克隆 paddleseg的代碼庫(kù) (如果克隆不了,請(qǐng)?jiān)赑ython實(shí)用寶典公眾號(hào)后臺(tái)回復(fù):圖像分割 下載):
git clone https://github.com/PaddlePaddle/PaddleSeg.git
克隆完成,進(jìn)入代碼庫(kù)文件夾:
cd PaddleSeg
執(zhí)行下面命令,并在 PaddleSeg/output 文件夾中出現(xiàn)預(yù)測(cè)結(jié)果,則證明安裝成功。
python predict.py
--config configs/quick_start/bisenet_optic_disc_512x512_1k.yml
--model_path https://bj.bcebos.com/paddleseg/dygraph/optic_disc/bisenet_optic_disc_512x512_1k/model.pdparams
--image_path docs/images/optic_test_image.jpg
--save_dir output/result
預(yù)測(cè)結(jié)果如下:
3.訓(xùn)練模型
前面只是利用了 PaddlePaddle 提前訓(xùn)練好的數(shù)據(jù)進(jìn)行預(yù)測(cè),下面我們要嘗試自己訓(xùn)練一個(gè)模型。
為了訓(xùn)練模型,我們需要獲得眼底訓(xùn)練集。事實(shí)上,在前面** 初嘗 Paddleseg **中,我們便獲得了一份眼底訓(xùn)練集,其路徑是 PaddleSegdataoptic_disc_seg.
如果你沒(méi)有進(jìn)行 初嘗 Paddleseg 這一節(jié),也想要獲取訓(xùn)練集數(shù)據(jù)的話,在Python實(shí)用寶典公眾號(hào)后臺(tái)回復(fù):圖像分割 下載。下載后解壓數(shù)據(jù)集,得到一個(gè)optic_disc_seg文件夾,將其放到 PaddleSeg 代碼庫(kù)的 data 文件夾下。
配置化訓(xùn)練
PaddleSeg 提供了配置化驅(qū)動(dòng)進(jìn)行模型訓(xùn)練。他們?cè)谂渲梦募性敿?xì)列出了每一個(gè)可以優(yōu)化的選項(xiàng),用戶只要修改這個(gè)配置文件就可以對(duì)模型進(jìn)行定制。
所有的配置文件在PaddleSeg/configs文件夾下面 :
每一個(gè)文件夾代表一個(gè)模型,里面包含這個(gè)模型的所有配置文件。
在PaddleSeg的配置文件給出的學(xué)習(xí)率中,除了"bisenet_optic_disc_512x512_1k.yml"中為單卡學(xué)習(xí)率外,其余配置文件中均為4卡的學(xué)習(xí)率,因此如果你是單卡訓(xùn)練,則學(xué)習(xí)率設(shè)置應(yīng)變成原來(lái)的1/4。
為了簡(jiǎn)化學(xué)習(xí)難度,我們繼續(xù)以"bisenet_optic_disc_512x512_1k.yml"文件為例,修改部分參數(shù)進(jìn)行訓(xùn)練,下面是這個(gè)配置的全部說(shuō)明:
上滑查看更多代碼
batch_size: 4#設(shè)定batch_size的值即為迭代一次送入網(wǎng)絡(luò)的圖片數(shù)量,一般顯卡顯存越大,batch_size的值可以越大
iters: 1000#模型迭代的次數(shù)
train_dataset:#訓(xùn)練數(shù)據(jù)設(shè)置
type: OpticDiscSeg#選擇數(shù)據(jù)集格式
dataset_root: data/optic_disc_seg#選擇數(shù)據(jù)集路徑
num_classes: 2#指定目標(biāo)的類別個(gè)數(shù)(背景也算為一類)
transforms:#數(shù)據(jù)預(yù)處理/增強(qiáng)的方式
- type: Resize#送入網(wǎng)絡(luò)之前需要進(jìn)行resize
target_size:[512, 512]#將原圖resize成512*512在送入網(wǎng)絡(luò)
- type: RandomHorizontalFlip#采用水平反轉(zhuǎn)的方式進(jìn)行數(shù)據(jù)增強(qiáng)
- type: Normalize#圖像進(jìn)行歸一化
mode: train
val_dataset:#驗(yàn)證數(shù)據(jù)設(shè)置
type: OpticDiscSeg#選擇數(shù)據(jù)集格式
dataset_root: data/optic_disc_seg#選擇數(shù)據(jù)集路徑
num_classes: 2#指定目標(biāo)的類別個(gè)數(shù)(背景也算為一類)
transforms:#數(shù)據(jù)預(yù)處理/增強(qiáng)的方式
- type: Resize#將原圖resize成512*512在送入網(wǎng)絡(luò)
target_size:[512, 512]#將原圖resize成512*512在送入網(wǎng)絡(luò)
- type: Normalize#圖像進(jìn)行歸一化
mode: val
optimizer:#設(shè)定優(yōu)化器的類型
type: sgd#采用SGD(Stochastic Gradient Descent)隨機(jī)梯度下降方法為優(yōu)化器
momentum: 0.9#動(dòng)量
weight_decay: 4.0e-5#權(quán)值衰減,使用的目的是防止過(guò)擬合
learning_rate:#設(shè)定學(xué)習(xí)率
value: 0.01#初始學(xué)習(xí)率
decay:
type: poly#采用poly作為學(xué)習(xí)率衰減方式。
power: 0.9#衰減率
end_lr: 0#最終學(xué)習(xí)率
loss:#設(shè)定損失函數(shù)的類型
types:
- type: CrossEntropyLoss#損失函數(shù)類型
coef:[1, 1, 1, 1, 1]
#BiseNetV2有4個(gè)輔助loss,加上主loss共五個(gè),1表示權(quán)重 all_loss = coef_1 * loss_1 + .... + coef_n * loss_n
model:#模型說(shuō)明
type: BiSeNetV2#設(shè)定模型類別
pretrained: Null#設(shè)定模型的預(yù)訓(xùn)練模型
你可以嘗試調(diào)整部分參數(shù)進(jìn)行訓(xùn)練,看看你自己訓(xùn)練的模型效果和官方給出的模型的效果的差別。
開始訓(xùn)練
(GPU版)在正式開啟訓(xùn)練前,我們需要將CUDA設(shè)置為目前有1張可用的顯卡:
set CUDA_VISIBLE_DEVICES=0 # windows
# export CUDA_VISIBLE_DEVICES=0 # linux
輸入訓(xùn)練命令開始訓(xùn)練:
python train.py
--config configs/quick_start/bisenet_optic_disc_512x512_1k.yml
--do_eval
--use_vdl
--save_interval 500
--save_dir output
見(jiàn)到如下的界面,說(shuō)明你已經(jīng)開始訓(xùn)練了:
4.訓(xùn)練過(guò)程可視化
PaddlePaddle 還提供了可視化分析工具:VisualDL,讓我們的網(wǎng)絡(luò)訓(xùn)練過(guò)程更加直觀。
當(dāng)打開use_vdl
開關(guān)后,PaddleSeg會(huì)將訓(xùn)練過(guò)程中的數(shù)據(jù)寫入VisualDL文件,可實(shí)時(shí)查看訓(xùn)練過(guò)程中的日志。記錄的數(shù)據(jù)包括:
- loss變化趨勢(shì)
- 學(xué)習(xí)率變化趨勢(shì)
- 訓(xùn)練時(shí)間
- 數(shù)據(jù)讀取時(shí)間
- mean IoU 變化趨勢(shì)(當(dāng)打開了do_eval開關(guān)后生效)
- mean pixel Accuracy變化趨勢(shì)(當(dāng)打開了do_eval開關(guān)后生效)
使用如下命令啟動(dòng)VisualDL查看日志:
# 下述命令會(huì)在127.0.0.1上啟動(dòng)一個(gè)服務(wù),支持通過(guò)前端web頁(yè)面查看,可以通過(guò)--host這個(gè)參數(shù)指定實(shí)際ip地址
visualdl --logdir output/
在瀏覽器輸入提示的網(wǎng)址,效果如下:
如圖所示,打開 http://127.0.0.1:8040/ 頁(yè)面,效果如下:
5.模型測(cè)試評(píng)估
訓(xùn)練完成后,用戶可以使用評(píng)估腳本val.py來(lái)評(píng)估模型效果。
假設(shè)訓(xùn)練過(guò)程中迭代次數(shù)(iters)為1000,保存模型的間隔為500,即每迭代1000次數(shù)據(jù)集保存2次訓(xùn)練模型。
因此一共會(huì)產(chǎn)生2個(gè)定期保存的模型,加上保存的最佳模型best_model,一共有3個(gè)模型,可以通過(guò)model_path指定期望評(píng)估的模型文件。
python val.py
--config configs/quick_start/bisenet_optic_disc_512x512_1k.yml
--model_path output/iter_1000/model.pdparams
在圖像分割領(lǐng)域中,評(píng)估模型質(zhì)量主要是通過(guò)三個(gè)指標(biāo)進(jìn)行判斷,準(zhǔn)確率(acc)、平均交并比(Mean Intersection over Union,簡(jiǎn)稱mIoU)、Kappa系數(shù)。
- 準(zhǔn)確率:指類別預(yù)測(cè)正確的像素占總像素的比例,準(zhǔn)確率越高模型質(zhì)量越好。
- 平均交并比:對(duì)每個(gè)類別數(shù)據(jù)集單獨(dú)進(jìn)行推理計(jì)算,計(jì)算出的預(yù)測(cè)區(qū)域和實(shí)際區(qū)域交集除以預(yù)測(cè)區(qū)域和實(shí)際區(qū)域的并集,然后將所有類別得到的結(jié)果取平均。在本例中,正常情況下模型在驗(yàn)證集上的mIoU指標(biāo)值會(huì)達(dá)到0.80以上,顯示信息示例如下所示,第2行的mIoU=0.8609即為mIoU。
- Kappa系數(shù):一個(gè)用于一致性檢驗(yàn)的指標(biāo),可以用于衡量分類的效果。Kappa系數(shù)越高模型質(zhì)量越好。
隨著評(píng)估腳本的運(yùn)行,最終打印的評(píng)估日志如下。
76/76 [==============================] - 6s 84ms/step - batch_cost: 0.0835 - reader cost: 0.0029
2021-06-05 19:38:53 [INFO] [EVAL] #Images: 76 mIoU: 0.8609 Acc: 0.9945 Kappa: 0.8393
2021-06-05 19:38:53 [INFO] [EVAL] Class IoU:
[0.9945 0.7273]
2021-06-05 19:38:53 [INFO] [EVAL] Class Acc:
[0.9961 0.8975]
可以看到,我改了參數(shù)后的訓(xùn)練效果還是不錯(cuò)的。
6.效果可視化
除了分析模型的IOU、ACC和Kappa指標(biāo)之外,我們還可以查閱一些具體樣本的切割樣本效果,從Bad Case啟發(fā)進(jìn)一步優(yōu)化的思路。
predict.py腳本是專門用來(lái)可視化預(yù)測(cè)案例的,命令格式如下所示
python predict.py
--config configs/quick_start/bisenet_optic_disc_512x512_1k.yml
--model_path output/iter_1000/model.pdparams
--image_path data/optic_disc_seg/JPEGImages/H0003.jpg
--save_dir output/result
運(yùn)行完成后,打開 output/result 文件夾。我們選擇1張圖片進(jìn)行查看,效果如下。
我們可以直觀的看到模型的切割效果和原始標(biāo)記之間的差別,從而產(chǎn)生一些優(yōu)化的思路,比如是否切割的邊界可以做規(guī)則化的處理等。
大家也可以嘗試自己標(biāo)注一個(gè)數(shù)據(jù)集進(jìn)行圖像分割,你只要按照 PaddleSegdataoptic_disc_seg 里面那樣組織圖片結(jié)構(gòu),就可以復(fù)用這些訓(xùn)練、評(píng)估的過(guò)程。
-
圖像分割
+關(guān)注
關(guān)注
4文章
182瀏覽量
18002 -
模型
+關(guān)注
關(guān)注
1文章
3243瀏覽量
48842 -
python
+關(guān)注
關(guān)注
56文章
4797瀏覽量
84691 -
PaddlePaddle
+關(guān)注
關(guān)注
0文章
3瀏覽量
1428
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論