醫學圖像算法unet和unet++的darknet開源實現(修訂1001)

深度學習應用於醫學行業主要是以下unet和unet++兩種網絡模型

上圖是unet的網絡模型

上圖是unet++的網絡模型(相當於把殘差引入了unet)

 

         本開源項目是用移植方便darknet深度學習框架(C語言代碼),實現了上面兩種模型的算法.並在項目中放入了例圖/批處理/執行文件.並配備了多個詳細說明文本文件.主要可應用於圖像分割/目標濾出/目標定位.

 

github下載地址:  https://github.com/lswtzw/zwcode

百度網盤下載:    https://pan.baidu.com/s/1bE2PZ5Rvu-9QU3_Ib2heAg      提取碼:0r13

 

下面是開源項目中提供的僞造實驗圖像:

train訓練原圖  train訓練Label(二值mask)   

上面的圖大約10張,主要是方位和形變的小差別.用於訓練,原圖和label圖的文件名一一對應.

test測試圖    test結果圖(二值mask)   

 (能排除六角形干擾小塊,適應較大形變,正確輸出血管的mask圖)

上面的圖大約15張,肯定不同於10張訓練圖,不僅目標線條有較大變化,而且還增加了明暗變化和干擾背景或干擾雜塊,且訓練時未用數據增廣.

三次以上的實測發現,unet網絡有很好的泛化能力,能正確提取出想要的目標,能正確過濾掉比目標淡和比目標濃的大小干擾色塊或背景,適應較大程度的形變,從而清晰地過濾出目標並定位目標.牆裂建議在訓練時就把各種干擾色塊和背景弄到train圖像上去,但在train的對應mask圖中卻只保留要的目標.

 

 

  1. 運行環境和運行條件:

windows系統 -----(最好是有4GB顯存以上的獨立顯卡,並安裝好了CUDA開發環境,未安裝只能用CPU版本);

本項目需要先安裝opencv320-----(最好是opencv320,與開發機保持一致,其它版本估計也行);

最後:請把opencv320下的opencv_world320.dll複製到可執行文件目錄下(darknet/build/darknet/x64/);

          opencv320在上面提到的百度網盤中可以下載到;

     首次使用建議先跑通darknet_no_gpu.exe這個版本(CPU版本,配置要求低).

 

 

  1. 發行版本說明:

本開源項目是基礎於AlexeyAB大神的Windows版的darknet框架加改的,所以如果你的電腦已配置好了AlexeyAB大神的版本,只要替換掉:

 darknet.h,darknet.c,data.h,data.c,parser.c,並增加unet.h,unet.c這幾個文件就可以了.用戶可按需修改主文件unet.c,

darknet框架的windows版本安裝方法請百度查CSDN網文:"win10下配置yolov3","window下安裝配置darknet"等.

只要這個配置好了,能編譯出darknet_no_gpu.exe,就可以繼續下面的步驟了.

另外,本開源項目也參考了網友:陽光玻璃杯 "圖片語義分割"的博文,並在他的git關鍵代碼和配置的基礎上改出了本開源代碼,他用的是segnet網絡模型.

 

 

  1. 使用說明:

因爲darknet.exe是在我的電腦上編譯出的gpu版本,可能在你的電腦上啓不動.需要重新編譯源碼.

如果你想先快速上手試試,可以先用:darknet_no_gpu.exe這個可執行文件.

把下載好的darknet和unet_data兩個目複製到你的電腦c:根目錄下,可以少些路徑配置.

測試的話可以先執行unet_data目錄下的幾個批處理文件.

 

一.文件和目錄配置:

    1.darknet目錄是項目源碼,用vs2015或以上打開它的.sln工程文件,在build子目錄下.

    2.unet_data目錄是調用批處理/配置文件/圖像集/權重模型文件的存放主目錄,核心是data.txt:

         這個文件是各種路徑的配置文件,注意修改對應的盤符!默認初始值是在C盤根目錄下.

    上面這個和darknet框架上的傳統data配置文件差不多,用法略有改動.

    3.color目錄下放的是彩色訓練圖像和對應配置文件.

         4.backup目錄一般用於存放訓練出的模型文件.

 

二.網絡模型配置:

    unet_cfg.txt/unet_cfg++.txt這兩個文本文件就是網絡模型配置文件

    (完全同於darknet格式的cfg),注意:不要另存爲UTF-8編碼(有時改了會出錯),

    就用windows記事本默認的ANSI編碼來保存.(windows回車換行模式)

    配置文件可以自由使用各種網絡模型,如segnet也是可以的.這個我放在了darknet的cfg目錄下.

 

