选择文件->本地(提前把jpg放到本地,且放几张到前端)/服务器(不知道能不能导通)选择一张图片->一键分割->将图片前缀传给算法调用算法(后端把得到的预测nii切片成jpg
私下将所有的img原图数据集(可先准备一个原图)切片成jpg作为准备(已准备),提前就准备好。如果其他人使用,首先应自己准备一张jpg图片(所以切片功能可作为副页面)。
加载一张jpg到前端,传参数名图片前缀到算法test,得到一个nii预测后,再切片转成jpg(既然挪到本地就不用在管服务器如何再保存到本地了)加载到前端。
一、nii转jpg及问题
参考:批量nii文件转换成jpg格式_llly333的博客-CSDN博客_nii文件转换为jpg
用jupyter notebook运行,方便修改运行。
环境:名为open-mmlab的envs环境
改一下nii文件路径以及存放jpg路径即可。
import nibabel as nib
import numpy as np
import imageio
import os
#读取nii文件
def read_niifile(niifile): # 读取niifile文件
img = nib.load(niifile) # 下载niifile文件(其实是提取文件)
img_fdata = img.get_fdata() # 获取niifile数据
img90 = np.rot90(img_fdata) #旋转90度
#return img_fdata
return img90
#保存jpg文件并输出
def save_fig(file): # 保存为图片
fdata = read_niifile(file) # 调用上面的函数,获得数据
(y, x, z) = fdata.shape # 获得数据shape信息:(长,宽,维度-即切片数量)
for k in range(z):
silce = fdata[:, :, k]
#silce = fdata[k, :, :] # 三个位置表示三个不同角度的切片
imageio.imwrite(os.path.join(output, '{}.jpg'.format(os.path.splitext(os.path.splitext(i)[0])[0]+'_'+str(k))), silce)
# 将切片信息保存为jpg格式
#i表示获取到的nii文件名(不含路径)
#os.path.splitext(i)[0]表示去除文件名后缀
#用两次splitext是因为图像原格式为.nii.gz,需要去两次后缀,如果是.nii形式的文件只用去除一次后缀即可
#str(k)代表每层切片单独命名,避免重名,以_0,_1,...的形式命名
#读取文件
def findAllFile(base):
for root, ds, fs in os.walk(base):
for f in fs:
yield f
#设置文件路径
# base =r'C:\Users\nii' # nii文件的路径
base = "/media/exdisk/yrzheng/YanyiXia/002DSeg/code/01project_STUnet_both/predictions/TU_Synapse224/img/"
output = "/media/exdisk/yrzheng/YanyiXia/002DSeg/code/01project_STUnet_both/predictions/TU_Synapse224/img_jpg/" # 保存png的路径
for i in findAllFile(base):
dir = os.path.join(base,i)
savepicdir = (os.path.join(output,i))
#os.mkdir(savepicdir) #新建文件夹,重命名为nii文件名称,无需子文件夹,注释掉
save_fig(dir)
【仍遇到一些特别常见的问题】
1、上来模块报错:没有nibanel模块
原因:此环境下并不是没有安装此模块,只是没有安装jupyter,所以用的别的用户的jupyter,所以在别人环境下无此模块,所以安装jypyter在此环境下。
conda install jupyter
2、pip安装不到当下的envs环境,显示其他的环境,需运行pip命令如下
python -m pip install nibabel
3、缺少imageio模块同上安装
4、imagefile错误原因:在要遍历处理的文件夹下不光只含有nii文件,还放了其他文件,就转移掉即可
二、改测试test.py代码
pycharm激活码suspended,选择start trial开始试用即可,且记得选择下面的两个复选框,否则还不行
整个切片送到网络,花将近4分
换成一个切片送到网络,也花3分03
注意,for循环,range开始和结束不能相同,不然步长为0,就不执行for语句
range只写一个数,是默认从0开始,到结束数-1
计算结果八类也慢循环8次,一类就要好几秒
一个切片1分29秒
D:\SystemSeg\Anaconda\envs\python3.8\python.exe D:/SystemSeg/01project_STUnet_both/TransUNet/test_slice.py
Namespace(Dataset=<class 'datasets.dataset_synapse.Synapse_dataset'>, base_lr=0.01, batch_size=24, dataset='Synapse', deterministic=1, exp='TU_Synapse224', img_size=224, ind=95, is_pretrain=True, is_savenii=True, list_dir='case0001', max_epochs=150, max_iterations=20000, n_skip=3, num_classes=9, seed=1234, test_save_dir='../predictions', vit_name='R50-ViT-B_16', vit_patches_size=16, volume_path='../data/Synapse/test_vol_h5', z_spacing=1)
TU_pretrain_R50-ViT-B_16_skip3_epo150_bs24_224
1 test iterations per epoch
1it [01:29, 89.54s/it]idx 0 case case0001 mean_dice 0.026404 mean_hd95 72.593257
1it [01:29, 89.67s/it]
Mean class 1 mean_dice 0.015071 mean_hd95 84.332377
Mean class 2 mean_dice 0.046360 mean_hd95 40.475918
Mean class 3 mean_dice 0.052767 mean_hd95 45.475268
Mean class 4 mean_dice 0.042436 mean_hd95 25.612497
Mean class 5 mean_dice 0.018292 mean_hd95 139.258752
Mean class 6 mean_dice 0.018888 mean_hd95 129.019378
Mean class 7 mean_dice 0.000000 mean_hd95 0.000000
Mean class 8 mean_dice 0.017422 mean_hd95 116.571866
Testing performance in best val model: mean_dice : 0.026404 mean_hd95 : 72.593257
Process finished with exit code 0
【改test.py代码】
输入整个测试集代码保存一份
test.py代码没问题,dataset_Synapse.py代码没问题,utils.py代码没问题
回想起来了,测试test.py代码中,加载模型时名字是固定的,而我为了区别之前跑的好多参数的模型,就把先得到的模型测试好得到结果后,再给改了命名,下次用哪个改哪个即可
注:image,label标签中看不到数据很正常,前边切片没有
到第10个image后边100行才有,而且console终端里面显示不完全所以显得全是零,遇到这种情况没事多往后面维度和后面的行里看