用 TensorFlow.js COCO-SSD 辨識圖片物件

更新於 2024/06/05閱讀時間約 9 分鐘

本篇要解決的問題

幾年前有寫了一篇〈ML5.js 神經網路 開發圖像辨識〉,是辨識圖片裡的物件,最近跟朋友設計一個活動,是需要判斷照片中的人數,ML5 有點不夠用,問了 ChatGPT 後,知道了 Tensorflow.js 裡,有一個 COCO-SSD 的模型,官方的說明 是「在單一影像中定位及辨識多個物件」,實際用起來後,也真的覺得好用,除了可以把人辨識出來,還可以給在照片上的範圍。

本篇主要參考的來源,是 官方說明文件、ChatGPT 的回答。

最後完成的 Demo:

https://letswritetw.github.io/letswrite-coco-ssd


基本使用

官方文件的使用教學很基本,就是我們用 img src 把圖檔放上去後,再用 COCO-SSD 這個模型來進行辨識,程式碼如下:

<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs"> </script>
<script src="https://cdn.jsdelivr.net/npm/@tensorflow-models/coco-ssd"> </script>

<img id="img" src="cat.jpg"/>

<script>
const img = document.getElementById('img');
cocoSsd.load().then(model => {
// detect objects in the image.
model.detect(img).then(predictions => {
console.log('Predictions: ', predictions);
});
});
</script>

進階用法

這邊 August 因為跟朋友設計的活動,是要讓參加活動的人,自己拍照後上傳,所以不能像官方的範例一樣,直接就能取得圖片。

以下程式碼使用 Vue.js 來實作。

HTML

HTML 的部份,我們放一個上傳檔案的按鈕,跟要在照片上標出辨識範圍的 canvas:

<input
type="file" ref="photo"
accept="image/*"
@change="photoHandler"/>

<canvas id="canvas"></canvas>

accept 限制使用者只能上傳圖片。

ref="photo" 是要在 Vue.js 裡能抓到使用者選擇的 file。

photoHandler 就是稍後要寫在 Vue.js 的 method。

Vue.js / JavaScript

因為 model 載入要時間,如果不想每次都載入,就要把 model 存在 data。

辨識的結果也需要存在 data,才好把結果呈現在畫面上。

data() {
return {
result: null,
modal: null
}
}

methods 先來處理使用者選擇了圖片檔:

async photoHandler() {
const file = this.$refs.photo.files[0];
if (!file) return;

// 載入 COCO-SSD 模型
this.model = this.model || await cocoSsd.load();

const imageElement = document.createElement('img');
imageElement.src = URL.createObjectURL(file);

imageElement.onload = async () => {

this.result = await this.model.detect(imageElement);

// 在照片上標出範圍
this.drawBox(imageElement, this.result);

// 清除暫時創建的圖檔 URL
URL.revokeObjectURL(imageElement.src);

};
}

COCO-SSD 辨識的結果,會是一個陣列,像這樣:

[
{
"bbox": [
244.66079431772232,
405.9116929471493,
304.8147379755974,
786.6561211645603
],
"class": "person",
"score": 0.9971041083335876
},
...
]

bbox 是辨識出的範圍。

class 是辨識結果,score 是信心值,愈接近 1 就愈準。

我們在照片用 COCO-SSD 辨識完後,執行了 drawBox,主要是標出照片裡 COCO-SSD 辨識的物件。

