Py Faster-RCNN 入口脚本程序faster_rcnn_alt_opt.sh注解

       最近看Faster-RCNN,虽然faster_rcnn_alt_opt.sh脚本程序无关乎核心点,但对完整理解其程序执行过程和参数设置来龙去脉还是有些必要知道和了解的,有些东西反反复复看点,然后过几天有不太清楚还不如一次性弄清楚,为此我就做了些笔记备注方便以后查阅。因为刚知道点shell脚本,所以在程序注解过程中有些罗嗦,反正主要是给自己看得,高手略过吧,不当之处忘指出。

#!/bin/bash
# Usage:
# ./experiments/scripts/faster_rcnn_alt_opt.sh GPU NET DATASET [options args to {train,test}_net.py]
# DATASET is only pascal_voc for now
#
# Example:
# ./experiments/scripts/faster_rcnn_alt_opt.sh 0 VGG_CNN_M_1024 pascal_voc \
#   --set EXP_DIR foobar RNG_SEED 42 TRAIN.SCALES "[400, 500, 600, 700]"
#2018/07/20 by DQ
       #set指令能设置所使用shell的执行方式,set -[选项] 表示启动某个设置;set +[选项]表示取消某个设置     
set -x #表示开启显示执行过程中的变量值。想知道脚本内部执行的变量的值或执行结果,这个时候可以使用在脚本内部用 set -x
set -e #就是当命令以非零状态退出时,则退出shell。主要作用是,当脚本执行出现意料之外的情况时,立即退出,避免错误被忽略,导致最终结果不正确

export PYTHONUNBUFFERED="True" #export命令将使系统在创建每一个新的shell时定义这个变量的一个拷贝。这个过程称之为变量输出。
#我的命令行输入为:./experiments/scripts/faster_rcnn_alt_opt_defect.sh 0 ZF fab
GPU_ID=$1  #命令行第一个参数:gpu的索引号 0
NET=$2     #命令行第二个参数:网络名字 ZF
NET_lc=${NET,,} #转化为小写的即zf
DATASET=$3 #命令行第三个参数:数据文件名 fab

array=( $@ ) #获取命令行所有参数
len=${#array[@]} #命令行参数个数,array[@]也表示所有参数,#表示得到数组长度
EXTRA_ARGS=${array[@]:3:$len} #获取命令行第四个之末尾之间的所有参数,一般输入3个参数,没有第四个参数,所以是空的
EXTRA_ARGS_SLUG=${EXTRA_ARGS// /_} #不太清楚搞啥子

case $DATASET in 
  pascal_voc) #case 选择项1
    TRAIN_IMDB="voc_2007_trainval"
    TEST_IMDB="voc_2007_test"
    PT_DIR="pascal_voc"
    ITERS=40000
    ;; #case 语句一段分支结束标识
  fab) #case 选择项2
    TRAIN_IMDB="fab_2017_trainval_defect"
    TEST_IMDB="fab_2017_test_defect"
    PT_DIR="fab"
    ITERS=40000
    ;;
  coco) #case 选择项3
    echo "Not implemented: use experiments/scripts/faster_rcnn_end2end.sh for coco"
    exit
    ;;
  *) #case 语句默认选项
    echo "No dataset given"
    exit
    ;;
