用 TensorFlow 追蹤千年隼號

1908904-3f34b50d62483a3f.gif'html

簡評:TensorFlow 是個機器學習的開源庫。這篇文章中原做者 Nick Bourdakos 將用 TensorFlow 來訓練識別自定義模型,並給出了詳細的過程(星戰迷 = =|| )。python

在寫這篇博客時,許多大型技術公司(如 IBM,Google,Microsoft,Amazon)都有簡單易用的視覺識別 API。一些小點的公司一樣提供了相似的服務,好比 Clarifai。但它們都沒有提供對象識別。linux

下面的圖片都使用了相同的 Watson 視覺識別默認分類器標籤。第一個已經經過對象識別模型處理過了。git

clipboard.png

對象識別能夠遠遠超過視覺識別自己。但若是你想要進行對象識別,你就要親自動手。github

你或許不須要自定義對象識別模型,這取決於你的用例。TensorFlow 的對象識別 API 提供了幾種不一樣速度和精度的模型,它們基於 COCO 數據集api

爲了讓你方便使用,我放上了一個 COCO 模型能夠識別的完整對象列表:bash

clipboard.png

若是你想要識別一些標誌或者不在上面這個表裏的東西,你就須要構建本身的對象識別器。而我如今但願能夠識別千年隼號和一些鈦戰機,這顯然是個極其重要且沒有現成模型的用例。服務器

給你的圖片做註解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?」

固然不!有各類各樣的註解工具能夠幫助你,好比 labelImgRectLabel 。我使用 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 開始:

clipboard.png

點中它,而後選擇 TensorFlow。

clipboard.png

選擇機器類型爲:32 線程 POWER8,128G RAM, 1 * P100 GPU w/NVLink(np8g1)。

clipboard.png

開始後,下面的工做臺就會出現。當服務器狀態變成運行時,服務器就準備好了。

clipboard.png

點擊 click to show 獲得密碼。而後點擊 click here to connect 啓動筆記本。

登陸使用 nimbix 的帳戶和密碼。

clipboard.png

開始訓練

經過點擊 New 下拉菜單,選擇 Terminal 打開一個新的終端。

clipboard.png

下面這個界面,你應該很熟悉了:

clipboard.png

提示:終端在 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.data-00000-of-00001
  • model.ckpt-STEP_NUMBER.index
  • model.ckpt-STEP_NUMBER.meta

提示: 你一次只能下載一個。

clipboard.png

提示:確保在完成後點擊紅色電源按鈕,不然計時將不會中止。

導出推理圖

想要在咱們的代碼中使用模型,咱們須要把檢查點文件(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 目錄。

結果

如下是咱們在「星球大戰:原力覺醒」這個片斷中的全部幀上運行模型時獲得的結果。

clipboard.png

youtube 視頻點此進入

英文原文:Tracking the Millennium Falcon with TensorFlow

相關文章
相關標籤/搜索