这篇博文主要对《Instance-aware Semantic Segmentation via Multi-task Network Cascades
》论文的代码用自己的数据运行,数据格式与原代码所需的格式一致。只是基础的利用代码,从这个过程里能了解代码的运行框架。
对这篇论文的理解参见:http://blog.csdn.net/u011070171/article/details/53071216
代码链接:https://github.com/daijifeng001/MNC
1.代码环境搭建
根据github上的代码说明,进行操作。
1)下载代码
git clone --recursive https://github.com/daijifeng001/MNC.git
2)安装python依赖包。caffe环境搭建好了的话,这些依赖包都会装过了,没有装的后面再补全。
Python packages: numpy
, scipy
, cython
,python-opencv
, easydict
, yaml
.
3)进入lib目录下进行编译。
cd $MNC_ROOT/lib
make
4)进入/MNC/caffe-mnc/目录,更改Makefile.config文件的内容如下:
# In your Makefile.config, make sure to have this line uncommented
WITH_PYTHON_LAYER := 1
# CUDNN is recommended in building to reduce memory footprint
USE_CUDNN := 1
5)进入caffe-mnc目录进行编译。
cd $MNC_ROOT/caffe-mnc
# If you have all of the requirements installed
# and your Makefile.config in place, then simply do:
make -j8 && make pycaffe
6)运行代码的demo
下载训练好的模型:
./data/scripts/fetch_mnc_model.sh
运行demo:
cd $MNC_ROOT
./tools/demo.py
7) 结果
我们可以在/MNC/data/demo/目录下看到图片分割的结果,原图以及运行demo后的结果图。
2. 用自己的数据
这篇博文只介绍到不更改原代码的数据输入格式进行代码运行,模型训练,用自己想要的数据格式进行代码运行后面再总结一下。不更改原代码数据输入格式,用自己的数据进行代码运行能让我们整体了解下代码运行流程。
1)运行入口在/MNC/experiments/scripts/目录里,新建一个my_train.sh文件,内容如下(是参考同目录下的shell文件写的):
路径最好用绝对路径,涉及个人隐私,贴出来的代码为相对路径的。。
#!/bin/bash
# Usage:
# ./experiments/scripts/my_train.sh [--set ...]
# Example:
# ./experiments/scripts/mnc_5stage.sh \
# --set EXP_DIR foobar RNG_SEED 42 TRAIN.SCALES "[400,500,600,700]"
set -x
set -e
export PYTHONUNBUFFERED="True"
ITERS=20
DATASET_TRAIN=my_train
DATASET_TEST=my_test
LOG="/MNC/experiments/logs/znlog.txt"
exec &> >(tee -a "$LOG")
echo Logging output to "$LOG"
NET_INIT=/MNC/data/mnc_model/mnc_model.caffemodel.h5
time /MNC/tools/train_net.py --gpu 0 \
--solver /MNC/models/VGG16/my_train/solver.prototxt \
--weights ${NET_INIT} \
--imdb ${DATASET_TRAIN} \
--iters ${ITERS} \
--cfg /MNC/experiments/cfgs/VGG16/my_train.yml
2)shell文件里调用/MNC/tools/train_net.py文件。
训练参数说明:
--solver 求解器文件
--imdb 图像数据库
--iters 训练迭代次数
--cfg 配置文件,可以在这个文件里设置EXP_DIR: mytrain,这为训练结果的保存目录
my_train.yml内容:
EXP_DIR: mytrain
MASK_SIZE: 21
TRAIN:
RPN_POST_NMS_TOP_N: 300
IMS_PER_BATCH: 1
BBOX_NORMALIZE_TARGETS_PRECOMPUTED: True
3)train_net.py里调用attach_roidb(args.imdb_name)和attach_maskdb(args.imdb_name),分别获取imdb和maskdb.
attach_roidb()和attach_maskdb()函数分别在/MNC/lib/db/roidb.py和,/MNC/lib/db/roidb.py文件里。
attach_roidb()和attach_maskdb()函数均调用imdb.py里的函数。
我们在 imdb.py 里添加自己的数据库,imdb.py内容如下(路径仍是绝对路径,给出的是相对路径):
# --------------------------------------------------------
# Multitask Network Cascade
# Modified from py-faster-rcnn (https://github.com/rbgirshick/py-faster-rcnn)
# Copyright (c) 2016, Haozhi Qi
# Licensed under The MIT License [see LICENSE for details]
# --------------------------------------------------------
from datasets.pascal_voc_det import PascalVOCDet
from datasets.pascal_voc_seg import PascalVOCSeg
from datasets.my_dataset_seg import MyDatasetSeg
__sets = {
'voc_2012_seg_train': (lambda: PascalVOCSeg('train', '2012', '/home/zhuangni/code/idear2/MNC/data/VOCdevkitSDS/')),
'voc_2012_seg_val': (lambda: PascalVOCSeg('val', '2012', '/home/zhuangni/code/idear2/MNC/data/VOCdevkitSDS')),
'voc_2007_trainval': (lambda: PascalVOCDet('trainval', '2007')),
'voc_2007_test': (lambda: PascalVOCDet('test', '2007')),
'my_train': (lambda: MyDatasetSeg('train', '/MNC/data/MyDataset')),
'my_test': (lambda: MyDatasetSeg('test', '/MNC/data/MyDataset'))
}
def get_imdb(name):
""" Get an imdb (image database) by name.
"""
if not __sets.has_key(name):
raise KeyError('Unknown dataset: {}'.format(name))
return __sets[name]()
def list_imdbs():
return __sets.keys()
4)在imdb.py里,
from datasets.my_dataset_seg import MyDatasetSeg
这是加载数据库的类。
我们在/MNC/lib/datasets/目录下创建加载数据库主要有三个类:my_dataset.py,my_dataset_det.py,my_dataset_seg.py。这三个文件的内容分别可以拷贝对应的pascal_voc.py,pascal_voc_det.py,pascal_voc_seg.py并进行修改。
其中, my_dataset.py可不修改。pascal_voc.py,pascal_voc_det.py和pascal_voc_seg.py主要修改路径及类名问题。
代码里的cache_file为后面生成的。
数据库主要是参考VOC 2012 dataset建立的。运行如下命令可获取该数据库,数据库在/MNC/data/VOCdevkitSDS/里:
./data/scripts/fetch_sbd_data.sh
照此,我们建立自己的数据库:
my_dataset_det.py内容: