在本教學課程中,您將建構並安裝 Chrome 擴充功能,讓您在網頁中按一下滑鼠右鍵點選圖片,並對圖片執行多類別物件偵測。此擴充功能會將 MobileNetV2 分類器套用至圖片,然後使用預測類別標記圖片。
範例程式碼可在 GitHub 上取得。
先決條件
若要完成本教學課程,您的開發環境中需要安裝下列項目
建構擴充功能
取得原始碼並建構擴充功能
- 複製或下載 tfjs-examples 存放區。
- 變更為
chrome-extension
目錄:cd tfjs-examples/chrome-extension
。 - 安裝依附元件:
yarn
。 - 執行建構指令碼:
yarn build
。
執行建構指令碼後,您應該會看到下列新檔案
dist/src/content.js
dist/src/service_worker.js
dist/src/service_worker.js.map
安裝擴充功能
在 Chrome 中安裝擴充功能
- 在 Chrome 瀏覽器中,前往
chrome://extensions
。 - 使用瀏覽器右側的切換按鈕開啟「開發人員模式」。
- 選取「載入未封裝項目」,然後選取
tfjs-examples/chrome-extension/dist
目錄。此目錄包含manifest.json
檔案和建構封裝的src/*.js
檔案。
您應該會看到「TF.js mobilenet in a Chrome extension」的新卡片。
使用擴充功能
安裝擴充功能後,您可以在瀏覽器中分類圖片
- 前往具有圖片的網站。例如,前往
google.com
,搜尋「老虎」,然後在結果頁面中選取「圖片」。您應該會看到老虎圖片頁面。 - 在圖片上按一下滑鼠右鍵,然後選取「使用 TensorFlow.js 分類圖片」。會有預熱期,因此第一次執行應用程式時,推論速度會較慢。(在您自己的應用程式中,您可以透過饋送虛擬資料來啟動模型。)
擴充功能會在圖片上執行模型,然後疊加文字以指出預測。
移除擴充功能
當您完成擴充功能的實驗後,可以移除它
- 在 Chrome 中,前往
chrome://extensions
。 - 在「TF.js mobilenet in a Chrome extension」卡片中,選取「移除」,然後確認您要移除擴充功能。
擴充功能的運作方式
本節將概略說明擴充功能的運作方式。
資訊清單檔案 manifest.json
指定 Chrome 將在背景執行的 Service Worker
"background": {
"service_worker": "src/service_worker.js"
},
Service Worker 指令碼 service_worker.js
匯入 TensorFlow.js 套件和 mobilenet 模型。
import * as mobilenet from '@tensorflow-models/mobilenet';
import * as tf from '@tensorflow/tfjs';
package.json
中的建構指令碼使用套件組合器 Parcel 將所有項目組合在一起,因此在執行階段不會載入外部指令碼。
"build": "parcel build src/service_worker.js --dist-dir dist/src/ && npm run copy",
這是為了符合 Chrome Manifest V3,後者禁止遠端託管程式碼。請注意,Service Worker 仍然可以載入外部資源,例如 TensorFlow.js 模型。
Service Worker 指令碼會建立操作圖片的內容選單項目。然後,指令碼會接聽點擊。
/**
* Adds a right-click menu option to trigger classifying the image.
* The menu option should only appear when right-clicking an image.
*/
chrome.runtime.onInstalled.addListener(() => {
chrome.contextMenus.create({
id: 'contextMenu0',
title: 'Classify image with TensorFlow.js ',
contexts: ['image'],
});
});
chrome.contextMenus.onClicked.addListener(clickMenuCallback);
當使用者選取選單項目時,回呼會傳送訊息,其中包含目前的分頁 ID 和按一下滑鼠右鍵點選的圖片網址。(請注意,在 Service Worker 中,DOM 物件無法使用。)
function clickMenuCallback(info, tab) {
const message = { action: 'IMAGE_CLICKED', url: info.srcUrl };
chrome.tabs.sendMessage(tab.id, message, (resp) => {
if (!resp.rawImageData) {
console.error(
'Failed to get image data. ' +
'The image might be too small or failed to load. ' +
'See console logs for errors.');
return;
}
const imageData = new ImageData(
Uint8ClampedArray.from(resp.rawImageData), resp.width, resp.height);
imageClassifier.analyzeImage(imageData, info.srcUrl, tab.id);
});
}
內容指令碼 content.js
會接聽訊息並處理 IMAGE_CLICKED
動作。指令碼會接收圖片網址、載入圖片、在 OffscreenCanvas
上轉譯圖片、從畫布取得圖片資料,然後將資料傳回 Service Worker。
在 Service Worker 收到圖片資料後,它會使用資料執行 mobilenet 模型並取得預測結果。在上述 clickMenuCallback
函式中,imageClassifier
是 ImageClassifier
類別的執行個體,它會載入模型並取得預測。然後,Service Worker 指令碼會將結果傳回內容指令碼以供顯示。在內容指令碼收到結果後,它會將結果疊加在原始圖片之上。
當大約 30 秒內沒有活動發生時,Service Worker 執行緒會進入閒置狀態。如需管理 Service Worker 事件的詳細資訊,請參閱 Chrome 文件。
後續步驟
本教學課程示範如何部署 Chrome 擴充功能,以使用 TensorFlow.js 和預先訓練的 MobileNet 模型來分類圖片。若要進一步瞭解 TensorFlow.js 的預先訓練模型,請參閱預先訓練模型存放區。