NiftyNet項目對tensorflow進行了比較好的封裝,實現了一整套的DeepLearning流程。將數據加載、模型加載,網絡結構定義等進行了很好的分離,抽象封裝成了各自獨立的模塊。雖然抽象的概念比較多,使得整個項目更爲複雜,可是總體結構清晰,支持的模塊多。可擴展性尚未進行試驗,暫時不是很清楚。 該項目可以實現:正則表達式
項目支持醫學圖像的讀取,提供的讀取器有:xcode
在使用中遇到了一些問題,其訓練的速度很是慢。最開始單個iter的平均訓練時間估計在40秒以上,有的iter時間會有200秒。如今主要在查找性能瓶頸。babel
niftynet.engine.application_driver(ApplicationDriver)定義並驅動着整個Application的生命週期,將配置數據進行解析後,實例化Application並啓動流程。網絡
Application 做爲核心概念,承擔整個train或inference的主要功能。全部Application繼承於niftynet.application.base_application(簡稱爲BaseApplication)。BaseApplication使用單例模式。app
在Application類中,構建了Tensorflow的圖結構和建立Session用於驅動計算。
BaseApplication單例模式的具體實現有一點小問題。dom
Application所完成的工做具體能夠劃分紅如下4個環節ide
initialise_dataset_loader()
initialise_sampler()函數
initialise_network()post
connect_data_and_network()性能
interpret_output()
配置文件須要必須包含的模塊:
– [GAN]
– [SEGMENTATION]
– [REGRESSION]
– [AUTOENCODER]
Name |
解釋 |
例子 |
默認值 |
csv_file |
包含輸入圖像文件的列表 |
csvfile=filelist.csv |
'' |
pathtosearch |
若是沒有配置csv_file,則今後路徑下去搜索輸入圖像 |
pathtosearch=~/ct_data |
NiftyNet home folder |
filename_contains |
搜索輸入圖像時用於匹配的關鍵詞 |
filename_contains=foo, bar |
'' |
filenamenotcontains |
搜索輸入圖像時用於排除的關鍵詞 |
filenamenotcontains=ti, s1 |
'' |
filename_removefromid |
正則表達式,用於從輸入圖像的文件名中,解析出id |
filename_removefromid=foo |
'' |
interp_order |
插值法 |
interp_order=1 |
3 |
pixdim |
若是指定了,輸入的3D圖像會從新採樣到指定大小再送入網絡 |
pixdim=1.2, 1.2, 1.2 |
'' |
axcodes |
若是指定了,輸入的3D圖像會從新設定到指定的axcodes順序再送入網絡 參考文章 |
axcodes=L, P, S |
'' |
spatialwindowsize |
3個整數,指定輸入window的大小[能被8整除] |
spatialwindowsize=64, 64, 64 |
'' |
loader |
指定圖像讀取loader類型 |
loder=simpleitk |
None |
[interp_order] 當設定採樣方法爲resize時,須要這個參數對圖片上採樣或下采樣 1表示雙線性插值
0表示最近鄰插值
3表示三次樣條插值
Name |
解釋 |
例子 |
默認值 |
cude_devices |
指定GPU |
cuda_devices=0,1 |
'' |
num_threads |
預處理線程的數量 |
num_threads=8 |
2 |
num_gpus |
訓練時使用GPU數量 |
num_gpus=2 |
1 |
model_dir |
保存或讀取模型權重和Log的位置 |
model_dir=~/niftynet/xxx |
config文件所在目錄 |
datasetsplitfile |
用於將數據劃分紅training/validation/inferenct字集 |
datasetsplitfile=~/nifnet/xxx |
./datasetsplitfile.csv |
event_handler |
註冊事件處理 |
eventhandler=modelrestorer |
modelsaver, modelrestorer, samplerthreading, applygradients, outputinterpreter, consolelogger, tensorboard_logger |
Names |
解釋 |
例子 |
默認值 |
name |
所使用的網絡結構 |
name=niftynet.network.toynet.ToyNet |
‘’ |
activation_function |
設置網絡中使用的激活函數 |
activation_function=prelu |
Relu |
batch_size |
批大小 |
batch_size=10 |
2 |
smaller_final_batch_mode |
當總數據量不能被batch_size整除時,最後一個batch_size的方式 |
smaller_final_batch_mode=drop smaller_final_batch_mode=pad smaller_final_batch_mode=dynamic |
pad |
decay |
正則化參數 |
decay=1e-5 |
0.0 |
reg_type |
正則化類型 |
reg_type=L1 |
L2 |
volume_padding_size |
|
volume_padding_size=4, 4, 4 |
0, 0, 0 |
volume_padding_mode |
|
volume_padding_mode=symmetric |
minimum |
window_sampling |
採樣的類型 |
window_sampling=uniform 固定尺寸,相同的機率分佈 window_sampling=weighted 固定尺寸,根據intensity做爲機率分佈 window_sampling=balanced 固定尺寸,每一個label擁有相同採樣機率 window_sampling=resize 縮放圖像到window尺寸 |
uniform |
queue_length |
採樣時使用的buffer大小 |
queue_length=10 |
5 |
keep_prob |
若是網絡中使用了dropout |
keep_prob=0.2 |
1.0 |
Name |
解釋 |
例子 |
默認值 |
optimizer |
優化器類型 |
optimizer=momentum |
adam |
sample_per_volume |
每一個輸入圖像採樣的次數 |
sample_per_volume=5 |
1 |
lr |
學習率 |
lr=0.0001 |
0.1 |
loss_type |
loss計算方式 |
loss_type=CrossEntropy |
Dice |
starting_iter |
啓動的iter |
starting_iter=0 |
0 |
save_every_n |
保存的間隔 |
save_every_n=50 |
500 |
tensorboard_every_n |
tensorboard記錄的間隔 |
tensorboard_every_n=50 |
20 |
max_iter |
最大iter數 |
max_iter=3000 |
10000 |
max_checkpoints |
保存的最多checkpoint數 |
max_checkpoints=5 |
100 |
訓練時驗證
validation_every_n |
訓練時進行驗證的間隔 |
validation_every_n=10 |
-1 |
validation_max_iter |
驗證時iter的數量 |
validation_max_iter=5 |
1 |
exclude_fraction_for_validation |
驗證集的比重 |
exclude_fraction_for_validation=0.2 |
0.0 |
exclude_fraction_for_inference |
測試集的比重 |
exclude_fraction_for_inference=0.1 |
0.0 |
數據加強
rotation_angle |
旋轉 |
rotation_angle=-10.0, 10.0 |
‘’ |
scaling_percentage |
縮放 |
scaling_percentage=-20.0, 20.0 |
‘’ |
random_flipping_axes |
翻轉 |
random_flipping_axes=1,2 |
-1 |
Name |
解釋 |
例子 |
默認值 |
spatial_window_size |
網絡輸入尺寸大小 |
spatial_window_size=64,64,64 |
‘’ |
border |
輸入尺寸的邊框 |
border=5,5,5 |
0,0,0 |
inference_iter |
使用指定iter保存的權重文件 |
inference_iter=1000 |
-1 |
save_seg_dir |
保存輸出路徑 |
save_seg_dir=output/test |
output |
output_postfix |
輸出保存的後綴 |
output_postfix=_output |
_niftynet_out |
output_interp_order |
插值法 |
output_interp_order=0 |
0 |
dataset_to_infer |
使用的數據集,可選:’all’, ‘training’, ‘validation’, ‘inference’ |
dataset_to_infer=all |
‘’ |
n niftynet.io.image_reader模塊
ImageReader的主要做用是,遍歷一組目錄,搜索並返回一個圖像的列表,以及使用iterative的方式將數據加載到內存中。
ImageReader會建立一個tf.data.Dataset的對象,這樣使得模塊能夠很方便地接入到基於tensorflow的程序中。
ImageReader的特色:
l 設計用於支持醫療圖像數據的格式
l 支持多模態輸入數據
l 支持tf.data.Dataset
n niftynet.contrib.dataset_sampler
sampler將 image reader做爲輸入,從每張圖像中採起出結果輸出。
在不少的醫學圖像處理的狀況中,因爲GPU顯存的限制以及訓練效率等的考慮,網絡結構會對圖像的部分進行處理而非整張圖像。
項目中包含了一些已經實現的網絡:
– simulator_gan
– siple_gan
– highres3dnet, highres3dnetsmall, highres3dnetlarge
– toynet
– unet
– vnet
– dense_vnet
– deepmedic
– scalenet
– holisticnet
– unet_2d
– resnet
– se_resnet
– vae
已提供支持的loss計算方式
支持的優化器類型
NiftyNet項目的設計,使用了Signal和event handler模式,具體實現使用了blinker庫。這樣能夠方便地將模型保存,tensorboard記錄等操做進行配置。
目前可供註冊的signal有:
信號處理函數註冊到對應的信號後,由引擎負責調用。
網絡層的相關設計都封裝在Layer類中,可繼承layer類,實現定製化結構