FCN语义分割训练自己的数据(依据VOC2012数据集格式)

本文介绍了如何使用FCN训练自己的数据集,参照VOC2012数据集的格式,包括数据制作流程、颜色填充、数据集整合以及训练过程。通过labelme软件进行标注,转换成所需格式,并分享了相关的代码片段。

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

chapter 4 应用FCN训练自己的数据(以voc2012为模板)

step0.参考数据集需求

可用于FCN的完全VOC格式的数据组织结构模式:

训练集和验证集可以按照8-2的方式进行安排。

VOC2012数据集共包含21个类别,其中包括背景类,则共包含20类事物。

step1.制作自己的数据

应用一个简化的方法,并不把像素级的labels做成.mat的形式,反倒是借助于索引图的格式,直接在载入图片的时候把颜色值作为标签载入,并把制作好的索引图当成labels。

制作过程:

制作自己的FCN数据流程:

  1. 应用labelme软件(安装使用过程参见安装文档)对图像数据进行标注,标注完毕后会生成.json文件。
  2. 针对.json文件,在终端输入指令:labelme_json_to_dataset 路径/文件名.json   即可生成dataset文件夹。
  3. 为文件夹下的label.png(目前开起来是全黑色)进行分配颜色(若类别数没有超过21类,则该步骤不需要操作)。
  4. 应用python的skimage库进行颜色填充,得到24位的着色后的RGB三通道图像,重命名为2018_000001.png(label)。
  5. //(已注释掉20190704)应用matlab将着色后的label(src/2018_000001.png)图像转为8位灰度图像,即可用label(dst/2018_000001.png)。
  6. (订正第5条20190704)应用matlab将着色后的label(src/2018_000001.png)RGB三通道图像转为8位彩色索引图像,即可用label(dst/2018_000001.png)。

a.jpg ---> a.json ---> a_json(dataset文件夹,其中包括:img.png(原图), label.png(标签图), label_viz.png(标签可视化后的图像), label_names.txt, info.yaml) ---> src/2018_000001.png(24) ---> dst/2018_000001.png(8)

小工具:制作mask语义级标签的工具labelme,开源代码链接为:https://github.com/wkentaro/labelme

