基于分割网络Unet生成虚拟图像

本文基于Unet分割网络,利用49例头部磁共振T1、T2数据,通过配准使二者解剖位置一致,转换数据格式并裁剪窗宽窗位,构建数据集。以T1为输入、T2为标签训练Unet进行回归,用SSIM评估,经200轮训练,最佳SSIM达0.571,实现由T1生成虚拟T2图像。

☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

基于分割网络unet生成虚拟图像 - 创想鸟

基于分割网络Unet生成虚拟图像

这个想法是基于

[1]高留刚, 李春迎, 陆正大,等. 基于卷积神经网络生成虚拟平扫CT图像[J]. 中国医学影像技术, 2022, 38(3):5.

【1】文章使用Unet对增强CT数据进行训练,最终预测生成对应的虚拟平扫CT图像,达到只需要对患者扫描一次CT即可,避免患者接受过多的放射辐射。基于分割网络Unet生成虚拟图像 - 创想鸟

【2】因为本项目没有对应的CT数据,刚好有一个T1、T2磁共振头部公开数据,先磁共振数据进行配准,然后输入T1模态的数据到Unet中然后生成对应的T2模态数据。基于分割网络Unet生成虚拟图像 - 创想鸟

1. 数据

数量:49例

模态和部位:磁共振的T1和T2头部数据 基于分割网络Unet生成虚拟图像 - 创想鸟

In [ ]

#解压数据!unzip -o /home/aistudio/data/data146796/mydata.zip -d /home/aistudio/work

In [ ]

#antspyx 是一个配准工具包,SImpleITK处理医学数据!pip install antspyx SimpleITK

In [ ]

import osimport antsimport SimpleITK as sitkfrom tqdm import tqdmimport numpy as npimport randomimport matplotlib.pyplot as pltimport paddleimport cv2

2. 对数据进行配准

项是利用 Unet对像素数值进行回归预测。所以在进入网路之前,除了像素值的尺寸不同之外,原资料与标记资料的解剖学位置应当是相同的。因此,必须将原始资料与标签资料进行匹配,使二者重新整合。比如下面这张图片,T1有256层,T2有136层,显然是解剖位置不对,然后经过配准后的T2有256层,和T1层的解剖学位置一模一样。对齐后的数据可以作为标记输入到网络中。基于分割网络Unet生成虚拟图像 - 创想鸟

In [ ]

#因为配准花费的时间太久太久了,本项目的数据已经包含好了配准后的数据。#因此不用运行此代码path  = '/home/aistudio/work/mydata/IXI-T1'for f in tqdm(os.listdir(path)):    f_path = os.path.join(path,f)    m_path = os.path.join('/home/aistudio/work/mydata/IXI-T2',f.replace('T1','T2'))    f_img = ants.image_read(f_path)    m_img = ants.image_read(m_path)    mytx = ants.registration(fixed=f_img, moving=m_img, type_of_transform='SyN')    # 将形变场作用于moving图像,得到配准后的图像    warped_img = ants.apply_transforms(fixed=f_img, moving=m_img, transformlist=mytx['fwdtransforms'],                                    interpolator="linear")    # 将配准后图像的direction/origin/spacing和原图保持一致    warped_img.set_direction(f_img.direction)    warped_img.set_origin(f_img.origin)    warped_img.set_spacing(f_img.spacing)    img_name = '/home/aistudio/work/mydata/IXI-T2-warped/'+ f.replace('T1','Warped')    # ants.image_write(warped_img, img_name)print("End")

3. 转换数据形式

原始数据格式是NIFIT,是属于医疗数据格式的一种。把NIFIT数据转换成numpy,并对窗宽窗位进行裁剪到0~255。并生成txt文档,用作构建DataSet使用。

In [ ]

random.seed(2022)save_path = '/home/aistudio/work/npdata'save_origin_path = "/home/aistudio/work/npdata/origin/"save_label_path =  "/home/aistudio/work/npdata/label/"if not os.path.exists(save_path):    os.mkdir(save_path)    os.mkdir(save_origin_path)    os.mkdir(save_label_path)origin_data = '/home/aistudio/work/mydata/IXI-T1'f_list = os.listdir(origin_data)random.shuffle(f_list)split = int(len(f_list)*0.9)t_f_list = f_list[:split]v_f_list = f_list[split:]def gen_txt(f_list,name):    txt = open( os.path.join(save_path,name),'w')    for f in f_list:        if '.ipynb_checkpoints' in f:            continue        f_path = os.path.join(origin_data,f)        tag_path = os.path.join(origin_data.replace('T1','T2-warped'),f.replace('T1','Warped'))        f_sitkData = sitk.ReadImage(f_path)        tag_sitkData = sitk.ReadImage(tag_path)        f_npData = sitk.GetArrayFromImage(f_sitkData)        tag_npData = sitk.GetArrayFromImage(tag_sitkData)        f.split('-')[0]        for i in range(100,200):            f_slice = np.rot90(f_npData[:,i,:],-1)            tag_slice = np.rot90(tag_npData[:,i,:],-1)            f_slice = (f_slice - 0) / ((835 - 0) / 255)            np.clip(f_slice, 0, 255, out=f_slice)            tag_slice = (tag_slice - 0) / ((626 - 0) / 255)            np.clip(tag_slice, 0, 255, out=tag_slice)                        f_save_path = save_origin_path+f.split('-')[0]+'_'+str(i) +'.npy'            tag_save_path = save_label_path+f.split('-')[0]+'_'+str(i) +'.npy'            np.save(f_save_path,f_slice)            np.save(tag_save_path,tag_slice)            txt.write(f_save_path + ' ' + tag_save_path+ 'n')    txt.close()gen_txt(t_f_list,name='train.txt')gen_txt(v_f_list,name='val.txt')print('完成')

