NiftyNet 項目瞭解

1. NiftyNet項目概述

NiftyNet項目對tensorflow進行了比較好的封裝,實現了一整套的DeepLearning流程。將數據加載、模型加載,網絡結構定義等進行了很好的分離,抽象封裝成了各自獨立的模塊。雖然抽象的概念比較多,使得整個項目更爲複雜,可是總體結構清晰,支持的模塊多。可擴展性尚未進行試驗,暫時不是很清楚。 該項目可以實現:正則表達式

  1. 圖像分割
  2. 圖像分類
  3. gan
  4. Autoencoder
  5. 迴歸

項目支持醫學圖像的讀取,提供的讀取器有:xcode

  1. nibabel 支持.nii醫學文件格式
  2. simpleitk 支持.dcm和.mhd格式的醫療圖像
  3. opencv 支持.jpg等常見圖像讀取,讀取後通道順序爲BGR
  4. skimage 支持.jpg等常見圖像讀取
  5. pillow 支持.jpg等常見圖像讀取

在使用中遇到了一些問題,其訓練的速度很是慢。最開始單個iter的平均訓練時間估計在40秒以上,有的iter時間會有200秒。如今主要在查找性能瓶頸。babel

 

 

 

1、       項目結構

niftynet.engine.application_driver(ApplicationDriver)定義並驅動着整個Application的生命週期,將配置數據進行解析後,實例化Application並啓動流程。網絡

i.              Application

Application 做爲核心概念,承擔整個train或inference的主要功能。全部Application繼承於niftynet.application.base_application(簡稱爲BaseApplication)。BaseApplication使用單例模式。app

在Application類中,構建了Tensorflow的圖結構和建立Session用於驅動計算。
BaseApplication單例模式的具體實現有一點小問題。dom

Application所完成的工做具體能夠劃分紅如下4個環節ide

  1. 輸入數據相關 數據加載,數據加強,數據取樣等,抽象在這兩個接口中在SegmentationApplication中,sampler支持:uniform, weighted, resized, balanced4種方式

      initialise_dataset_loader()
initialise_sampler()函數

  1. 網絡結構相關 網絡結構的定義,參數的管理,自定義操做等,抽象在此接口中

      initialise_network()post

  1. 模型共享相關 完成由網絡的輸入到網絡的輸出,計算loss、gradient,建立optimizer等,抽象在此接口中

      connect_data_and_network()性能

  1. 輸出解碼相關 inference將網絡輸出解碼操做,抽象在此接口中

      interpret_output()

ii.              Config

配置文件須要必須包含的模塊:

  • [SYSTEM]
  • [NETWORK]
  • 若是action爲train,那麼config中須要包含[TRAINING]模塊
  • 若是action爲inference,那麼config中須要包含[INFERENCE]模塊
  • 額外的,根據特定的application,會須要包含指定名稱的模塊。如:

–             [GAN]

–             [SEGMENTATION]

–             [REGRESSION]

–             [AUTOENCODER]

  • 除了以上的配置外,其餘的數據會處理爲input data source specifications【數據聲明模塊】
l  數據聲明模塊

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表示三次樣條插值

l  [SYSTEM]

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

l  [NETWORK]

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

 

l  [TRAINING]

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

 

 

l  [INFERENCE]

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

‘’

 

iii.              Reader & Dataset

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顯存的限制以及訓練效率等的考慮,網絡結構會對圖像的部分進行處理而非整張圖像。

iv.              Network

項目中包含了一些已經實現的網絡:

  1. GAN:

–             simulator_gan

–             siple_gan

  1. Segmentation:

–             highres3dnet, highres3dnetsmall, highres3dnetlarge

–             toynet

–             unet

–             vnet

–             dense_vnet

–             deepmedic

–             scalenet

–             holisticnet

–             unet_2d

  1. classification:

–             resnet

–             se_resnet

  1. autoencoder:

–             vae

v.              Loss

已提供支持的loss計算方式

  1. Segmentation
    1. CrossEntropy
    2. CrossEntropy_Dense
    3. Dice
    4. Dice_NS
    5. Dice_Dense
    6. Dice_Dense_NS
    7. Tversky
    8. GDSC
    9. WGDL
    10. SensSpec
    11. Gan
      1. CrossEntropy
      2. Regression
        1. L1Loss
        2. L2Loss
        3. RMSE
        4. MAE
        5. Huber
        6. Classification
          1. CrossEntropy
          2. AutoEncoder
            1. VariationalLowerBound

支持的優化器類型

  1. adam
  2. gradientdescent
  3. momentum
  4. nesterov
  5. adagrad
  6. rmsprop

vi.              Event機制

NiftyNet項目的設計,使用了Signal和event handler模式,具體實現使用了blinker庫。這樣能夠方便地將模型保存,tensorboard記錄等操做進行配置。

目前可供註冊的signal有:

  1. GRAPH_CREATED
  2. SESS_STARTED
  3. SESS_FINISHED
  4. ITER_STARTED
  5. ITER_FINISHED

信號處理函數註冊到對應的信號後,由引擎負責調用。

vii.              Layer

網絡層的相關設計都封裝在Layer類中,可繼承layer類,實現定製化結構

相關文章
相關標籤/搜索