Colab を用いたAI実行体験
【サイト内の関連ページ】
YOLO26 による物体検出(カメラ撮影)
概要・体験
Google Colab 上で最新の軽量物体検出モデル YOLO26 nano を動かし、自分の端末のカメラ映像にリアルタイムで物体検出をかける演習である。インストールやデータ準備は一切不要で、コードを1セル貼って実行するだけ。カメラ許可後、画面内の人や物が枠とラベルで次々に囲まれていく様子を確認できる。「カメラ入力 → AI 推論 → 結果描画」という処理の流れを最小手順で体感でき、ロボットの視覚処理の基本構造を実感として理解できる達成感が得られる。なお Google Colab そのものの概要はGoogle Colaboratoryとはを参照のこと。
実行手順(Google Colab)
- ① 次のリンクから Google Colab のノートブックを開く:https://colab.research.google.com/drive/1Tz4ZQuwttPxr8QLefDtrGVfuR5MEuTJQ?usp=sharing
- ② Google アカウントでログインする(未ログインの場合)。アカウントを持っていない場合はGoogleアカウントの取得手順を参照のこと。
- ③ コードセルをクリックして選択し、セル左の実行ボタン(▶)または
Shift + Enterで実行する。 - ④ 初回実行時にブラウザからカメラアクセスの許可を求められるので「許可」を選ぶ。
- ⑤ 許可後、カメラ映像に検出結果(枠+ラベル)が連続的に表示される。
- ⑥ 停止するときは、実行中セルの停止ボタン(■)を押してセルの実行を中断する。
※ 書き換えた内容を保存して後日も使いたい場合は、「ファイル」→「ドライブにコピーを保存」で自分のドライブに複製しておく(Google Driveへの定期保存も参照)。
発展課題
このコードに小さな改造を加えて、推論部分の挙動を確かめてみよう。
- 課題1:検出する物体を絞り込む。
推論を行う行
result = model(img, verbose=False)[0]をresult = model(img, classes=[0], verbose=False)[0]に書き換える。classes=[0]は「人」だけを検出する指定で、カメラに物を映しても人以外には枠が付かなくなる。 数字を変えると別の物体に絞れる(例:67は携帯電話)。 これにより、必要な対象だけを検出するという実用的な調整を体験できる。 - 課題2:いま何個検出したかを画面に表示する。
推論の次の行
_, buf = cv2.imencode('.jpg', result.plot())の直前に、
を追加し、続く行をn = len(result.boxes) frame = result.plot() cv2.putText(frame, "count: %d" % n, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)_, buf = cv2.imencode('.jpg', frame)に変える。result.boxesが検出結果の一覧であり、その個数を画面左上に赤字で重ねて表示する。 推論結果がプログラムから数値として取り出せること(後段の処理に渡せること)を実感できる。
ソースコード
先頭の !pip install -q ultralytics は YOLO 実行に必要なライブラリの導入であり、セッションごとに再実行が必要となる(詳細はパッケージのインストールを参照)。処理が停止して反応しなくなった場合は、セッションを終了して最初から実行し直す(セッション管理を参照)。
!pip install -q ultralytics
from IPython.display import display, Javascript, Image, update_display
from google.colab.output import eval_js
from base64 import b64decode
from ultralytics import YOLO
import numpy as np, cv2
display(Javascript('''
async function startCamera() {
const video = document.createElement('video');
const stream = await navigator.mediaDevices.getUserMedia({video: true});
video.srcObject = stream;
await video.play();
window._video = video;
}
async function takeFrame() {
const video = window._video;
const canvas = document.createElement('canvas');
canvas.width = video.videoWidth;
canvas.height = video.videoHeight;
canvas.getContext('2d').drawImage(video, 0, 0);
return canvas.toDataURL('image/jpeg', 0.8);
}
'''))
model = YOLO('yolo26n.pt')
eval_js('startCamera()')
display(Image(data=b''), display_id='cam')
while True:
img = cv2.imdecode(np.frombuffer(b64decode(eval_js('takeFrame()').split(',')[1]), np.uint8), 1)
_, buf = cv2.imencode('.jpg', model(img, verbose=False)[0].plot())
update_display(Image(data=buf.tobytes()), display_id='cam')