0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

用TensorFlow制作一個圖像識別工具的構(gòu)建步驟解析

zhKF_jqr_AI ? 2018-01-18 13:43 ? 次閱讀

編者按:本文作者Sara Robinson在Medium上發(fā)布了一個有趣的項目,她自制了一款A(yù)PP,能自動識別歌手Taylor Swift。這與我們之前介紹的尋找威利項目很像。該教程非常詳細,有興趣的同學(xué)可以學(xué)習(xí)一下,動手做一個自己的圖像識別工具哦~本文已獲作者授權(quán),以下是對原文的編譯。

注:由于寫作本文時TensorFlow沒有Swift庫,我用Swift構(gòu)建了針對我的模型的預(yù)測請求的APP。

以下就是我們創(chuàng)建的APP:

TensorFlow物體檢測API能讓你識別出一張圖片中特定物體的位置,這可以應(yīng)用到許多有趣的程序上。不過我平常拍人比較多,所以就想把這一技術(shù)應(yīng)用到人臉識別上。結(jié)果發(fā)現(xiàn)模型表現(xiàn)得非常好!也就是上圖我創(chuàng)建的Taylor Swift檢測器。

本文將列出模型的構(gòu)建步驟,從收集Taylor Swift的照片到模型的訓(xùn)練:

對圖像進行預(yù)處理,改變大小、貼標簽、將它們分成訓(xùn)練和測試兩部分,并修改成Pascal VOC格式;

將圖片轉(zhuǎn)化成TFRecords文件以符合物體檢測API;

利用MobileNet在谷歌Cloud ML Engine上訓(xùn)練模型;

導(dǎo)出訓(xùn)練好的模型并將其部署到ML Engine上進行服務(wù);

構(gòu)建一個iOS前端,根據(jù)訓(xùn)練好的模型做出預(yù)測請求(使用Swift)。

下面是各部分如何結(jié)合在一起的架構(gòu)圖:

用TensorFlow制作一個圖像識別工具的構(gòu)建步驟解析

在開始之前,首先要解釋一下我們即將用到的技術(shù)和術(shù)語:TensorFlow物體檢測API是一個構(gòu)建在TensorFlow上的框架,用于識別圖像中特定的對象。例如,你可以用很多貓的照片訓(xùn)練它,一旦訓(xùn)練完畢,你可以輸入一張貓的圖像,它就會輸出一個方框列表,認為圖像中有一只貓。雖然它的名字中含有API,但是你可以將它更多地想象成用于遷移學(xué)習(xí)的一套便利的工具。

但是,訓(xùn)練模型識別圖像中的對象是個費時費力的活。物體檢測最酷的地方就是它支持五個預(yù)訓(xùn)練模型的遷移學(xué)習(xí)(transfer learning),那么什么是遷移學(xué)習(xí)呢?比如,當兒童學(xué)習(xí)第一門語言時,他們會接觸大量的例子,如果有錯就會立刻被糾正過來。例如當孩子們學(xué)習(xí)識別貓時,他們的父母會指著圖片上的貓,并說出“貓”這個詞,這種重復(fù)增強了他們的腦回路。當它們學(xué)習(xí)如何識別一只狗時,無需從頭開始,這一過程與貓的識別類似,只是學(xué)習(xí)對象不同。這就是遷移學(xué)習(xí)的工作原理

但我沒有時間尋找并標記數(shù)千個Taylor Swift的圖像,但是我可以通過修改最后幾個圖層、在數(shù)百萬張圖像上訓(xùn)練的模型中提取特征,應(yīng)用于TSwift的檢測。

第一步:預(yù)處理圖像

首先要感謝Dat Tran寫的關(guān)于浣熊檢測器的博客,地址:https://towardsdatascience.com/how-to-train-your-own-object-detector-with-tensorflows-object-detector-api-bec72ecfe1d9

