问题总结
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()进行随机失活,降低模型复杂度
②网络出现问题。网络结构不合理,将网络根据特性改合理。此时应该时训练集验证集准确率或者损失率起伏波动大。
③ 设置了不合理的参数。