手把手教你用蘋果Core ML和Swift開發人臉目標識別APP
【導讀】CoreML是2017年蘋果WWDC發布的最令人興奮的功能之一。它可用於將機器學習整合到應用程序中,並且全部離線。CoreML提供的機器學習 API,包括面部識別的視覺 API、自然語言處理 API 。蘋果軟體主管兼高級副總裁 Craig Federighi 在大會上介紹說,Core ML 致力於加速在 iPhone、iPad、Apple Watch 等移動設備上的人工智慧任務,支持深度神經網路、循環神經網路、卷積神經網路、支持向量機、樹集成、線性模型等。本文將帶你從最初的數據處理開始教你一步一步的實現一個「霉霉」檢測器,來自動從一堆手機照片中找出「霉霉」。專知內容組編輯整理。
Build a Taylor Swift detector with the TensorFlow Object Detection API, ML Engine, and Swift
by Sara Robinson
注釋:本文沒有用TensorFlow官方庫,我用Swift構建了基於我的模型構建了應用程序。這在將來可能會改變,但Taylor對此有最終的發言權。
目前為止還沒有官方swift介面的TensorFlow 庫,所以我們用單純的swift在我們模型的基礎上建立預測過程的客戶端程序
下圖是我們應用程序APP的演示:(動圖)
GIF/2K
TensorFlow對象目標檢測API demo可以讓您識別圖像中目標的位置,這可以應用到一些很酷的的應用程序中。 有時我們可能會拍攝更多人物照片而不是景物照片,所以可以用同樣的技術來識別人臉。 事實證明,它同樣工作得很好! 我用它來構建了上圖中的Taylor Swift檢測器。
在這篇文章中,我概述了從一組TSwift格式的圖像到一個iOS app的建立步驟,該app在一個訓練好的模型對測試圖像進行預測;
1. 預訓練圖片:調整大小,標籤,將它們分成訓練和測試集,並得到Pascal VOC格式;
2. 將圖像轉換為TFRecords格式,從而用作API輸入;
3. 在Cloud ML引擎上使用MobileNet訓練模型;
4. 把訓練好的模型導出,並將其部署到ML引擎中以提供服務;
5. 構建一個iOS前端,對訓練過的模型做出預測請求。
用下面的架構圖,說明這幾部分組合在一起:
你可以直接從GitHub上找到這個項目,地址是:
https://github.com/sararob/tswift-detection
現在看來,一切似乎都很簡單
在我深入討論這些步驟之前,需要先解釋一下術語:TensorFlow對象檢測API是基於TensorFlow構建的框架,用於在圖像中識別對象。例如,你可以用許多貓的照片來訓練對象檢測器,一旦訓練好了你就可以輸入一個待遇測的貓的圖像,它會返回一個矩形列表,每個矩形中有一個貓。雖然是API,但您可以把它看作是一組用於遷移學習的方便實用的工具。
訓練一個對象識別模型需要大量時間和大量的數據。對象檢測中最牛的部分是它支持五種預訓練的遷移學習模型。轉移學習遷移學習是如何工作的?舉個例子:當一個孩子在學習他們的第一語言時,他們會接觸到很多例子,如果他們錯認了什麼,他們就會改正。例如,他們第一次識別一隻貓時,他們會看到他們的父母指向貓,然後說「貓」這個詞,這種重複強化了他們大腦中的認識。當他們學習如何識別狗時,孩子不需要從頭開始學習。他們可以使用他們識別貓的過程,但將其應用於稍微不同的任務。這就是遷移學習的原理。
我沒有時間去找到並且標記太多TSwift的圖像,但是我可以利用從這些模型中提取出來的特徵,通過修改最後的幾層來訓練數以百萬計的圖像,並將它們應用到我的分類任務中(檢測TSwift)。
▌第一步:圖像預處理
非常感謝Dat Tran,他寫的一篇博文非常棒(地址:https://towardsdatascience.com/how-to-train-your-own-object-detector-with-tensorflows-object-detector-api-bec72ecfe1d9 ),博文中介紹了如何用TF對象檢測訓練一個浣熊探測器。我的圖像標記和圖像轉化都follow他的博客,將圖片轉換為TensorFlow需要的格式。我在這裡總結一下我的步驟。
第一步:從谷歌圖片下載200張Taylor Swift的照片。我發現有一個Chrome擴展程序,可以下載Google種搜索的所有圖片結果。 在標記圖像之前,我將它們分成兩個數據集:訓練集和測試集。使用測試集測試模型的準確性。 根據Dat的建議,我寫了一個腳本來調整圖像解析度,以確保沒有任何圖像寬於600像素。
由於對象檢測API(Object Detection API)會輸出對象在圖像中的位置,因此不能將圖像和標籤作為訓練數據傳遞給對象。 需要傳遞一個邊界框(bounding box)來標識圖像中的對象以及與邊界框的標籤(在我們的數據集中,我們只有一個標籤,就是tswift)。
要生成圖像的邊界框,我使用了LabelImg(https://github.com/tzutalin/labelImg ),LabelImg是一個Python程序,可以讓你手動給圖像打標籤,並返回每個圖像的邊界框和相關標籤的XML文件。下面是它的工作原理,我定義了一個圖像的邊界框,並打標籤tswift:
然後LabelImg自動生成一個xml文件:
現在我有一個圖像,一個邊界框和一個標籤,但我需要將其轉換為TensorFlow接受的格式 – TFRecord(這種數據的一種二進位表示)。我寫了一個腳本來實現格式轉換。要使用我的腳本,您需要安裝tensorflow / models,從tensorflow / models / research目錄運行腳本,參數傳遞如下(運行兩次:一次用於訓練數據,一次用於測試數據):
腳本:
https://github.com/sararob/tswift-detection/blob/master/convert_to_tfrecord.py
▌第二步:在雲機器學習引擎上訓練TSwift 探測器
我可以在我的筆記本電腦上訓練這個模型,但這耗費大量的時間和資源,導致電腦不能做其他工作。 雲計算就是為了解決這個問題! 我們可以利用雲來進行多核訓練,從而在幾個小時內完成整個工作。 當我使用雲機器學習引擎時,我可以利用GPU(圖形處理單元)進行更快地訓練。有了這種處理能力,就可以開始訓練了,然後把模型訓練的幾個小時交給TSwift。
設置雲機器學習引擎
所有的數據都是TFRecord格式,我將數據上傳到雲端開始訓練。 首先,我在Google雲端控制台中創建一個項目,並開啟了雲機器學習引擎:
然後,我將創建一個雲存儲桶(Cloud Storage bucket)來打包我模型的所有資源。
我將在這個桶中創建一個名為/ data的子目錄來放置訓練和測試的TFRecord文件
API還需要一個pbtxt文件將標籤映射成整型的ID。 由於只有一個標籤,所以該文件很小:
添加MobileNet校驗文件進行進行學習
我不是從零開始訓練這個模型,所以當我進行訓練時,我需要使用預訓練模型。 我選擇使用MobileNet模型 - MobileNets是一系列針對移動優化的小模型。儘管MobileNet訓練很快,並且預測更快, 但是我不會直接在移動設備上使用我的模型。 我下載了MobileNet校驗文件進行訓練。 校驗文件是一個二進位文件,它包含了訓練過程中TensorFlow模型在一些特殊點的狀態。下載並解壓縮校驗文件後,您會看到它包含以下三個文件:
訓練模型需要所有的這些文件,所以需要將它們放在我的雲存儲桶中的同一個data/目錄下。
在進行訓練工作之前,還需要補充一點。 對象檢測腳本需要一個方法來綁定我們的模型校驗文件,標籤映射和訓練數據, 我們將使用配置文件來實現。repo對五個預先訓練的模型類型都有配置文件。 我在這裡使用了MobileNet,並使用雲存儲區中的相應路徑更新了所有PATH_TO_BE_CONFIGURED。 該文件除了將我的模型連接到雲存儲中的數據,還為我的模型配置了幾個參數,例如卷積大小,激活函數和步數。
以下是開始訓練之前/data雲存儲分區中應該存在的所有文件:
我還會在我的雲存儲桶中創建train /和eval /子目錄 - 這是TensorFlow進行訓練和評估時模型校驗文件存放的地方。
現在已經準備好所有的訓練文件,我可以使用gcloud命令來開始訓練。 請注意,您需要在本地拷貝一份tensorcow / models / research並在該目錄下運行以下的訓練腳本:
在進行訓練的同時,也開始進行評估工作。 使用以前沒有訓練過的數據來評估我的模型的準確性:
您可以通過雲端控制台來瀏覽機器學習引擎的「作業」部分,這一部分可以驗證您的作業是否運行正確,並且可以檢查作業的日誌。
▌第3步:部署模型進行預測
將模型部署到機器學習引擎我需要將我的模型檢查點轉換為ProtoBuf。 在我的訓練過程中,我可以看到從幾個檢查點保存的文件:
檢查點文件的第一行將告訴我最新的檢查點路徑,我將從該檢查點本地下載3個文件。每個檢查點應該有一個.index,.meta和.data文件。這些保存在本地目錄中,我可以使用目標檢測手動腳本export_inference_graph將它們轉換為ProtoBuf。要運行下面的腳本,您需要在MobileNet配置文件添加本地路徑,你需要從訓練任務中下載模型檢查點的編號,以及要導出的圖形的目錄名稱:
這個腳本運行後,你應該在你的.pb輸出目錄裡面看到一個saved_model 目錄。上傳saved_model.pb ble(不要擔心其它生成的文件)到你雲存儲下/ data目錄中。
現在您已經準備好將模型部署到機器學習引擎上進行服務。首先,使用gcloud命令創建你的模型:
然後通過將模型指向剛剛上傳到雲存儲的已保存模型ProtoBuf來創建模型的第一個版本:
一旦模型部署完成,就可以使用機器學習引擎的在線預測API來預測新圖像。
▌第4步:使用Firebase和Swift構建預測客戶端
我在Swift中編寫了一個iOS客戶端來對我的模型進行預測請求(因為為什麼不用其他語言編寫TSwift檢測器?)Swift客戶端將圖像上傳到雲存儲,這會觸發Firebase,在Node.js中發出預測請求,並將生成的預測圖像和數據保存到雲存儲和Firestore中。
首先,在我的Swift客戶端中,我添加了一個按鈕,供用戶訪問設備照片庫。用戶選擇照片後,會自動將圖像上載到雲端存儲:
接下來,我編寫了上傳到我的項目的雲存儲觸發的Firebase資料庫。它把圖像進行64位編碼,並發送到機器學習引擎進行預測。你可以在這裡找到完整功能的代碼。下面是我向機器學習引擎預測API發出請求的函數部分。
在機器學習響應中,我們得到:
detection_box來定義TSwift周圍的邊界框(如果她在圖像中檢測到的話)
detection_scores為每個檢測框返回一個分數值。我將分數高於70%的檢測認為是正確的。
detection_classes告訴我們與檢測相關的標籤ID。在我的實驗中,因為只有一個標籤,它總是1
在函數中,如果檢測到Taylor,則使用detection_boxes在圖像上繪製一個框,並給出判斷分數。將帶有新框的圖像保存到雲存儲,然後將圖像的文件路徑寫入Cloud Firestore,以便在iOS應用程序中讀取路徑並下載新圖像(使用矩形):
最後,在我的iOS應用程序中,可以監聽圖像Firestore路徑的更新。如果檢測到,我會下載圖像,並與檢測分數一起顯示在應用程序中。這個函數將替換上面第一個Swift代碼片段中的注釋:
我們有一個Taylor Swift檢測器。這裡的重點不是準確性(因為我的訓練集中只有140張圖像),所以模型錯誤地識別了一些可能會誤認為tswift的人的圖像。但是,我會花時間來標識更多的圖片,我將更新模型,並在應用程序商店發布應用程序:)
▌下一步是什麼?
這篇文章涵蓋了很多信息。要想自己構建這個系統? 可參考下面步驟:
預處理數據:我遵循Dat的博客文章,使用LabelImg來處理標籤圖像,並生成邊框數據的xml文件。 然後我寫了一個腳本來將標記的圖像轉換為TFRecords。
腳本:
https://github.com/sararob/tswift-detection/blob/master/convert_to_tfrecord.py
訓練和評估目標檢測模型:使用本博客的方法,我將訓練和測試數據上傳到雲存儲,並使用機器學習引擎進行訓練和評估。
將模型部署到機器學習引擎:我使用gcloud CLI將我的模型部署到機器學習引擎
我的模型:https://cloud.google.com/ml-engine/docs/deploying-models。
預測請求:我使用Firebase SDK for Cloud功能向我的機器學習引擎模型發出在線預測請求。此請求是由我的Swift應用上傳到Firebase存儲觸發的。在我的函數中,我向Firestore寫預測元數據。
參考鏈接:
https://towardsdatascience.com/build-a-taylor-swift-detector-with-the-tensorflow-object-detection-api-ml-engine-and-swift-82707f5b4a56
-END-
專 · 知
人工智慧領域主題知識資料查看獲取:【專知薈萃】人工智慧領域26個主題知識資料全集(入門/進階/論文/綜述/視頻/專家等)
※ICCV2017 PoseTrack challenge優異方法:基於檢測和跟蹤的視頻中人體姿態估計
※模仿人類的印象機制,商湯提出精確實時的視頻目標檢測方法
※2017最火的五篇深度學習論文 總有一篇適合你
※飛入尋常百姓家:DeepCognition.ai教你輕鬆部署AI應用
※遷移學習在深度學習中的應用
TAG:專知 |