4. 构建Dataset

数据增强只采用 缩放到256×256。

In [4]

from paddle.io import Dataset, DataLoaderfrom paddle.vision.transforms import Resizeclass MyDataset(Dataset):    def __init__(self, data_dir, txt_path, transform=None):        super(MyDataset, self).__init__()        self.data_list = []        with open(txt_path,encoding='utf-8') as f:            for line in f.readlines():                image_path, label_path = line.split(' ')                image_path = image_path.strip()                label_path = label_path.strip()                image_path = os.path.join(data_dir, image_path)                label_path = os.path.join(data_dir,label_path)                self.data_list.append([image_path, label_path])        self.transform = transform    def __getitem__(self, index):        image_path, label_path = self.data_list[index]        image = np.load(image_path)        label = np.load(label_path)        if self.transform is not None:            image = self.transform(image)            label = self.transform(label)                image = image[np.newaxis,:].astype('float32')        label = label[np.newaxis,:].astype('float32')        return image, label    def __len__(self):        return len(self.data_list)BatchSize = 24transform = Resize(size=(256,256))t_dataset = MyDataset('/home/aistudio','work/npdata/train.txt',transform=transform)v_dataset = MyDataset('/home/aistudio','work/npdata/val.txt',transform=transform)train_loader = DataLoader(t_dataset,batch_size=BatchSize)  val_loader = DataLoader(v_dataset,batch_size=BatchSize)

5. 评价指标 SSIM

SSIM (Structure Similarity Index Measure) 结构衡量指标

结构相似指标可以衡量图片的失真程度,也可以衡量两张图片的相似程度,SSIM指标感知模型,即更符合人眼的直观感受。SSIM 主要考量图片的三个关键特征:亮度(Luminance), 对比度(Contrast), 结构 (Structure)。SSIM取值约接近1,两张图片的相似度约接近。两张图片一模一样,SSIM=1

参考文章 https://zhuanlan.zhihu.com/p/399215180

In [6]

def ssim(img1, img2):  C1 = (0.01 * 255)**2  C2 = (0.03 * 255)**2  img1 = img1.astype(np.float64)  img2 = img2.astype(np.float64)  kernel = cv2.getGaussianKernel(11, 1.5)  window = np.outer(kernel, kernel.transpose())  mu1 = cv2.filter2D(img1, -1, window)[5:-5, 5:-5] # valid  mu2 = cv2.filter2D(img2, -1, window)[5:-5, 5:-5]  mu1_sq = mu1**2  mu2_sq = mu2**2  mu1_mu2 = mu1 * mu2  sigma1_sq = cv2.filter2D(img1**2, -1, window)[5:-5, 5:-5] - mu1_sq  sigma2_sq = cv2.filter2D(img2**2, -1, window)[5:-5, 5:-5] - mu2_sq  sigma12 = cv2.filter2D(img1 * img2, -1, window)[5:-5, 5:-5] - mu1_mu2  ssim_map = ((2 * mu1_mu2 + C1) * (2 * sigma12 + C2)) / ((mu1_sq + mu2_sq + C1) *                              (sigma1_sq + sigma2_sq + C2))  return ssim_map.mean()def calculate_ssim(img1, img2):  if not img1.shape == img2.shape:    raise ValueError('Input images must have the same dimensions.')  if img1.ndim == 2:    return ssim(img1, img2)  elif img1.ndim == 3:    if img1.shape[2] == 3:      ssims = []      for i in range(3):        ssims.append(ssim(img1, img2))      return np.array(ssims).mean()    elif img1.shape[2] == 1:      return ssim(np.squeeze(img1), np.squeeze(img2))  else:    raise ValueError('Wrong input image dimensions.')for data in t_dataset:    img1,img2 = data    plt.figure(figsize=(10,6))    plt.subplot(1,2,1)    plt.imshow(np.squeeze(img1),'gray')    plt.title("T1 mode")    plt.subplot(1,2,2)    plt.imshow(np.squeeze(img2),'gray')    plt.title("T2 mode")    print(f'SSIM:{calculate_ssim(np.squeeze(img1),np.squeeze(img2))}')    break
SSIM:0.4927141870957079

