《威利在哪里?》(Where’s Wally)是由英國插畫家馬丁·漢德福特(Martin Handford)創(chuàng)作的一套兒童繪本。這個書的目標就是在一張人山人海的圖片中找出一個特定的人物——威利(Wally)。“Where’s Wally”的商標已在28個國家進行了注冊,為方便語言翻譯,每一個國家都會給威利起一個新名字,最成功的是北美版的“Where’s Waldo”,在這里,威利改名成了沃爾多(Waldo)。
現(xiàn)在,機器學習博主Tadej Magajna另辟蹊徑,利用深度學習解開“威利在哪里”的問題。與傳統(tǒng)的計算機視覺圖像處理方法不同的是,它只使用了少數(shù)幾個標記出威利位置的圖片樣本,就訓練成了一套“尋找威利”的系統(tǒng)。
訓練過的圖像評估模型和檢測腳本發(fā)布在作者的GitHub repo上。
本文介紹了用TensorFlow物體檢測API訓練神經(jīng)網(wǎng)絡(luò)、并用相應(yīng)的Python腳本尋找威利的過程。大致分為以下幾步:
將圖片打標簽后創(chuàng)建數(shù)據(jù)集,其中標簽注明了威利在圖片中的位置,用x,y表示;
用TensorFlow物體檢測API獲取并配置神經(jīng)網(wǎng)絡(luò)模型;
在數(shù)據(jù)集上訓練模型;
用導出的圖像測試模型;
開始前,請確保你已經(jīng)按照說明安裝了TensorFlow物體檢測API。
創(chuàng)建數(shù)據(jù)集
雖說深度學習中最重要的環(huán)節(jié)是處理神經(jīng)網(wǎng)絡(luò),但不幸的是,數(shù)據(jù)科學家們總要花費大量時間準備訓練數(shù)據(jù)。
最簡單的機器學習問題最終得到的通常是一個標量(如數(shù)字檢測器)或是一個分類字符串。TensorFlow物體檢測API在訓練數(shù)據(jù)是則將上述兩個結(jié)果結(jié)合了起來。它由一系列圖像組成,并包含目標對象的標簽和他們在圖像中的位置。由于在二維圖像中,兩個點足以在對象周圍繪制邊界框,所以圖像的定位只有兩個點。
為了創(chuàng)建訓練集,我們需要準備一組Where’s Wally的插畫,并標出威利的位置。在此之前已經(jīng)有人做出了一套解出威利在哪里的訓練集。
最右邊的四列描述了威利所在的位置
創(chuàng)建數(shù)據(jù)集的最后一步就是將標簽(.csv)和圖片(.jpeg)打包,存入單一二分類文件中(.tfrecord)。詳細過程可參考這里,訓練和評估過程也可以在作者的GitHub上找到。
準備模型
TensorFlow物體檢測API提供了一組性能不同的模型,它們要么精度高,但速度慢,要么速度快,但精度低。這些模型都在公開數(shù)據(jù)集上經(jīng)過了預訓練。
雖然模型可以從頭開始訓練,隨機初始化網(wǎng)絡(luò)權(quán)重,但這可能需要幾周的時間。相反,這里作者采用了一種稱為遷移學習(Transfer Learning)的方法。
這種方法是指,用一個經(jīng)常訓練的模型解決一般性問題,然后再將它重新訓練,用于解決我們的問題。也就是說,與其從頭開始訓練新模型,不如從預先訓練過的模型中獲取知識,將其轉(zhuǎn)移到新模型的訓練中,這是一種非常節(jié)省時間的方法。
作者使用了在COCO數(shù)據(jù)集上訓練過的搭載Inception v2模型的RCNN。該模型包含一個.ckpycheckpoint文件,可以利用它開始訓練。
配置文件下載完成后,請確保將“PATHTOBE_CONFIGURED”字段替換成指向checkpoint文件、訓練和評估的.tfrecord文件和標簽映射文件的路徑。
最后需要配置的文件是labels.txt映射文件,其中包含我們所有不同對象的標簽。由于我們尋找的都是同一個類型的對象(威利),所以標簽文件如下:
item {
id: 1
name: 'waldo'
}
最終應(yīng)該得到:
一個有著checkpoint文件的預訓練模型;
經(jīng)過訓練并評估的.tfrecord數(shù)據(jù)集;
標簽映射文件;
指向上述文件的配置文件。
然后就可以開始訓練啦。
訓練
TensorFlow物體檢測API提供了一個十分容易上手的Python腳本,可以在本地訓練模型。它位于models/research/object_detection中,可以通過以下命令運行:
python train.py --logtostderr --pipeline_config_path= PATH_TO_PIPELINE_CONFIG --train_dir=PATH_TO_TRAIN_DIR
PATH_TO_PIPELINE_CONFIG是通往配置文件的路徑,PATH_TO_TRAIN_DIR是新創(chuàng)建的directory,用來儲存checkpoint和模型。
train.py的輸出看起來是這樣:
用最重要的信息查看是否有損失,這是各個樣本在訓練或驗證時出現(xiàn)錯誤的總和。當然,你肯定希望它降得越低越好,因為如果它在緩慢地下降,就意味著你的模型正在學習(要么就是過擬合了你的數(shù)據(jù)……)。
你還可以用Tensorboard顯示更詳細的訓練數(shù)據(jù)。
腳本將在一定時間后自動存儲checkpoint文件,萬一計算機半路崩潰,你還可以恢復這些文件。也就是說,當你想完成模型的訓練時,隨時都可以終止腳本。
但是什么時候停止學習呢?一般是當我們的評估集損失停止減少或達到非常低的時候(在這個例子中低于0.01)。
測試
現(xiàn)在,我們可以將模型用于實際測試啦。
首先,我們需要從儲存的checkpoint中輸出一個推理圖(interference graph),利用的腳本如下:
python export_inference_graph.py — pipeline_config_path PATH_TO_PIPELINE_CONFIG --trained_checkpoint_prefix PATH_TO_CHECPOINT --output_directory OUTPUT_PATH
產(chǎn)生的推理圖就是用來Python腳本用來找到威利的工具。
作者寫了幾個簡單目標定位的腳本,其中find_wally.py和find_wally_pretty.py都可以在他的GitHub上找到,并且運行起來也很簡單:
python find_wally.py
或者
python find_wally_pretty.py
不過當你在自己的模型或圖像上運行腳本時,記得改變model-path和image-path的變量。
結(jié)語
模型的表現(xiàn)出乎意料地好。它不僅從數(shù)據(jù)集中成功地找到了威利,還能在隨機從網(wǎng)上找的圖片中找到威利。
但是如果威利在圖中特別大,模型就找不到了。我們總覺得,不應(yīng)該是目標物體越大越好找嗎?這樣的結(jié)果表明,作者用于訓練的圖像并不多,模型可能對訓練數(shù)據(jù)過度擬合了。
-
神經(jīng)網(wǎng)絡(luò)
+關(guān)注
關(guān)注
42文章
4809瀏覽量
102834 -
python
+關(guān)注
關(guān)注
56文章
4825瀏覽量
86226 -
tensorflow
+關(guān)注
關(guān)注
13文章
330瀏覽量
61038
原文標題:如何用神經(jīng)網(wǎng)絡(luò)“尋找威利”
文章出處:【微信號:jqr_AI,微信公眾號:論智】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
高階API構(gòu)建模型和數(shù)據(jù)集使用
【AI學習】第3篇--人工神經(jīng)網(wǎng)絡(luò)
嵌入式中的人工神經(jīng)網(wǎng)絡(luò)的相關(guān)資料分享
輕量化神經(jīng)網(wǎng)絡(luò)的相關(guān)資料下載
圖像預處理和改進神經(jīng)網(wǎng)絡(luò)推理的簡要介紹
如何使用TensorFlow將神經(jīng)網(wǎng)絡(luò)模型部署到移動或嵌入式設(shè)備上
傳統(tǒng)檢測、深度神經(jīng)網(wǎng)絡(luò)框架、檢測技術(shù)的物體檢測算法全概述

評論