(超详细很完整)tensorflow下利用deeplabv3+对自己的数据进行训练

本指南详述如何使用deeplabv3+进行语义分割训练,包括数据准备、模型配置、训练及评估流程。从标注数据、转换格式到调整训练参数,助您快速上手。

👦👦👦👦👦👦👦👦👦👦👦👦👦👦👦👦👦👦👦👦👦👦👦👦👦👦👦👦👦👦👦


大前提

👿👿👿👿👿👿👿👿👿👿👿👿👿👿👿👿👿👿

首先完成我的另一篇博文《(超详细很完整)tensorflow上实现deeplabv3+》中详细描述的tf下deeplabv3+的实现。

接下来才能进行对于自己数据集的训练。


DATA

Annotation

原始数据需要进行语义分割的标注。标注过程详见我的另一篇博文《使用labelme标注语义分割数据》
标注完成获得原始图片对应的json文件。

Convert to VOC-format Dataset

利用对应的json文件,将数据转换成voc格式,方便后续进一步转换成deeplab训练所需的灰度图格式。

将labelme项目下载到本地:

git clone https://github.com/wkentaro/labelme.git

找到目录/labelme/examples/semantic_segmentation,里面有一个进行转换的完整示例,对照着示例,将自己的数据(原始图片和对应json标注)放入data_annotated文件夹,制作自己的labels.txt,拷贝labelme2voc.py文件不需改动,如下:
在这里插入图片描述
then:

# It generates:
#   - data_dataset_voc/JPEGImages
#   - data_dataset_voc/SegmentationClass
#   - data_dataset_voc/SegmentationClassVisualization
python labelme2voc.py data_annotated data_dataset_voc --labels labels.txt

会生成data_dataset_voc文件夹,里面包含:
在这里插入图片描述

Convert to 灰度图

deeplab使用单通道的标注图,即灰度图,并且类别的像素标记应该是0,1,2,3…n(共计n+1个类别,包含1个背景类和n个目标类),此外,标注图上忽略的像素值标记为255。

注意:不要把 ignore_label 和 background 混淆,ignore_label 没有做标注,不在预测范围内,即不参与计算loss。我们在mask中将 ignore_label 的灰度值标记为 255,而background 标记为 0。

我们上一步获得了voc格式数据,对于voc这种有colormap的标注图,可以利用remove_gt_colormap.py去掉colormap转成灰度图。

要使用remove_gt_colormap.py,首先要将tensorflow的models下载到本地:

git clone https://github.com/tensorflow/models.git

then:

# from models/research/deeplab/datasets
python remove_gt_colormap.py \
  --original_gt_folder="/path/SegmentationClassPNG" \
  --output_dir="/path/SegmentationClassRaw"

original_gt_folder是原始标签图文件夹,这里给定上一步生成的data_dataset_voc文件夹下的SegmentationClassPNG文件夹路径,output_dir是要输出的标签图文件夹的位置,设定为和SegmentationClassPNG文件夹同级目录下的SegmentationClassRaw文件夹。

生成的SegmentationClassRaw文件夹里面就是需要的灰度图:
在这里插入图片描述
乍一看黑不溜秋,其实对应标注像素值有变化,可以将图片像素值整体乘上100,效果如下:
在这里插入图片描述
see?像素值是不一样滴。

Convert to tfrecord

制作tfrecord之前,需要有指引文件将数据集分类成训练/测试/验证集。

制作指引文件,需要将之前生成的原始图片和灰度图分别放在两个文件夹下:/root/data/image//root/data/mask/,两个文件夹下的文件是一一对应的,文件名相同。并在文件夹/root/data/index/下创建3个txt文件:

  • train.txt:所有训练集的文件名
  • trainval.txt:所有验证集的文件名
  • val.txt:所有测试集的文件名

数据集目录如下:

from /root/data/

  • image
  • mask
  • index
    • train.txt
    • trainval.txt
    • val.txt
  • tfrecord

这里贴一段python脚本,能够获取文件名写入txt:

# 文件名写入txt
import random
import glob

img_path = glob.glob('/root/data/image/*.jpg') 
for each in img_path:
    with open('/root/data/image/all.txt','a')as f:
        f.write(each[15:-4]+'\n')# 切片换成自己路径对应的文件名位置

然后对文件名进行随机分配成三个txt:

# 随机分配训练集测试集验证集
import random

with open('/root/data/image/all.txt','r')as f:
    lines = f.readlines()
    g = [i for i in range(1, 2172)]# 设置文件总数
    random.shuffle(g)
    # 设置需要的文件数
    train = g[:1500]
    trainval = g[1500:1900]
    val = g[1900:]

    for index, line in enumerate(lines,1):
        if index in train:
            with open('/root/data/index/train.txt','a')as trainf:
                trainf.write(line)
        elif index in trainval:
            
评论 94
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值