如何使用TensorFlow追蹤千年隼號(hào)

大數(shù)據(jù)

作者:Nick Bourdakos

摘要:本文以星球大戰(zhàn)中的千年隼號(hào)為例,介紹了如何使用強(qiáng)大的PowerAI來(lái)進(jìn)行對(duì)象檢測(cè)。

大數(shù)據(jù)
活動(dòng)中的自定義對(duì)象檢測(cè)(完整視頻地址)

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

下面兩張圖片都使用了相同的Watson Visual Recognition默認(rèn)分類(lèi)器進(jìn)行標(biāo)記。不過(guò),第一張圖片首先通過(guò)了一個(gè)對(duì)象檢測(cè)模型。

大數(shù)據(jù)

對(duì)象檢測(cè)比視覺(jué)識(shí)別先進(jìn)得多。但是如果想要進(jìn)行對(duì)象檢測(cè),你就不得不自己動(dòng)手了。

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

這是COCO模型可檢測(cè)對(duì)象的完整列表:

大數(shù)據(jù)

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

標(biāo)注圖片

訓(xùn)練自己的模型需要做很多工作。需要收集大量的圖像,并標(biāo)注它們。標(biāo)注包括指定對(duì)象坐標(biāo)和相應(yīng)的標(biāo)簽。對(duì)于包含兩個(gè)鈦戰(zhàn)機(jī)的圖像,標(biāo)注的結(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>

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

我們是否需要為這幾百?gòu)垐D片寫(xiě)一大推的xml呢?

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

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

克隆代碼庫(kù)

從這里克隆代碼庫(kù)。目錄結(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)包含了所有的訓(xùn)練數(shù)據(jù),開(kāi)箱即用。但是如果要用自己的數(shù)據(jù)創(chuàng)建模型,那么需要將你自己的訓(xùn)練圖像添加到images目錄中,將XML標(biāo)注添加到annotations/xmls目錄中,然后更新trainval.txt和label_map.pbtxt。

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

abc123xyz

注意:請(qǐng)確保JPG和XML文件的文件名除了擴(kuò)展名之外是一樣的。

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

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

運(yùn)行腳本

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

pip install -r requirements.txt

在PYTHONPATH中加入models和models/slim:

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

重要提示:每次打開(kāi)終端后都要運(yùn)行一遍,或者添加到~/.bashrc文件中。

運(yùn)行腳本:

python object_detection/create_tf_record.py

腳本運(yùn)行結(jié)束之后,將會(huì)得到train.record和val.record文件。我們將用這兩個(gè)文件來(lái)訓(xùn)練模型。

下載模型

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

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

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

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

準(zhǔn)備訓(xùn)練

運(yùn)行下面的腳本,訓(xùn)練開(kāi)始了!

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

注意:將pipeline_config_path替換為配置文件實(shí)際的路徑。

global step 1:global step 2:global step 3:global step 4:...

好極了!開(kāi)始運(yùn)行了!

10分鐘后。

global step 41:global step 42:global step 43:global step 44:...

電腦開(kāi)始冒煙了

global step 71:global step 72:global step 73:global step 74:...

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

救世主PowerAI強(qiáng)勢(shì)出擊!

PowerAI

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

大概只用了一個(gè)小時(shí)的時(shí)間就訓(xùn)練了一萬(wàn)步。不過(guò),這只用了一個(gè)GPU。 PowerAI的真正威力是能夠以高達(dá)95%的效率在數(shù)百個(gè)GPU上進(jìn)行分布式的深度學(xué)習(xí)。

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

太快了!

創(chuàng)建一個(gè)Nimbix賬號(hào)

Nimbix為開(kāi)發(fā)者提供了在PowerAI平臺(tái)上免費(fèi)處理十個(gè)小時(shí)的試用帳戶。你可以在這里進(jìn)行注冊(cè)。

注意:這個(gè)過(guò)程不是自動(dòng)的,所以可能需要24小時(shí)才能審批通過(guò)。

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

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

部署PowerAI Notebooks應(yīng)用

首先搜索PowerAI Notebooks。

大數(shù)據(jù)

點(diǎn)擊,然后選擇?TensorFlow。

大數(shù)據(jù)

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

大數(shù)據(jù)

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

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

然后點(diǎn)擊Click here to connect啟動(dòng)Notebook。

大數(shù)據(jù)

使用用戶名nimbix和先前提供的密碼進(jìn)行登錄。

大數(shù)據(jù)

開(kāi)始訓(xùn)練

點(diǎn)擊New下拉菜單并選擇Terminal,打開(kāi)一個(gè)新的終端窗口。

大數(shù)據(jù)

跳出一個(gè)熟悉的界面:

大數(shù)據(jù)

注意:該終端可能不能在Safari中運(yùn)行。

訓(xùn)練的步驟與我們?cè)诒镜剡M(jìn)行訓(xùn)練的步驟相同。如果你使用我的訓(xùn)練數(shù)據(jù),那么可以克隆我的代碼庫(kù):

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

然后cd進(jìn)入根目錄:

cd Custom-Object-Detection

運(yùn)行下面這個(gè)命令,下載我們之前提到的預(yù)先訓(xùn)練好的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,因?yàn)檫@是一個(gè)新的終端:

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

最后運(yùn)行訓(xùn)練命令:

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

下載模型

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

我建議每5000步左右下載一次模型,對(duì)其進(jìn)行評(píng)估,以確保你的方向是正確的。

點(diǎn)擊左上角的Jupyter徽標(biāo),打開(kāi)Custom-Object-Detection/train。

下載編號(hào)最大的model.ckpt文件。

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

注意:一次只能下載一個(gè)文件。

大數(shù)據(jù)

注意:完成后,請(qǐng)務(wù)必點(diǎn)擊機(jī)器上的紅色電源按鈕。否則,記時(shí)不會(huì)停止,時(shí)間會(huì)繼續(xù)走下去。

導(dǎo)出推理圖

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

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

然后運(yùn)行這個(gè)命令:

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

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

測(cè)試模型

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

python object_detection/object_detection_runner.py

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

結(jié)果

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

極客網(wǎng)企業(yè)會(huì)員

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

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

長(zhǎng)按掃碼 閱讀全文