Ubuntu20运行SegNeXt代码提取道路水体(三)——SegNeXt训练与推理自己的数据集

训练自己的数据集

参考博客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)

但是这样训练结果还是没有变化
还是0!还是0!
无语了!
查看这篇博客来找一下原因
以及这篇

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Laney_Midory

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值