(关于标注标签的拓展,https://blog.youkuaiyun.com/chaipp0607/article/details/79036312另附一个bounding box的工具,开源代码链接为:https://github.com/tzutalin/labelImg

由于标注工作需要专家来进行标注,所以label最好是在window上能进行安装,并给非计算机领域的专家来使用,具体安装和使用说明可以参考如下代码,如需详细安装过程,可在下方留言或者私信。

conda create --name=labelme python=3.6
conda activate labelme
pip install pyqt5
conda install pillow=4.0.0
pip install labelme

首先,颜色填充代码如下,colorlabel.py文件可以在此处下载:https://github.com/hitzoro/FCN-ColorLabel

import colorlabel
import PIL.Image
import os
import numpy as np
from skimage import io,data,color

rootdir = 'D:/temppic/piczhongyaohuichuan/005zzy/'
dstpath = 'D:/temppic/piczhongyaohuichuan/005zzy/label24'
list = os.listdir(rootdir)
count = 114
for i in range(0,len(list)):
    path = os.path.join(rootdir,list[i])
    if(os.path.isdir(path) and 'json' in path):
        img = PIL.Image.op
### 关于 Pascal VOC2012 数据集语义分割任务中的使用 Pascal VOC2012 是一个广泛用于计算机视觉领域的重要数据集,尤其适用于目标检测和语义分割任务。以下是有关其在语义分割任务中的具体使用方法以及一些示例代码。 #### 下载与准备数据集 为了获取 Pascal VOC2012 数据集,可以利用 `d2l` 库提供的工具完成下载和解压操作[^3]: ```python import d2l.torch as d2l # 定义数据集URL及其SHA-1哈希值 d2l.DATA_HUB['voc2012'] = ( d2l.DATA_URL + 'VOCtrainval_11-May-2012.tar', '4e443f8a2eca6b1dac8a6c57641b67dd40621a49' ) # 执行下载并提取到指定路径 voc_dir = d2l.download_extract('voc2012', 'VOCdevkit/VOC2012') ``` 上述代码片段展示了如何通过自动化脚本下载并解压缩数据集至本地环境。最终的数据存储位置通常为 `../data/VOCdevkit/VOC2012` 文件夹下。 --- #### 加载与处理数据集 加载 Pascal VOC2012 的图像和标注文件可以通过自定义函数实现。以下是一个简单的例子,展示如何读取数据集中的一张样本图片及其对应的像素级标签[^1]: ```python from PIL import Image import os def load_data_voc(voc_dir, image_id): """加载单张VOC2012数据集的图像和标签""" jpeg_filename = os.path.join( voc_dir, 'JPEGImages', f'{image_id}.jpg' ) label_filename = os.path.join( voc_dir, 'SegmentationClass', f'{image_id}.png' ) with open(jpeg_filename, 'rb') as f: image = Image.open(f).convert('RGB') with open(label_filename, 'rb') as f: label = Image.open(f).convert('L') return image, label # 测试加载一张样例图片 example_image_id = '2007_000032' # 替换为你感兴趣的ID image, label = load_data_voc(voc_dir, example_image_id) print(f"Image size: {image.size}, Label size: {label.size}") ``` 此函数能够返回给定 ID 对应的 RGB 图像与其灰度形式的类别掩码(即逐像素分类结果)。注意,这里的 `image_id` 需要替换为实际存在于数据集内的某个有效编号。 --- #### 构建训练数据管道 对于深度学习模型而言,构建高效的数据输入流水线至关重要。下面提供了一种基于 TensorFlow 的方式来生成 TFRecord 格式的记录文件[^2]: ```bash # 命令行脚本转换原始PNG标签为TFRecords格式 python convert_to_tfrecord.py \ --images_dir=${VOC_DIR}/JPEGImages/ \ --annotations_dir=${VOC_DIR}/SegmentationClass/ \ --list_file=${VOC_DIR}/ImageSets/Segmentation/train.txt \ --output_path=voc_train.tfrecords ``` 以上命令调用了外部 Python 脚本来批量处理所有训练集合中的条目,并将其序列化成紧凑高效的二进制表示形式以便后续快速访问。 而在 PyTorch 中,则可通过继承 Dataset 类来自定义迭代逻辑: ```python class VOCSegmentationDataset(torch.utils.data.Dataset): def __init__(self, root, is_train=True, transform=None): super().__init__() self.root = root self.transform = transform split_name = 'train' if is_train else 'val' list_file = os.path.join(root, 'ImageSets', 'Segmentation', f'{split_name}.txt') with open(list_file) as f: self.ids = [line.strip() for line in f] def __getitem__(self, index): img_id = self.ids[index] img, lbl = load_data_voc(self.root, img_id) if self.transform is not None: img, lbl = self.transform(img), self.transform(lbl) return img, lbl def __len__(self): return len(self.ids) ``` 这个类封装了对整个数据子集的操作接口,允许灵活地施加各种增强变换以提升泛化能力。 --- #### 训练 Mask R-CNN 或其他模型 当准备好高质量的预处理数据之后,就可以着手搭建神经网络架构来进行端到端的学习过程了。如果采用 C++ 实现的话,需遵循特定框架的要求配置好依赖项后再编写相应源程序[^4];而如果是主流机器学习库如 TensorFlow/Keras 或 PyTorch 则相对更加简便直观些。 例如,在 Keras 上面启动一次完整的实验周期大致如下所示: ```python model.compile(optimizer='adam', loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True), metrics=['accuracy']) history = model.fit(train_dataset, validation_data=val_dataset, epochs=NUM_EPOCHS) ``` 这里假定了已经实例化的 `train_dataset` 和 `val_dataset` 符合标准 API 接口规范。 --- ### 总结 综上所述,从基础层面介绍了 Pascal VOC2012 如何应用于语义分割场景下的全流程概览——涵盖了前期准备工作直至后期算法调试阶段的关键环节。希望这些资料能帮助理解这一经典课题的实际运作机制!
评论 43
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值