'html
簡評:TensorFlow 是個機器學習的開源庫。這篇文章中原做者 Nick Bourdakos 將用 TensorFlow 來訓練識別自定義模型,並給出了詳細的過程(星戰迷 = =|| )。python
在寫這篇博客時,許多大型技術公司(如 IBM,Google,Microsoft,Amazon)都有簡單易用的視覺識別 API。一些小點的公司一樣提供了相似的服務,好比 Clarifai。但它們都沒有提供對象識別。linux
下面的圖片都使用了相同的 Watson 視覺識別默認分類器標籤。第一個已經經過對象識別模型處理過了。git
對象識別能夠遠遠超過視覺識別自己。但若是你想要進行對象識別,你就要親自動手。github
你或許不須要自定義對象識別模型,這取決於你的用例。TensorFlow 的對象識別 API 提供了幾種不一樣速度和精度的模型,它們基於 COCO 數據集。api
爲了讓你方便使用,我放上了一個 COCO 模型能夠識別的完整對象列表:bash
若是你想要識別一些標誌或者不在上面這個表裏的東西,你就須要構建本身的對象識別器。而我如今但願能夠識別千年隼號和一些鈦戰機,這顯然是個極其重要且沒有現成模型的用例。服務器
給你的圖片做註解koa
訓練本身的模型要花費大量工夫。你可能不想耗費太多的時間,若是是這樣,你能夠看看個人關於使用現有模型的其餘文章。這是個更平滑的方向。機器學習
你須要收集大量的圖片,而且寫上註解。註解包括聲明對象的座標以及關聯的標籤。好比一張有兩架鈦戰機的圖片,註解看起來像這樣;
<annotation> <folder>images</folder> <filename>image1.jpg</filename> <size> <width>1000</width> <height>563</height> </size> <segmented>0</segmented> <object> <name>Tie Fighter</name> <bndbox> <xmin>112</xmin> <ymin>281</ymin> <xmax>122</xmax> <ymax>291</ymax> </bndbox> </object> <object> <name>Tie Fighter</name> <bndbox> <xmin>87</xmin> <ymin>260</ymin> <xmax>95</xmax> <ymax>268</ymax> </bndbox> </object> </annotation>
像個人星戰模型,我收集了 308 張圖片,每張圖片有兩到三個對象。我建議每一個對象找 200-300 個例子。
你可能會想,「難道我要收集成百上千張圖片,並且每張都要寫上一堆 XML?」
固然不!有各類各樣的註解工具能夠幫助你,好比 labelImg 和 RectLabel 。我使用 RectLabel,但它只支持 macOS。不過即使使用工具,仍是要費不少工夫,我用了三到四個小時不間斷的工做才把整個數據集註解完。
若是你有錢,可讓別人來作,好比找幾個實習生。你也能夠用像 Mechanical Turk 這樣的資源。若是你是個像我這樣的窮大學生,或者,以單調的工做爲樂子的人,你仍是得本身來。
當創造註解時,若是你不想寫本身的轉換腳本,請確保將它們導出爲 PASCAL VOC 格式,這是我和許多其餘人用的格式,你能夠「偷」我上面的腳本(其實我也是從別人那偷的)。
在開始運行爲 TensorFlow 準備數據的腳本以前,咱們須要作一些設置。
克隆倉庫
從克隆個人倉庫開始。
目錄結構看起來是這樣的:
models |-- annotations | |-- label_map.pbtxt | |-- trainval.txt | `-- xmls | |-- 1.xml | |-- 2.xml | |-- 3.xml | `-- ... |-- images | |-- 1.jpg | |-- 2.jpg | |-- 3.jpg | `-- ... |-- object_detection | `-- ... `-- ...
我加上了本身的訓練數據,這樣你就能夠開箱即用。但若是你想要用本身的數據創造一個模型,你須要把你的訓練圖片放到 images 目錄下,把 XML 註解放到 annotations/xmls 下,更新 trainval.txt 以及 label_map.pbtxt。
trainval.txt 是一個文件名列表,讓咱們能夠找到以及關聯 JPG 和 XML 文件。下面的 trainval.txt 列表可讓咱們找到abc.jpg,abc.xml,123.jpg,123.xml,xyz.jpg和xyz.xml:
abc 123 xyz
提示:確保去掉擴展名後,你的 JPG 和 XML 文件名匹配。
label_map.pbtxt 是咱們嘗試識別的對象列表。看起來像這樣:
item { id: 1 name: 'Millennium Falcon' } item { id: 2 name: 'Tie Fighter' }
運行腳本
首先,安裝 Python 和 pip,安裝腳本需求:
pip install -r requirements.txt
把 models 和 models/slim 添加到你的 PYTHONPATH:
export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/slim
重要提示:若是不想每次打開終端都運行上面的命令,你須要把它添加到 ~/.bashrc 文件。
運行腳本:
python object_detection/create_tf_record.py
一旦腳本運行完成,你會獲得 train.record 和 val.record 文件。這是咱們用來訓練模型要用的文件。
下載基礎模型
從頭開始訓練對象識別器甚至使用多個 GPU 也要花好幾天。爲了加快訓練速度,咱們會採起一個經過不一樣的數據集訓練過的對象識別器,並重用它的一些參數來初始化咱們的新模型。
你能夠從 model zoo 下載一個模型。每一個模型都有不一樣的精確值和速度。我使用的是 faster_rcnn_resnet101_coco。
提取並把全部的 model.ckpt 文件移動到咱們庫的根目錄。
你應該會看到一個 faster_rcnn_resnet101.config 文件。它和 faster_rcnn_resnet101_coco 模型一塊兒工做。若是你使用其餘模型,你能夠從這裏找到對應的配置文件。
準備訓練
運行下面的腳本,而後就能開始訓練了!
python object_detection/train.py \ --logtostderr \ --train_dir=train \ --pipeline_config_path=faster_rcnn_resnet101.config
提示:將 pipeline_config_path 替換成你的配置文件的本地路徑
global step 1: global step 2: global step 3: global step 4: ...
耶!開始訓練了!
10 分鐘後:
global step 41: global step 42: global step 43: global step 44: ...
電腦開始抽菸:
global step 71: global step 72: global step 73: global step 74: ...
這玩意兒要跑多久?
我在視頻中使用的模型運行大概要運行 22,000 步。
什麼?!
我用的是 MacBook Pro,若是你運行的設備和個人差很少,我假設每一步你大約須要花 15 秒,那麼獲得一個像樣的模型須要不間斷的運行三到四天。
好吧,這樣作太傻了。我沒有這麼多時間來作這個?
怎麼辦?PowerAI 來救場了!
PowerAI
PowerAI 可讓咱們在 IBM Power System 中用 P100 GPUs 快速地訓練咱們的模型!
訓練 10,000 步只須要大約一個小時。這還只是僅僅用了一個 GPU。PowerAI 中真正的力量來源於分佈式地使用幾百個 GPU 進行深度學習的能力,效率能夠達到 95%。
有了 PowerAI 的幫助,IBM 創造了一項圖片識別紀錄:在 7 小時內識別準確率達到 33.8%。超過了以前 Microsoft 的紀錄 —— 10 天 29.9 %的準確率。
超快快快!
由於我沒有訓練幾百萬張圖片,我固然不須要這麼多資源。一個 GPU 夠了。
建立 Nimbix 帳戶
Nimbix 給開發者提供了一個 10 小時免費體驗 PowerAI 平臺的體驗帳戶。你能夠在這裏註冊。
提示:這個過程不是自動的,審覈經過要 24 小時。
一旦審覈經過,你就會收到一個建立帳戶的確認郵件。它會要你提供促銷代碼,留空白就好了。
你如今能夠在這裏登陸了。
部署 PowerAI 筆記本應用
從搜索 PowerAI Notebooks 開始:
點中它,而後選擇 TensorFlow。
選擇機器類型爲:32 線程 POWER8,128G RAM, 1 * P100 GPU w/NVLink(np8g1)。
開始後,下面的工做臺就會出現。當服務器狀態變成運行時,服務器就準備好了。
點擊 click to show 獲得密碼。而後點擊 click here to connect 啓動筆記本。
登陸使用 nimbix 的帳戶和密碼。
開始訓練
經過點擊 New 下拉菜單,選擇 Terminal 打開一個新的終端。
下面這個界面,你應該很熟悉了:
提示:終端在 Safari 上可能有問題。
訓練的步驟和咱們在本地運行的時候相同。若是你使用個人訓練數據,你能夠克隆個人倉庫:
git clone https://github.com/bourdakos1/Custom-Object-Detection.git
而後去到這個目錄:
cd Custom-Object-Detection
運行下面的片斷,下載 faster_rcnn_resnet101_coco 模型:
wget http://storage.googleapis.com/download.tensorflow.org/models/object_detection/faster_rcnn_resnet101_coco_11_06_2017.tar.gz tar -xvf faster_rcnn_resnet101_coco_11_06_2017.tar.gz mv faster_rcnn_resnet101_coco_11_06_2017/model.ckpt.* .
而後,咱們須要再次更新 PYTHONPATH,由於使用了新的終端:
export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/slim
最後在運行下面的命令開始訓練:
python object_detection/train.py \ --logtostderr \ --train_dir=train \ --pipeline_config_path=faster_rcnn_resnet101.config
下載你的模型
何時個人模型才能弄好?這取決於你的訓練數據。越多數據,你須要越多步數。個人模型在接近 4500 步時趨於穩定。在 20,000 步時達到頂峯。我甚至讓它訓練到了 200,000 步,可是沒有任何增長。
我建議在每 5000 步左右下載你的模型,評估一下它,要確保你在正確的道路上。
點擊左上角的 Jupyter 標誌,而後,去到 Custom-Object-Detection/train。
下載全部的帶有最大數字的 model.ckpt 文件。
提示: 你一次只能下載一個。
提示:確保在完成後點擊紅色電源按鈕,不然計時將不會中止。
導出推理圖
想要在咱們的代碼中使用模型,咱們須要把檢查點文件(model.ckpt-STEP_NUMBER.*)轉換成凍結推理圖。
把剛剛下載的檢查點文件移動到以前咱們使用的庫的根目錄。
而後運行命令:
python object_detection/export_inference_graph.py \ --input_type image_tensor \ --pipeline_config_path faster_rcnn_resnet101.config \ --trained_checkpoint_prefix model.ckpt-STEP_NUMBER \ --output_directory output_inference_graph
記得
*export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/slim*
你應該會看到一個新的 output_inference_graph 目錄,裏面有一個 frozen_inference_graph.pb 文件,這是咱們要用的。
測試模型
如今,運行下面的命令:
python object_detection/object_detection_runner.py
它會找到 output_inference_graph/frozen_inference_graph.pb 文件,用你的對象識別模型去識別 test_images 目錄下的全部圖片,而後把結果輸出到 output/test_images 目錄。
結果
如下是咱們在「星球大戰:原力覺醒」這個片斷中的全部幀上運行模型時獲得的結果。