首先,我從谷歌圖片上下載了200張Taylor Swift的照片,這里安利一個Chrome插件:Fatkun Batch Download Image,可以下載所有圖片搜索結(jié)果。在打標簽之前,我把圖片分為兩類:訓(xùn)練和測試。另外,我寫了一個調(diào)整圖片大小的腳本(https://github.com/sararob/tswift-detection/blob/master/resize.py),確保每張圖的寬度不超過600px。

由于檢測器會告訴我們圖中的對象位置,所以你不能直接把圖像和標簽作為訓(xùn)練數(shù)據(jù)。你需要用邊框?qū)ο笕Τ鰜?,以及將表框打上標簽(在我們的?shù)據(jù)集中,只需要一個標簽tswift)。

打邊框工具依然使用LabelImg,這是一個基于Python的程序,你只需輸入帶標簽的圖像,它就會輸出一個xml文件,將每張照片都打上邊框同時還有相關(guān)標簽(不到一上午我就處理好200張圖片了)。下面是它如何工作的(標簽輸入為tswift):

然后LabelImg生成一個xml文件:

Desktop

tswift.jpg

/Desktop/tswift.jpg

Unknown

1000

667

3

0

tswift

Unspecified

0

0

420

80

582

291

現(xiàn)在我有了一張帶有邊框和標簽的圖片了,但是我還要把它轉(zhuǎn)換成TensorFlow可接受的方式——一個數(shù)據(jù)的二進制表示TFRecord。關(guān)于這一方法可以在GitHub上查看。要運行我的腳本,你需要先下載一個tensorflow/models,從tensorflow/models/research本地直接運行腳本,帶上以下參數(shù)(運行兩次:一次用于訓(xùn)練數(shù)據(jù),一次用于測試數(shù)據(jù))

python convert_labels_to_tfrecords.py

--output_path=train.record

--images_dir=path/to/your/training/images/

--labels_dir=path/to/training/label/xml/

第二步:訓(xùn)練檢測器

我可以在筆記本電腦上訓(xùn)練這個模型,但是時間會很長,而且占用大量的資源。并且一旦我需要用電腦做別的事,訓(xùn)練就會中斷。所以,我選擇了云!我們可以利用云來運行多個跨核心的訓(xùn)練,幾個小時內(nèi)就能完成整個工作,并且用Cloud ML engine的速度比GPU還要快。

設(shè)置Cloud ML Engine

我準備將所有TFRecord格式的數(shù)據(jù)上傳到云并開始訓(xùn)練。首先,我在谷歌云端控制臺中創(chuàng)建了一個項目,并啟用了Cloud ML Engine:

用TensorFlow制作一個圖像識別工具的構(gòu)建步驟解析

然后,我將創(chuàng)建一個云存儲bucket來打包模型的所有資源。確保在指定區(qū)域進行存儲(不要選擇多個區(qū)域):

我將在這個bucket中/data子目錄來放置訓(xùn)練和測試TFRecord的文件:

目標對象檢測API還需要一個將標簽映射到整數(shù)ID的pbtxt文件。由于我們只有一個標簽,這個是非常短的:

item {

id: 1

name: 'tswift'

}

添加MobileNet檢查點進行遷移學(xué)習(xí)

因為我并非從零開始訓(xùn)練這個模型,所以當我運行訓(xùn)練時,我需要指向我將要建立的預(yù)訓(xùn)練模型。我選擇使用MobileNet模型——它是針對移動設(shè)備優(yōu)化的一系列小模型。雖然我不會直接在移動設(shè)備上訓(xùn)練模型,但MobileNet將會快速訓(xùn)練,并允許更快的預(yù)測請求。我下載了這個MobileNet檢查點用于訓(xùn)練,檢查點是一個二進制文件,包含訓(xùn)練過程中特定點的TensorFlow模型的狀態(tài)。下載并解壓縮后,你可以看到它包含的三個文件:

