U-net 閱讀筆記
來自專欄 CV喵的進階4 人贊了文章
為什麼第一篇寫這篇文章呢?
因為這是我做圖像分割看的第一篇文章。筆記也是當年寫的,現在看來low的一絕,留在這裡當做紀念吧。
文章源碼是利用Caffe實現的,像我這種無腦小菜鳥更喜歡用可讀性強的Pytorch來複現U-net。
廢話說完了,上當年草稿:
U-Net: Convolutional Networks for Biomedical Image Segmentation
論文作者:Olaf Ronneberger, Philipp Fischer, and Thomas Brox
源碼地址: Computer Vision Group(基於Caffe)
閱讀整理:
競賽:
ISBI challenge for segmentation of neuronal structures in electron microscopic stacks
數據:
30張512*512圖片,主要依靠data augmentation(細胞形變等)
代碼:給出的源碼中可以直接運行測試單張圖片,使用目前的GPU大概一秒鐘。不知為何換成自己的圖片去測試可能就不太好用了,可能是因為細胞過於密集?也可能是loss寫的不對?論文中提到了端到端訓練,代碼中好像並不能直接運行實現,連基本的solver都找不到(嗚嗚……)。自己太菜,使用源碼不如網上大神自己搭建的keras和pytorch的效果好,先總結一下論文,至於實驗待日後填坑吧……不過代碼中有現成的matlab借口來測試,運行起來很方便。
數據處理:
1、官方的數據集只有一張tif,最開始看到的時候整個人蒙圈了。後來才知道要自己拆分,代碼參考:
from libtiff import *
imgdir = TIFF3D.open("train-labels.tif")
imgarr = imgdir.read_image()
for i in range(imgarr.shape[0]):
savepath = "./train-labels/"+ str(i) + .tif
img = TIFF.open(savepath, w)
img.write_image(imgarr[i])
一張tif會被拆成30張tif。
2、數據增強,對於細胞分割主要採用細胞形變,主要參考http://download.csdn.net/detail/u012931582/9817058
(C++工程,注意代碼中opencv要使用2.4.10版本,版本3有一些頭文件會找不到)
3、如果使用caffe,需要生成hdf5文件。
注意:u-net很神奇,輸入輸出圖片大小竟然不一樣,記得調整label尺寸。還有,label直接讀進去也不行,難免有誤差,讀進去的不一定是0和1的標籤,搞不好就是0和0.9最後全變成0了,白訓練……知乎粘貼代碼看著好彆扭,不粘貼了生成hdf5代碼了,反正現在常用pytorch也沒這麼麻煩。
網路結構:
輸出比輸入圖片要小。全卷積網路。像素級二分類。
預測的時候,為了檢測邊緣需要對輸入圖片進行處理:將邊緣鏡像。
對於同類密集緊鄰的細胞圖片:增加有細胞接觸的背景部分的loss權重。
注意:輸出的圖片比輸入的小,文中提到一定要選好輸入尺寸,從而使得每個pooling層都能整除,才能準確分割。
訓練:
Caffe : SGD;batch size=1;high momentum (0.99);
Energy function:
提前計算好訓練集中每個ground truth segmentation 的weight map,計算公式如下:
參數初始化很重要:標準正態分布,方差2/N。N denotes the number of incoming nodes of one neuron . E.g. for a 3x3 convolution and 64 feature channels in the previous layer N = 9 · 64 = 576.
數據增強:平移、旋轉、形變、灰度變化。形變最重要。原文敘述為We generate smooth deformations using random displacement vectors on a coarse 3 by 3 grid. The displacements are sampled from a Gaussian distribution with 10 pixels standard deviation. Per-pixel displacements are then computed using bicubic interpolation. Drop-out layers at the end of the contracting path perform further implicit data augmentation.
現在再看U-net,覺得他的確是分割領域「編碼-解碼」結構的典型代表。很多實現分割的任務都會拿他作對比,所以重要的並不是他在原始數據集上的實現,而是u-net結構的設計理念和他在各種數據集上的應用。
推薦閱讀:
※[譯文]下一代十億用戶是互聯網的未來
※看嘿逗智能水杯如何成為水杯中的「范冰冰」
※miniblink介面使用文檔
※文學與科技的較量
※蘋果今年新機發布會時間預測
TAG:讀書筆記 | 科技 | 深度學習DeepLearning |