NiftyNet是一款开源的卷积神经网络平台,专门针对医学图像处理分析,下面简单介绍一下我目前了解到的使用方法,进一步学习请查看官方文档
NiftyNet有很强的易用性,数据层,应用层,网络层等是完全独立的,
数据层(NiftyNet/niftynet/io),负责医学图像的读取,目前读取器有以下几种:
1. nibabel 支持.nii医学文件格式
2. simpleitk 支持.dcm和 .mhd格式的医疗图像
3. opencv 支持.jpg等常见图像读取,读取后通道顺序为BGR
4. skimage 支持.jpg等常见图像读取
5. pillow 支持.jpg等常见图像读取,通道顺序为RGB
应用层(NiftyNet/niftynet/application),:目前支持的应用有以下几种
1. 分割 (segmentation_application.py)
2. 分类 (classification_application.py)
3. Autoencoder
4. Gan生成网络
5. 回归
网络层(NiftyNet/niftynet/network),这个里面包含了已经实现的一些网络,resnet,dense_vnet,等,我们可以创建自己的网络结构后放在这个文件夹
每个网络要想运行,必须包含一个config.ini配置文件(默认情况下在C:\Users\Administrator\niftynet\extensions),用来设置训练/测试所用的全部参数,详细如下:
每个配置文件必须包含三个sections:
· [SYSTEM]
· [Application] 自己定义.如[SEGMENTATION],[GAN],等
如果是训练(train)阶段,还必须有一个[TRAINING]和 [Input data source] section可以自己命名,比如[ct],还得有一个[label]section
如果是测试(inference)阶段,必须包含 [INFERENCE] section和输入数据section
下面介绍每个section的参数
[Input data source ]
1.path_to_search 数据集路径,如果有多个,用逗号分开
2.filename_contains 数据文件包含的字符串
3.filename_not_contains 数据文件不包含的字符串
以上两个用于限定路径下的数据文件是什么
4.spatial_window_size 输入到网络中的图片尺寸,要指明三个维度,前两个维度表示图片的长和宽,第三个维度如果为1表示用2d卷积,不是1的话就是3d卷积的深度
5.interp_order 插值法,当设定采样方法为resize时,需要这个参数对图片上采样或下采样,1表示双线性插值,0表示最近邻插值,3表示三次样条插值,默认为3
6.axcodes 如果设定了这个参数,3D的图片要重新设定到指定的axcodes这个顺序后再进入网络
7 loader 图片读取器,按照上面介绍的内容设定,比如是dcm文件,就指定loader= simpleitk
[label]
与[Input data source section]类似
[SYSTEM]
1. cuda_devices
设置 tensorflow 的CUDA_VISIBLE_DEVICES变量
2. model_dir
预训练模型的位置
[NETWORK]
1.name
NiftyNet/niftynet/network 里面的一个网络,比如,如果设置为niftynet.network.toynet.ToyNet,那么就会利用niftynet/network/toynet.py中定义的网络结构(class)
2.activation_function
可选参数,设定网络的激活函数
batch_size
设定batch_size
3.volume_padding_size
对输入图片设定padding_size,不需要,则为0
4.window_sampling,进入网络的image的采样方法 ,包括两种
·1) resize 如果图片大小不一,设定为resize,会让进入网络的图片首先resize到spatial_window_size
··2)uniform 输出的图片保持原本的大小,采样器随机选取spatial_window_size尺寸的区域,相当于 random cropping
5.queue_length
Niftynet的数据读取方法类似于tensorflow,设置两个队列,一个队列(sample)负责从数据集读取数据并扰乱顺序,另一个队列负责从前一个队列(sample)中读取batch_size张图片输入网络,这个参数就是指第一个队列的长度,为了使扰乱顺序(randomised)更加有意义,这个参数最小值为batch_size * 2.5
[TRAINING]
1.·optimiser 设定优化算法类型,包括 adagrade ,adam,gradientdescent,momentum,rmsprop,nesterov
2.sample_per_volume 每张图片的采样次数,(只有设置采样方法为uniform时才有意义?)
3.lr 学习率
loss_type 损失函数类型,包括常见的损失函数,及医疗领域的损失函数,详见niftynet/layer/loss_*
4.starting_iter 设定为0,把参数随机初始化后开始训练,设定为1,先加载最新的模型,再继续训练
5.save_every_n 每训练多少次,保存一次
6.max_iter 最大迭代次数
[INFERENCE]
1.spatial_window_size :输出图像的尺寸,默认为输入的spatial_window_size大小
2.border 默认为0,当输出图像与输入图像尺寸不一致时,设置其才有意义
3.inference_iter 使用训练了多少次的模型去作预测,设置为-1或者没写这个参数,表示用最新的模型
4.output_interp_order 输出图片的插值方法和前面一样
5.save_seg_dir¶ 输出结果保存路径
要建立一个workflow可以用以下方法:
1.首先cd 到NiftyNet所在目录,,比如, cd /home/wangqiuli/Documents/NiftyNet
2. python net_run.py [train|inference] -c <path_to/config.ini> -a <application>
注意:
Train/inference 二选一,分别表示训练/测试, -c 配置文件路径,-a 将要import的应用种类,
注意,应该写成以下形式user.path.python.module.MyApplication,将从user/path/python/module.py/中import MyApplication类
比如:
python net_run.py -a niftynet.application.segmentation_application.SegmentationApplication -c path/config.ini
也可以写成
Python net_segment -c
如果要更改参数,可以直接去config.ini修改,也可以直接命令行修改,比如,只修改网络
Python net_segment.py train -c config.ini --name my_network_collection.new_net.NewNet
注意:进行新的训练前,请把models文件夹里面的.csv文件删除