1. 程式人生 > >faster-rcnn 之 shell指令碼開始訓練:./experiments/scripts/faster_rcnn_alt_opt.sh 0 ZF pascal_voc

faster-rcnn 之 shell指令碼開始訓練:./experiments/scripts/faster_rcnn_alt_opt.sh 0 ZF pascal_voc

【說明】:歡迎加入:faster-rcnn 交流群 238138700,這是作者提供的一個執行訓練的指令碼,我們來看看這個指令碼做了什麼工作,如果要執行需要輸入哪些引數;

【使用】:如果要訓練一個網路,可以在shell中輸入:./experiments/scripts/faster_rcnn_alt_opt.sh 0 ZF pascal_voc

這樣就指定了gpu編號,網路名稱,資料集名稱三個引數,就可以了

#!/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]"

set -x
set -e

export PYTHONUNBUFFERED="True"

GPU_ID=$1
NET=$2
NET_lc=${NET,,}
DATASET=$3

array=( 
[email protected]
) len=${#array[@]} EXTRA_ARGS=${array[@]:3:$len} EXTRA_ARGS_SLUG=${EXTRA_ARGS// /_} case $DATASET in pascal_voc) TRAIN_IMDB="voc_2007_trainval" TEST_IMDB="voc_2007_test" PT_DIR="pascal_voc" ITERS=40000 ;; coco) echo "Not implemented: use experiments/scripts/faster_rcnn_end2end.sh for coco" exit ;; *) echo "No dataset given" exit ;; esac LOG="experiments/logs/faster_rcnn_alt_opt_${NET}_${EXTRA_ARGS_SLUG}.txt.`date +'%Y-%m-%d_%H-%M-%S'`" exec &> >(tee -a "$LOG") echo Logging output to "$LOG" time ./tools/train_faster_rcnn_alt_opt.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 NET_FINAL=`grep "Final model:" ${LOG} | awk '{print $3}'` set -x time ./tools/test_net.py --gpu ${GPU_ID} \ --def models/${PT_DIR}/${NET}/faster_rcnn_alt_opt/faster_rcnn_test.pt \ --net ${NET_FINAL} \ --imdb ${TEST_IMDB} \ --cfg experiments/cfgs/faster_rcnn_alt_opt.yml \ ${EXTRA_ARGS}


按行解析:

set -x

set -e

關於set可以參考連結點選開啟連結,set -x :將後面執行的命令輸出到螢幕,便於除錯;set -e:如果命令返回值不是0則退出shell;

後面的這一段就是輸入3個引數

GPU_ID=$1
NET=$2
NET_lc=${NET,,}
DATASET=$3


這一段沒去糾結細節,反正大意就是獲取剩下的引數,放在EXTRA_ARGS變數中
array=( [email protected] )
len=${#array[@]}
EXTRA_ARGS=${array[@]:3:$len}
EXTRA_ARGS_SLUG=${EXTRA_ARGS// /_}

然後就是根據出入的引數dataset,使用case語句選擇執行,這裡有3個分支,分別是pascal_voc,coco和其他

case $DATASET in
  pascal_voc)
    TRAIN_IMDB="voc_2007_trainval"
    TEST_IMDB="voc_2007_test"
    PT_DIR="pascal_voc"
    ITERS=40000
    ;;
  coco)
    echo "Not implemented: use experiments/scripts/faster_rcnn_end2end.sh for coco"
    exit
    ;;
  *)
    echo "No dataset given"
    exit
    ;;
esac

再下面就是呼叫python指令碼執行訓練和測試了:

time ./tools/train_faster_rcnn_alt_opt.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
NET_FINAL=`grep "Final model:" ${LOG} | awk '{print $3}'`
set -x


time ./tools/test_net.py --gpu ${GPU_ID} \
  --def models/${PT_DIR}/${NET}/faster_rcnn_alt_opt/faster_rcnn_test.pt \
  --net ${NET_FINAL} \
  --imdb ${TEST_IMDB} \
  --cfg experiments/cfgs/faster_rcnn_alt_opt.yml \
  ${EXTRA_ARGS}

從上面可以看出,作者搞這麼麻煩,其實一句話呼叫train_faster_rcnn_alt_opt.py就得了,費這麼大勁,無語

比如訓練,直接使用python指令碼的話,如下輸入:

./tools/train_faster_rcnn_alt_opt.py --gpu 0 --net_name ZF --weights data/imagenet_models/ZF.v2.caffemodel --imdb voc_2007_trainval --cfg experiments/cfgs/faster_rcnn_alt_opt.yml