跑unet代码问题总结:位深度、mat转换为png、像素转换到[0,1]区间

问题总结

1、Bubbliiiing中基于pytorch的Unet程序进行斑马线分割,进行训练图片替换及num_classes改变后,train程序报错:

报错:RuntimeError: cuda runtime error (2) : out of memory at ..\aten\src\THC/THCStorage.cpp:49
报错位置在于unet网络结构中的unetup类outputs = torch.cat([inputs1, self.up(inputs2)], 1)
原因:是因为图片的数据集尺寸不对。
解决:需要进行更改从512*512*3变换成416*416*3
为什么:不明白

2、进行斑马线分割:miou程序运行时候出现miou的计算结果等于0

原因:图片属性详细信息中的位深度不同
解决:更改图片的位深度。方法链接saookami
为什么:因为在预测时voc的数据集格式是8位,而斑马线分割的数据集中其segmention是24位,导致 len(gt) = 2764800, len(pred) = 921600不相同导致计算时进行了跳过。

import os
import cv2
prepath = "./zebra"
savepath = './zebra'
# 将其他位转换为8位深度
f_n  = os.listdir(bacepath)    # 得到要进行变化的图片路径
for n in f_n:
    imdir = bacepath + '\\' + n   # 逐个获取文件名称
    img = cv2.imread(imdir)
    cropped = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    cv2.imwrite(savepath + '\\' + n, cropped)  # NOT CAHNGE THE TYPE

3、如何进行一个文件夹的预测

from PIL import Image
import os
import cv2
from unet import Unet
unet = Unet()
prepath = "./zebra"
savepath = './zebra'
ap= os.listdir(prepath)      # 获取到需要预测的文件夹中的文件名
print(ap)
for i in ap:
    image = Image.open(prepath+"\\"+i)  # 依次打开文件中的图片
    r_image = unet.detect_image(image)  # 依次对图片进行预测
    k = os.path.splitext(i)		# 获取对应的分割后的图片名称
    r_image.save(savepath+"\\"+k[0]+".png")  #保存图片

4、如何将mat转化png格式

单个转换程序是使用的github在这位作者提供的CrackForest-dataset数据集的issue问答中victor000000的回答链接地址

下面是可以对整个文件夹的mat转换为png格式

import scipy.io
import numpy as np
import cv2
from skimage import io
import os
path= './VOC2007/SegmentationClass/groundTruth/mat/'

# -*- coding: utf-8 -*-
name = os.listdir(path)
print(name)
for i in name:
    print(i)
    k = os.path.splitext(i)
    print(k)
    matn = path +i
    print(matn)
    mat = scipy.io.loadmat(matn)
    np_seg = mat['groundTruth'][0][0][0]
    (y, x) = np.where(np_seg == 2)
    np_seg[y, x] = 255
    (y, x) = np.where(np_seg == 1)
    np_seg[y, x] = 0
    cv2.imwrite(k[0]+'.png', np_seg)

4、unet预测出来全黑

查看训练使用的mask图片的像素范围。如果标注的物体mask为白色。则使用代码将图片的像素范围转换到[0,1]区间。

import os
from PIL import Image
import numpy as np
import cv2
# bacepath = "H:/py-pro/unet-pytorch-main/VOCdevkit/VOC2007/zebra/SegmentationClass24"
# savepath = 'H:/py-pro/unet-pytorch-main/VOCdevkit/VOC2007/SegmentationClass'
bacepath = r"./zebra"
savepath = r'./zebra'

ap= os.listdir(bacepath)
print(ap)
for i in ap:
    print(i)
    image = Image.open(bacepath+"\\"+i)
    img_array = np.array(image)/255.0
    r_image = Image.fromarray(np.uint8(img_array))
    #r_image.save(savepath+"\\"+k[0]+".png")
    r_image.save(savepath + '\\' + i)

5、 加入vgg等骨干网络后,准确率反而变差。

原因有
① 数据集过小,加入骨干网络后导致模型变得复杂。此时准确率反而变差。当训练集验证集数据都很好,测试集得到的结果不好时,给网络加入nn.Dropout()进行随机失活,降低模型复杂度
②网络出现问题。网络结构不合理,将网络根据特性改合理。此时应该时训练集验证集准确率或者损失率起伏波动大。
③ 设置了不合理的参数。

  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值