async drawBox(imageElement, predictions) {
const canvas = document.getElementById('canvas');
const context = canvas.getContext('2d');

// 設定畫布大小與圖片一致
canvas.width = imageElement.width;
canvas.height = imageElement.height;

// 畫圖片到畫布上
context.drawImage(imageElement, 0, 0, canvas.width, canvas.height);

for (let prediction of predictions) {
const [x, y, width, height] = prediction.bbox;
const text = `${prediction.class} (${(prediction.score * 100).toFixed(2)}%)`;

// 畫框
context.strokeStyle = 'yellow';
context.lineWidth = 8;
context.strokeRect(x, y, width, height);

// 設定字體樣式
context.font = '28px Arial';
context.fillStyle = 'yellow';

// 量測文字寬度與高度
const textWidth = context.measureText(text).width;
const textHeight = 28 * 1.5;
const padding = 8;

// 畫白色背景框,包含 padding
context.fillStyle = 'white';
context.fillRect(x - padding, y - 20 - textHeight - padding, textWidth + padding * 2, textHeight + padding * 2);

// 畫文字
context.fillStyle = 'black'; // 文字顏色
context.fillText(text, x + padding / 2, y - 10 - textHeight / 2);
}

}

辨識範例、原始碼

我們來試一下結果,以下圖片是在可商用的素材網 Pixabay 上下載的。

先來辨識一群人:

辨識一群人

辨識一群人

接著來辨識動物:

辨識動物

辨識動物

神奇的是,把柯基辨識成 Teddy Bear 了 XD。

最後來辨識物品:

辨識物品

辨識物品

雖然相機、滑鼠、茶杯都沒辨識到,不過還行,免費的就不要求了。

最後再次附上 Demo,也附上 Demo 的原始碼,取用前麻煩多多分享本篇,你的小小舉動,對本站都是大大的鼓勵。

Demo:

https://letswritetw.github.io/letswrite-coco-ssd

原始碼:

https://github.com/letswritetw/letswrite-coco-ssd

