大阪大学 中島優作
ほとんどの応用は「物体を見つけた」が前提。検出がこけると後ろが全部こける
ロボットではまず検出(箱)。つかみ方まで考えるなら形が分かるセグメンテーション
キャリブレーションはカメラ/デプスカメラのスライドを参照
画像を後から直すより、撮る前にそろえる方がずっと安くて確実
| 処理 | 何をする | 効く場面 |
|---|---|---|
| 歪み補正 | レンズの歪みを内部パラメータで戻す | 広角カメラ、画像の端の物体の位置 |
| ROI 切り出し | 作業台など見る場所だけ切り出す | 小さい物体、関係ない物の誤検出 |
| リサイズ | モデルの入力サイズ(例 640)へ。縦横比を保って余白を足す(レターボックス) | 必須。つぶすと形が変わる |
| 色の変換 | BGR ↔ RGB、HSV(色と明るさを分ける) | 色で判定、モデルの入力順 |
| 明るさ・色の補正 | ガンマ補正、CLAHE、ホワイトバランス | 暗い・明暗差が大きい・色かぶり |
| 平滑化 | ガウシアン・メディアンフィルタ | ノイズが多い(暗所・高感度) |
| 正規化 | 画素値を 0〜1 などにそろえる | モデルの入力(多くはライブラリが自動) |
「暗い部屋+電球色」を押して、前処理を 1 つずつ足してみよう。1 つだけでは足りないことも多い
import cv2
img = cv2.imread("table.png") # OpenCV は BGR の順で読む
img = cv2.undistort(img, K, dist) # 歪み補正(K, dist はキャリブレーション結果)
roi = img[200:680, 300:1100] # 作業台だけ切り出す
lab = cv2.cvtColor(roi, cv2.COLOR_BGR2LAB) # 明るさ L だけを補正する
l, a, b = cv2.split(lab)
l = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8)).apply(l)
roi = cv2.cvtColor(cv2.merge((l, a, b)), cv2.COLOR_LAB2BGR)
roi = cv2.GaussianBlur(roi, (5, 5), 0) # ノイズを均す
rgb = cv2.cvtColor(roi, cv2.COLOR_BGR2RGB) # モデルが RGB を期待するなら変換
色だけ・明るさだけを触れるよう、色空間を変えてから処理するのが定石
Wang et al., YOLOv10: Real-Time End-to-End Object Detection, NeurIPS 2024 / Ultralytics YOLO26
# pip install ultralytics
from ultralytics import YOLO
model = YOLO("yolo26n.pt") # n=最小。s/m/l/x と大きくなるほど高精度・低速
results = model("table.jpg") # 画像・動画・カメラ番号を渡せる
for box in results[0].boxes:
name = model.names[int(box.cls)] # クラス名(COCO の 80 クラス)
print(name, float(box.conf), box.xyxy.tolist())
# 自分の物体で追加学習(ファインチューニング)
model.train(data="my_objects.yaml", epochs=100, imgsz=640)
決まった物は追加学習した YOLO、初めて見る物はオープンボキャブラリ、と使い分け
ros2 launch yolo_bringup yolo.launch.py
短時間で「自分の物」を検出できるようにするデータづくりが勝負
九州工業大学などの合同チーム
Hibikino-Musashi@Home 2025 Team Description Paper, arXiv:2511.20180
次は、検出した物体に合わせに行くビジョンフィードバック制御へ