👦👦👦👦👦👦👦👦👦👦👦👦👦👦👦👦👦👦👦👦👦👦👦👦👦👦👦👦👦👦👦
文章目录
大前提
👿👿👿👿👿👿👿👿👿👿👿👿👿👿👿👿👿👿
首先完成我的另一篇博文《(超详细很完整)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:

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

被折叠的 条评论
为什么被折叠?



