當前位置:
首頁 > 知識 > 用攝像頭和Tensorflow.js在瀏覽器上實現目標檢測

用攝像頭和Tensorflow.js在瀏覽器上實現目標檢測

選自Medium

作者:Mike Shi

機器之心編譯

參與:Pedro、劉曉坤

Tensorflow.js 是一個能在你的瀏覽器里運行的全新深度學習庫。本文將會介紹從原生 Tiny YOLO Darknet 模型到 Keras 的轉換,再到 Tensorflow.js 的轉換,如何利用其作一些預測,在編寫 Tensorflow.js 遇到的一些問題,以及介紹使用聯網攝像頭/圖像輕鬆地進行預測檢測。

項目地址:https://github.com/ModelDepot/tfjs-yolo-tiny

YOLO9000:更好,更快,更強

嚴格意義上來講這才是原文的標題。我們將會使用 Tiny YOLO,一個快速的、能在 200 FPS 下運行的目標檢測模型。我們將會使用 Tiny YOLO 而非完整的 YOLOv2。為什麼?首先,YOLOv2 只在功能強大的桌面級設備上以 40 幀每秒的速度運行,而這個條件大多數用戶都達不到。同時,YOLOv2 的模型文件是 Tiny YOLO 的五倍大,這將會導致網路卡死。最後,YOLOv2 有一個暫時不被原生 Tensorflow.js 支持的重組層(reorg layer)。下一步,我們將重點放在 Tiny YOLO 的網路配置(神經網路結構)以及權重上。

YAD2K:又一個 DARKNET 2 KERAS(轉換器)