esac #case 语句结束,这个标识符是case的逆序书写
#`date +'%Y-%m-%d_%H-%M-%S'` 中最外层是``即反引号,这和在命令行中单独执行$date +'%Y-%m-%d_%H-%M-%S'是一样的。
#显示时期,格式为:年-月-日_时-分-秒。反引号在Linux中起着命令替换的作用
LOG="experiments/logs/faster_rcnn_alt_opt_${NET}_${EXTRA_ARGS_SLUG}.txt.`date +'%Y-%m-%d_%H-%M-%S'`"
#exec命令用于调用并执行指令的命令。exec命令通常用在shell脚本程序中,可以调用其他的命令。如果在当前终端中使用命令,
#则当指定的命令执行完毕后会立即退出终端。
# >是重定向符,就是把前面输出的内容重定向到后面指定的位置
# &>filename 意思是把标准输出和标准错误输出都重定向到文件filename中
# tee命令作用可以用字母T来形象地表示。它把输出的一个副本输送到标准输出,另一个副本拷贝到相应的文件中。如果希望在看到输出的同时,
# 也将其存入一个文件,那么这个命令再合适不过了。它的一般形式为:tee -a files,其中,- a表示追加到文件末尾。
exec &> >(tee -a "$LOG") #自这一行及以后执行的命令一边显示在屏幕上,一边保存在LOG表示的文件中去
echo Logging output to "$LOG" #"$LOG" 表示LOG这个字符串变量
###训练程序###
#命令行参数前输入一定要带--,当然这个train_faster_rcnn_alt_opt_defect.py 脚本中定义参数输入形式有的可能为-
#time命令用于统计给定命令所花费的总时间
time ./tools/train_faster_rcnn_alt_opt_defect.py --gpu ${GPU_ID} \ 
  --net_name ${NET} \
  --weights data/imagenet_models/${NET}.v2.caffemodel \
  --imdb ${TRAIN_IMDB} \
  --cfg experiments/cfgs/faster_rcnn_alt_opt.yml \
  ${EXTRA_ARGS}

set +x
#最外层含有反引号,这是一个可执行语句。在LOG表示的文件中正则查找"Final model:",找到的结果,然后作为awk 命令的输入
NET_FINAL=`grep "Final model:" ${LOG} | awk '{print $3}'` #但是'{print $3}' 结果是打印数据文件名DATASET,有点绕不太清楚具体想搞啥
set -x
###测试程序###
time ./tools/test_net.py --gpu ${GPU_ID} \
  --def models/${PT_DIR}/${NET}/faster_rcnn_alt_opt/faster_rcnn_test_defect.pt \
  --net ${NET_FINAL} \
  --imdb ${TEST_IMDB} \
  --cfg experiments/cfgs/faster_rcnn_alt_opt.yml \
  ${EXTRA_ARGS}
在命令终端中键入如下命令:
$ cd py-faster-rcnn
$./experiments/scripts/faster_rcnn_alt_opt_defect.sh 0 ZF fab
屏幕显示如下(截取到参数解析处)
+ set -e
+ export PYTHONUNBUFFERED=True
+ PYTHONUNBUFFERED=True
+ GPU_ID=0
+ NET=ZF
+ NET_lc=zf
+ DATASET=fab
+ array=($@)
+ len=3
+ EXTRA_ARGS=
+ EXTRA_ARGS_SLUG=
+ echo EXTRA_ARGS_SLUG
EXTRA_ARGS_SLUG
+ case $DATASET in
+ TRAIN_IMDB=fab_2017_trainval_defect
+ TEST_IMDB=fab_2017_test_defect
+ PT_DIR=fab
+ ITERS=40000
++ date +%Y-%m-%d_%H-%M-%S
+ LOG=experiments/logs/faster_rcnn_alt_opt_ZF_.txt.2018-07-20_11-07-16
+ exec
++ tee -a experiments/logs/faster_rcnn_alt_opt_ZF_.txt.2018-07-20_11-07-16
+ echo Logging output to experiments/logs/faster_rcnn_alt_opt_ZF_.txt.2018-07-20_11-07-16
Logging output to experiments/logs/faster_rcnn_alt_opt_ZF_.txt.2018-07-20_11-07-16
+ ./tools/train_faster_rcnn_alt_opt_defect.py --gpu 0 --net_name ZF --weights data/imagenet_models/ZF.v2.caffemodel --imdb fab_2017_trainval_defect --cfg experiments/cfgs/faster_rcnn_alt_opt.yml
Called with args:
Namespace(cfg_file='experiments/cfgs/faster_rcnn_alt_opt.yml', gpu_id=0, imdb_name='fab_2017_trainval_defect', net_name='ZF', pretrained_model='data/imagenet_models/ZF.v2.caffemodel', set_cfgs=None)

 

你可能感兴趣的:(#,PyFasterRCNN)