(自用)Unet代码梳理(数据--模型训练和评价--测试)

本文介绍了如何使用LabelMe制作数据集,生成二值mask,并结合UNet进行图像分割,包括代码示例和针对医学图像的调整。内容涵盖了从json文件读取、mask创建到模型应用的整个流程。
摘要由CSDN通过智能技术生成

顺序乱得很,看视频跟着敲代码的时候遇到什么问题就立即记下了,有空再梳理

-----------------------------------我是分割线20240125----------------------------------------------------------------

一、数据

1、制作数据集

首先打开labelme:直接在prompt中输入labelme所在的虚拟环境名(这里我的直接是labelme)

打开后的界面:多张图片时“上一幅”“下一幅”连续处理

------------------补充(来自Unet完结篇11:57)----------

一张图上标注两个区域(对RGB图像)CLASS_NAMES(’***’,’***’)

(jison文件就是一堆点)

-----------------------------------我是分割线------------------------------------------------------------------------------

2、生成mask

lanelme官方有生成mask的代码(直接搜就有,或者可以自己写一个)

(以下是跟着博主来写的代码,先创建python File)

json文件信息读取

import os
from PIL import Image, ImageDraw
import json
def make_mask(image_dir):#获得全部的json文件,批处理
    data = os.listdir(image_dir)
    temp_data = []
    for i in data:#遍历
        if i.split('.')[1] == 'json':
            temp_data.append(i)
        else:
            continue
    for js in temp_data:#遍历json文件
        json_data = json.load(open(os.path.join(image_dir, js), 'r'))#以读(read)的形式获得json文件
        print(json_data)#测试是否获得所有json文件

if __name__ == '__main__':
    make_mask(r'C:\Users\*****\Unet\data\image')#测试是否获得所有json文件(这里需要传文件夹的完整位置)

二值图片(黑白)没有color等信息,彩色图片会有

image.new('')的使用:对于彩色图像,不需要RGB,只需要8位图https://www.zhihu.com/question/68390406

-----------------------------------我是分割线------------------------------------------------------------------------------

代码部分参考:

图像分割UNet硬核讲解(带你手撸unet代码)_哔哩哔哩_bilibili

重新梳理UNet代码(数据->模型训练测试->评价)_哔哩哔哩_bilibili

敲代码可以跟着第一个,第二个比较完整(从数据处理到模型训练评价指标)

UNet完结篇_哔哩哔哩_bilibili

-----------------------------------我是分割线20240126更------------------------------------------------------------

在up基础上改过的make_mask_data.py

用all_labels替代了CLASS_NAMES中的标签类别,up使用的是RGB图像,我使用了医学图像所以在fill那里改为fill=1,出来的mask就是二值图像了(第一次跟着视频敲代码的时候能直接出来二值图,用到我的任务上就出来纯黑的图了,大概没有*255?具体不是很清楚原因,这里是用chatgpt建议的代码来改的,能用就行)

import os
import numpy as np
import cv2
# import numpy as np
from PIL import Image, ImageDraw
import json

# CLASS_NAMES = ['0001-00001', '0002-00001','0003-00001','0004-00001','0005-00001','0006-00001','0007-00001',
#                '0008-00001','0009-00001','00010-00001','00011-00001','00012-00001','00013-00001','00014-00001',
#                '00015-00001',]


def make_mask(image_dir, save_dir):  # 获得全部的json文件,批处理
    data = os.listdir(image_dir)
    temp_data = []
    all_labels = []  # 用于存储所有的label值
    for i in data:  # 遍历
        if i.split('.')[1] == 'json':
            temp_data.append(i)
        else:
            continue
    for js in temp_data:  # 解析json文件,需要获得json文件的shape、label等信息
        json_data = json.load(open(os.path.join(image_dir, js), 'r'))  # 以读(read)的形式获得json文件,解析json
        # print(json_data)#测试是否获得所有json文件
        shapes_ = json_data['shapes']
        # shape_ = json_data['shapes'][0]#这里的shapes不一定是0,多组数据时需要遍历

        # 遍历获取所有label值
        for shape_ in shapes_:
            label = shape_['label']
            all_labels.append(label)

        # mask = Image.new('L', Image.open(
        #     os.path.join(image_dir, js.replace('json', 'png'))).size)
        mask = Image.new('1', Image.open(
            os.path.join(image_dir, js.replace('json', 'png'))).size)  # 不需要RGB,需要8位图即可,根据图片格式写'jpg''png'
        for shape_ in shapes_:
            label = shape_['label']
            points = shape_['points']
            points = tuple(tuple(i) for i in points)  # 将points转成元组

            print(np.array(mask).shape)  # 查看图片是几通道
            # mask.show()#‘L’相当于读出黑色掩码
            mask_draw = ImageDraw.Draw(mask)
            # print(label)#所有的图片信息都拿出来
            # print(points)

            # mask_draw.polygon(points, fill= all_labels.index(label)+1)
            mask_draw.polygon(points, fill=1)  # 根据类别标签 label,在图像上绘制对应的多边形,并且使用类别索引加 1 作为填充颜色(如果没有+1读出来全黑的是背景)
            # mask = np.array(mask)*255  # 白的是因为*255
            # cv2.imshow('mask',mask)
            # cv2.waitKey(0)
            # mask.show()
            mask.save(os.path.join(save_dir, js.replace('json', 'png')))


# def vis_label(img):
#    img=Image.open(img)
#    img=np.array(img)
#   print(set(img.reshape(-1).tolist()))


if __name__ == '__main__':
    make_mask(r'C:\Users\wuxia\Desktop\Unet\convert_to_png',
              r'C:\Users\wuxia\Desktop\Unet\train\Labels')  # 测试是否获得所有json文件(这里需要传文件夹的完整位置SegmentationClass是保存图片的位置)

    # make_mask('image', 'SegmentationClass')
    # vis_label('SegmentationClass/000799.png')
    # img=Image.open('SegmentationClass/000019.png')
    # print(np.array(img).shape)
    # out=np.array(img).reshape(-1)
    # print(set(out.tolist()))
U-Net是一种用于图像分割的深度学习网络结构,常被用于医学图像分析和计算机视觉领域。U-Net网络结构可以有效地将输入图像分割为多个类别,并且在训练过程中能够达到较好的分割精度。 CSDN是一个开发者社区网站,提供了许多深度学习相关的资源和文档。其中,有一份关于U-Net代码的多类别训练文档可供下载和学习。这份文档提供了详细的说明和实现代码,帮助开发者理解并应用U-Net进行多类别图像分割任务。 在使用U-Net进行多类别训练时,我们需要准备带有标签的训练数据集。每个图像样本都包含输入图像和对应的标签图像,标签图像中每个像素都被赋予表示不同类别的标签。通过使用U-Net网络结构,我们可以将输入图像传入网络中进行训练,并根据网络输出与标签图像进行比较来计算损失,然后使用反向传播算法来更新网络参数,最终使网络能够对输入图像进行准确的多类别分割。 通过CSDN下载的U-Net代码,我们可以学习到如何搭建U-Net网络结构、如何处理输入数据、如何计算损失并进行反向传播更新参数等步骤。这份文档提供了一份较为完整的实现,并可以根据具体任务自定义网络的结构和损失函数。 总之,通过使用U-Net网络结构以及CSDN提供的多类别训练代码,我们可以快速实现并训练图像分割任务,并获得较好的分割结果。这份代码对于深度学习研究者和开发者来说,是一个非常有价值的资源。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值