训练自己的数据集
参考博客1
参考博客2(voc格式)
参考博客3(voc格式)
参考博客4(ade格式)
参考博客4(cityscrapes格式)
结合这一句话
我明白了
对数据格式的要求:
1、八位深度的mask
2、类别的顺序就代表了mask上对应类别的像素值!!!所以我需要修改一下我的图片
图片深度从24位改为8位
>>> p24 = Image.open('G:/Desktop/test.png') # 打开24位深的RGB图像
>>> p8 = p24.convert("P") # 将24位深的RGB图像转化为8位深的模式“P”图像
>>> p8.save("G:/Desktop/test_1.png") #保存图像
图片深度从8位改为24位
>>> p24 = Image.open('G:/Desktop/test.png') # 打开24位深的RGB图像
>>> p8 = p24.convert("RGB") # 将24位深的RGB图像转化为8位深的模式“P”图像
>>> p8.save("G:/Desktop/test_1.png") #保存图像
出现的问题
按照上面的方法训练
但是训练检测不出来road的iou
只能检测出background
不知道这是什么问题
用产生的检查点文件来预测也预测不出来
尝试一
查询了很多博客
博客一
这里面提到了一个
而我在自定义我的数据集的时候并没有用到这个
现在对这个做一个尝试:
尝试的方法主要参考了这篇博客,写的很详细!
但这个代码出现了点问题
File “/home/wangtianni/.conda/envs/pytorch/lib/python3.6/os.py”, line 220, in makedirs
mkdir(name, mode)
PermissionError: [Errno 13] Permission denied: ‘/mydata’
创建文件问题解决
尝试失败
直接查找不到 晕了
这是因为我的语句有些问题:
文件夹不能这样子写
应该是下面这样
使用sudo chmod 777 Scrapy 开放Scrapy目录的读写权限
所以不要前面的斜杠 直接加文件夹名字就行
但还是出错
chown: 正在更改’mydata/MyRoadData/annotations’ 的所有者: 不允许的操作
参考这篇文章
好吧
我放弃了
重新新建一个一模一样的文件夹
再次运行就没这个问题了
成功生成了txt文件
但需要注意的是这个txt文件只有五分之四的数据
需要再修改一下代码
我修改之后的代码可以分别读取训练的和测试的数据 分别生成txt
import mmcv
import os.path as osp
data_root = "/home/wangtianni/SegNeXt-main/SegNeXt-main/data/data/MyRoadData/annotations/"
valid_root = "/home/wangtianni/SegNeXt-main/SegNeXt-main/data/data/MyRoadData/images/"
ann_dir = "training"
split_dir = 'splits'
mmcv.mkdir_or_exist(osp.join(osp.abspath(osp.join(data_root,"..")), split_dir))
filename_list = [filename[:-9] for filename in mmcv.scandir(
osp.join(data_root +ann_dir), suffix='_mask.png')]
with open(osp.join(osp.abspath(osp.join(data_root,"..")),split_dir, 'train.txt'), 'w') as f:
train_length = int(len(filename_list))
f.writelines(line + '\n' for line in filename_list[:train_length])
validname_list = [filename[:-8] for filename in mmcv.scandir(
osp.join(valid_root, ann_dir), suffix='_sat.jpg')]
#with open(osp.join(data_root, '../',split_dir, 'val.txt'), 'w') as f:
with open(osp.join(osp.abspath(osp.join(data_root,"..")),split_dir, 'val.txt'), 'w') as f:
valid_length = int(len(validname_list))
f.writelines(line + '\n' for line in validname_list[:valid_length])
生成了txt文件还是没什么用
苍天啊!大地啊!还是0!
尝试二
那就试试第二个方法
这个方法还是我在搜索阅读大量博客的时候看到的
这篇博客
作者在这里提到了制作mask的方法
但我用了他的代码之后发现他提供的代码有些问题
这里贴一下我改动的代码
输入是24位正常的mask图片,格式为png
如果不是的话可以修改一下
1、生成24位3通道的png图片
mask_root = "/home/wangtianni/SegNeXt-main/SegNeXt-main/data/data/MyRoadData/annotations/training/"
save_root = "/home/wangtianni/SegNeXt-main/SegNeXt-main/data/data/MyRoadData/annotations/saving/"
mask_names = filter(lambda x: x.find('png')!=-1, os.listdir(mask_root))
for file in mask_names:
msk_path = mask_root + file.strip()
msk = Image.open(msk_path)
save_path= save_root + file.strip()
img=msk.convert("RGB")
img.save(save_path)
2、将mask转为数字类别图(8通道)
def src_2_gray(src_mask_path, sv_gray_path):
# 注意将palette改为自己的调色板
palette = { 0: (0,0,0),
1: (255, 255, 255)}
src_mask = mmcv.imread(src_mask_path, channel_order='rgb')
gray_mask = np.zeros((src_mask.shape[0], src_mask.shape[1]), dtype=np.uint8)
for c, i in palette.items():
print(c)
print(i)
m = np.all(src_mask == np.array(i).reshape(1, 1, 3), axis=2)
gray_mask[m] = c
mmcv.imwrite(gray_mask, sv_gray_path)
3、将数字类别图转为训练用的8位伪彩图
显示出来的就是正常的,但是像素值是0,1
def gray2color(img_path, save_path):
# '''
# img+path:类别灰度图
# save_path:存储路径
# '''
# 注意将PALETTE改为自己的调色板
PALETTE=[[0,0,0], [255,255,255]]
img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)
img = Image.fromarray(img)
lette = PALETTE
palette = []
for i in range(256):
palette.extend((i, i, i))
palette[:3*len(PALETTE)] = np.array(
lette, dtype='uint8').flatten()
print(palette)
img.putpalette(palette)
img.save(save_path)
print("finish")
4、检验图片
a.不管使用任何工具:尽可能先得到从表面看起来比较正常的mask(各个物体颜色正常,放大之后没有斑点,),分割用的mask一般是png且mode为P格式的,如果得到的是jpg的或者mode非P,通常是需要进行转化的。
查看图片的mode:
print(msk.mode)
assert msk.mode == 'P', "mode error"
训练集Mask的调色板每一张都不相同,在这里需要注意的是,按照上述方式进行,训练集的mask必须是8bit的格式,调色板必须根据自己的类别进行添加到图片中。
检查数据集调色板是否一致(脚本):
def read_palatte(img_path=None):
img = Image.open(img_path)
# print(type(img.getpalette()))
print(img.getpalette()[:6])
print(len(img.getpalette()))
5、主函数
mask_root = "/home/wangtianni/SegNeXt-main/SegNeXt-main/data/data/MyRoadData/annotations/training/"
save_root = "/home/wangtianni/SegNeXt-main/SegNeXt-main/data/data/MyRoadData/annotations/saving/"
mask_names = filter(lambda x: x.find('png')!=-1, os.listdir(mask_root))
for file in mask_names:
msk_path = mask_root + file.strip()
msk = Image.open(msk_path)
save_path= save_root + file.strip()
#1
img=msk.convert("RGB")
img.save(save_path)
#2
src_2_gray(msk_path, save_path)
#3
gray2color(msk_path, save_path)
#4
print(msk.mode)
assert msk.mode == 'P', "mode error"
#5
read_palatte(msk_path)