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