如何使用TensorFlow追蹤千年隼號

大數(shù)據(jù)

作者:Nick Bourdakos

摘要:本文以星球大戰(zhàn)中的千年隼號為例,介紹了如何使用強大的PowerAI來進行對象檢測。

大數(shù)據(jù)
活動中的自定義對象檢測(完整視頻地址)

當前,大多數(shù)的大型科技公司(如IBM、Google、Microsoft和Amazon)都有自己的視覺識別產(chǎn)品。一些小公司也提供了類似的產(chǎn)品,如Clarifai。但是他們都沒有提供對象檢測API。

下面兩張圖片都使用了相同的Watson Visual Recognition默認分類器進行標記。不過,第一張圖片首先通過了一個對象檢測模型。

大數(shù)據(jù)

對象檢測比視覺識別先進得多。但是如果想要進行對象檢測,你就不得不自己動手了。

根據(jù)不同的使用情況,可能并不需要自定義對象檢測模型。?TensorFlow的對象檢測API提供了一些基于COCO數(shù)據(jù)集的不同速度和準確度的模型。

這是COCO模型可檢測對象的完整列表:

大數(shù)據(jù)

如果想要檢測不在此列表中的東西,則必須構(gòu)建自己的自定義對象檢測器。

標注圖片

訓練自己的模型需要做很多工作。需要收集大量的圖像,并標注它們。標注包括指定對象坐標和相應(yīng)的標簽。對于包含兩個鈦戰(zhàn)機的圖像,標注的結(jié)果是這樣的:

<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>

針對星球大戰(zhàn)模型,我收集了308個圖片,每張圖片包含了兩到三個對象。我建議針對每個對象找出的200-300個樣本圖片。

我們是否需要為這幾百張圖片寫一大推的xml呢?

當然不用!有很多標注工具,比如labelImg和RectLabel。我使用的是RectLabel,但它只能在macOS上使用。不過,還是有很多工作要做的。我花了大約三四個小時的時間來標注整個數(shù)據(jù)集。創(chuàng)建標注時,請將其導出為PASCAL VOC格式。

在運行腳本準備數(shù)據(jù)之前,還需要做一些設(shè)置工作。

克隆代碼庫

從這里克隆代碼庫。目錄結(jié)構(gòu)如下所示:

