RoboflowとYOLO11nの関係 — 「教材」と「生徒」で考えるとスッと入る

ミドリ: タツヤさん、最近うちの社内研究で「カメラ映像から38種類の小さくて見た目がよく似た物体を見分ける」っていう物体検出のプロジェクトをやってましたよね。あれ、調べてると RoboflowYOLO11n っていう名前が両方出てくるんですけど、これって競合するサービスなんですか?どっちかを選べばいい、みたいな。

タツヤ(首を振りながら): そこ、ものすごくよく誤解されるところなんだ。結論から言うと 競合じゃなくて分業。一直線につながる役割分担になってる。一言でまとめるなら——

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つ。

ミドリ: .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向けにこう削った。

ミドリ: それでもメモリ足りなかったら?

タツヤ: その時の手順も決めてあった。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は 「データ層〜学習層〜推論層をつなぐ配管工事」を全部やってくれた。具体的にはこんな役割。

ミドリ: ランブックって、手順書ですよね。なんでそれが必要だったんですか?

タツヤ: うちの自動実行の仕組みには 「1タスク30分まで」っていう制限があったんだ。でも学習は数時間かかる。だから単発の自動実行じゃ完走できない。そこでClaude Codeに 「自宅PCに直接ログインして手で流すための、チェックボックス付き手順書」を作らせた。各ステップに「ここまで出来てたらスキップ」っていう存在チェックを入れて、途中で落ちても続きから再開できるようにしてある。

ミドリ: AIに丸投げじゃなくて、「人間が手を動かす部分の段取りもAIに設計させた」んですね。

タツヤ: そこがポイント。Claude Codeは「実行者」であると同時に「段取り屋」でもある。30分制限みたいな現実の制約を踏まえて、人間とAIの役割分担まで設計してくれる。脱エンジニアの現場だと、ここがいちばん価値が出るところだと思う。

推論層:学習が終わったらRoboflowもYOLOの学習環境も要らない

ミドリ: 学習が終わった後って、本番ではどうやって動かすんですか?

タツヤ: ここも誤解されやすいんだけど、本番(推論)では Roboflow にも、学習用のGPU環境にも、一切アクセスしない

ミドリ: え、せっかく作ったのに使わないんですか?

タツヤ: 教材(Roboflow)と学習環境(GPU+Ultralytics)は 「学習のときだけ」必要なものだから。学習が終わると、その成果は best.onnx(約3〜5MBの小さなファイル)1個に凝縮される。本番はこのONNXファイルだけあればいい。

ミドリ: 整理すると……Roboflowは「学習前」、GPUは「学習中」、ONNXは「学習後の本番」。役割がきれいに時間で分かれてるんですね。

タツヤ: その通り! 「RoboflowとYOLOどっちを使う?」っていう問いがそもそも筋違いだってわかるよね。順番に全部使って、最後はどっちも手放す。これが物体検出パイプラインの実像なんだ。

全体の流れをもう一度

ミドリ: 最初から最後まで、もう一回順番に並べてもらえますか?

タツヤ: いいよ。今回うちでやったことを時系列で並べるとこう。

  1. Roboflow Universe からCC BY 4.0の実写データセット(38クラス)をYOLO形式でダウンロード
  2. 精度が出ない苦手クラスを 合成データで水増し(低画質シーンを作り込み、2.5〜4倍)
  3. 実データと合成データを クラス名を揃えてマージ(Claude Codeで検算)
  4. yolo11n.pt(COCO事前学習済み)から 転移学習を開始
  5. GTX1050(4GB)向けの縮小設定(imgsz512 / batch4 / FP16)で数時間学習
  6. best.onnx を書き出して ブラウザ(onnxruntime-web)で推論
  7. 一連のスクリプトとランブックは Claude Codeが生成・オーケストレーション

ミドリ: Roboflowが①〜③、YOLO11nが④〜⑤、推論が⑥、そしてClaude Codeが全部の接着剤、と。

タツヤ: 完璧な要約。「教材を整える人(Roboflow)」「学ぶ生徒(YOLO11n)」「先生役の段取り屋(Claude Code)」——この3者の協業だと思えば、もう混乱しないはずだよ。

注意点・よくある失敗

ミドリ: 逆に「これやっちゃダメ」っていうハマりどころは?

タツヤ: 4つ警告しておくね。

ミドリ: 特に最後のやつ、やりがちですね。「使ったツールは全部本番でも要る」って思い込みがち。

タツヤ: そう。学習と推論で必要なものは違う——これを意識できると設計が一段クリーンになるよ。

まとめ

タツヤ: 今日のポイントを整理しよう。

ミドリ: 「画像認識AIを作る」って聞くと身構えてましたけど、教材→生徒→本番の3ステップだと思えば、すごく見通しが良くなりました。

タツヤ: そうそう。しかも今回みたいに 型落ちの家庭用GPU1枚 + 公開データセット + Claude Code で、ちゃんと動く検出モデルが作れる。「深層学習は大企業のもの」っていう時代は終わりつつあるんだ。

次のステップ

ミドリ: 自分でも試すなら、何から手をつければいいですか?

タツヤ: 3つだけ手を動かしてみてほしい。

  1. Roboflow Universe を眺める — 自分のやりたいタスクに近い公開データセットがないか探す。あれば学習データ集めの9割が終わる
  2. pip install ultralytics して yolo11n.pt で1回学習を回す — まずは少量データで「最後まで通す」体験をする。精度は後で上げればいい
  3. torch.cuda.is_available() で自分のGPUを確認 — 使えるなら縮小設定で、無理ならクラウドGPUを時間borrowする判断ができる

ミドリ: どれも今日中に着手できそうですね。

タツヤ: そう。Shimanto AI Solutionsでは、こうした物体検出・画像認識モデルの「データ設計(Roboflow活用・合成データ生成)」から「学習パイプラインの自動化(Claude Code連携)」「家庭用GPUやエッジ環境での軽量推論(ONNX化)」まで、現場目線で一緒に組み立てる支援をしているよ。「公開データセットだけで足りるか」「自前GPUで回せるか、クラウドが要るか」みたいな最初の見極めから、気軽に相談してほしい。


関連記事

シマント AI のサービス | 脱エンジニアの部屋 | AI戦略マップ 2025–2045