三.關於數據增廣:

    因爲label(蒙版二值圖像)和image是按文件名稱,進行的一一對應關係,如果產生平移或擠壓等變化時,

    兩者要同步進行,所以須要另外想辦法用其它工具軟件或程序實現,結果圖直接加到訓練模板中.

 

四.結束訓練的時機:

    根據筆者的經驗,avg_loss的值,訓練到100以下,就差不多了可以停了.

    總之我的GT750顯卡4GB顯存,10張模板用了4個小時以上,訓練unet++時間比unet要長得多.

    如果訓練24小時都不行,一般是模板圖像有問題,存在矛盾模板.

    根據筆者的經驗,GPU識別的速度一般在2秒以內.視圖像大小和網絡複雜度而定.   

    啓動訓練後,可以用nvidia-smi查看顯存佔用,如果餘得多,可以增大cfg的[net]的batch的值或圖像寬高.

 

五.調用接口:

    爲方便C#和JAVA等的弱耦合調用,提供了一次性載入模型和多次性按需識別的調用接口,請參見項目中包含的說明文檔: <<關於C#或java的調用說明.txt>>

 

darknet.exe  unet  <train/test/preload>  <data filename>  <cfg filename>  [weights filename]  [image file name]

上面是調用的傳入參數: train是訓練模型,test是識別,preload是預裝模型,data filename是路徑配置文件,cfg filename是模型配置文件,後面是權重(模型)文件

 

.簡單調用示例:(unet_data目錄下提供了各種調用方式的.bat文件範例)

         1.訓練train(第一個是cpu版) (需要在data.txt中指定train圖像的路徑)

         "../darknet/build/darknet/x64/darknet_no_gpu.exe"  unet  train  data.txt  unet_cfg.txt

         "../darknet/build/darknet/x64/darknet.exe"  unet  train  data.txt  unet_cfg.txt

            訓練的明細文件名稱列表在train.list.txt中

 

         2.繼續以前的模型做再訓練

         "../darknet/build/darknet/x64/darknet.exe"  unet  train  data.txt  unet_cfg.txt  backup/unet_cfg.backup

         把unet_cfg.txt換成unet++_cfg.txt就是用unet++算法模型.

 

         3.預測/識別

        darknet.exe  unet  test  data.txt  unet_cfg.txt  backup/unet_cfg.backup  test/10.jpg

 

         4.批量預測/識別(需要在data.txt中指定test圖像的路徑)

         darknet.exe  unet  test  data.txt  unet_cfg.txt  backup/unet_cfg.backup

         將會對指定test路徑下的圖像10.jpg,11.jpg,12.jpg,13.jpg.....進行批量順序識別.

 

         5.預裝模型與後期多次按需調用(詳細調用請參見說明書)

         darknet.exe  unet  preload  data.txt  unet_cfg.txt  backup/unet_cfg.backup    #預裝模形入內存後待機

         wdarknet_call.exe   1                                                   #按需控制darknet做一次批量識別

 

         結束語: 個人感嘆,用KERAS訓練UNET非常快,編的程簡潔易懂,是深度學習的第一選擇,實驗室的好幫手;但DARKNET是低級的,C語言原子級編碼操作,可以自個兒改寫dropout算子的具體實現等,這裏可以讓你真正喫透神經網絡的底層,因爲用了BN吧,訓練非常慢,個人測試識別效果卻貌似更好些,缺點是感覺其更新慢支持少還很山寨;tensorflow作爲中間語言,作出的行業開天闢地貢獻不可磨滅,其作者創造了一個晦澀編碼的高尚哲學體系,個人主觀認爲既不正宗也不親民,不推薦思想傳統的人學用.

 

bug-1001修訂補充:

1.實測unet,unet++兩種算法各有優劣,最後輸出mask結果圖輪廓,若顏色都偏淡少,可對兩種算法的結果圖做加法合成,輸出一張較濃多的結果圖.相反,如果都偏濃多,則可做交集輸出.

2.實測發現unet,尤其是unet++模型,對小面積目標的單獨定位(比如上圖大骨上的小六邊形圖塊)效果不好,這種情況可以用減法實現,就是用兩套(train)label圖像,都有大面積背景輪廓線,但其一套上面不保留小目標的mask二值圖,另一套上保留,這樣訓練出兩套權重模型,識別同一套test圖像,輸出的兩套mask結果圖,相減,就能得到小目標的正確mask定位圖.如果還要對小目標做分類,可以再選一套比alexnet更成熟的網絡模型,在深度學習領域內採用多模機制進行圖像識別.

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章