models|-- annotations|   |-- label_map.pbtxt|   |-- trainval.txt|   `-- xmls|       |-- 1.xml|       |-- 2.xml|       |-- 3.xml|       `-- ...|-- images|   |-- 1.jpg|   |-- 2.jpg|   |-- 3.jpg|   `-- ...|-- object_detection|   `-- ...`-- ...

這里已經(jīng)包含了所有的訓練數(shù)據(jù),開箱即用。但是如果要用自己的數(shù)據(jù)創(chuàng)建模型,那么需要將你自己的訓練圖像添加到images目錄中,將XML標注添加到annotations/xmls目錄中,然后更新trainval.txt和label_map.pbtxt。

trainval.txt是一個文件名列表,用于查找和關(guān)聯(lián)JPG和XML文件。下面的trainval.txt列表讓我們可以找到abc.jpg、abc.xml、123.jpg、123.xml、xyz.jpg和xyz.xml:

abc123xyz

注意:請確保JPG和XML文件的文件名除了擴展名之外是一樣的。

label_map.pbtxt是我們要檢測的對象列表。內(nèi)容是這樣的:

item {  id: 1  name: 'Millennium Falcon'}item {  id: 2  name: 'Tie Fighter'}

運行腳本

首先,安裝Python和pip,并安裝腳本需要的組件:

pip install -r requirements.txt

在PYTHONPATH中加入models和models/slim:

export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/slim

重要提示:每次打開終端后都要運行一遍,或者添加到~/.bashrc文件中。

運行腳本:

python object_detection/create_tf_record.py

腳本運行結(jié)束之后,將會得到train.record和val.record文件。我們將用這兩個文件來訓練模型。

下載模型

即使使用多個GPU,從頭開始訓練對象檢測器也可能需要數(shù)天的時間。為了加速訓練,我們將采用一個在不同數(shù)據(jù)集上訓練過的對象檢測器,并重新設(shè)置它的一些參數(shù)來初始化我們的新模型。

你可以從這個模型集市上下載模型。每個模型的準確性和速度都不一樣。我使用的是faster_rcnn_resnet101_coco。

把所有的model.ckpt文件提取出來并復(fù)制到代碼庫的根目錄。

faster_rcnn_resnet101.config是faster_rcnn_resnet101_coco模型的配置文件。如果使用另一個模型,則可以在這里找到相對應(yīng)的配置文件。

準備訓練

運行下面的腳本,訓練開始了!

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:...

這東西要運行多久呢? 視頻中使用的模型要運行22000步。如果使用的是MacBook Pro,假設(shè)每15秒左右完成一步,以這樣的速度,大約需要三到四天的時間才能獲得一個差不多的模型。太費時間了!??!

救世主PowerAI強勢出擊!

PowerAI

PowerAI讓用戶可以在配置了P100 GPU的IBM Power Systems上快速訓練模型!

大概只用了一個小時的時間就訓練了一萬步。不過,這只用了一個GPU。 PowerAI的真正威力是能夠以高達95%的效率在數(shù)百個GPU上進行分布式的深度學習。

在PowerAI的幫助下,IBM創(chuàng)造了在7個小時內(nèi)識別一張新圖像達到33.8%準確率的記錄。它超過了微軟以前的行業(yè)紀錄,在10天內(nèi)達到29.9%的準確率。

太快了!

創(chuàng)建一個Nimbix賬號

Nimbix為開發(fā)者提供了在PowerAI平臺上免費處理十個小時的試用帳戶。你可以在這里進行注冊。

注意:這個過程不是自動的,所以可能需要24小時才能審批通過。

申請通過后,你將收到一封電子郵件,其中包含有關(guān)確認和創(chuàng)建帳戶的說明。

現(xiàn)在,你可以在這里登錄了。

部署PowerAI Notebooks應(yīng)用

首先搜索PowerAI Notebooks。

大數(shù)據(jù)

點擊,然后選擇?TensorFlow。

大數(shù)據(jù)

選擇機器類型:32 thread POWER8, 128GB RAM, 1x P100 GPU w/NVLink (np8g1)。

大數(shù)據(jù)

服務(wù)器開啟,將顯示以下儀表板面板。當服務(wù)器的Status變?yōu)镻rocessing時,就可以訪問服務(wù)器了。

點擊(click to show)獲取密碼。

然后點擊Click here to connect啟動Notebook。

大數(shù)據(jù)

使用用戶名nimbix和先前提供的密碼進行登錄。

大數(shù)據(jù)

開始訓練

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

大數(shù)據(jù)

跳出一個熟悉的界面:

大數(shù)據(jù)

注意:該終端可能不能在Safari中運行。

訓練的步驟與我們在本地進行訓練的步驟相同。如果你使用我的訓練數(shù)據(jù),那么可以克隆我的代碼庫:

git clone [https://github.com/bourdakos1/Custom-Object-Detection.git](https://github.com/bourdakos1/Custom-Object-Detection.git)

然后cd進入根目錄:

cd Custom-Object-Detection

運行下面這個命令,下載我們之前提到的預(yù)先訓練好的faster_rcnn_resnet101_coco模型。

wget [http://storage.googleapis.com/download.tensorflow.org/models/object_detection/faster_rcnn_resnet101_coco_11_06_2017.tar.gz](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.gzmv faster_rcnn_resnet101_coco_11_06_2017/model.ckpt.* .

然后,再次設(shè)置PYTHONPATH,因為這是一個新的終端:

export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/slim

最后運行訓練命令:

python object_detection/train.py \        --logtostderr \        --train_dir=train \        --pipeline_config_path=faster_rcnn_resnet101.config

下載模型

數(shù)據(jù)越多,則需要的步驟也越多。我的模型在接近4500步的時候非常穩(wěn)定。然后,在大約20000步時達到峰值。我甚至做了20萬步的訓練,但是效果并不理想。

我建議每5000步左右下載一次模型,對其進行評估,以確保你的方向是正確的。

點擊左上角的Jupyter徽標,打開Custom-Object-Detection/train。

下載編號最大的model.ckpt文件。

model.ckpt-STEP_NUMBER.data-00000-of-00001model.ckpt-STEP_NUMBER.indexmodel.ckpt-STEP_NUMBER.meta

注意:一次只能下載一個文件。

大數(shù)據(jù)

注意:完成后,請務(wù)必點擊機器上的紅色電源按鈕。否則,記時不會停止,時間會繼續(xù)走下去。

導出推理圖

要在代碼中使用模型,需要將檢查點文件(model.ckpt-STEP_NUMBER.*)轉(zhuǎn)換為推理圖。

將剛剛下載的檢查點文件復(fù)制到代碼庫的根目錄中。

然后運行這個命令:

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

記住執(zhí)行:

export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/slim

這時,應(yīng)該可以看到一個新的output_inference_graph目錄和frozen_inference_graph.pb文件。這就是我們需要的文件。

測試模型

現(xiàn)在運行以下命令:

python object_detection/object_detection_runner.py

它會在test_images目錄中的所有圖像上運行output_inference_graph/frozen_inference_graph.pb中的對象檢測模型,并將結(jié)果輸出到output/test_images目錄中。

結(jié)果

點擊此處查看在“星球大戰(zhàn):原力覺醒”某個片段上運行模型后得到的結(jié)果。

免責聲明:本網(wǎng)站內(nèi)容主要來自原創(chuàng)、合作伙伴供稿和第三方自媒體作者投稿,凡在本網(wǎng)站出現(xiàn)的信息,均僅供參考。本網(wǎng)站將盡力確保所提供信息的準確性及可靠性,但不保證有關(guān)資料的準確性及可靠性,讀者在使用前請進一步核實,并對任何自主決定的行為負責。本網(wǎng)站對有關(guān)資料所引致的錯誤、不確或遺漏,概不負任何法律責任。任何單位或個人認為本網(wǎng)站中的網(wǎng)頁或鏈接內(nèi)容可能涉嫌侵犯其知識產(chǎn)權(quán)或存在不實內(nèi)容時,應(yīng)及時向本網(wǎng)站提出書面權(quán)利通知或不實情況說明,并提供身份證明、權(quán)屬證明及詳細侵權(quán)或不實情況證明。本網(wǎng)站在收到上述法律文件后,將會依法盡快聯(lián)系相關(guān)文章源頭核實,溝通刪除相關(guān)內(nèi)容或斷開相關(guān)鏈接。

2017-11-15
如何使用TensorFlow追蹤千年隼號
作者:Nick Bourdakos 摘要:本文以星球大戰(zhàn)中的千年隼號為例,介紹了如何使用強大的PowerAI來進行對象檢測。 活動中的自定義對象檢測(完整

長按掃碼 閱讀全文