RoboflowとYOLO11nの関係 — 「教材」と「生徒」で考えるとスッと入る
ミドリ: タツヤさん、最近うちの社内研究で「カメラ映像から38種類の小さくて見た目がよく似た物体を見分ける」っていう物体検出のプロジェクトをやってましたよね。あれ、調べてると Roboflow と YOLO11n っていう名前が両方出てくるんですけど、これって競合するサービスなんですか?どっちかを選べばいい、みたいな。
タツヤ(首を振りながら): そこ、ものすごくよく誤解されるところなんだ。結論から言うと 競合じゃなくて分業。一直線につながる役割分担になってる。一言でまとめるなら——
Roboflow = 教材(写真と正解ラベル)、YOLO11n = それで学ぶ生徒(検出モデル)
ミドリ: 教材と生徒……。じゃあ、どっちか選ぶんじゃなくて、両方使うのが普通ってことですか?
タツヤ: そう。今日はうちで実際にやった「38クラスの小物体検出モデルを、Claude Codeで自動化して家庭用GPUで深層学習させる」っていうプロジェクトを題材に、この2つの関係を分解していこうか。脱エンジニアの視点でも、ここの構造さえつかめば「AIで画像認識をやりたい」って時に何を準備すればいいかが見えるようになるよ。
ミドリ: お願いします。ちなみに今回は具体的に何を検出させたんですか?
タツヤ: 中身は伏せておくけど、38種類の、サイズが小さくて互いにそっくりな物体だと思ってくれればいい。色違い・微妙な模様違いを大量に並べて、カメラ映像からリアルタイムで全部見分ける、っていうわりとシビアなお題だよ。
そもそも物体検出パイプラインは「3層」に分かれている
ミドリ: いきなり2つの名前が出てくると混乱するんですけど、全体像ってどうなってるんですか?
タツヤ: 物体検出のプロジェクトは、ざっくり3つの層に分かれてるんだ。ここを頭に入れると、各ツールがどこを担当してるか一発でわかる。
| 層 | 役割 | 今回の担当 |
|---|---|---|
| データ層 | 写真を集める・正解ラベルを付ける・水増しする・配る | Roboflow(+自前の合成データ) |
| 学習層 | データを食べてモデルの重みを育てる | YOLO11n(Ultralytics)+ GPU |
| 推論層 | 育ったモデルを本番で動かす | ONNX + ブラウザ実行 |
ミドリ: あ、Roboflowは一番上の「データ層」なんですね。学習させるYOLOとは、そもそも担当する場所が違う。
タツヤ: そういうこと。Roboflowは「学習させる前」の準備工程を全部引き受けてくれる。YOLO11nは「準備が終わったデータ」を受け取って、ひたすら学ぶ役。バトンを渡す関係であって、どっちが優れてるとかじゃないんだ。
Roboflowの役割:質のいい「教材」を作って配る
ミドリ: じゃあデータ層、Roboflowが具体的に何をやってくれるのか教えてください。
タツヤ: Roboflowがカバーするのは大きく4つ。
- アノテーション:写真の中の物体を四角(バウンディングボックス)で囲んで「これは○番のクラス」とラベルを付ける作業。ブラウザ上でポチポチできる
- データセットのバージョン管理:「v1は500枚」「v2は augment 追加で2,000枚」みたいに、教材のバージョンを記録して再現できる
- データ拡張(augmentation):1枚の写真から、明るさ違い・回転・ノイズ入りを自動で増やす。少ない写真でも水増しできる
- エクスポート:学習で使える形式に変換して書き出す。YOLO形式なら「画像 +
.txt(正規化された座標) +data.yaml(クラス定義)」の3点セット
ミドリ: .txt に座標が入ってるんですか?
タツヤ: うん。YOLO形式のラベルは、1行が1個の物体で、こういう形になってる。
<class_id> <cx> <cy> <w> <h>
たとえば 3 0.300 0.500 0.05 0.10 なら「クラス3番の物体が、画像の横30%・縦50%の位置に、幅5%・高さ10%のサイズで写ってる」って意味。座標は全部0〜1に正規化されてるのがポイントで、画像サイズが変わっても破綻しない。
ミドリ: なるほど。で、data.yaml がクラスの一覧表なんですね。
タツヤ: そう。「nc: 38(クラス数)」と「names: 0番は○○、1番は△△……」っていう対応表が書いてある。YOLO11nはこの data.yaml を見て「全部で何種類を覚えればいいか」を知るわけ。
ミドリ: 今回、教材の写真ってゼロから自分で撮ったんですか?
タツヤ: いや、ここがRoboflowの賢いところで、Roboflow Universe っていう公開データセットの倉庫があるんだ。今回はそこにあった CC BY 4.0 ライセンスの実写データセット(38クラス) をベースに使わせてもらった。YOLO形式でエクスポートすれば、さっきの3点セットがそのまま手に入る。
ミドリ: 既製の教材を借りてきた、と。じゃあそれだけで足りたんですか?
タツヤ: それが足りなかった。ここから先がちょっと面白い話になる。
弱点を「合成データ」で補強する — 教材の自作
ミドリ: 公開データセットだけじゃ何がダメだったんですか?
タツヤ: 特定のクラスだけ極端に検出精度が低かったんだ。具体的には、ある一群の物体が「暗いところ」「手ブレ」「映像圧縮でボヤけた」みたいな低画質シーンでまったく当たらない。実写データにそういうコマが少なかったのが原因。
ミドリ: 教材に「苦手分野の問題」が載ってなかったから、生徒もそこが解けない、と。
タツヤ: まさにその比喩がドンピシャ。だから 苦手なクラスだけを狙って合成データ(synthetic data)を自前生成した。プログラムで物体を背景に貼り付けて、わざと「スマホ暗所」「遠距離で小さい」「配信圧縮でガビガビ」みたいな低画質シーンを作り込む。苦手クラスは2.5倍〜4倍に水増しした。
ミドリ: 合成データとRoboflowの実データって、どうやって1つにするんですか?
タツヤ: クラス名を揃えてからマージする。これが地味だけど超重要。Roboflow側の「0番=○○」と合成側の「0番=○○」がズレてると、生徒が間違った正解を覚えちゃう。だから merge-synth-into-yolo.py みたいなスクリプトで、両者の data.yaml のクラス対応を突き合わせてから結合する。ここのズレチェックは、後から Claude Code に何度も検算させたよ。
ミドリ: 教材作りって、思ったより神経使うんですね。
タツヤ: モデルの精度の8割は教材で決まる、って言われるくらいだからね。「Roboflowで土台を借りて、足りない部分を合成データで足す」——これがデータ層の現実的なやり方。
YOLO11nの役割:教材を食べてひたすら学ぶ「生徒」
ミドリ: やっと学習層ですね。YOLO11nって、その「11n」って何の意味ですか?
タツヤ: YOLOは "You Only Look Once" の略で、画像を一回見るだけで「何が・どこに」を同時に当てる物体検出モデルの系譜。Ultralyticsっていうチームが開発を続けてて、11がバージョン世代、nが "nano"(一番小さいサイズ) を表してる。
ミドリ: サイズって選べるんですか?
タツヤ: うん。n(nano) < s(small) < m(medium) < l(large) < x(xlarge) の順で大きくなる。大きいほど賢いけど重い。今回はブラウザでサクサク動かしたかったから、一番軽い n(nano) を選んだ。
ミドリ: なんで一番小さいのを?精度落ちません?
タツヤ: トレードオフだね。今回のゴールは「家庭用GPUで学習できて、最終的にブラウザでリアルタイム推論できる」こと。重いモデルだと家庭用GPUの4GBメモリに乗らないし、ブラウザでもカクつく。だから「nanoで、合成データの補強で精度を稼ぐ」っていう戦略を取った。
ミドリ: ゼロから学習させたんですか?それとも……。
タツヤ: 転移学習(transfer learning)だよ。yolo11n.pt っていう COCO(一般物体80種)で事前学習済みの重みからスタートする。「すでに『物の見方』の基礎を知ってる生徒」に、うちの38クラスだけを追加で教え込むイメージ。ゼロから教えるより圧倒的に速いし精度も出る。
ミドリ: 学習を回すコードって複雑なんですか?
タツヤ: それが、Ultralyticsのおかげで驚くほどシンプルなんだ。Python APIだと本質はこれだけ。
from ultralytics import YOLO
model = YOLO("yolo11n.pt") # COCO事前学習済みの nano から開始
model.train(
data="data_local.yaml", # Roboflow+合成のマージ済み教材
epochs=100, # 教材を100周
imgsz=512, # 入力解像度
batch=4, # 一度に見る枚数(GPUメモリで決まる)
device="cuda:0", # GPUを使う
)
model.export(format="onnx") # 本番用に ONNX へ書き出し
ミドリ: え、これだけ?
タツヤ: 本質はこれだけ。data= にさっきのマージ済み data.yaml を渡すと、YOLO11nが勝手に「あ、38クラスね」って読み取って学習を始める。Roboflowが用意したバトンを、YOLOがそのまま受け取る——この継ぎ目がキレイなのが、2つを組み合わせる最大の利点なんだ。
GPUの現実:RTX4090じゃなくて「家庭用GTX1050」で回す
ミドリ: 深層学習って、すごく高いGPUが要るイメージなんですけど。
タツヤ: 理想はね。でもうちが今回学習に使ったのは、自宅PCに載ってた GeForce GTX 1050(VRAM 4GB)。何世代も前の、今や入門機ですらない型落ちGPUだよ。
ミドリ: そんなので深層学習できるんですか?!
タツヤ: できる。ただし「縮小設定」が必須になる。ネットに転がってるチュートリアルは大体RTX4090(VRAM 24GB)みたいな高級GPU前提だから、そのままの設定だと一瞬で OOM(メモリ不足) で落ちる。だからGTX1050向けにこう削った。
- 入力解像度を 640 → 512 に下げる(処理する画素を減らす)
- バッチサイズを 4 まで絞る(一度にGPUに乗せる枚数を最小に)
- AMP / FP16(半精度)を有効化(数値の精度を半分にしてメモリ節約)
- CUDA 11.8 のPyTorchホイールを使う(GTX1050世代で安定する組み合わせ)
ミドリ: それでもメモリ足りなかったら?
タツヤ: その時の手順も決めてあった。batch=4 でもOOMが出たら FP16 を外す、それでもダメなら解像度をさらに下げる。こういう「落ちた時の逃げ道」を最初に用意しておくのが、非力なGPUで戦うコツだね。学習自体は GTX1050で数時間かかったけど、ちゃんと完走した。
ミドリ: GPUが効いてるかって、どうやって確認するんですか?
タツヤ: 学習を始める前に必ずこれを叩く。
import torch
print(torch.cuda.is_available(), torch.cuda.get_device_name(0))
# → True GeForce GTX 1050 が出ればOK
ここが False だったら CPUで学習が走って数十時間コースになる。落とし穴その1だね。「動いてるけど実はCPU」が一番こわい。
Claude Codeの役割:パイプライン全体の「オーケストレーター」
ミドリ: ここまでRoboflowとYOLOの話でしたけど、Claude Codeはどこで効いたんですか?
タツヤ: Claude Codeは 「データ層〜学習層〜推論層をつなぐ配管工事」を全部やってくれた。具体的にはこんな役割。
- スクリプト生成:Roboflowからのダウンロード、合成データ生成、クラス名を揃えたマージ、学習、ONNXエクスポート——この一連のPythonスクリプトをほぼ全部Claude Codeに書かせた
- クラス対応の検算:「Roboflow側と合成側で38クラスの番号がズレてないか」を何度もチェックさせた。人間が目視でやると必ずミスする部分
- 環境のフォールバック設計:
yolo11n.ptが古いUltralyticsで読めない時はyolov8n.ptに自動で切り替わるようにした。「最新を使いたいけど、動かない環境でも止まらない」を両立 - 手動学習ランブックの整備:これが地味に効いた
ミドリ: ランブックって、手順書ですよね。なんでそれが必要だったんですか?
タツヤ: うちの自動実行の仕組みには 「1タスク30分まで」っていう制限があったんだ。でも学習は数時間かかる。だから単発の自動実行じゃ完走できない。そこでClaude Codeに 「自宅PCに直接ログインして手で流すための、チェックボックス付き手順書」を作らせた。各ステップに「ここまで出来てたらスキップ」っていう存在チェックを入れて、途中で落ちても続きから再開できるようにしてある。
ミドリ: AIに丸投げじゃなくて、「人間が手を動かす部分の段取りもAIに設計させた」んですね。
タツヤ: そこがポイント。Claude Codeは「実行者」であると同時に「段取り屋」でもある。30分制限みたいな現実の制約を踏まえて、人間とAIの役割分担まで設計してくれる。脱エンジニアの現場だと、ここがいちばん価値が出るところだと思う。
推論層:学習が終わったらRoboflowもYOLOの学習環境も要らない
ミドリ: 学習が終わった後って、本番ではどうやって動かすんですか?
タツヤ: ここも誤解されやすいんだけど、本番(推論)では Roboflow にも、学習用のGPU環境にも、一切アクセスしない。
ミドリ: え、せっかく作ったのに使わないんですか?
タツヤ: 教材(Roboflow)と学習環境(GPU+Ultralytics)は 「学習のときだけ」必要なものだから。学習が終わると、その成果は best.onnx(約3〜5MBの小さなファイル)1個に凝縮される。本番はこのONNXファイルだけあればいい。
- ONNX形式にエクスポート:フレームワークに依存しない汎用フォーマット
onnxruntime-webでブラウザ実行:サーバーすら不要で、ユーザーのブラウザ内で直接推論- Roboflowへのアクセスはゼロ:教材は使い終わったら手放す
ミドリ: 整理すると……Roboflowは「学習前」、GPUは「学習中」、ONNXは「学習後の本番」。役割がきれいに時間で分かれてるんですね。
タツヤ: その通り! 「RoboflowとYOLOどっちを使う?」っていう問いがそもそも筋違いだってわかるよね。順番に全部使って、最後はどっちも手放す。これが物体検出パイプラインの実像なんだ。
全体の流れをもう一度
ミドリ: 最初から最後まで、もう一回順番に並べてもらえますか?
タツヤ: いいよ。今回うちでやったことを時系列で並べるとこう。
- Roboflow Universe からCC BY 4.0の実写データセット(38クラス)をYOLO形式でダウンロード
- 精度が出ない苦手クラスを 合成データで水増し(低画質シーンを作り込み、2.5〜4倍)
- 実データと合成データを クラス名を揃えてマージ(Claude Codeで検算)
yolo11n.pt(COCO事前学習済み)から 転移学習を開始- GTX1050(4GB)向けの縮小設定(imgsz512 / batch4 / FP16)で数時間学習
best.onnxを書き出して ブラウザ(onnxruntime-web)で推論- 一連のスクリプトとランブックは Claude Codeが生成・オーケストレーション
ミドリ: Roboflowが①〜③、YOLO11nが④〜⑤、推論が⑥、そしてClaude Codeが全部の接着剤、と。
タツヤ: 完璧な要約。「教材を整える人(Roboflow)」「学ぶ生徒(YOLO11n)」「先生役の段取り屋(Claude Code)」——この3者の協業だと思えば、もう混乱しないはずだよ。
注意点・よくある失敗
ミドリ: 逆に「これやっちゃダメ」っていうハマりどころは?
タツヤ: 4つ警告しておくね。
- クラス番号のズレを放置しない — 複数のデータソースをマージする時、
data.yamlのクラス対応が1つでもズレると、モデルは静かに間違った正解を学習する。一番デバッグしづらいバグ - 「GPUで動いてるつもりでCPU」に気づかない —
torch.cuda.is_available()がFalseのまま学習が走ると、数時間が数十時間になる。最初に必ず確認 - 高級GPU前提の設定をコピペしない — チュートリアルの
batch=16, imgsz=640をGTX1050で打つと即OOM。自分のVRAMに合わせて削るのが大前提 - 本番にRoboflowや学習環境を持ち込まない — 推論に必要なのはONNX1個だけ。「Roboflowのキーを本番に置く」みたいな設計にすると、不要な依存とコスト、漏洩リスクを抱える
ミドリ: 特に最後のやつ、やりがちですね。「使ったツールは全部本番でも要る」って思い込みがち。
タツヤ: そう。学習と推論で必要なものは違う——これを意識できると設計が一段クリーンになるよ。
まとめ
タツヤ: 今日のポイントを整理しよう。
- RoboflowとYOLO11nは競合じゃなく分業。Roboflow=教材(データ層)、YOLO11n=生徒(学習層)、ONNX=本番(推論層)で、時間軸できれいに役割が分かれる
- Roboflowはアノテ・バージョン管理・augment・YOLO形式エクスポート(画像+
.txt+data.yaml)を担当。公開データセット(Roboflow Universe)を土台にできる - 足りない教材は合成データで補強し、クラス名を揃えてマージするのが現実解
- YOLO11nはCOCO事前学習済みの
yolo11n.ptから転移学習。data.yamlを渡すだけでクラス数を自動認識 - 家庭用GTX1050(4GB)でも、imgsz512 / batch4 / FP16 の縮小設定で深層学習は回せる
- Claude Codeがスクリプト生成・クラス検算・フォールバック設計・手動学習ランブック整備まで、パイプライン全体をオーケストレーション
- 本番(推論)はONNX1個で完結し、Roboflowにも学習GPUにもアクセスしない
ミドリ: 「画像認識AIを作る」って聞くと身構えてましたけど、教材→生徒→本番の3ステップだと思えば、すごく見通しが良くなりました。
タツヤ: そうそう。しかも今回みたいに 型落ちの家庭用GPU1枚 + 公開データセット + Claude Code で、ちゃんと動く検出モデルが作れる。「深層学習は大企業のもの」っていう時代は終わりつつあるんだ。
次のステップ
ミドリ: 自分でも試すなら、何から手をつければいいですか?
タツヤ: 3つだけ手を動かしてみてほしい。
- Roboflow Universe を眺める — 自分のやりたいタスクに近い公開データセットがないか探す。あれば学習データ集めの9割が終わる
pip install ultralyticsしてyolo11n.ptで1回学習を回す — まずは少量データで「最後まで通す」体験をする。精度は後で上げればいいtorch.cuda.is_available()で自分のGPUを確認 — 使えるなら縮小設定で、無理ならクラウドGPUを時間borrowする判断ができる
ミドリ: どれも今日中に着手できそうですね。
タツヤ: そう。Shimanto AI Solutionsでは、こうした物体検出・画像認識モデルの「データ設計(Roboflow活用・合成データ生成)」から「学習パイプラインの自動化(Claude Code連携)」「家庭用GPUやエッジ環境での軽量推論(ONNX化)」まで、現場目線で一緒に組み立てる支援をしているよ。「公開データセットだけで足りるか」「自前GPUで回せるか、クラウドが要るか」みたいな最初の見極めから、気軽に相談してほしい。