1. 程式人生 > >TensorFlow Object Detection API 教程1

TensorFlow Object Detection API 教程1

TensorFlow 的物件檢測 API ( Tensorflow Object Detection API ) 是一個非常強大的工具,可以快速地使任何人(特別是那些像我一樣沒有機器學習背景的人)來構建和部署功能強大的影象識別系統。Github 上也有詳細的使用說明,這裡主要是其運用的實踐過程。

TensorFlow物件檢測API教程 - 第1部分:選擇模型

Github 上的 tutorial
ai-1

這些都將在 Linux 中完成整個教程,但如果可以安裝和使用 TensorFlow,在其他作業系統上使用這些資訊也是沒問題的。

一. 安裝說明

1.1 下載並編譯

在你喜歡的目錄下新建一個新目錄 Tensorflow

,進入此目錄下載安裝 Tensorflow Object Detection API

git clone https://github.com/tensorflow/models.git 

如下圖
ai-3

然後請根據 models/blob/master/research/object_detection/g3doc/ 目錄下的 installation.md 配置好你的環境。應該注意的是,如果你之前安裝過 TensorFlow ,也請根據 installation.md 檔案裡的 Add Libraries to PYTHONPATH 的說明配置好你的環境。

進入目錄 models/research/

編譯 Object Detection API 程式碼

