利用pytorch对CT图像做深度学习的时候需要使用pytorch的图像处理的工具包transform,但是我看在CT图像上通常使用的是transform.ToTensor()将图像转换到[0,1],自然图像常常会使用transforms.Normalize()来将图像转换到[-1,1],对此查询了一下CT图像是否需要使用transforms.Normalize()很少有资料,抱着试一试的心态,自己钻研了一下怎么来使用这个函数
在此如果有人比较了解CT图像是否需要Normalize请指正。
网上查到的方法对transforms.Normalize()应用需要先使用transform.ToTensor()将图像转换到[0,1],然后再根据数据集的mean,std分别对数据集进行Normalize();
以下是计算我的数据集的mean,std的代码:
from torchvision.transforms import ToTensor
import numpy as np
from PIL import Image
import tqdm
import os
import torch
img_dir = "./training_dataset/" #数据集路径
# 使用assert 判断数据集路径是否存在,若存在程序继续向下执行,若不存在,最抛出异常:“image dir: '{img_dir}' does not exist.”
assert os.path.exists(img_dir), f"image dir: '{img_dir}' does not exist."
img_name_list=[]
for root ,sub, files in os.walk(img_dir): #遍历数据集
#print(os.path.splitext(os.path.basename(root)))
want_pngs = ['DegradePhase1','DegradePhase2','DegradePhase3','DegradePhase4', #筛选自己需要的数据集
'DegradePhase5','DegradePhase6','DegradePhase7','DegradePhase8','DegradePhase9','DegradePhase10']
for want_png in want_pngs:
if want_png in os.path.splitext(os.path.basename(root)):
print('OK')
for file in files:
if file.endswith(".png"):
file_name = os.path.join(root, file)
img_name_list.append(file_name)
print(len(img_name_list)) #总共25080张png图片 ,DegradePhase相关的图片11400张
cumulative_mean = torch.zeros(1) #CT图像是单通道,所以最后指建了一维tensor
cumulative_std = torch.zeros(1)
x_transform = ToTensor() #normalize之前需要ToTensor
print(f"INFO: {len(img_name_list)} imgs in total")
for img_name in tqdm.tqdm(img_name_list,total=len(img_name_list)):
img = np.array(Image.open(img_name)) #打开图像
img = x_transform(img) #转化成tensor并归一到[0,1]
C,H,W = img.shape[:3] #获取通道C,高H,宽W
img = img.view(C,-1) #将H,展平
#print(img.shape,img.dtype)
#print(img.mean())
cumulative_mean += img.mean(1) # 分别将将所有图片的每一个通道的值求均值再求和
cumulative_std += img.std(1) #分别将将所有图片的每一个通道的值求均标准差再求和
mean = cumulative_mean / len(img_name_list)
std = cumulative_std / len(img_name_list)
print(f"总数据量:{len(img_name_list)}")
print(f"mean: {mean}")
print(f"std: {std}")
最后输出:
ps:注意如果训练的时候改写transform的话,利用训练好的模型做预测的使用也需要使用与训练时一样的transform,不然会的到非常奇怪的结果