在使用基于Pytorch的DeeplabV3+模型(Bubbliiiing)训练以及预测时遇到的问题

原博:憨批的语义分割重制版9——Pytorch 搭建自己的DeeplabV3+语义分割平台-CSDN博客

github:https://github.com/bubbliiiing/deeplabv3-plus-pytorch

最近在使用Bubbliiing的deeplabv3+模型对自己的数据集进行训练时,使用博主提供的json_to_dataset.py对labelme标注的数据进行转换后,训练完的模型在预测结果时没有拉框的情况,原博的评论区下也有很多同学有这种情况,具体如下:

json_to_dataset.py代码:

import base64
import json
import os
import os.path as osp

import numpy as np
import PIL.Image
from labelme import utils


if __name__ == '__main__':
    # jpg原图路径
    jpgs_path   = "datasets/JPEGImages"
    # 标签图片输出路径
    pngs_path   = "datasets/SegmentationClass"
    classes     = ["_background_", "xxx"]

    # json文件路径
    count = os.listdir(r".\xml")
    for i in range(0, len(count)):
        path = os.path.join(r".\xml", count[i])

        if os.path.isfile(path) and path.endswith('json'):
            data = json.load(open(path))
            
            if data['imageData']:
                imageData = data['imageData']
            else:
                imagePath = os.path.join(os.path.dirname(path), data['imagePath'])
                with open(imagePath, 'rb') as f:
                    imageData = f.read()
                    imageData = base64.b64encode(imageData).decode('utf-8')

            img = utils.img_b64_to_arr(imageData)
            label_name_to_value = {'_background_': 0}
            for shape in data['shapes']:
                label_name = shape['label']
                if label_name in label_name_to_value:
                    label_value = label_name_to_value[label_name]
                else:
                    label_value = len(label_name_to_value)
                    label_name_to_value[label_name] = label_value
            
            # label_values must be dense
            label_values, label_names = [], []
            for ln, lv in sorted(label_name_to_value.items(), key=lambda x: x[1]):
                label_values.append(lv)
                label_names.append(ln)
            assert label_values == list(range(len(label_values)))
            
            lbl = utils.shapes_to_label(img.shape, data['shapes'], label_name_to_value)
            
                
            PIL.Image.fromarray(img).save(osp.join(jpgs_path, count[i].split(".")[0]+'.jpg'))

            new = np.zeros([np.shape(img)[0],np.shape(img)[1]])
            for name in label_names:
                index_json = label_names.index(name)
                index_all = classes.index(name)
                new = new + index_all*(np.array(lbl) == index_json)

            utils.lblsave(osp.join(pngs_path, count[i].split(".")[0]+'.png'), new)
            print('Saved ' + count[i].split(".")[0] + '.jpg and ' + count[i].split(".")[0] + '.png')

训练时的损失值也很不科学:

又计算了miou值,好嘛(你看看你给孩子学了什么!):


解决办法:

首先怀疑VOC标注图片的像素值的问题,非博主所说的目标区域像素值为1,背景区域像素值为0,用代码遍历统计voc标注图片的所有像素值:

from PIL import Image
import numpy as np

# 图像路径
image = Image.open(r'path.png')

# 转换为NumPy数组
image_array = np.array(image)

# 统计每个像素值的数量
unique, counts = np.unique(image_array, return_counts=True)

# 打印结果
pixel_counts = dict(zip(unique, counts))
for pixel_value, count in pixel_counts.items():
    print(f'像素值 {pixel_value}: {count} 个')

运行结果发现:

嘿!您猜怎么着?,使用博主提供的json_to_datasets.py代码转完之后的像素值会因为不明原因异常,需要手动修改一下,添加代码:

# 令所有非0像素值点为1
image_array[image_array != 0] = 1

#这里要根据自己实际标注的标签数量来确定像素值,我的标签只有一个所以目标区域为1,背景为0

再统计一下试试:


批量将png图片的像素值全部修改完成之后再重新进行训练,训练过程就正常多了,预测结果也可以正常拉框显示区域了(预测结果就不放了):

损失值:

mIoU:

又可以愉快的炼丹了


总结

可能是环境配置和库版本不一的问题或是其他玄学问题,运行博主提供的json_to_datasets.py会导致原本应该像素值为1的点会乱掉(

所以就像原博主说的,请仔细检查一下自己的数据集的格式和像素值的问题!

其他问题请参考原博主的帖子神经网络学习小记录-番外篇——常见问题汇总_loading weights into state dict... killed-CSDN博客

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: pytorch deeplabv3+ 是一种基于 PyTorch 框架实现的深度学习模型,主要用于对图像进行语义分割和图像标注的任务。它是以 DeepLabv3 为基础,通过改进编码器部分的网络结构,实现更强的特征提取能力,同采用了空洞卷积和分离卷积等技术,提升了模型的准确性和效率。 ### 回答2: PyTorch Deeplabv3 是一种基于深度学习的图像分割算法,采用了改进的全卷积模型实现。Deeplabv3 可够用于图像分割、物体识别、手势识别等多项任务,且在许多计算机视觉竞赛中都取得了优异的成绩。 PyTorch Deeplabv3 算法核心采用了ASPP(Atrous Spatial Pyramid Pooling)空洞空间金字塔池化技术,该技术通过将卷积核的扩张程度进行控制,从而增加了卷积层的感受野大小,保证了模型可以适应更为复杂的图像环境,减少了模型对图像尺寸的限制,通过引入标准化操作机制进一步提高了图像分割模型的效果。ASPP 算法可以扩大感染野,使得模型有更多的上下文信息,并且可以通过不同分辨率的层来考虑物体的大小和位置差异,从而达到更加精确的分割效果。 使用 PyTorch Deeplabv3 进行图像分割,一般需要经过将图像输入到网络中进行前向传递,从而得到像素级别的标签结果。在全卷积模型的设计中,可以采用反卷积或上采样等方法来将输出大小与输入大小保持一致,经过卷积、反卷积和上采样之后输出对图像进行分割。 总之,PyTorch Deeplabv3 是一种效果良好的图像分割算法,有望在物体识别、手势识别等领域发挥越来越重要的作用。 ### 回答3: PyTorch DeepLabV3是一种深度卷积神经网络模型,广泛应用于图像分割,其设计旨在为图像分割工作提供有效和高质量的解决方案。该算法被称为深度空洞卷积神经网络,完全基于卷积神经网络,其模型结构非常适合处理高分辨率图像。 该模型使用的是基于ResNet网络的编码器和Atrous (或空洞卷积)的解码器。通过将ResNet的卷积块替换为Atrous卷积块,可以获得跨越多个尺度的信息,并且保持空洞卷积的特性,以提高参数利用率并减少运算间。DeepLabV3算法通过使用多尺度池化和空洞卷积技术有效地捕获并预测图像的细节和上下文信息,从而实现高准确度的图像分割DeepLabV3算法的优点包括: 1.精度高:相对于其他图像分割算法,DeepLabV3算法具有更高的分割准确度和更好的分割性能。 2.多尺度:DeepLabV3允许我们以多个尺度处理图像,从而获得更好的分割结果。 3.可扩展:DeepLabV3算法可以通过调整模型结构和参数来适应不同的应用场景,并具有较好的扩展性和可定制性。 除此之外,深度学习框架PyTorch也提供了强大的工具和API支持,方便用户使用DeepLabV3算法进行图像分割工作。PyTorch DeepLabV3在计算机视觉领域中拥有广泛的应用,例如医学图像分割、自动驾驶、目标跟踪、场景分析等领域。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值