# From tensorflow/models/research/
protoc object_detection/protos/*.proto --python_out=.

如果您不熟悉修改 .bashrc 檔案,請將終端控制檯 cdmodels/research / 目錄下 ,並輸入命令

# From tensorflow/models/research/
export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/slim

如下圖
ai-4

進入您的終端視窗。如果關閉終端視窗,則必須重新執行此操作。

一步一腳印按照教程環境配置來,其實還是很容易踩到坑的。像我就踩到不少坑


踩坑

跳坑之 tensorflow 安裝
---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
/home/trsky/anaconda2/envs/py3/lib/python3.6/site-packages/tensorflow/python/pywrap_tensorflow.py in <module>()
     57 
---> 58   from tensorflow.python.pywrap_tensorflow_internal import *
     59   from tensorflow.python.pywrap_tensorflow_internal import __version__

/home/trsky/anaconda2/envs/py3/lib/python3.6/site-packages/tensorflow/python/pywrap_tensorflow_internal.py in <module>()
     27             return _mod
---> 28     _pywrap_tensorflow_internal = swig_import_helper()
     29     del swig_import_helper

/home/trsky/anaconda2/envs/py3/lib/python3.6/site-packages/tensorflow/python/pywrap_tensorflow_internal.py in swig_import_helper()
     23             try:
---> 24                 _mod = imp.load_module('_pywrap_tensorflow_internal', fp, pathname, description)
     25             finally:

/home/trsky/anaconda2/envs/py3/lib/python3.6/imp.py in load_module(name, file, filename, details)
    241         else:
--> 242             return load_dynamic(name, filename, file)
    243     elif type_ == PKG_DIRECTORY:

/home/trsky/anaconda2/envs/py3/lib/python3.6/imp.py in load_dynamic(name, path, file)
    341             name=name, loader=loader, origin=path)
--> 342         return _load(spec)
    343 

ImportError: libcublas.so.9.0: cannot open shared object file: No such file or directory

During handling of the above exception, another exception occurred:

ImportError                               Traceback (most recent call last)
<ipython-input-1-a438b9f11946> in <module>()
      4 import sys
      5 import tarfile
----> 6 import tensorflow as tf
      7 import zipfile
      8 

/home/trsky/anaconda2/envs/py3/lib/python3.6/site-packages/tensorflow/__init__.py in <module>()
     22 
     23 # pylint: disable=wildcard-import
---> 24 from tensorflow.python import *
     25 # pylint: enable=wildcard-import
     26 

/home/trsky/anaconda2/envs/py3/lib/python3.6/site-packages/tensorflow/python/__init__.py in <module>()
     47 import numpy as np
     48 
---> 49 from tensorflow.python import pywrap_tensorflow
     50 
     51 # Protocol buffers

/home/trsky/anaconda2/envs/py3/lib/python3.6/site-packages/tensorflow/python/pywrap_tensorflow.py in <module>()
     72 for some common reasons and solutions.  Include the entire stack trace
     73 above this error message when asking for help.""" % traceback.format_exc()
---> 74   raise ImportError(msg)
     75 
     76 # pylint: enable=wildcard-import,g-import-not-at-top,unused-import,line-too-long

ImportError: Traceback (most recent call last):
  File "/home/trsky/anaconda2/envs/py3/lib/python3.6/site-packages/tensorflow/python/pywrap_tensorflow.py", line 58, in <module>
    from tensorflow.python.pywrap_tensorflow_internal import *
  File "/home/trsky/anaconda2/envs/py3/lib/python3.6/site-packages/tensorflow/python/pywrap_tensorflow_internal.py", line 28, in <module>
    _pywrap_tensorflow_internal = swig_import_helper()
  File "/home/trsky/anaconda2/envs/py3/lib/python3.6/site-packages/tensorflow/python/pywrap_tensorflow_internal.py", line 24, in swig_import_helper
    _mod = imp.load_module('_pywrap_tensorflow_internal', fp, pathname, description)
  File "/home/trsky/anaconda2/envs/py3/lib/python3.6/imp.py", line 242, in load_module
    return load_dynamic(name, filename, file)
  File "/home/trsky/anaconda2/envs/py3/lib/python3.6/imp.py", line 342, in load_dynamic
    return _load(spec)
ImportError: libcublas.so.9.0: cannot open shared object file: No such file or directory


Failed to load the native TensorFlow runtime.

See https://www.tensorflow.org/install/install_sources#common_installation_problems

for some common reasons and solutions.  Include the entire stack trace
above this error message when asking for help.

如圖
ai-2
解決

我是通過 Anaconda 管理 Python 環境的,按照教程的 tensorflow 安裝方式貌似是哪裡除了錯?那就還是用 conda 安裝好了。用 conda 安裝 tensorflow

conda install tensorflow

如下圖
ai-1

更多相關問題

1.2 測試模型

進入 models/research/objection_detection / 目錄,執行 命令

 jupyter-notebook 

如下圖

ai-7

修改檔案路徑,即可以測試自己的圖片,例如下面

PATH_TO_TEST_IMAGES_DIR = 'test_images'
TEST_IMAGE_PATHS = [ os.path.join(PATH_TO_TEST_IMAGES_DIR, 'image{}.jpg'.format(i)) for i in range(1, 3) ]

如圖
ai-12

開啟 jupyter 。開啟瀏覽器 (預設地址 http://localhost:8888/tree ),開啟 object_detection_tutorial.ipynb 並通過 Cell - Run all 執行整個 notebook 。注意不要將此檔案移動到此資料夾之外,否則某些匯入語句將失敗。

在這裡,訓練自己的資料應該有幾個想要分類的樣本影象。將它們放在 tests_images 資料夾中,並將命名為image3.jpgimage4.jpgimageN.jpg 等。在 notebook 中修改檢測標目標的路徑

TEST_IMAGE_PATHS = [os.path.join(PATH_TO_TEST_IMAGES_DIR,'image{}.jpg'.format(i)) for i in range(1, N+1)]

其中,N 是放置在資料夾中的影象的最後一個編號。然後重新執行 notebook 。會發現影象已被分類。

注意:要將圖片名稱設定的和程式碼描述相符合,如 image1.jpg

例如

# If you want to test the code with your images, just add path to the images to the TEST_IMAGE_PATHS.
PATH_TO_TEST_IMAGES_DIR = '/media/Deep_Learning/test_images'
TEST_IMAGE_PATHS = [ os.path.join(PATH_TO_TEST_IMAGES_DIR, 'image{}.jpg'.format(i)) for i in range(1, 3) ]

開啟 object_detection_tutorial.ipynb
ai-5

Cell - Run all 執行整個 notebook
ai-6

執行結果
ai-7

ai-10

當然也可以進入目錄 models/research 執行以下命令測試是否成功下載並部署好 Tensorflow Object Detection API 的環境

 python object_detection/builders/model_builder_test.py

如下圖

ai-9

注意:如果你不幸踩到坑併發出如下錯誤提示了

Traceback (most recent call last):
  File "object_detection/builders/model_builder_test.py", line 21, in <module>
    from object_detection.builders import model_builder
ModuleNotFoundError: No module named 'object_detection'

請回到此文章開頭所說的,在開啟的終端中進入 models/research 目錄,請重新執行

protoc object_detection/protos/*.proto --python_out=.
export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/slim

然後再執行 python object_detection/builders/model_builder_test.py

如下圖,測試成功
ai-8

二.選擇一個模型

notebook 中的預設模型是 TensorFlow 提供的最簡單(最快)的預先訓練的模型。可以看下面的表格,你可以看到有很多其他可用的模型。其中,mAP 表示 平均精度,表示模型在 COCO 資料集上的測試情況。一般來說,計算時間更長的模型性可能會更好。然而,這些模型也有一些細微的差別(比如對小物體的表現),如果想了解它們的優點和缺點,可以閱讀相關的論文

Model name Speed COCO mAP Outputs
ssd_mobilenet_v1_coco fast 21 Boxes
ssd_inception_v2_coco fast 24 Boxes
rfcn_resnet101_coco medium 30 Boxes
faster_rcnn_resnet101_coco medium 32 Boxes
faster_rcnn_inception_resnet_v2_atrous_coco slow 37 Boxes

要測試新模型,只需將 jupyter notebook 中的 MODEL_NAME 替換為位於g3doc 資料夾中的 detection_model_zoo.mb 檔案中相應模型的下載位置即可。

可直接將 MODEL_NAME 修改為如下值以呼叫其他模型

MODEL_NAME = 'ssd_inception_v2_coco_11_06_2017'

MODEL_NAME = 'rfcn_resnet101_coco_11_06_2017'

MODEL_NAME = 'faster_rcnn_resnet101_coco_11_06_2017'

MODEL_NAME = 'faster_rcnn_inception_resnet_v2_atrous_coco_11_06_2017'

ai-12