顺序乱得很,看视频跟着敲代码的时候遇到什么问题就立即记下了,有空再梳理
-----------------------------------我是分割线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
敲代码可以跟着第一个,第二个比较完整(从数据处理到模型训练评价指标)
-----------------------------------我是分割线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()))