关于deeplabv3+ 使用自定义数据集训练出现的问题1

本文详细介绍了如何使用deeplabv3+进行图像语义分割任务的全过程,包括环境搭建、数据集处理及训练配置等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

环境

我使用的deeplab的开源代码地址:(框架是pytorch)

https://github.com/jfzhang95/pytorch-deeplab-xception.git

 环境的安装不说,conda新建一个环境,按照需求下载.....blabla;

  • ubuntu18.04
  • pytorch1.2
  • pycharm
  • python3.7
  • GTX2080ti

准备数据集

我没有很多分割的数据集,也懒得去标注。所以我就去biying 搜索了以下,找到了知乎的一篇文章,有一些开源的数据集:https://zhuanlan.zhihu.com/p/195699093

磁瓦缺陷数据集

中国科学院自动所一个课题组收集的数据集,是“Saliency of magnetic tile surface defects”这篇论文的数据集。收集了6种常见磁瓦缺陷的图像,并做了语义分割的标注。

这个就是为下载的数据集

 

 

前面的  images  和 mask 是为处理过后的:

大概说一下这个数据集,处理这个数据集花了为2天时间,因为在工作,所以断断续续的;

首先这个数据集分了6个类; MT_Blowhole  MT_Break  MT_Crack  MT_Fray  MT_Uneven  MT_Free

这几个文件夹结构不统一

如:
    -MT_Break
             --img
                    ---1.jpg
                    ---1.png
    -MT_Fray
              --1.jpg
              --1.png
                    
多了一个文件夹,所以各位  先统一以下,我是按照 第二种方式来的

2 处理完之后,就开始分析数据集

你会发现MT_Free 的数据比其他五个大很多,就是样本不均衡,

但是其实你仔细看看,就会发现MT_Free 的数据的PNG 都是黑的  ,说明MT_Free 是作为背景处理的,在工业上有些是OK品却被当作了NG品处理--吴识别的图片集,你们可以这么理解

3 初次尝试 我先排除了MT_Free 这个数据集,先训练其他五个数据集

因此,我先将其他五个文件夹中的JPG 和 PNG 分离出来 放到images 和 mask 里面去

分离之后的结构大概是

-images
       --MT_Fray              
                ---1.jpg
                ---2.jpg
                ....
                n.jpg
        --MT_Crack              
                ---1.jpg
                ---2.jpg
                ....
                n.jpg
        ...
        --MT_Break              
                ---1.jpg
                ---2.jpg
                ....
                n.jpg
-mask
       --MT_Fray              
                ---1.png
                ---2.png
                ....
                n.png
        --MT_Crack              
                ---1.png
                ---2.png
                ....
                n.png
        ...
        --MT_Break              
                ---1.png
                ---2.png
                ....
                n.png                    

4 分完之后 再将抽取0.1  * 每个种类的总数  作为验证集  ,然后制作成如下方式

-ciwa_soft
           --ImagesSets              
                        train.txt  # 存放对应.jpg 的位置,最好是绝对路径
                        val.txt
            --JPEGImages              
                        ---1.jpg
                        ---2.jpg
                        ....
                        n.jpg
            --SegmentationClass              
                         ---1.png
                         ---2.png
                         ....
                         n.png
               

修改配置

要训练自己数据集,要修改以下几个配置,包括将自己数据集添加进去:

  1. 在mypath.py文件中,定义自己的数据集,把刚才的路径添加进去,我的数据集名字叫做mydata,如下:

     

  1. 然后在dataloaders/datasets路径下创建自己的数据集文件,这里创建为mydata.py,因为我们是按照VOC数据集格式,所以直接将pascal.py内容复制过来修改,这里将类别数和数据集改成自己的数据集,类别记得加上背景类,我这里一共是5+1类:

  1. 修改dataloaders/utils.py,在文件中创建一个get_ciwa_label()函数,根据自己的类别数,我这里只有5类,一类是背景,5个类是我要分割的类,因此有6个类的颜色

定义颜色