以上所有都要用來訓(xùn)練模型,所以我將它們放在云存儲bucket中的同一個data/目錄中。

在開始訓(xùn)練之前,還需要添加一個文件。對象檢測腳本需要一種方法查找模型的檢查點、標簽映射和訓(xùn)練數(shù)據(jù)。我們將用配置文件處理這一點。TF對象檢測為五個預(yù)訓(xùn)練模型采集了樣本配置文件。我們在這里為MobileNet使用一個,并且在云存儲bucket的相應(yīng)路徑中更新了所有PATH_TO_BE_CONFIGURED占位符。除了將我的模型連接到云存儲中的數(shù)據(jù)外,此文件還為我的模型配置了幾個超參數(shù),如卷積大小、激活函數(shù)和步驟。

以下是開始訓(xùn)練之前云存儲bucket中我的/data中的所有文件:

我還會在bucket中創(chuàng)建train/和eval/子目錄——這是TensorFlow在訓(xùn)練和評估時書寫模型檢查點文件的地方。

現(xiàn)在已經(jīng)準備好訓(xùn)練了,通過執(zhí)行g(shù)cloud命令開始。請注意,你需要在本地復(fù)制tensorflow/models/research并從該目錄運行此訓(xùn)練腳本:

# Run this script from tensorflow/models/research:

gcloud ml-engine jobs submit training ${YOUR_TRAINING_JOB_NAME}

--job-dir=${YOUR_GCS_BUCKET}/train

--packages dist/object_detection-0.1.tar.gz,slim/dist/slim-0.1.tar.gz

--module-name object_detection.train

--region us-central1

--config object_detection/samples/cloud/cloud.yml

--runtime-version=1.4

--

--train_dir=${YOUR_GCS_BUCKET}/train

--pipeline_config_path=${YOUR_GCS_BUCKET}/data/ssd_mobilenet_v1_coco.config

訓(xùn)練的同時,我也開始了評估工作。我會使用之前從未見過的數(shù)據(jù)來評估模型的準確性:

# Run this script from tensorflow/models/research:

gcloud ml-engine jobs submit training ${YOUR_EVAL_JOB_NAME}

--job-dir=${YOUR_GCS_BUCKET}/train

--packages dist/object_detection-0.1.tar.gz,slim/dist/slim-0.1.tar.gz

--module-name object_detection.eval

--region us-central1

--scale-tier BASIC_GPU

--runtime-version=1.4

--

--checkpoint_dir=${YOUR_GCS_BUCKET}/train

--eval_dir=${YOUR_GCS_BUCKET}/eval

--pipeline_config_path=${YOUR_GCS_BUCKET}/data/ssd_mobilenet_v1_coco.config

你可以通過在云端控制臺導(dǎo)航到ML Engine的“作業(yè)”部分來驗證您的任務(wù)是否正確運行,并檢查日志以查找特定作業(yè):

用TensorFlow制作一個圖像識別工具的構(gòu)建步驟解析

第三步:部署預(yù)測模型

為了將模型部署到ML Engine,我需要將模型檢查點轉(zhuǎn)換為ProtoBuf。在我的train/bucket中,可以看到從幾處保留的檢查點文件:

文件的第一行告訴我最新的檢查點路徑——我應(yīng)從該檢查點本地下載3個文件。每個檢查點應(yīng)該有一個.index,.meta,和.data文件。將它們保存在本地目錄中后,我可以使用對象檢測的export_inference_graph腳本將它們轉(zhuǎn)換為ProtoBuf。要運行以下腳本,你需要定義MobileNet配置文件的本地路徑、訓(xùn)練時下載的模型檢查點編號以及要導(dǎo)出的圖形目錄名稱:

# Run this script from tensorflow/models/research:

python object_detection/export_inference_graph.py

--input_type encoded_image_string_tensor

--pipeline_config_path ${LOCAL_PATH_TO_MOBILENET_CONFIG}

