tf-faster-rcnn调试笔记(0)

Posted by Kiri on July 13, 2018

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的函数用法