balancap-ssd-tensorflow_ubuntu環境_手把手教學操作全流程
第一部分
一、利用jupyter Notebook可以輕鬆的執行SSD的一個測試用例
你要做的就是:
1. 下載模型ssd_300_vgg,存放在SSD-Tensorflow-master/checkpoints/這個目錄下,解壓
2. 開啟終端,在主目錄下,進入SSD-Tensorflow-master目錄,進入 notebooks目錄,執行 jupyter-notebook進入http://localhost:8892/tree伺服器,開啟 ssd_notebook.ipynb.ipynb檔案
3. (此步驟其他教程有說,我沒有做,用的預設的可以執行)
配置一些路徑:第4個cell中from notebooks import visualization改成import notebooks,不改的話目錄結構不對,會報錯
4.執行到第4個cell報錯說找不到 nets 模組,解決辦法是在第三個cell裡面新增路徑,一定是到nets資料夾的上一級目錄
/home/hp/zjc/Tensorflow/Deeplearning/SSD-Tensorflow-master/
否則會報錯
5.使用自己的圖片,改變path = '../demo/'成自己的圖片所在路徑
6. 從頭到尾執行所有cell即可。
第二部分
二、製作資料集
1.VOC2007為例,結構如下
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~`
+VOCtrainval_06-Nov-2007
+VOCdevkit
+VOC2007
+Annotations
+ImageSets
+JPEGImages
+SegmentationClass
+SegmentationObject
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+VOCtest_06-Nov-2007
+VOCdevkit
+VOC2007
+Annotations
+ImageSets
+JPEGImages
+SegmentationClass
+SegmentationObject
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2.voc2007的檔案要如此放置3個壓縮包分別放在三個資料夾(資料夾按要求命名),解壓出來
3.為了避免每次在終端敲那麼多字母,建議新建一個.sh檔案,把以下指令碼貼上進去.
起名為 tf_convert_data.sh
只要在這裡更改DATASET_DIR與OUTPUT_DIR路徑就可以了
最後在檔案所在目錄開啟終端並輸入bash tf_convert_data.sh:
(本教程所建立的所有shell指令碼都存放在
/home/.../Tensorflow/Deeplearning/shell這個資料夾下)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#以下是格式說明檔案
#filename = tf_convert_data.sh
#!/bin/bash
#This is a shell script to convert Pascal VOC datasets(2007 and 2012) into TF-Records only.
#Directory where the original dataset is stored
DATASET_DIR=/home/hp/zjc/Tensorflow/Deeplearning/VOCtrainval_06-Nov-2007/VOCdevkit/VOC2007/
#Output directory where to store TFRecords files
OUTPUT_DIR=/home/hp/zjc/Tensorflow/Deeplearning/VOCtrainval_06-Nov-2007/VOCdevkit/VOC2007_tfrecord/ #一定注意這裡的VOC2007_tfrecord資料夾是自己新建的,用於輸出tfrecord檔案
python ../tf_convert_data.py \ #此處找到tf_convert_data.py 路徑即可eg: python /home/hp/zjc/Tensorflow/Deeplearning/SSD-Tensorflow-master/tf_convert_data.py \
--dataset_name=pascalvoc \
--dataset_dir=${DATASET_DIR} \
--output_name=voc_2007_train \
--output_dir=${OUTPUT_DIR}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#下面是我自己的.sh檔案可以稍微改下路徑複製直接用
#filename = tf_convert_data.sh #!/bin/bash #This is a shell script to convert Pascal VOC datasets(2007 and 2012) into TF-Records only.
#Directory where the original dataset is stored DATASET_DIR=/home/hp/zjc/Tensorflow/Deeplearning/VOCtrainval_06-Nov-2007/VOCdevkit/VOC2007/
#Output directory where to store TFRecords files OUTPUT_DIR=/home/hp/zjc/Tensorflow/Deeplearning/VOCtrainval_06-Nov-2007/VOCdevkit/VOC2007_tfrecord/
python /home/hp/zjc/Tensorflow/Deeplearning/SSD-Tensorflow-master/tf_convert_data.py \ --dataset_name=pascalvoc \ --dataset_dir=${DATASET_DIR} \ --output_name=voc_2007_train \ --output_dir=${OUTPUT_DIR}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
如圖
4.執行指令,終端裡面bash tf_convert_data.sh即可
(VOC2007_tfrecord資料夾是自己新建的,用於輸出tfrecord檔案執行結果如下)
執行結果如下:
(有的博主說官方的小DEMO有問題,原話如下:demo中的sess = tf.Session()這條語句連續第二次執行的時候,一切又回覆正常,wtf!!!
我:同樣遇到,但是一會又好了,而且檢測同樣一張圖片隨緣成功)
第三部分
三、驗證
為了 reproduce evaluation metrics on the recall-precision curve && compute mAP metrics following the Pascal VOC 2007 and 2012 guidelines. 跟製作資料集的shell 指令碼一樣,可以在tf_convert_data.sh指令碼所在目錄”/shell”,新建指令碼並將如下程式碼貼上進去,執行bash eval_ssd_network.sh
執行:
2.直接執行會報錯
TypeError: Can not convert a tuple into a Tensor or Operation.
解決辦法如下:參照此網址
第一部分貼上進去
第二,三部分看好位置呼叫flatten函式
一部分
def flatten(x):
result = []
for el in x:
if isinstance(el, tuple):
result.extend(flatten(el))
else:
result.append(el)
return result
二,三部分
# Waiting loop.
slim.evaluation.evaluation_loop(
master=FLAGS.master,
checkpoint_dir=checkpoint_path,
logdir=FLAGS.eval_dir,
num_evals=num_batches,
eval_op=flatten(list(names_to_updates.values())), #這裡呼叫flatten
variables_to_restore=variables_to_restore,
eval_interval_secs=60,
max_number_of_evaluations=np.inf,
session_config=config,
timeout=None)
# Standard evaluation loop.
start = time.time()
slim.evaluation.evaluate_once(
master=FLAGS.master,
checkpoint_path=checkpoint_path,
logdir=FLAGS.eval_dir,
num_evals=num_batches,
eval_op=flatten(list(names_to_updates.values())), #這裡也呼叫flatten
variables_to_restore=variables_to_restore,
session_config=config)
(
報錯:
tensorflow.python.framework.errors_impl.InternalError: Failed to create session.
解決方法:
gnome-system-monitor
gnome-system-monitor關掉要關的
)
不過我是直接重啟,暴力解決
3.tensorboard顯示
在../log_files/log_eval/
下生成三個檔案:
events.out.tfevents.1498225326.doctorimagePC
,
events.out.tfevents.1498225563.doctorimagePC
,
training_config.txt
下圖是別人跑出來的結果,為啥我的沒有MAP?
在目錄 /.../SSD-Tensorflow-master/log_files
下執行tensorboard --logdir=log_eval