def get_ciwa_label():
    return np.asarray([[0, 0, 0], [1, 1, 1], [2, 2, 2], [3, 3, 3],
                       [4, 4, 4], [5, 5, 5]])

使用该代码 在utils

修改号之后跑一下  mydata.py 出现了问题

问题 出现:

Traceback (most recent call last):
  File "/home/***/opt/*****/deeplabv3/dataloaders/datasets/mydata.py", line 130, in <module>
    segmap = decode_segmap(tmp, dataset='mydata')
  File "/home/***/opt/****/deeplabv3/dataloaders/utils.py", line 48, in decode_segmap
    rgb[:, :, 0] = r / 255.0
ValueError: could not broadcast input array from shape (513,513,3) into shape (513,513)

通过打印格式 并且 和 pascal 的数据对比发现

 

我的数据  print(rgb.shape,r.shape)   --> (513, 513, 3) (513, 513, 3)
pascal数据  print(rgb.shape,r.shape)   --> (513, 513, 3) (513, 513)

一直追个溯源,发现了问题所在

pascal 图片读取的  用PIL.Image 读取的,它有一个模式叫  P 模式,类似一种压缩手段,而我的数据图片也是同样方式读取出来的  却是RGB 模式 所以问题就是如何转换成P模式,找到了  一些博客https://blog.youkuaiyun.com/icamera0/article/details/50843196

通过在 mydata.py 有一个函数叫做

    def _make_img_gt_point_pair(self, index):
        _img = Image.open(self.images[index]).convert('RGB')
        _target = Image.open(self.categories[index])
        _target = _target.convert('P')  # zeng增加在这里即可

        return _img, _target

至此,运行mydata.py 数据正常。接下来就是训练了。待续  2020.12.12

参考博客

https://blog.youkuaiyun.com/icamera0/article/details/50843196

https://blog.youkuaiyun.com/qq_39056987/article/details/106455828

 

 

### 使用DeepLabV3+训练自定义数据集 #### 准备环境和安装依赖库 为了使用DeepLabV3+模型进行图像分割,首先需要准备开发环境并安装必要的软件包。对于TensorFlow框架下的操作如下: ```bash pip install tensorflow keras-cv ``` 对于PyTorch框架,则需执行不同的命令来设置相应的运行环境。 #### 数据预处理 在开始之前,确保已经准备好标注好的图片以及对应的标签文件。通常情况下,这些资料会被整理成特定格式的数据集,比如Pascal VOC或COCO格式。针对自定义数据集,可能还需要编写脚本来转换原始数据到上述标准格式之一[^1]。 #### 加载预训练模型 可以利用KerasCV提供的接口轻松加载预先训练过的DeepLabV3+实例作为起点。这一步骤能够显著减少收敛时间,并提高最终性能表现。 ```python import keras_cv.models.segmentation.deeplab_v3_plus as deeplab model = deeplab.DeepLabV3Plus.from_preset( "deeplabv3plus_xception_coco", # 预设名称取决于所选的基础网络与权重源 num_classes=YOUR_DATASET_NUM_CLASSES # 替换为实际类别数量 ) ``` #### 自定义配置调整 根据具体应用场景的需求,可进一步修改超参数设定、优化器选择等方面的内容以适应不同任务特点。例如更改损失函数类型或是引入额外正则化机制等措施有助于提升泛化能力。 #### 训练过程管理 通过定义合适的回调(callbacks),可以在整个迭代过程中监控进度变化情况;同时保存最佳版本的权值组合以便后续部署应用阶段调用。下面给出了一段简单的代码片段展示如何完成这一目标: ```python from tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping callbacks_list = [ ModelCheckpoint(filepath=&#39;best_model.h5&#39;, save_best_only=True), EarlyStopping(monitor=&#39;val_loss&#39;, patience=5) ] history = model.fit(training_dataset, validation_data=validation_dataset, epochs=EPOCHS_NUMBER, callbacks=callbacks_list) ``` 以上就是关于采用DeepLabV3+来进行深度学习图像分割项目的概览介绍及其基本流程说明。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值