深度學習應用於醫學行業主要是以下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圖中卻只保留要的目標.
- 運行環境和運行條件:
windows系統 -----(最好是有4GB顯存以上的獨立顯卡,並安裝好了CUDA開發環境,未安裝只能用CPU版本);
本項目需要先安裝opencv320-----(最好是opencv320,與開發機保持一致,其它版本估計也行);
最後:請把opencv320下的opencv_world320.dll複製到可執行文件目錄下(darknet/build/darknet/x64/);
opencv320在上面提到的百度網盤中可以下載到;
首次使用建議先跑通darknet_no_gpu.exe這個版本(CPU版本,配置要求低).
- 發行版本說明:
本開源項目是基礎於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網絡模型.
- 使用說明:
因爲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更成熟的網絡模型,在深度學習領域內採用多模機制進行圖像識別.