ICnet基于VOC数据集的训练
Voc4ICnet
数据集准备的目的:ICNET基于VOc数据集的训练,和同时做分割和检测的Blitznet做对比.
一、数据集标签制作与准备:
Pascal VOC数据集可用于目标检测和分割,提供了语义分割标签和实例分割标签.
本文中使用的数据集为原始的pascal-voc2012,和B. Hariharan et a提供的额外的带有分割label的voc_aug数据集合并而成.
voc_aug: http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar # 2 GB
下载后解压并重命名为voc_aug
pascal-voc2012: http://www.eecs.berkeley.edu/Research/Projects/CS/vision/grouping/semantic_contours/benchmark.tgz # 1.3 GB
下载后解压,并将voc2012重命名为VOC2012_orig
由于ICNET原代码中使用的标签数据为灰度图,需要将上述数据集中的标签数据都转换为灰度图作为传入的标签.
而voc_aug下载并解压,得到文件夹benchmark_RELEASE,讲其重命名为VOC_aug.该数据集中的label是.mat格式的文件,这里需要将.mat转化为.png的灰度图.
在网上看到deeplab_v2中作者有给出转化代码,下载deeplab_v2项目,转化代码为deeplab_v2/voc2012/mat2png.py,传入参数为.mat文件的存放路径和转化都的png文件存放路径
本文数据集中用到的文件路径如下:
vocdatasetVOC2012_orgImageSetsSegmentationtrainval.txtJPEGImagesSegmentationClassSegmentationClass_1DVOC_augdatasetclscls_png
本文的运行命令如下:
cd ~/TF-Project/deeplab_v2/voc2012
./mat2png.py /media/yue/DATA/vocdataset/VOC_aug/dataset/cls /media/yue/DATA/vocdataset/VOC_aug/dataset/cls_png
由于原始的数据集VOC2012中语义标签是三通道的彩色图片,需要将其降为单通道的图片
./convert_labels.py /media/yue/DATA/vocdataset/VOC2012_orig/SegmentationClass/ /media/yue/DATA/vocdataset/VOC2012_orig/ImageSets/Segmentation/trainval.txt /media/yue/DATA/vocdataset/VOC2012_orig/SegmentationClass_1D/
即可得到两组数据的原图和标签图,具体为
vocdatasetVOC2012_orgJPEGImages #原图SegmentationClass_1D #单通道标签图VOC_augdatasetimg #原图cls_png #单通道标签图
再将两数据集的原图和单通道标签图分别合并,将原始pascal voc2012数据集中的图片inages和标签labels复制到增强pascal voc2012数据集中,如果重复则覆盖
cd /media/yue/DATA/vocdataset
cp VOC2012_orig/SegmentationClass_1D/* VOC_aug/dataset/cls_png/
cp VOC2012_orig/JPEGImages/* VOC_aug/dataset/img/
- images:img,jpg图片的个数变成17125张;
- labels:文件名是cls_png, png图片的个数是11355张。
再制作训练集和验证集和测试集,生成.txt文件.由于Icnet对输入文件大小有限定,这里还需要将所有图片都resize到2的大小.再根据训练步骤训练即可.
二、VOC训练train.py
# If you want to apply to other datasets, change following four lines
DATA_DIR ='/media/yue/DATA/vocdataset'
DATA_LIST_PATH = '/media/yue/DATA/vocdataset/icnettrain.txt'
IGNORE_LABEL = 0 # The class number of background
INPUT_SIZE = '256, 256'
2、修改传入的预训练模型,这里不需要传入预训练模型,直接将读入预训练模型语句注释掉.
本文修改代码的190和191行如下:
else:print('traing without pre-trained model...')#net.load(args.restore_from, sess)
python train_voc.py --update-mean-var --train-beta-gamma
1修改icnet_cityscapes_bnnomerge.prototxt中的conv6_cls num_output 为自己需要输出类别数,这里为21(不修改此处也可进行训练,是否有错误还需验证)
def load(self, data_path, session, ignore_missing=True):data_dict = np.load(data_path, encoding='latin1').item()for op_name in data_dict:with tf.variable_scope(op_name, reuse=True):for param_name, data in data_dict[op_name].items():try:if 'bn' in op_name:param_name = BN_param_map[param_name]var = tf.get_variable(param_name)if 'conv6_cls' not in var.name:session.run(var.assign(data))except ValueError:if not ignore_missing:raise
3取消net.load(args.restore_from, sess)的注释.
训练命名如上
三、VOC评价evaluate.py
1参照evaluate.py写的cityscapes_param和ADE20k_param写voc_param,并添加相关字段.本文如下:
voc_param = {'name': 'voc','input_size': [256, 256],'num_classes': 21,'ignore_label': 0,'num_steps': 2000,'data_dir': '/media/yue/DATA/vocdataset','data_list': '/media/yue/DATA/vocdataset/icnetval.txt'
'others': './snapshots/'
parser.add_argument("--dataset", type=str, default='',choices=['ade20k', 'cityscapes','voc'],required=True)
elif param['name'] == 'voc':img = tf.expand_dims(img, axis=0)img = tf.image.resize_bilinear(img, shape, align_corners=True)
elif args.dataset == 'voc':param = voc_param
elif args.dataset == 'voc':mIoU, update_op = tf.contrib.metrics.streaming_mean_iou(pred, gt, num_classes=param['num_classes'])
python evaluate.py --dataset=voc --filter-scale=1 --model=others
InvalidArgumentError (see above for traceback): assertion failed: [`labels` out of bound] [Condition x < y did not hold element-wise:x (mean_iou/confusion_matrix/control_dependency:0) = ] [1 1 1...] [y (mean_iou/ToInt64_2:0) = ] [8][[Node: mean_iou/confusion_matrix/assert_less/Assert/AssertGuard/Assert = Assert[T=[DT_STRING, DT_STRING, DT_INT64, DT_STRING, DT_INT64], summarize=3, _device="/job:localhost/replica:0/task:0/device:CPU:0"](mean_iou/confusion_matrix/assert_less/Assert/AssertGuard/Assert/Switch/_781, mean_iou/confusion_matrix/assert_less/Assert/AssertGuard/Assert/data_0, mean_iou/confusion_matrix/assert_less/Assert/AssertGuard/Assert/data_1, mean_iou/confusion_matrix/assert_less/Assert/AssertGuard/Assert/Switch_1/_783, mean_iou/confusion_matrix/assert_less/Assert/AssertGuard/Assert/data_3, mean_iou/confusion_matrix/assert_less/Assert/AssertGuard/Assert/Switch_2/_785)]][[Node: Gather_1/_817 = _Recv[client_terminated=false, recv_device="/job:localhost/replica:0/task:0/device:GPU:0", send_device="/job:localhost/replica:0/task:0/device:CPU:0", send_device_incarnation=1, tensor_name="edge_1308_Gather_1", tensor_type=DT_INT64, _device="/job:localhost/replica:0/task:0/device:GPU:0"]()]]
检查语义标签图片,发现有个别灰度图像素点值大于类别数,说明在转为灰度图时出现了错误.重新制作灰度图,发现灰度图无误,错误出现自resize的过程中,修正后即可.
训练的60000次的模型,miou为0.00797,loss已降至0.5,目前未找到原因.
四、VOC推断inference.py
1、修改model_paths中’others’字段,为’others’:’./snapshots/’
def main():args = get_arguments()if args.dataset == 'cityscapes':num_classes = cityscapes_classelse:num_classes = ADE20k_class
if args.dataset == 'cityscapes':num_classes = cityscapes_classelif args.dataset == 'ADE20k':num_classes = ADE20k_classelif args.dataset == 'voc':num_classes = voc_class
parser.add_argument("--dataset", type=str, default='',choices=['ade20k', 'cityscapes'],required=True)
parser.add_argument("--dataset", type=str, default='',choices=['ade20k', 'cityscapes','voc'],required=True)
python inference.py --img-path=./input/2007_000027.jpg --model=others --dataset=voc --filter-scale=1
Traceback (most recent call last):File "inference.py", line 198, in <module>main()File "inference.py", line 160, in mainpred = decode_labels(raw_output_up, shape, num_classes)File "/home/yue/TF-Project/ICNet-tensorflow-master/tools.py", line 39, in decode_labelspred = tf.matmul(onehot_output, color_mat)File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/math_ops.py", line 1891, in matmula, b, transpose_a=transpose_a, transpose_b=transpose_b, name=name)File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/gen_math_ops.py", line 2437, in _mat_mulname=name)File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/op_def_library.py", line 787, in _apply_op_helperop_def=op_def)File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 2958, in create_opset_shapes_for_outputs(ret)File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 2209, in set_shapes_for_outputsshapes = shape_func(op)File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 2159, in call_with_requiringreturn call_cpp_shape_fn(op, require_shape_fn=True)File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/common_shapes.py", line 627, in call_cpp_shape_fnrequire_shape_fn)File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/common_shapes.py", line 691, in _call_cpp_shape_fn_implraise ValueError(err.message)
ValueError: Dimensions must be equal, but are 21 and 19 for 'MatMul' (op: 'MatMul') with input shapes: [65536,21], [19,3].
label_colours_voc = [[0, 0, 0],[128, 0, 0] ,[ 0, 128, 0],[128, 128, 0],[ 0, 0, 128] ,[128, 0, 128] ,[ 0, 128, 128] ,[128, 128, 128],[ 64, 0, 0] ,[192, 0, 0] ,[ 64, 128, 0],[192, 128, 0],[ 64, 0, 128],[192, 0, 128],[ 64, 128, 128],[192, 128, 128],[ 0, 64, 0],[128, 64, 0],[ 0, 192, 0] ,[128, 192, 0],[ 0, 64, 128]]
def decode_labels(mask, img_shape, num_classes):if num_classes == 150:color_table = read_labelcolours(matfn)elif num_classes==21:color_table = label_colours_vocelse:color_table = label_colours
ICnet基于VOC数据集的训练相关推荐
- pascal行人voc_在Pascal VOC 数据集上训练YOLOv3模型
上节介绍了<从零开始在Windows10中编译安装YOLOv3>,本节介绍在Pascal VOC 数据集上训练YOLOv3. 第一步,下载并安装YOLOv3训练依赖项. a.下载Pasca ...
- pascal行人voc_在一个很小的Pascal VOC数据集上训练一个实例分割模型
只使用1349张图像训练Mask-RCNN,有代码. 代码:https://github.com/kayoyin/tiny-inst-segmentation 介绍 计算机视觉的进步带来了许多有前途的 ...
- 【学习记录】win10搭建YOLOX训练自己的VOC数据集
我是目录: 前言: 1.yolox的训练配置 2.yolox源码 3.必要的环境 配置yolox所需环境 1.安装依赖库 2.安装yolox 3.安装apex 4.下载预训练模型 4.准备自己的数据集 ...
- Ubuntu上用caffe的SSD方法训练Pascal VOC数据集
实验目的 继caffe和ssd搭建完成,demo也演示完毕,了解一些基本知识后,现在开始训练自己的数据集,在给自己的训练集处理之前,先跟着官方的示例将Pascal VOC数据集训练走一遍,把可能会踩坑 ...
- mmdetection的安装并训练自己的VOC数据集
mmdetection的安装并训练自己的VOC数据集 mmdetection的安装与VOC数据集的训练 一. mmdetection的安装 1.使用conda创建虚拟环境 2.安装Cython 3.安 ...
- yolov5-7.0训练自己的VOC数据集
yolov5-7.0训练自己的VOC数据集 这个笔记可能只适用于7.0版本的,写这个笔记主要是给工作室伙伴参考的,大佬请绕行 有错误之处欢迎指出 一.下载 yolov5的GitHub仓库地址:Rele ...
- 建立自己的voc数据集_将自己数据集转化成voc数据集格式并用mmdetection训练
一.准备自己的数据 拿nwpu数据集来举例,nwpu数据集文件夹中的内容是: images文件夹:存放数据图片 labelTxt文件夹:存放标注信息,images文件夹中每张图片都对应一个txt文件存 ...
- FCN制作自己的数据集、训练和测试 caffe
原文:http://blog.csdn.net/zoro_lov3/article/details/74550735 FCN制作自己的数据集.训练和测试全流程 花了两三周的时间,在导师的催促下,把FC ...
- GAN生成对抗网络基本概念及基于mnist数据集的代码实现
本文主要总结了GAN(Generative Adversarial Networks) 生成对抗网络的基本原理并通过mnist数据集展示GAN网络的应用. GAN网络是由两个目标相对立的网络构成的,在 ...
最新文章
- thinkphp笔记
- mysql小写转大写UPPER() 和大写转小写LOWER()
- 终于发现为什么SQL没有释放句柄,原来是保存句柄的变量被覆盖了,丢失了原来的句柄...
- 分治法在求解“最近对”问题中的应用(JAVA)
- 原码,反码,补码,移码四种机器码的表示方法及0的四种表示方法
- 预计2000元起步的骁龙855?魅族游戏手机16T有点猛!
- redis的数据持久化方案
- Jedis连接数据库
- python实现strand_sort排序算法
- 财经职业技能测试的软件,2020技能 2.财经管理类 职业技能测试考试大纲(试行)...
- 原生js追加html代码,原生js动态添加元素
- C语言——if-else语句嵌套
- 搬运: CVonline: 图像数据库(一) (更新于20190821)
- matlab内置随机数生成器及随机模拟举例
- nginx 在线一键安装
- root_path运用python_Python current_app.root_path方法代碼示例
- Python的excel表格操作,数据提取分析
- 新媒体运营绩效考核标准
- 坑人无数的俩货:半包和粘包
- BAT云战争新动向:收编“旧军”,占山为王