6. 导入Unet模型,开始训练

Unet网络是一种语义分割网络,输入原始图像和对应的标签Mask图像到Unet网络中进行分割,最终输出和标签Mask一致的图像。实际也是对像素值进行分类。把原始图像中的像素值进行分类,到底是属于Mask图像中像素值0,还是像素值1等等。这里是使用Unet网络进行回归,因此网络输出的类别是1。基于分割网络Unet生成虚拟图像 - 创想鸟

In [8]

from model.unet import UNetimg = paddle.rand([2, 1, 256, 256])model = UNet()out = model(paddle.rand([2, 1, 256, 256]))print(out.shape)
[2, 1, 256, 256]

In [9]

def evaluation(model,val_dataset):    """验证"""    model.eval()    ssims = []    for data in val_dataset:        image,label = data        image = image[np.newaxis,:].astype('float32')        image = paddle.to_tensor(image)        pre = model(image).numpy()        pre = np.squeeze(pre).astype('int32')        ssims.append(calculate_ssim(np.squeeze(label.astype('int32')),pre))    return np.array(ssims).mean()def train(model,epochs):    if not os.path.exists('/home/aistudio/save_model'):        os.mkdir('/home/aistudio/save_model')    steps = int(len(t_dataset)/BatchSize) * epochs    best_ssim = 0 #记录最优的ssim得分    model.train()    scheduler = paddle.optimizer.lr.PolynomialDecay(learning_rate=0.05, decay_steps=steps, verbose=False)    opt = paddle.optimizer.Adam(learning_rate=scheduler, parameters=model.parameters())        for epoch_id in range(epochs):        for batch_id, data in enumerate(train_loader()):            images, labels = data            images = paddle.to_tensor(images)            labels = paddle.to_tensor(labels)            predicts = model(images)            mse_loss = paddle.nn.MSELoss()            l1_loss = paddle.nn.L1Loss()            loss = mse_loss(predicts, labels)+l1_loss(predicts,labels)            if batch_id % 200 == 0:                print("epoch: {}, batch: {}, loss is: {}".format(epoch_id, batch_id, loss.numpy()))            loss.backward()            opt.step()            opt.clear_grad()        #训练过程中,保存模型参数        if epoch_id % 10 == 0:            paddle.save(model.state_dict(), '/home/aistudio/save_model/'+str(epoch_id)+'model.pdparams')                        model.eval()            #训练过程中,预览效果,输入T1图片,预测t2图片            data = t_dataset[150]            img,label = data            input = img[np.newaxis,:].astype('float32')            input = paddle.to_tensor(input)            pre = model(input).numpy()            pre = np.squeeze(pre)            plt.figure(figsize=(12,6))            plt.subplot(1,3,1)            plt.imshow(np.squeeze(img),'gray')            plt.title("input: T1 mode")            plt.subplot(1,3,2)            plt.imshow(np.squeeze(label),'gray')            plt.title("target:T2 mode")            plt.subplot(1,3,3)            plt.imshow(pre,'gray')            plt.title("pre: T2 mode")            plt.show()            v_ssim_mean = evaluation(model, v_dataset)            if v_ssim_mean > best_ssim:                paddle.save(model.state_dict(), '/home/aistudio/save_model/best_model.pdparams')                best_ssim = v_ssim_mean            model.train()            print(f'val_SSIM: {v_ssim_mean},Best_SSIM:{best_ssim}')       #启动训练过程train(model,epochs= 200)
epoch: 0, batch: 0, loss is: [7316.7188]
val_SSIM: 0.39978080604275146,Best_SSIM:0.39978080604275146epoch: 1, batch: 0, loss is: [2628.9192]epoch: 2, batch: 0, loss is: [2724.6853]epoch: 3, batch: 0, loss is: [2688.8508]epoch: 4, batch: 0, loss is: [2686.88]epoch: 5, batch: 0, loss is: [2608.186]epoch: 6, batch: 0, loss is: [2520.5952]epoch: 7, batch: 0, loss is: [2692.3694]epoch: 8, batch: 0, loss is: [2702.1028]epoch: 9, batch: 0, loss is: [2628.6016]epoch: 10, batch: 0, loss is: [2485.4382]
val_SSIM: 0.4802982366278921,Best_SSIM:0.4802982366278921epoch: 11, batch: 0, loss is: [2507.683]epoch: 12, batch: 0, loss is: [2434.3452]epoch: 13, batch: 0, loss is: [2408.262]epoch: 14, batch: 0, loss is: [2332.7097]epoch: 15, batch: 0, loss is: [2270.0247]epoch: 16, batch: 0, loss is: [2179.795]epoch: 17, batch: 0, loss is: [2138.3933]epoch: 18, batch: 0, loss is: [2093.4106]epoch: 19, batch: 0, loss is: [1887.1506]epoch: 20, batch: 0, loss is: [2024.5569]
val_SSIM: 0.49954443953370115,Best_SSIM:0.49954443953370115epoch: 21, batch: 0, loss is: [1973.8619]epoch: 22, batch: 0, loss is: [1956.6097]epoch: 23, batch: 0, loss is: [1909.3981]epoch: 24, batch: 0, loss is: [1875.7285]epoch: 25, batch: 0, loss is: [1837.553]epoch: 26, batch: 0, loss is: [1812.5168]epoch: 27, batch: 0, loss is: [1785.5492]epoch: 28, batch: 0, loss is: [1774.7295]epoch: 29, batch: 0, loss is: [1752.758]epoch: 30, batch: 0, loss is: [1756.8203]
val_SSIM: 0.5426780015544808,Best_SSIM:0.5426780015544808epoch: 31, batch: 0, loss is: [1735.7894]epoch: 32, batch: 0, loss is: [1827.0814]epoch: 33, batch: 0, loss is: [1753.9219]epoch: 34, batch: 0, loss is: [1779.7365]epoch: 35, batch: 0, loss is: [1752.4994]epoch: 36, batch: 0, loss is: [1747.4668]epoch: 37, batch: 0, loss is: [1735.7844]epoch: 38, batch: 0, loss is: [1769.8733]epoch: 39, batch: 0, loss is: [1759.1631]epoch: 40, batch: 0, loss is: [1630.8364]
val_SSIM: 0.4373114577520071,Best_SSIM:0.5426780015544808epoch: 41, batch: 0, loss is: [1611.3628]epoch: 42, batch: 0, loss is: [1715.6615]epoch: 43, batch: 0, loss is: [1763.4269]epoch: 44, batch: 0, loss is: [1737.9359]epoch: 45, batch: 0, loss is: [1772.5739]epoch: 46, batch: 0, loss is: [1738.1847]epoch: 47, batch: 0, loss is: [1775.006]epoch: 48, batch: 0, loss is: [1911.8531]epoch: 49, batch: 0, loss is: [2033.4453]epoch: 50, batch: 0, loss is: [1987.3456]
val_SSIM: 0.5579299673856584,Best_SSIM:0.5579299673856584epoch: 51, batch: 0, loss is: [1836.5175]epoch: 52, batch: 0, loss is: [1861.1411]epoch: 53, batch: 0, loss is: [1845.1718]epoch: 54, batch: 0, loss is: [1740.5963]epoch: 55, batch: 0, loss is: [1660.3125]epoch: 56, batch: 0, loss is: [1726.9702]epoch: 57, batch: 0, loss is: [1635.8535]epoch: 58, batch: 0, loss is: [1610.6799]epoch: 59, batch: 0, loss is: [1568.5394]epoch: 60, batch: 0, loss is: [1617.876]
val_SSIM: 0.5634165131362056,Best_SSIM:0.5634165131362056epoch: 61, batch: 0, loss is: [1561.1827]epoch: 62, batch: 0, loss is: [1597.7261]epoch: 63, batch: 0, loss is: [1525.599]epoch: 64, batch: 0, loss is: [1548.1874]epoch: 65, batch: 0, loss is: [1488.4364]epoch: 66, batch: 0, loss is: [1513.0366]epoch: 67, batch: 0, loss is: [1505.5546]epoch: 68, batch: 0, loss is: [1516.5098]epoch: 69, batch: 0, loss is: [1467.4851]epoch: 70, batch: 0, loss is: [1585.8317]
val_SSIM: 0.5709971328311436,Best_SSIM:0.5709971328311436epoch: 71, batch: 0, loss is: [1457.6887]epoch: 72, batch: 0, loss is: [1467.6174]epoch: 73, batch: 0, loss is: [1471.8882]epoch: 74, batch: 0, loss is: [1459.0536]epoch: 75, batch: 0, loss is: [1458.9404]epoch: 76, batch: 0, loss is: [1634.24]epoch: 77, batch: 0, loss is: [1650.2292]epoch: 78, batch: 0, loss is: [1437.5302]epoch: 79, batch: 0, loss is: [1421.7593]epoch: 80, batch: 0, loss is: [1413.1609]
val_SSIM: 0.5701560896501561,Best_SSIM:0.5709971328311436epoch: 81, batch: 0, loss is: [1409.3071]epoch: 82, batch: 0, loss is: [1404.0553]epoch: 83, batch: 0, loss is: [1420.5449]epoch: 84, batch: 0, loss is: [1398.2864]epoch: 85, batch: 0, loss is: [1488.5781]epoch: 86, batch: 0, loss is: [1401.356]epoch: 87, batch: 0, loss is: [1410.7175]epoch: 88, batch: 0, loss is: [1500.6272]epoch: 89, batch: 0, loss is: [1416.3497]epoch: 90, batch: 0, loss is: [1380.4263]
val_SSIM: 0.5465621052241267,Best_SSIM:0.5709971328311436epoch: 91, batch: 0, loss is: [1372.7605]epoch: 92, batch: 0, loss is: [1367.5848]epoch: 93, batch: 0, loss is: [1376.7378]epoch: 94, batch: 0, loss is: [1370.2089]epoch: 95, batch: 0, loss is: [1365.8433]epoch: 96, batch: 0, loss is: [1369.1512]epoch: 97, batch: 0, loss is: [1369.3212]epoch: 98, batch: 0, loss is: [1404.3115]epoch: 99, batch: 0, loss is: [1354.4286]epoch: 100, batch: 0, loss is: [1382.9532]
val_SSIM: 0.5378666148453135,Best_SSIM:0.5709971328311436epoch: 101, batch: 0, loss is: [1387.7471]epoch: 102, batch: 0, loss is: [1424.3396]epoch: 103, batch: 0, loss is: [1349.6024]epoch: 104, batch: 0, loss is: [1366.5181]epoch: 105, batch: 0, loss is: [1352.3512]epoch: 106, batch: 0, loss is: [1353.1865]epoch: 107, batch: 0, loss is: [1352.0631]epoch: 108, batch: 0, loss is: [1343.2163]epoch: 109, batch: 0, loss is: [1345.3413]epoch: 110, batch: 0, loss is: [1346.6847]
val_SSIM: 0.5586893791021966,Best_SSIM:0.5709971328311436epoch: 111, batch: 0, loss is: [1343.9454]epoch: 112, batch: 0, loss is: [1349.0774]epoch: 113, batch: 0, loss is: [1337.5864]epoch: 114, batch: 0, loss is: [1429.8538]epoch: 115, batch: 0, loss is: [1349.8104]epoch: 116, batch: 0, loss is: [1335.1368]epoch: 117, batch: 0, loss is: [1337.9221]epoch: 118, batch: 0, loss is: [1352.1951]epoch: 119, batch: 0, loss is: [1347.4542]epoch: 120, batch: 0, loss is: [1336.236]
val_SSIM: 0.4977443843057142,Best_SSIM:0.5709971328311436epoch: 121, batch: 0, loss is: [1341.1677]epoch: 122, batch: 0, loss is: [1325.7648]epoch: 123, batch: 0, loss is: [1322.5]epoch: 124, batch: 0, loss is: [1322.8683]epoch: 125, batch: 0, loss is: [1319.6675]epoch: 126, batch: 0, loss is: [1319.3303]epoch: 127, batch: 0, loss is: [1320.0753]epoch: 128, batch: 0, loss is: [1316.222]epoch: 129, batch: 0, loss is: [1336.7915]epoch: 130, batch: 0, loss is: [1321.2736]
val_SSIM: 0.47030362428033146,Best_SSIM:0.5709971328311436epoch: 131, batch: 0, loss is: [1339.2891]epoch: 132, batch: 0, loss is: [1318.2183]epoch: 133, batch: 0, loss is: [1325.5737]epoch: 134, batch: 0, loss is: [1308.886]epoch: 135, batch: 0, loss is: [1298.8752]epoch: 136, batch: 0, loss is: [1302.0266]epoch: 137, batch: 0, loss is: [1279.0824]epoch: 138, batch: 0, loss is: [1313.5026]epoch: 139, batch: 0, loss is: [1317.8335]epoch: 140, batch: 0, loss is: [1325.1211]
val_SSIM: 0.5129117285623543,Best_SSIM:0.5709971328311436epoch: 141, batch: 0, loss is: [1307.1959]epoch: 142, batch: 0, loss is: [1312.2686]epoch: 143, batch: 0, loss is: [1320.1404]epoch: 144, batch: 0, loss is: [1326.3783]epoch: 145, batch: 0, loss is: [1308.4757]epoch: 146, batch: 0, loss is: [1318.8088]epoch: 147, batch: 0, loss is: [1297.8518]epoch: 148, batch: 0, loss is: [1296.301]epoch: 149, batch: 0, loss is: [1301.2318]epoch: 150, batch: 0, loss is: [1290.0143]
val_SSIM: 0.4650640222375466,Best_SSIM:0.5709971328311436epoch: 151, batch: 0, loss is: [1320.3531]epoch: 152, batch: 0, loss is: [1311.9688]epoch: 153, batch: 0, loss is: [1302.6729]epoch: 154, batch: 0, loss is: [1302.4635]epoch: 155, batch: 0, loss is: [1286.9762]epoch: 156, batch: 0, loss is: [1284.86]epoch: 157, batch: 0, loss is: [1290.937]epoch: 158, batch: 0, loss is: [1274.3252]epoch: 159, batch: 0, loss is: [1280.6571]epoch: 160, batch: 0, loss is: [1286.4685]
val_SSIM: 0.4561319579342975,Best_SSIM:0.5709971328311436epoch: 161, batch: 0, loss is: [1270.9604]epoch: 162, batch: 0, loss is: [1287.5771]epoch: 163, batch: 0, loss is: [1269.8563]epoch: 164, batch: 0, loss is: [1286.9226]epoch: 165, batch: 0, loss is: [1272.0933]epoch: 166, batch: 0, loss is: [1274.8392]epoch: 167, batch: 0, loss is: [1272.4178]epoch: 168, batch: 0, loss is: [1266.7671]epoch: 169, batch: 0, loss is: [1282.4298]epoch: 170, batch: 0, loss is: [1247.015]
val_SSIM: 0.49646587443554935,Best_SSIM:0.5709971328311436epoch: 171, batch: 0, loss is: [1250.8077]epoch: 172, batch: 0, loss is: [1287.3835]epoch: 173, batch: 0, loss is: [1248.3782]epoch: 174, batch: 0, loss is: [1249.7322]epoch: 175, batch: 0, loss is: [1273.4828]epoch: 176, batch: 0, loss is: [1253.0632]epoch: 177, batch: 0, loss is: [1281.6831]epoch: 178, batch: 0, loss is: [1280.6669]epoch: 179, batch: 0, loss is: [1245.0092]epoch: 180, batch: 0, loss is: [1257.4398]
val_SSIM: 0.46512517332255776,Best_SSIM:0.5709971328311436epoch: 181, batch: 0, loss is: [1242.4584]epoch: 182, batch: 0, loss is: [1254.164]epoch: 183, batch: 0, loss is: [1238.1926]epoch: 184, batch: 0, loss is: [1243.1198]epoch: 185, batch: 0, loss is: [1248.0677]epoch: 186, batch: 0, loss is: [1240.6064]epoch: 187, batch: 0, loss is: [1252.3843]epoch: 188, batch: 0, loss is: [1230.179]epoch: 189, batch: 0, loss is: [1237.1627]epoch: 190, batch: 0, loss is: [1232.43]
val_SSIM: 0.4939679476601408,Best_SSIM:0.5709971328311436epoch: 191, batch: 0, loss is: [1245.5471]epoch: 192, batch: 0, loss is: [1255.1567]epoch: 193, batch: 0, loss is: [1250.8704]epoch: 194, batch: 0, loss is: [1223.4425]epoch: 195, batch: 0, loss is: [1224.8658]epoch: 196, batch: 0, loss is: [1230.7142]epoch: 197, batch: 0, loss is: [1229.7573]epoch: 198, batch: 0, loss is: [1235.9465]epoch: 199, batch: 0, loss is: [1225.0635]