你可能已經注意到 YOLO 是用 Darknet 編寫的,而 Darknet 聽起來和 Tensorflow 沒什麼關係。所以我們的第一步就是將 YOLO 模型轉換為更加 Tensorflow 式的東西,在我們的例子中,這個東西是 Keras。Keras 是一個更高級的深度學習框架。我們推薦使用此種方式(https://js.tensorflow.org/tutorials/import-keras.html)將你的權重轉換為 Tensorflow.js 的格式。

我們將會使用 YAD2K 來將 Darknet 模型轉換為 Keras 模型。請按照此處的教程來安裝 YAD2K(https://github.com/allanzelener/YAD2K#installation)。

當然了,你也可以假裝你已經安裝好了然後使用我已經給出的最終權重文件(https://modeldepot.io/mikeshi/tiny-yolo-in-javascript),但是這樣的話你會失去不少樂趣!

現在,我們將要修復 YAD2K 里的一個 Bug 來正確載入 Tiny YOLO。

用你最喜歡的文本編輯器打開 yad2k.py,在第 83 行,將 buffer=weights_file.read(16) 改為 buffer=weights_file.read(20)。為什麼?現在毫無頭緒。

現在在你的電腦終端運行下列指令。這些指令會下載 Tiny YOLO 權重以及配置文件同時會將轉換後的模型文件輸出到 model_data/yolov2-tiny.h5。

wgethttps://pjreddie.com/media/files/yolov2-tiny.weights

wgethttps://raw.githubusercontent.com/pjreddie/darknet/master/cfg/yolov2-tiny.cfg

./yad2k.py yolov2-tiny.cfg yolov2-tiny.weights model_data/yolov2-tiny.h5

之後,我們要保證新模型能運轉起來。一個有趣的事實是:之前我忘了做這一步然後我花了一整天糾結為什麼 Tensorflow.js 不工作。

./test_yolo.py model_data/yolov2-tiny.h5

這個模型會輸出一些預測。

TENSORFLOW.JS 轉換器:我們最後的權重轉換方式

這一步更加簡單,我保證!查看此處的官方指導(https://js.tensorflow.org/tutorials/import-keras.html)。我已經把所有的難題解決了,所以如果你還覺得這些看起來太多了的話,你可以直接跳過這一步。

我們將要安裝官方轉換工具。在終端運行 pip install tensorflowjs 指令來安裝轉換器。

現在要轉換我們的模型,再次使用終端!

tensorflowjs_converter--input_format keras

model_data/yolov2-tiny.h5

tfjs_model_data

現在我們終於將模型文件轉移到 tfjs_model_data 中去了!注意,那個文件夾還包含了 model.json 以及一些其他的碎片文件。model.json 告訴 Tensorflow.js 神經網路的結構是怎樣的以及哪些碎片文件與哪些權重相對應。這些碎片文件包含了模型的權重。要保證這些碎片文件和 model.json 在同一個目錄下,不然你的模型將會無法正確載入。

Tensorflow.js

現在,我們到了有趣的部分。我們將同時處理 ML 和 JS 代碼!

首先,我們導入 Tensorflow 然後載入模型。

import*astffrom『@tensorflow/tfjs』;

const model =awaittf.loadModel(url);

等等,什麼是"url"?你可以使用此處的託管模型文件(https://raw.githubusercontent.com/MikeShi42/yolo-tiny-tfjs/master/model2.json)或者把路徑加到你轉換後的文件中去。

完美,現在我們做些真正的深度學習了:

functionyolo(input){

returnmodel.predict(input);

}

啊哈。這看起來好像也沒什麼特別的,等等。我們忘了將輸出轉換成邊框、分類標籤以及概率!

將數字轉換為邊框以及數字

我不準備深入探討這個話題,因為對 YOLO 的後處理可以拿來單獨寫幾篇博客了。相反,我會專註於我在將 Python 版本轉換到 Javascript 時遇到的難題。

1. 一部分張量操作不可行。

Tensorflow.js 還很年輕,因此有一些功能暫時不可用,例如 boolean mask 以及 NMS。你可能也會遇到這樣的問題,不過幸運的是你可以繞過它,通過下列方式:

2. 你不能像 Python 那樣使用 -1 索引

在 python 中,你可以使用 -1 作為「最後一個元素」。不幸的是,在 Tensorflow.js 中,如果你在 tf.slice 上嘗試這樣操作,它只會默默地失敗。

3. 你不能使用 5d 張量

注意,Tensorflow,js 的 WebGL 後端不支持 5d 張量。既然無法想像五維的樣子,為什麼還要使用它們?在 YOLO 中我們將輸出重塑為 [batch_size,xy,wh,box_confidence,box_class_pred]。這個很顯然是五維的。幸運的是,為了避免這些麻煩,我刪除了 batch_size。另一種做法是不將輸出重塑為 5d 張量。但是有些細節還需要謹慎處理。

除此之外,我的使用體驗是連貫的。我只需要重新實現兩個通常情況下 Tensorflow 不使用的 CPU 演算法(傳統 JS)。

NPM 安裝

現在把我們的深度學習應用到程序中去吧!

幸運的是,有人已經寫好了代碼,所以只需在終端安裝 NPM 即可:

npmi tfjs-yolo-tiny

然後我們再稍微利用一下 Javascript:

importyolo, { downloadModel }from『tfjs-yolo-tiny』;

constmodel =awaitdownloadModel();

constinputImage = webcam.capture();

constboxes =awaityolo(inputImage, model);

哇,你說的這個 webcam.capture() 是什麼?

除了 NPM 的安裝之外...

你可能已經注意到我們還沒有關注過輸入到我們的 YOLO 中的到底是什麼。這也是 Tensorflow.js 最棒的部分之一。

我們可以從文件(DOM)中取出視頻或者圖像然後將其轉換為一個張量!

我們可以用 Javascript 寫下這些:

importyolo, { downloadModel }from『tfjs-yolo-tiny』;

constmodel =awaitdownloadModel();

constinputImage = webcam.capture();

constboxes =awaityolo(inputImage, model);

棒!現在可以將圖像作為張量輸入!之後,從圖像切換到網路攝像頭,你只需將其指向正確的元素即可。這對我來說很神奇。

在這之後,我們要做一些預處理。在這種情況下,將其裁剪為正方形,調整大小為 416x416,然後除以 255 得到大小範圍從 0 到 1 的像素值。

最後的一些想法

我們已經介紹了如何將模型轉換為 Tensorflow.js 格式,載入模型並用它進行預測。然後,我們探討了在 Tensorflow.js 中編寫後處理代碼的一些難題,但我們解決了這些問題。現在我們知道如何通過靜態圖像或網路攝像頭抓取數據,可以將大多數 ML 模型從 Python 轉換為 Tensorflow.js 並在瀏覽器中運行它們。

原文地址:https://towardsdatascience.com/deep-learning-in-your-browser-a-brisk-guide-ca06c2198846

本文為機器之心編譯,轉載請聯繫本公眾號獲得授權。

------------------------------------------------

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 機器之心 的精彩文章:

善於單挑卻難以協作,構建多智能體AI系統為何如此之難?

TAG:機器之心 |