<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          意義重大的眼底識別!Python 圖像分割實戰(zhàn)教程

          共 9393字,需瀏覽 19分鐘

           ·

          2021-06-10 00:42


          在人工智能領(lǐng)域中,有一項非常關(guān)鍵的技術(shù),那就是圖像分割。

          圖像分割是指將圖像中具有特殊意義的不同區(qū)域劃分開來, 這些區(qū)域互不相交,每個區(qū)域滿足灰度、紋理、彩色等特征的某種相似性準則。

          比如上圖識別視盤。視盤是視網(wǎng)膜中的關(guān)鍵解剖學結(jié)構(gòu),其形狀、面積和深度等參數(shù)是衡量眼底健康狀況的重要指標,準確定位和分割視盤區(qū)域是眼底圖像分析和處理的關(guān)鍵步驟。

          在人工智能的輔助下,只需要數(shù)秒,即可初步判斷被檢者是否存在眼底疾病,這將有助緩解專業(yè)眼科醫(yī)生不足的瓶頸,開啟眼底疾病的基層篩查新模式。而圖像分割就是實現(xiàn)這項功能的基礎(chǔ),可見其重要性。

          下面就給大家講講如何基于 PaddlePaddle 平臺,訓練并測試一個視盤圖像分割的基本模型。

          1.準備



          為了實現(xiàn)這個實驗,Python 是必不可少的,如果你還沒有安裝 Python,建議閱讀我們的這篇文章:超詳細Python安裝指南。

          在安裝前,確認自己需要的 PaddlePaddle 版本,比如 GPU版 或 CPU版,GPU 在計算上具有絕對優(yōu)勢,但是如果你沒有一塊強力的顯卡,建議選擇CPU版本。

          (GPU版) 如果你想使用GPU版,請確認本機安裝了 CUDA 計算平臺及 cuDNN,它們的下載地址分別是
          https://developer.nvidia.com/cuda-downloads
          https://developer.nvidia.com/cudnn-download-survey

          具體 CUDA 和 cuDNN 對應的版本要求如下:

          • CUDA 工具包10.1/10.2配合cuDNN v7.6+

          • CUDA 工具包11.2配合cuDNN v8.1.1

          CUDA安裝流程很簡單,下載exe程序,一路往下走。cuDNN安裝流程復雜一些,你需要轉(zhuǎn)移壓縮包解壓后的部分文件到CUDA中,具體可見這篇cuDNN的官方安裝指引:
          https://docs.nvidia.com/deeplearning/cudnn/install-guide/index.html

          (CPU版)CPU版安裝過程比較簡單,直接按照下面 PaddlePaddle 的安裝指引輸入命令即可。


          (通用)選擇完你想要安裝的版本,并做好基礎(chǔ)工作后,接下來就是安裝 PaddlePaddle 的具體步驟,打開安裝指引流程頁面:
          https://www.paddlepaddle.org.cn/install/quick

          根據(jù)你自己的情況選擇這些選項,最后一個選項計算平臺指的是 GPU 加速工具包或CPU,如果你不想用GPU,請選CPU版;想用GPU版的同學請按剛剛下載的CUDA版本進行選擇。

          選擇完畢后下方會出現(xiàn)安裝信息,輸入安裝信息里的命令即可安裝成功,不得不說,PaddlePaddle 這些方面做的還是比較貼心的。

          在頁面下方還有具體的從頭到尾的安裝步驟,對 Python 基本的虛擬環(huán)境安裝流程不了解的同學可以看著這些步驟進行安裝。



          2.初嘗paddleseg



          安裝完 paddle 后,為了能夠?qū)崿F(xiàn)圖像分割功能,我們還需要安裝 paddleseg:

          pip install paddleseg


          并克隆 paddleseg的代碼庫 (如果克隆不了,請在Python實用寶典公眾號后臺回復:圖像分割 下載):

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


          克隆完成,進入代碼庫文件夾:

          cd PaddleSeg


          執(zhí)行下面命令,并在 PaddleSeg/output 文件夾中出現(xiàn)預測結(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


          預測結(jié)果如下:

          3.訓練模型



          前面只是利用了 PaddlePaddle 提前訓練好的數(shù)據(jù)進行預測,下面我們要嘗試自己訓練一個模型。

          為了訓練模型,我們需要獲得眼底訓練集。事實上,在前面 初嘗 Paddleseg 中,我們便獲得了一份眼底訓練集,其路徑是 PaddleSeg\data\optic_disc_seg.

          如果你沒有進行 初嘗 Paddleseg 這一節(jié),也想要獲取訓練集數(shù)據(jù)的話,在Python實用寶典公眾號后臺回復:圖像分割 下載。下載后解壓數(shù)據(jù)集,得到一個optic_disc_seg文件夾,將其放到 PaddleSeg 代碼庫的 data 文件夾下。

          配置化訓練

          PaddleSeg 提供了配置化驅(qū)動進行模型訓練。他們在配置文件中詳細列出了每一個可以優(yōu)化的選項,用戶只要修改這個配置文件就可以對模型進行定制。

          所有的配置文件在PaddleSeg/configs文件夾下面

          每一個文件夾代表一個模型,里面包含這個模型的所有配置文件。

          在PaddleSeg的配置文件給出的學習率中,除了"bisenet_optic_disc_512x512_1k.yml"中為單卡學習率外,其余配置文件中均為4卡的學習率,因此如果你是單卡訓練,則學習率設(shè)置應變成原來的1/4。

          為了簡化學習難度,我們繼續(xù)以"bisenet_optic_disc_512x512_1k.yml"文件為例,修改部分參數(shù)進行訓練,下面是這個配置的全部說明:

          上滑查看更多代碼

                     
          batch_size: 4 #設(shè)定batch_size的值即為迭代一次送入網(wǎng)絡(luò)的圖片數(shù)量,一般顯卡顯存越大,batch_size的值可以越大
          iters: 1000 #模型迭代的次數(shù)

          train_dataset: #訓練數(shù)據(jù)設(shè)置
            type: OpticDiscSeg #選擇數(shù)據(jù)集格式
            dataset_root: data/optic_disc_seg #選擇數(shù)據(jù)集路徑
            num_classes: 2 #指定目標的類別個數(shù)(背景也算為一類)
            transforms: #數(shù)據(jù)預處理/增強的方式
              - type: Resize #送入網(wǎng)絡(luò)之前需要進行resize
                target_size: [512, 512] #將原圖resize成512*512在送入網(wǎng)絡(luò)
              - type: RandomHorizontalFlip #采用水平反轉(zhuǎn)的方式進行數(shù)據(jù)增強
              - type: Normalize #圖像進行歸一化
            mode: train

          val_dataset: #驗證數(shù)據(jù)設(shè)置
            type: OpticDiscSeg #選擇數(shù)據(jù)集格式
            dataset_root: data/optic_disc_seg #選擇數(shù)據(jù)集路徑
            num_classes: 2 #指定目標的類別個數(shù)(背景也算為一類)
            transforms: #數(shù)據(jù)預處理/增強的方式
              - type: Resize #將原圖resize成512*512在送入網(wǎng)絡(luò)
                target_size: [512, 512]  #將原圖resize成512*512在送入網(wǎng)絡(luò)
              - type: Normalize #圖像進行歸一化
            mode: val

          optimizer: #設(shè)定優(yōu)化器的類型
            type: sgd #采用SGD(Stochastic Gradient Descent)隨機梯度下降方法為優(yōu)化器
            momentum: 0.9 #動量
            weight_decay: 4.0e-5 #權(quán)值衰減,使用的目的是防止過擬合

          learning_rate: #設(shè)定學習率
            value: 0.01 #初始學習率
            decay:
              type: poly #采用poly作為學習率衰減方式。
              power: 0.9 #衰減率
              end_lr: 0 #最終學習率

          loss: #設(shè)定損失函數(shù)的類型
            types:
              - type: CrossEntropyLoss #損失函數(shù)類型
            coef: [1, 1, 1, 1, 1]
            #BiseNetV2有4個輔助loss,加上主loss共五個,1表示權(quán)重 all_loss = coef_1 * loss_1 + .... + coef_n * loss_n

          model: #模型說明
            type: BiSeNetV2 #設(shè)定模型類別
            pretrained: Null #設(shè)定模型的預訓練模型


          你可以嘗試調(diào)整部分參數(shù)進行訓練,看看你自己訓練的模型效果和官方給出的模型的效果的差別。

          開始訓練

          (GPU版)在正式開啟訓練前,我們需要將CUDA設(shè)置為目前有1張可用的顯卡:

          set CUDA_VISIBLE_DEVICES=0 # windows
          # export CUDA_VISIBLE_DEVICES=0 # linux


          輸入訓練命令開始訓練:

          python train.py \
                 --config configs/quick_start/bisenet_optic_disc_512x512_1k.yml \
                 --do_eval \
                 --use_vdl \
                 --save_interval 500 \
                 --save_dir output
          見到如下的界面,說明你已經(jīng)開始訓練了:




          4.訓練過程可視化



          PaddlePaddle 還提供了可視化分析工具:VisualDL,讓我們的網(wǎng)絡(luò)訓練過程更加直觀。

          當打開use_vdl開關(guān)后,PaddleSeg會將訓練過程中的數(shù)據(jù)寫入VisualDL文件,可實時查看訓練過程中的日志。記錄的數(shù)據(jù)包括:

          1. 1. loss變化趨勢

          2. 2. 學習率變化趨勢

          3. 3. 訓練時間

          4. 4. 數(shù)據(jù)讀取時間

          5. 5. mean IoU 變化趨勢(當打開了do_eval開關(guān)后生效)

          6. 6. mean pixel Accuracy變化趨勢(當打開了do_eval開關(guān)后生效)


          使用如下命令啟動VisualDL查看日志:

          # 下述命令會在127.0.0.1上啟動一個服務(wù),支持通過前端web頁面查看,可以通過--host這個參數(shù)指定實際ip地址
          visualdl --logdir output/


          在瀏覽器輸入提示的網(wǎng)址,效果如下:


          如圖所示,打開 http://127.0.0.1:8040/ 頁面,效果如下:


          5.模型測試評估



          訓練完成后,用戶可以使用評估腳本val.py來評估模型效果。

          假設(shè)訓練過程中迭代次數(shù)(iters)為1000,保存模型的間隔為500,即每迭代1000次數(shù)據(jù)集保存2次訓練模型。

          因此一共會產(chǎn)生2個定期保存的模型,加上保存的最佳模型best_model,一共有3個模型,可以通過model_path指定期望評估的模型文件。

          python val.py \
                 --config configs/quick_start/bisenet_optic_disc_512x512_1k.yml \
                 --model_path output/iter_1000/model.pdparams


          在圖像分割領(lǐng)域中,評估模型質(zhì)量主要是通過三個指標進行判斷,準確率(acc)、平均交并比(Mean Intersection over Union,簡稱mIoU)、Kappa系數(shù)。

          • 準確率:指類別預測正確的像素占總像素的比例,準確率越高模型質(zhì)量越好。

          • 平均交并比:對每個類別數(shù)據(jù)集單獨進行推理計算,計算出的預測區(qū)域和實際區(qū)域交集除以預測區(qū)域和實際區(qū)域的并集,然后將所有類別得到的結(jié)果取平均。在本例中,正常情況下模型在驗證集上的mIoU指標值會達到0.80以上,顯示信息示例如下所示,第2行的mIoU=0.8609即為mIoU。

          • Kappa系數(shù):一個用于一致性檢驗的指標,可以用于衡量分類的效果。Kappa系數(shù)越高模型質(zhì)量越好。

          隨著評估腳本的運行,最終打印的評估日志如下。

          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ù)后的訓練效果還是不錯的。

          6.效果可視化



          除了分析模型的IOU、ACC和Kappa指標之外,我們還可以查閱一些具體樣本的切割樣本效果,從Bad Case啟發(fā)進一步優(yōu)化的思路。

          predict.py腳本是專門用來可視化預測案例的,命令格式如下所示

          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


          運行完成后,打開 output/result 文件夾。我們選擇1張圖片進行查看,效果如下。

          我們可以直觀的看到模型的切割效果和原始標記之間的差別,從而產(chǎn)生一些優(yōu)化的思路,比如是否切割的邊界可以做規(guī)則化的處理等。

          大家也可以嘗試自己標注一個數(shù)據(jù)集進行圖像分割,你只要按照 PaddleSeg\data\optic_disc_seg 里面那樣組織圖片結(jié)構(gòu),就可以復用這些訓練、評估的過程。

          本文部分內(nèi)容摘自: PaddleSeg官方文檔

          我們的文章到此就結(jié)束啦,如果你喜歡今天的Python 實戰(zhàn)教程,請持續(xù)關(guān)注Python實用寶典。

          有任何問題,可以在公眾號后臺回復:加群,回答相應紅字驗證信息,進入互助群詢問。

          原創(chuàng)不易,希望你能在下面點個贊和在看支持我繼續(xù)創(chuàng)作,謝謝!

          點擊下方閱讀原文可獲得更好的閱讀體驗

          Python實用寶典 (pythondict.com)
          不只是一個寶典
          歡迎關(guān)注公眾號:Python實用寶典

          瀏覽 82
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  成人婷婷五月 | 伊人乱伦 | 在线免费观看亚洲 | 日本中文字幕手机在线 | 91久久久精品 |