TensorFlow Object Detection API 教程1
TensorFlow 的物件檢測 API ( Tensorflow Object Detection API ) 是一個非常強大的工具,可以快速地使任何人(特別是那些像我一樣沒有機器學習背景的人)來構建和部署功能強大的影象識別系統。Github 上也有詳細的使用說明,這裡主要是其運用的實踐過程。
TensorFlow物件檢測API教程 - 第1部分:選擇模型
Github 上的 tutorial
這些都將在 Linux
中完成整個教程,但如果可以安裝和使用 TensorFlow
,在其他作業系統上使用這些資訊也是沒問題的。
一. 安裝說明
1.1 下載並編譯
在你喜歡的目錄下新建一個新目錄 Tensorflow
Tensorflow Object Detection API
。
git clone https://github.com/tensorflow/models.git
如下圖
然後請根據 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
檔案,請將終端控制檯 cd
到 models/research /
目錄下 ,並輸入命令
# From tensorflow/models/research/
export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/slim
如下圖
進入您的終端視窗。如果關閉終端視窗,則必須重新執行此操作。
一步一腳印按照教程環境配置來,其實還是很容易踩到坑的。像我就踩到不少坑
踩坑
跳坑之 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.
如圖
解決
我是通過 Anaconda 管理 Python 環境的,按照教程的 tensorflow
安裝方式貌似是哪裡除了錯?那就還是用 conda
安裝好了。用 conda
安裝 tensorflow
。
conda install tensorflow
如下圖
更多相關問題
1.2 測試模型
進入 models/research/objection_detection /
目錄,執行 命令
jupyter-notebook
如下圖
修改檔案路徑,即可以測試自己的圖片,例如下面
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) ]
如圖
開啟 jupyter
。開啟瀏覽器 (預設地址 http://localhost:8888/tree
),開啟 object_detection_tutorial.ipynb
並通過 Cell - Run all
執行整個 notebook
。注意不要將此檔案移動到此資料夾之外,否則某些匯入語句將失敗。
在這裡,訓練自己的資料應該有幾個想要分類的樣本影象。將它們放在 tests_images
資料夾中,並將命名為image3.jpg
、image4.jpg
、imageN.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
Cell - Run all
執行整個 notebook
執行結果
當然也可以進入目錄 models/research
執行以下命令測試是否成功下載並部署好 Tensorflow Object Detection API
的環境
python object_detection/builders/model_builder_test.py
如下圖
注意:如果你不幸踩到坑併發出如下錯誤提示了
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
如下圖,測試成功
二.選擇一個模型
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'