1. 程式人生 > >SSD講堂二(整體流程)_balancap-ssd-tensorflow_ubuntu環境_手把手教學操作全流程

SSD講堂二(整體流程)_balancap-ssd-tensorflow_ubuntu環境_手把手教學操作全流程

重要參考 https://blog.csdn.net/yexiaogu1104/article/details/77415990      

第一部分

一、利用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!!!

我:同樣遇到,但是一會又好了,而且檢測同樣一張圖片隨緣成功)

 

第三部分

三、驗證

1.下載好三個checkpoint:SSD-300 VGG-based, SSD-300 VGG-based, SSD-512 VGG-based,(需要翻,否則點了也載入不出來,具體請私信我,教你修改HOSTS

 

為了 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.

解決辦法如下:參照此網址

https://www.cnblogs.com/xlqtlhx/p/7866791.html

第一部分貼上進去

第二,三部分看好位置呼叫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.

解決方法:

此連結https://blog.csdn.net/pursuit_zhangyu/article/details/80582544

貌似可以解決問題

gnome-system-monitor

 

gnome-system-monitor關掉要關的

不過我是直接重啟,暴力解決

3.tensorboard顯示

(需要在google chrome瀏覽器登入,下載安裝方法參考https://blog.csdn.net/zjc910997316/article/details/82844908)

../log_files/log_eval/下生成三個檔案:

events.out.tfevents.1498225326.doctorimagePC,

events.out.tfevents.1498225563.doctorimagePC,

training_config.txt

下圖是別人跑出來的結果

在目錄 /.../SSD-Tensorflow-master/log_files

下執行tensorboard --logdir=log_eval

在chrome瀏覽器中輸入++http://localhost:6006++即可