U-net 閱讀筆記

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、數據增強,對於細胞分割主要採用細胞形變,主要參考download.csdn.net/detai

(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 |