avatar-img
9會員
19內容數
沙龍到底是…做什麼用的勒?
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
Let's Write 的沙龍 的其他內容
詳細解說如何在 Mac 上透過 Docker 安裝 MongoDB 社群版。包括 MongoDB Compass 的安裝與配置,以及 MongoDB Shell 的使用方法,為開發者提供 MongoDB 學習資源。
本文提供如何使用 Google Colab 結合 Faster Whisper 來提升語音辨識速度與準確性,包含安裝指南與使用方法。探索如何將語音轉換為文本,並對檔案進行不同格式的輸出。
本篇筆記了如何使用Google Colab和OpenAI的Whisper Large V3進行免費且開源的語音辨識。涵蓋從基礎設定到實際運用的步驟,適合初學者和技術愛好者輕鬆學習語音辨識技術。
透過 Web Workers,您可以將這些耗時的操作放在另一個執行緒中處理,減輕主執行緒的負擔,提高網站的效能和響應速度。這篇文章提供了詳細的解釋和示例,幫助您快速上手使用 Web Workers。不要錯過這個可以改善網站效能的實用技巧!
本篇介紹了一個名為 DOMPurify 的套件,它可以增加網站對 XSS 攻擊的防護力。DOMPurify 可以幫助開發人員過濾和清除不受信任的輸入,以防止 XSS 攻擊。本文提供了 DOMPurify 的安裝和使用方法,並提供了一個範例 Demo 供參考。
本篇大綱:本篇要解決的問題。用 Docker 安裝 Verdaccio。上傳 package。使用 package。刪除 package。修改 config.yml。改變 CSS。
詳細解說如何在 Mac 上透過 Docker 安裝 MongoDB 社群版。包括 MongoDB Compass 的安裝與配置,以及 MongoDB Shell 的使用方法,為開發者提供 MongoDB 學習資源。
本文提供如何使用 Google Colab 結合 Faster Whisper 來提升語音辨識速度與準確性,包含安裝指南與使用方法。探索如何將語音轉換為文本,並對檔案進行不同格式的輸出。
本篇筆記了如何使用Google Colab和OpenAI的Whisper Large V3進行免費且開源的語音辨識。涵蓋從基礎設定到實際運用的步驟,適合初學者和技術愛好者輕鬆學習語音辨識技術。
透過 Web Workers,您可以將這些耗時的操作放在另一個執行緒中處理,減輕主執行緒的負擔,提高網站的效能和響應速度。這篇文章提供了詳細的解釋和示例,幫助您快速上手使用 Web Workers。不要錯過這個可以改善網站效能的實用技巧!
本篇介紹了一個名為 DOMPurify 的套件,它可以增加網站對 XSS 攻擊的防護力。DOMPurify 可以幫助開發人員過濾和清除不受信任的輸入,以防止 XSS 攻擊。本文提供了 DOMPurify 的安裝和使用方法,並提供了一個範例 Demo 供參考。
本篇大綱:本篇要解決的問題。用 Docker 安裝 Verdaccio。上傳 package。使用 package。刪除 package。修改 config.yml。改變 CSS。
你可能也想看
Google News 追蹤
Thumbnail
徵的就是你 🫵 超ㄅㄧㄤˋ 獎品搭配超瞎趴的四大主題,等你踹共啦!還有機會獲得經典的「偉士牌樂高」喔!馬上來參加本次的活動吧!
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
特徵工程是機器學習中的核心技術,通過將原始數據轉換為有意義的特徵,以提升模型的準確性和穩定性。常見的特徵工程方法包括異常值檢測、特徵轉換、特徵縮放、特徵表示、特徵選擇和特徵提取。本文將深入探討這些方法的適用情況及具體實施流程,以幫助讀者有效利用特徵工程來優化機器學習模型表現。
Thumbnail
本篇文章介紹如何使用PyTorch構建和訓練圖神經網絡(GNN),並使用Cora資料集進行節點分類任務。通過模型架構的逐步優化,包括引入批量標準化和獨立的消息傳遞層,調整Dropout和聚合函數,顯著提高了模型的分類準確率。實驗結果表明,經過優化的GNN模型在處理圖結構數據具有強大的性能和應用潛力。
Thumbnail
前言 讀了許多理論,是時候實際動手做做看了,以下是我的模型訓練初體驗,有點糟就是了XD。 正文 def conv(filters, kernel_size, strides=1): return Conv2D(filters, kernel_size,
Thumbnail
本文要探討AI的任務與實戰場景。AI技術已深入生活各層面,從違約預測到都市交通管理。AI任務主要有三類:數值型資料處理、自然語言處理(NLP)和電腦影像辨識。時間序列資料和強化學習方法(如AlphaGo)也引起廣泛關注。AI演算法和方法因應不同學派和技術發展而多樣化,了解這些基礎有助選擇適合研究方向
為了將輸入文本轉換成深度學習模型可以使用的嵌入向量, 我們需要先將「輸入文本 Input Text」轉為「符元化文本 Tokenized Text」。 而實際上「符元化文本 Tokenized Text」與「嵌入向量 Embedding Vector」之間, 還有一個步驟稱為「符元
Thumbnail
在這篇文章中,將繼續介紹 TG Bot 整合 MongoDB 的相關操作。主要包括對 domain 進行驗證操作,使用的工具有 Python 、MongoDB 和 TG Bot。具體的功能需求包括新增 domain 前檢查 domain 憑證以及透過 TG Bot 檢查所有 domain 是否過期。
Thumbnail
本文介紹如何使用 TG Bot 來操作 MongoDB,包括讀取所有 domain、讀取特定 domain、新增 domain、批量新增 domain、修改 domain 和刪除 domain。透過 TG Bot 的指令操作,實現了自動化管理和多環境管理。
Thumbnail
卷積神經網路(CNN)是一種專門用於影像相關應用的神經網路。本文介紹了CNN在影像辨識中的應用,包括圖片的組成、Receptive Field、Parameter Sharing、以及Pooling等技術。通過本文,讀者將瞭解CNN在影像辨識領域的優勢和運作原理。
Thumbnail
EasyOCR是一個能夠幫助你對圖片中的文字進行辨識的工具,透過進階分析,可以應用在文件掃描、自動化數據輸入、發票掃描等領域。本章節將介紹如何安裝、引用模型、進行文字辨識、以及辨識結果的分析。透過學習,你可以建立屬於自己的文字辨識系統。
Thumbnail
本篇文章參考 Youtube 影片(...真實模型推薦...)內容,為大家找出影片中的模型,直接作圖測試,您直接連結過去,就可以在 TensorArt 內直接使用囉!
Thumbnail
徵的就是你 🫵 超ㄅㄧㄤˋ 獎品搭配超瞎趴的四大主題,等你踹共啦!還有機會獲得經典的「偉士牌樂高」喔!馬上來參加本次的活動吧!
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
特徵工程是機器學習中的核心技術,通過將原始數據轉換為有意義的特徵,以提升模型的準確性和穩定性。常見的特徵工程方法包括異常值檢測、特徵轉換、特徵縮放、特徵表示、特徵選擇和特徵提取。本文將深入探討這些方法的適用情況及具體實施流程,以幫助讀者有效利用特徵工程來優化機器學習模型表現。
Thumbnail
本篇文章介紹如何使用PyTorch構建和訓練圖神經網絡(GNN),並使用Cora資料集進行節點分類任務。通過模型架構的逐步優化,包括引入批量標準化和獨立的消息傳遞層,調整Dropout和聚合函數,顯著提高了模型的分類準確率。實驗結果表明,經過優化的GNN模型在處理圖結構數據具有強大的性能和應用潛力。
Thumbnail
前言 讀了許多理論,是時候實際動手做做看了,以下是我的模型訓練初體驗,有點糟就是了XD。 正文 def conv(filters, kernel_size, strides=1): return Conv2D(filters, kernel_size,
Thumbnail
本文要探討AI的任務與實戰場景。AI技術已深入生活各層面,從違約預測到都市交通管理。AI任務主要有三類:數值型資料處理、自然語言處理(NLP)和電腦影像辨識。時間序列資料和強化學習方法(如AlphaGo)也引起廣泛關注。AI演算法和方法因應不同學派和技術發展而多樣化,了解這些基礎有助選擇適合研究方向
為了將輸入文本轉換成深度學習模型可以使用的嵌入向量, 我們需要先將「輸入文本 Input Text」轉為「符元化文本 Tokenized Text」。 而實際上「符元化文本 Tokenized Text」與「嵌入向量 Embedding Vector」之間, 還有一個步驟稱為「符元
Thumbnail
在這篇文章中,將繼續介紹 TG Bot 整合 MongoDB 的相關操作。主要包括對 domain 進行驗證操作,使用的工具有 Python 、MongoDB 和 TG Bot。具體的功能需求包括新增 domain 前檢查 domain 憑證以及透過 TG Bot 檢查所有 domain 是否過期。
Thumbnail
本文介紹如何使用 TG Bot 來操作 MongoDB,包括讀取所有 domain、讀取特定 domain、新增 domain、批量新增 domain、修改 domain 和刪除 domain。透過 TG Bot 的指令操作,實現了自動化管理和多環境管理。
Thumbnail
卷積神經網路(CNN)是一種專門用於影像相關應用的神經網路。本文介紹了CNN在影像辨識中的應用,包括圖片的組成、Receptive Field、Parameter Sharing、以及Pooling等技術。通過本文,讀者將瞭解CNN在影像辨識領域的優勢和運作原理。
Thumbnail
EasyOCR是一個能夠幫助你對圖片中的文字進行辨識的工具,透過進階分析,可以應用在文件掃描、自動化數據輸入、發票掃描等領域。本章節將介紹如何安裝、引用模型、進行文字辨識、以及辨識結果的分析。透過學習,你可以建立屬於自己的文字辨識系統。
Thumbnail
本篇文章參考 Youtube 影片(...真實模型推薦...)內容,為大家找出影片中的模型,直接作圖測試,您直接連結過去,就可以在 TensorArt 內直接使用囉!