以上就是基于分割网络Unet生成虚拟图像的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/59535.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
云米冰箱通讯故障处理方法(解决云米冰箱通讯故障的实用方法及维修步骤)
上一篇 2025年11月10日 14:57:43
如何使用SQL的ALTER语句?修改表结构的实用技巧
下一篇 2025年11月10日 14:57:50

相关推荐

  • 抖音蝴蝶号无人直播带货操作流程及注意事项

    抖音蝴蝶号无人直播带货操作流程及注意事项抖音蝴蝶号无人直播带货操作流程及注意事项抖音蝴蝶号无人直播带货操作流程及注意事项抖音蝴蝶号无人直播带货操作流程及注意事项

    “抖音蝴蝶号无人直播带货”是一种通过自动化或半自动化技术实现的直播销售模式。①其核心在于摆脱真人主播限制,实现24小时不间断直播,提升效率与流量利用率;②关键步骤包括明确账号定位与商品选择、准备高质量且丰富的内容素材、利用虚拟人或预录内容实现直播推流、结合智能客服模拟评论区互动;③优势在于降低人力成…

    2026年9月21日 用户投稿
    500
  • VSCode侧边栏怎么去掉_VSCode侧边栏隐藏教程

    隐藏VSCode侧边栏可通过Ctrl + B(Windows/Linux)或Cmd + B(macOS)快捷键快速切换,也可通过菜单栏“视图 > 外观 > 切换侧边栏可见性”或命令面板执行“View: Toggle Sidebar Visibility”实现。推荐使用快捷键操作,效率最高…

    2026年9月21日
    000
  • win10连接打印机错误0x00000709怎么办_win10打印机连接错误修复方法

    错误代码0x00000709通常因权限不足、系统更新冲突或服务异常导致共享打印机连接失败。可使用专业工具一键修复,或通过修改注册表权限、卸载KB5005569等特定更新、重启Print Spooler及相关服务,以及添加Windows凭据(如IP地址和guest账户)解决该问题。 当您在Window…

    2026年9月21日
    100
  • MobileCLIP2— 苹果开源的端侧多模态模型

    MobileCLIP2— 苹果开源的端侧多模态模型MobileCLIP2— 苹果开源的端侧多模态模型MobileCLIP2— 苹果开源的端侧多模态模型MobileCLIP2— 苹果开源的端侧多模态模型

    ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 可图大模型 可图大模型(Kolors)是快手大模型团队自研打造的文生图AI大模型 32 查看详情 MobileCLIP2是什么 mobileclip2是由苹果研究团队开发的新一代高效多模态模型,…

    2026年9月21日 用户投稿
    100
  • 如何利用蝴蝶号自动直播间打造被动收入系统

    如何利用蝴蝶号自动直播间打造被动收入系统如何利用蝴蝶号自动直播间打造被动收入系统如何利用蝴蝶号自动直播间打造被动收入系统如何利用蝴蝶号自动直播间打造被动收入系统

    要打造蝴蝶号自动直播间实现被动收入,核心在于用预设内容和智能系统替代真人出镜,构建低干预、可持续的流量转化模式。1.内容策略上选择“长寿型”内容,如软件教程、助眠音频、产品演示,并设计循环播放逻辑;2.技术搭建时优化互动设置,嵌入商品链接与自动弹幕,提升直播间活性;3.多渠道引流,结合短视频与社交媒…

    2026年9月21日 用户投稿
    000
  • MySQL用户权限体系配置思路_Sublime中编辑多用户分权管理脚本

    MySQL用户权限体系配置思路_Sublime中编辑多用户分权管理脚本MySQL用户权限体系配置思路_Sublime中编辑多用户分权管理脚本MySQL用户权限体系配置思路_Sublime中编辑多用户分权管理脚本MySQL用户权限体系配置思路_Sublime中编辑多用户分权管理脚本

    最小权限原则是mysql用户权限配置的核心,确保每个用户仅拥有必要权限以提升安全性与可维护性。1.明确需求:根据用户角色分配如只读、增删改查或结构修改权限;2.创建用户并编写sql脚本进行权限管理,替代手动输入命令,提高效率与一致性;3.使用sublime text等编辑器提升脚本编写效率,利用语法…

    2026年9月21日 用户投稿
    000
  • mac怎么在菜单栏显示日期_Mac菜单栏显示日期方法

    首先启用菜单栏时钟显示,进入系统设置→控制中心→日期与时间→开启“在菜单栏中显示”;接着在“桌面与程序坞”→“时钟”中勾选“显示日期”以显示星期和具体日期,可选开启24小时制或秒数;若设置未生效,可通过终端执行killall SystemUIServer命令强制刷新菜单栏。 如果您发现Mac的菜单栏…

    2026年9月21日
    200
  • 音乐文件占用空间太多怎么办_音乐文件占用空间太多如何整理详细指南

    解决音乐文件占空间问题的关键是压缩与整理:先用软件或在线工具降低比特率压缩体积,再按场景分类、利用元数据自动归集,并通过听歌片段和BPM判断保留内容,避免重复与误删。 音乐文件占空间太多,核心解决办法就两条:一是压缩单个文件体积,二是通过有效分类管理提升使用效率。直接删歌不是长久之计,学会整理和优化…

    2026年9月21日
    000
  • Via浏览器在鸿蒙系统上运行会闪退怎么办_Via浏览器鸿蒙系统闪退的解决方法

    Via浏览器闪退可依次尝试清除缓存数据、更新或重装应用、检查系统更新与存储空间、禁用硬件加速功能,必要时通过开发者模式启用USB调试并使用DevEco Studio捕获日志定位问题。 如果您在使用Via浏览器访问网页时,应用突然关闭或无法正常启动,则可能是由于软件兼容性或系统资源问题导致。以下是解决…

    2026年9月21日
    300
  • 升级X86架构性能大提升!极空间Z2 Ultra图赏

    升级X86架构性能大提升!极空间Z2 Ultra图赏升级X86架构性能大提升!极空间Z2 Ultra图赏升级X86架构性能大提升!极空间Z2 Ultra图赏升级X86架构性能大提升!极空间Z2 Ultra图赏

    10月23日,极空间正式推出全新双盘位nas产品——极空间z2 ultra,官方售价为1899元,参与国家补贴后仅需1457元,性价比进一步提升。 此次发布的Z2 Ultra最大的亮点在于采用X86架构处理器,相较以往使用的ARM平台,性能实现飞跃式提升,运行速度显著加快。更重要的是,新架构对Doc…

    2026年9月21日 用户投稿
    200
  • 数据库分库分表(Sharding)策略

    在现代应用程序中,随着数据量的增长,单一数据库的性能和容量往往难以满足需求。这时,数据库分库分表(Sharding)策略就成了一个关键的解决方案。那么,如何设计和实现一个有效的分库分表策略呢?让我们深入探讨一下。 在我的职业生涯中,我曾多次参与大型项目的数据库优化,其中分库分表是常见的挑战之一。我记…

    2026年9月21日
    000
  • 抖音电商与独立商城怎么结合?流量互通与转化全攻略

    许多自建电商平台的运营者正积极探索与抖音电商的合作路径,以期借助其庞大的用户基数实现流量增长和销售转化提升。虽然抖音能为独立商城导入可观的新用户,但要真正实现高效联动,必须依赖技术系统的深度对接与精准的内容运营策略。以下是抖音与独立商城融合的关键路径及实操建议。 如何实现抖音与独立商城的店铺互通? …

    2026年9月21日
    100
  • 如何在Java中实现个人财务管理工具

    首先设计Transaction、FinanceManager和Budget核心类,实现交易记录、统计分析与预算控制功能,通过ArrayList管理数据,使用LocalDate处理日期,结合ObjectOutputStream持久化存储,初期采用Scanner构建控制台菜单实现增删查改与报表展示,后期…

    2026年9月21日
    000
  • Linux目录结构学习常见问题汇总

    Linux目录结构学习常见问题汇总Linux目录结构学习常见问题汇总Linux目录结构学习常见问题汇总Linux目录结构学习常见问题汇总

    Linux只有一个根目录,所有设备挂载于此,形成统一树状结构。根目录下各路径分工明确:/bin和/sbin分别存放用户与管理员命令;/etc集中配置文件;/home为用户家目录;/var存储日志等动态数据;/tmp用于临时文件;/usr存放系统程序,/usr/local供手动安装软件;/dev包含设…

    2026年9月21日 用户投稿
    000
  • win10无法创建新的分区提示空间不足怎么办 _Win10 无法创建分区空间不足解决方法

    首先检查磁盘是否存在未分配空间,若无则通过压缩卷释放空间;使用磁盘管理或第三方工具如EaseUS创建新分区;必要时清理磁盘或转换MBR为GPT格式以突破分区限制。 如果您在使用Windows 10系统时尝试创建新的磁盘分区,但系统提示“无法创建新分区”或“空间不足”,这通常是因为当前磁盘未分配的空间…

    2026年9月21日
    100
  • X旗下Grok上线即时语音搜索,挑战Google引领搜索新方向

    近日,x平台旗下的ai助手grok正式推出了“即时语音搜索”功能。用户现在可以通过语音直接提问,触发实时网页检索,并迅速获得整合后的精准答案。此举意在优化信息获取流程,推动人机交互向更自然、高效的方向演进。 该语音搜索模式实现了“即说即搜即答”的流畅体验。例如,当用户提出“星舰发射的具体时间是什么?…

    2026年9月21日
    100
  • Laravel应用的安全审计(Security Audit)方法

    进行安全审计对laravel应用至关重要,因为它能发现并修复安全漏洞,提升整体安全性和用户信任度。具体方法包括:1. 代码审查,确保无未过滤输入和弱密码;2. 配置文件安全性,保护敏感信息;3. 依赖管理,更新第三方包;4. 用户认证和授权,防止未授权访问;5. 日志和监控,检测异常行为。 在讨论L…

    2026年9月21日
    100
  • Linux中如何查看进程状态_Linux进程状态查看的详细方法

    掌握Linux进程查看方法可高效管理程序,常用ps aux或ps -ef查看进程快照,top和htop实时监控,/proc/PID/目录下获取详细状态,pgrep和pidof快速定位PID。 在Linux系统中,查看进程状态是系统管理和故障排查中的基本操作。掌握多种方法可以更高效地监控和管理运行中的…

    2026年9月21日
    1200
  • Laravel 8 登录后重定向到仪表盘的全面指南

    本文深入探讨了 Laravel 8 中用户登录后重定向到仪表盘的多种策略。我们将详细解析默认的重定向机制,包括 LoginController 和 RedirectIfAuthenticated 中间件,并重点介绍如何通过自定义登录逻辑实现精确的重定向控制,同时提供示例代码和常见问题排查建议,确保用…

    2026年9月21日
    000
  • iPhone 17如何设置隐私共享限制

    答案:通过设置隐私权限、关闭iCloud同步、退出家人共享及限制锁屏访问,可有效保护iPhone数据隐私。具体包括管理相机、麦克风、定位等权限,关闭不必要的iCloud数据同步,退出家庭共享群组,停用跨App内容共享,并在锁屏时禁用控制中心与通知预览,防止信息泄露。 虽然目前还没有iPhone 17…

    2026年9月21日
    500

发表回复

登录后才能评论
关注微信