--trained_checkpoint_prefix model.ckpt-${CHECKPOINT_NUMBER}

--output_directory ${PATH_TO_YOUR_OUTPUT}.pb

這個腳本運行后,你將會在.pb輸出目錄中看到一個saved_model/目錄。將saved_model.pb文件上傳到你的云存儲/data目錄中(不要擔心生成其他文件)。

現(xiàn)在你已經(jīng)準備好將模型部署到ML Engine上了。首先,用gcloud創(chuàng)建你的模型:

gcloud ml-engine models create tswift_detector

然后,通過將模型指向剛剛上傳到云存儲的已保存的ProtoBuf來創(chuàng)建第一個模型版本:

gcloud ml-engine versions create v1 --model=tswift_detector --origin=gs://${YOUR_GCS_BUCKET}/data --runtime-version=1.4

模型部署好后,我將用ML Engine的線上預(yù)測API生成新的預(yù)測圖像。

第四步:使用Firebase函數(shù)和Swift構(gòu)建預(yù)測客戶端

我在Swift中編寫了一個iOS客戶端來對我的模型進行預(yù)測請求。Swift客戶端將圖像上傳到云存儲,云存儲觸發(fā)Firebase函數(shù),在Node.js中發(fā)起預(yù)測請求,并將生成的預(yù)測圖像和數(shù)據(jù)保存到云存儲和Firebase中。

首先,在我的Swift客戶端中,我添加了一個按鈕,供用戶訪問設(shè)備的圖片庫。用戶選擇照片后,會觸發(fā)將圖像上傳到云端存儲的操作:

let firestore = Firestore.firestore()

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {

let imageURL = info[UIImagePickerControllerImageURL] as? URL

let imageName = imageURL?.lastPathComponent

let storageRef = storage.reference().child("images").child(imageName!)

storageRef.putFile(from: imageURL!, metadata: nil) { metadata, error in

if let error = error {

print(error)

} else {

print("Photo uploaded successfully!")

// TODO: create a listener for the image's prediction data in Firestore

}

}

}

dismiss(animated: true, completion: nil)

}

