tf-faster-rcnn调试笔记(0)
20180713-每周科研进展
- CCC2018 Poster
- 调试程序
调试程序
Faster R-CNN可以分为以下四个主要内容:
- 卷积层:首先使用提取图片的特征图,并共享于后续的RPN和分类网络;
- RPN:用于生成候选区域;
- RoI Pooling:使用共享卷积层生成的特征图和候选区域,生成固定大小的候选区域特征图,送入后续分类网络判别目标类别;
- Classification:所有的RCNN系列的方法都把检测的问题转换为对图片的局部区域的分类问题,利用proposal feature maps计算proposal的类别,同时再次bounding box regression获得检测框最终的精确位置 。
train_faster_rcnn.sh
修改了sh文件,让程序能够单一的在pascal_voc数据集上训练基于vgg16的Faster R-CNN网络
可以通过调整sh文件中的ITERS的数值来调整迭代次数
set -x命令用法总结 :
- 执行指令后,会先显示该指令及所下的参数
set +x命令用法总结 :
- 执行指令后,关闭该指令及所下的参数
set -e 命令用法总结 :
- 当命令的返回值为非零状态时,则立即退出脚本的执行
- 作用范围只限于脚本执行的当前进行,不作用于其创建的子进程
- 当想根据命令执行的返回值,输出对应的log时,最好不要采用set -e选项,而是通过配合exit 命令来达到输出log并退出执行的目的
#!/bin/bash
set -x
set -e
export PYTHONUNBUFFERED="True"
NET="vgg16"
array=( $@ )
len=${#array[@]}
EXTRA_ARGS=${array[@]:3:$len}
EXTRA_ARGS_SLUG=${EXTRA_ARGS// /_}
TRAIN_IMDB="voc_2007_trainval"
TEST_IMDB="voc_2007_test"
STEPSIZE="[50000]"
ITERS=70000
ANCHORS="[8,16,32]"
RATIOS="[0.5,1,2]"
LOG="experiments/logs/${NET}_${TRAIN_IMDB}_${EXTRA_ARGS_SLUG}_${NET}.txt.`date +'%Y-%m-%d_%H-%M-%S'`"
exec &> >(tee -a "$LOG")
echo Logging output to "$LOG"
set +x
if [[ ! -z ${EXTRA_ARGS_SLUG} ]]; then
NET_FINAL=output/${NET}/${TRAIN_IMDB}/${EXTRA_ARGS_SLUG}/${NET}_faster_rcnn_iter_${ITERS}.ckpt
else
NET_FINAL=output/${NET}/${TRAIN_IMDB}/default/${NET}_faster_rcnn_iter_${ITERS}.ckpt
fi
set -x
if [ ! -f ${NET_FINAL}.index ]; then
if [[ ! -z ${EXTRA_ARGS_SLUG} ]]; then
CUDA_VISIBLE_DEVICES=0 time python ./tools/trainval_net.py \
--weight data/imagenet_weights/${NET}.ckpt \
--imdb ${TRAIN_IMDB} \
--imdbval ${TEST_IMDB} \
--iters ${ITERS} \
--cfg experiments/cfgs/${NET}.yml \
--tag ${EXTRA_ARGS_SLUG} \
--net ${NET} \
--set ANCHOR_SCALES ${ANCHORS} ANCHOR_RATIOS ${RATIOS} \
TRAIN.STEPSIZE ${STEPSIZE} ${EXTRA_ARGS}
else
CUDA_VISIBLE_DEVICES=0 time python ./tools/trainval_net.py \
--weight data/imagenet_weights/${NET}.ckpt \
--imdb ${TRAIN_IMDB} \
--imdbval ${TEST_IMDB} \
--iters ${ITERS} \
--cfg experiments/cfgs/${NET}.yml \
--net ${NET} \
--set ANCHOR_SCALES ${ANCHORS} ANCHOR_RATIOS ${RATIOS} \
TRAIN.STEPSIZE ${STEPSIZE} ${EXTRA_ARGS}
fi
fi
trainval_net.py
对trainval_net.py文件加载的文件进行了粗略的理解。
初始化
#绝对导入
from __future__ import absolute_import
#精确除法
from __future__ import division
#使用Python3中的print语法
from __future__ import print_function
兼容Python2和Python3
- 绝对导入:随着Python库的扩展,越来越多的模块影响到标准库,使用绝对导入可以解决这一问题
- 精确除法:没有导入
division
时/
表示截断除法(Truncating Division);导入后//
表示截断除法 - 使用Python3中的print语法
导入相关模块
#初始化路径
import _init_paths
#导入获取兴趣区间模块和训练网络模块
from model.train_val import get_training_roidb, train_net
#模型配置文件
#cfg:_C的数据结构体,包括训练选项、测试选项等参数设置
from model.config import cfg, cfg_from_file, cfg_from_list, get_output_dir, get_output_tb_dir
#通过输入图像数据集的名字读取数据集
from datasets.factory import get_imdb
import datasets.imdb
import argparse
import pprint
import numpy as np
import sys
#加载TensorFlow
import tensorflow as tf
#加载vgg16模型
from nets.vgg16 import vgg16
#加载resnet_v1模型
from nets.resnet_v1 import resnetv1
#加载mobilenet_v1模型
from nets.mobilenet_v1 import mobilenetv1
遇到的问题
- 在shell中无法对程序进行debug,只能对部分输入参数进行调整;
- shell中部分指令了解不够
- 对程序的了解还仅仅浮于表面,没能深入的了解调试
老师的建议
- 使用pycharm对程序进行debug
- 将shell文件中的变量进行替换
- 配置pycharm运行程序的环境变量与输入参数
下一步计划
- 完成训练Faster R-CNN的主程序的debug和修改,简化程序的功能
- 主要先完成基于VGG16共享卷积层的Faster R-CNN网络在Pascal VOC数据集上进行训练的调试
- 学习程序中用到的TensorFlow的函数用法