接下來,我編寫了在上傳到云存儲時觸發(fā)的Firebase函數(shù)(https://github.com/sararob/tswift-detection/blob/master/firebase/functions/index.js)。下面的代碼也包含了我向ML Engine預(yù)測API發(fā)出請求的函數(shù)部分:

function cmlePredict(b64img, callback) {

return new Promise((resolve, reject) => {

google.auth.getApplicationDefault(function (err, authClient, projectId) {

if (err) {

reject(err);

}

if (authClient.createScopedRequired && authClient.createScopedRequired()) {

authClient = authClient.createScoped([

'https://www.googleapis.com/auth/cloud-platform'

]);

}

var ml = google.ml({

version: 'v1'

});

const params = {

auth: authClient,

name: 'projects/sara-cloud-ml/models/tswift_detector',

resource: {

instances: [

{

"inputs": {

"b64": b64img

}

}

]

}

};

ml.projects.predict(params, (err, result) => {

if (err) {

reject(err);

} else {

resolve(result);

}

});

});

});

}

在ML Engine的反應(yīng)中,我們得到:

detection_boxes:可以用來標出Taylor Swift周圍的邊框;

detection_scores:為每個檢測框架返回一個置信度值,其中只包括分數(shù)高于70%的檢測;

detection_classes:告訴我們與檢測相關(guān)的ID。在這種情況下,因為只有一個標簽所以該值總為1。

在函數(shù)中,如果檢測到Taylor,則用detection_boxes在圖像中繪制一個邊框以及生成置信度分數(shù)。然后將新的帶有邊框的圖像保存到云中,將圖像的文件路徑寫入Cloud Firestore,一邊在iOS應(yīng)用程序中讀取路徑并下載新圖像:

const admin = require('firebase-admin');

admin.initializeApp(functions.config().firebase);

const db = admin.firestore();

let outlinedImgPath = `outlined_img/${filePath.slice(7)}`;

let imageRef = db.collection('predicted_images').doc(filePath);

imageRef.set({

image_path: outlinedImgPath,

confidence: confidence

});

bucket.upload('/tmp/path/to/new/image', {destination: outlinedImgPath});

最后,在iOS應(yīng)用程序中,我們可以監(jiān)測圖像Firestore路徑的更新。如果檢測到目標,我會下載這張圖片并在應(yīng)用程序中顯示這張圖以及可信度分數(shù)。這個函數(shù)將替換上一個代碼片段中的注釋:

self.firestore.collection("predicted_images").document(imageName!)

.addSnapshotListener { documentSnapshot, error in

if let error = error {

print("error occurred(error)")

} else {

if (documentSnapshot?.exists)! {

let imageData = (documentSnapshot?.data())

self.visualizePrediction(imgData: imageData)

} else {

print("waiting for prediction data...")

}

}

}

好了!現(xiàn)在我們有一款Taylor Swift檢測器了!注意,由于模型只用了140張圖像進行訓(xùn)練,所以準確度不夠高,可能會把其他人誤認為是Taylor。但是,如果有時間的話,我會收集更多貼有標簽的圖片,并更新模型,發(fā)布到應(yīng)用商店里。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 圖像識別
    +關(guān)注

    關(guān)注

    9

    文章

    516

    瀏覽量

    38196
  • SWIFT
    +關(guān)注

    關(guān)注

    0

    文章

    92

    瀏覽量

    23772
  • tensorflow
    +關(guān)注

    關(guān)注

    13

    文章

    328

    瀏覽量

    60452

原文標題:教程帖:用TensorFlow自制Taylor Swift識別器

文章出處:【微信號:jqr_AI,微信公眾號:論智】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    使用Python卷積神經(jīng)網(wǎng)絡(luò)(CNN)進行圖像識別的基本步驟

    Python 卷積神經(jīng)網(wǎng)絡(luò)(CNN)在圖像識別領(lǐng)域具有廣泛的應(yīng)用。通過使用卷積神經(jīng)網(wǎng)絡(luò),我們可以讓計算機從圖像中學(xué)習(xí)特征,從而實現(xiàn)對圖像的分類、識別和分析等任務(wù)。以下是使用 Pytho
    的頭像 發(fā)表于 11-20 11:20 ?4961次閱讀

    基于DSP的快速紙幣圖像識別技術(shù)研究

    技術(shù),并根據(jù)具體系統(tǒng)特性對現(xiàn)有的識別算法進行分析、優(yōu)化和改進,以最終形成具有創(chuàng)新性、實用性和快速性特點的算法。這算法的研究與實現(xiàn),對于推動圖像識別技術(shù)理論的進步發(fā)展,以及加速
    發(fā)表于 11-05 14:43

    【瑞芯微RK1808計算棒試用申請】圖像識別以及芯片評測

    `項目名稱:圖像識別以及芯片評測試用計劃:項目名稱:圖像識別以及芯片評測申請理由:1,拿到人工計算棒會進行評估,完成linux項目的移植,本人有l(wèi)inux底層驅(qū)動移植經(jīng)驗,以及rt-thread
    發(fā)表于 09-18 19:21

    研發(fā)干貨丨基于OK3399-C平臺android系統(tǒng)下實現(xiàn)圖像識別

    研發(fā)干貨丨基于OK3399-C平臺android系統(tǒng)下實現(xiàn)圖像識別首先我們了解下android系統(tǒng)常用的圖像識別框架:調(diào)用些不開源庫進行識別
    發(fā)表于 02-07 08:46

    如何構(gòu)建基于圖像識別的印制線路板精密測試系統(tǒng)?

    如何構(gòu)建基于圖像識別的印制線路板精密測試系統(tǒng)?圖像識別技術(shù)在印刷線路板精密測試中的應(yīng)用
    發(fā)表于 04-27 06:25

    圖像識別模組(包括PCB圖、圖像識別模組源代碼)

    圖像識別模組電路原理圖、圖像識別模組PCB圖、圖像識別模組源代碼、圖像識別模組用戶使用手冊
    發(fā)表于 01-02 19:14 ?121次下載

    細粒度圖像識別深度學(xué)習(xí)開源工具庫Hawkeye解析

      Hawkeye 是基于 PyTorch 的細粒度圖像識別深度學(xué)習(xí)工具庫,專為相關(guān)領(lǐng)域研究人員和工程師設(shè)計。目前,Hawkeye 包含多種代表性范式的細粒度
    的頭像 發(fā)表于 11-06 20:26 ?1007次閱讀

    圖像識別技術(shù)原理 深度學(xué)習(xí)的圖像識別應(yīng)用研究

      圖像識別是人工智能領(lǐng)域的重要方向。經(jīng)過多年的研究,圖像識別技術(shù)取得了定的研究進展。圖像識別
    發(fā)表于 07-19 10:27 ?2次下載

    模擬矩陣在圖像識別中的應(yīng)用

    訊維模擬矩陣在圖像識別中的應(yīng)用主要是通過構(gòu)建包含多種圖像數(shù)據(jù)的模擬矩陣,來訓(xùn)練和測試深度學(xué)習(xí)模型,從而提高
    的頭像 發(fā)表于 09-04 14:17 ?525次閱讀
    模擬矩陣在<b class='flag-5'>圖像識別</b>中的應(yīng)用

    基于TensorFlow和Keras的圖像識別

    TensorFlow和Keras最常見的用途之圖像識別/分類。通過本文,您將了解如何使用Keras達到這目的。定義如果您不了解圖像識別
    的頭像 發(fā)表于 01-13 08:27 ?734次閱讀
    基于<b class='flag-5'>TensorFlow</b>和Keras的<b class='flag-5'>圖像識別</b>

    圖像識別技術(shù)原理 圖像識別技術(shù)的應(yīng)用領(lǐng)域

    圖像識別技術(shù)是種通過計算機對圖像進行分析和理解的技術(shù)。它借助計算機視覺、模式識別、人工智能等相關(guān)技術(shù),通過對圖像進行特征提取和匹配,找出
    的頭像 發(fā)表于 02-02 11:01 ?2090次閱讀

    圖像檢測和圖像識別的區(qū)別是什么

    圖像檢測和圖像識別是計算機視覺領(lǐng)域的兩重要研究方向,它們在許多應(yīng)用場景中都有著廣泛的應(yīng)用。盡管它們在某些方面有相似之處,但它們之間還是存在些明顯的區(qū)別。本文將從多個角度對
    的頭像 發(fā)表于 07-03 14:41 ?648次閱讀

    如何利用CNN實現(xiàn)圖像識別

    卷積神經(jīng)網(wǎng)絡(luò)(CNN)是深度學(xué)習(xí)領(lǐng)域中種特別適用于圖像識別任務(wù)的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)。它通過模擬人類視覺系統(tǒng)的處理方式,利用卷積、池化等操作,自動提取圖像中的特征,進而實現(xiàn)高效的圖像識別。本
    的頭像 發(fā)表于 07-03 16:16 ?830次閱讀

    opencv圖像識別有什么算法

    圖像識別算法: 邊緣檢測 :邊緣檢測是圖像識別中的基本步驟,用于識別圖像中的邊緣。常見的邊緣
    的頭像 發(fā)表于 07-16 10:40 ?620次閱讀

    圖像識別屬于人工智能嗎

    屬于。圖像識別是人工智能(Artificial Intelligence, AI)領(lǐng)域的重要分支。 、圖像識別概述 1.1 定義
    的頭像 發(fā)表于 07-16 10:44 ?784次閱讀