ClaudeにYOLO26環境を作らせたら、GPUを無視してCPUで進めようとした|最適な作り方に直した2つのポイント

ClaudeにYOLO26環境を作らせたら、GPUを無視してCPUで進めようとした|最適な作り方に直した2つのポイント

Ultralytics の最新世代モデル YOLO26 が出たので、自分の環境で動かして確かめてみました。

今回の環境構築は、AIコーディングエージェント(私は Claude を使っています)に手を動かしてもらいながら進めました。ただし丸投げにはしていません。エージェントが進めようとした作り方が、間違いではないものの最適ではなかったので、要所で2回、私の方から作り方を指示し直しています。

1回目。エージェントは、必要なライブラリをグローバル環境にそのまま入れようとしました。入れれば動きはします。ですが既存の環境を巻き込むやり方です。私は「それは止めて、venv で隔離してくれ」と指示しました。

2回目。エージェントは、入っている torch が CPU 版だったのを見て「このマシンは CPU 環境だ」と判断し、そのまま CPU で進めようとしました。CPU でも推論はできます。ですがこのマシンには RTX 3090 が載っています。性能を捨てる作り方です。私は「GPU があるんだから CUDA 版に入れ替えて」と指示しました。

どちらも、エージェントの選択は誤りではありません。動くものは作れます。ただ、最適ではない。最適な作り方を知っている人間が、どこで作り方そのものを指示し直すか。今回はそこがいちばんの肝でした。

この記事では、Windows + RTX 3090 で YOLO26 のセマンティックセグメンテーション(画像の全ピクセルにクラスを割り当てる処理)を動かし、X にそのまま投稿できる動画を書き出すところまでを、私が実際にやった手順そのままで再現できる形にまとめます。AI エージェントとどう分担したかも、要所で書き添えます。

検証環境は次の通りです。記事の賞味期限の目安にしてください。

  • OS:Windows 11 Pro
  • GPU:NVIDIA GeForce RTX 3090(VRAM 24GB)
  • Python:3.10.6
  • 最終的に入れたもの:torch 2.12.0+cu126 / ultralytics 8.4.60 / numpy 2.2.6

この記事でできるようになること

  • YOLO26 のセマンティックセグメンテーションを、グローバル環境を壊さず venv の中だけで動かせるようになる
  • CPU 版 torch に惑わされず、GPU 推論へ正しく切り替えられるようになる
  • OpenCV で書き出した mp4 が SNS で弾かれる原因と、その回避方法が分かる
  • AI エージェントに任せる作業で、人間がどこに判断を入れるべきかの感覚がつかめる

YOLO26 のセマンティックセグメンテーションとは

YOLO26 のセグメンテーション用モデルは、モデル名に -sem のサフィックスが付きます。n/s/m/l/x の5サイズがあり、自動運転向けの Cityscapes(19クラス)で事前学習済みです。

一番軽い yolo26n-sem で 78.3 mIoU、一番重い yolo26x-sem で 83.6 mIoU。mIoU は塗り分けの正確さを表す指標で、数字が大きいほど正確です。

物体ごとに枠で囲うインスタンスセグメンテーションと違い、セマンティックセグメンテーションは同じクラスの個体を区別しません。画面全体について「このピクセルは道路」「ここは人」というクラスマップを (H, W) の形で返します。

推論コード自体は数行で済みます。

from ultralytics import YOLO
model = YOLO("yolo26n-sem.pt")
results = model("https://ultralytics.com/images/bus.jpg")
for result in results:
    semantic_mask = result.semantic_mask.data

semantic_mask.data(H, W) のクラスID マップです。これを色に変換して元画像に重ねれば、冒頭のような塗り分け画像になります。

公式ドキュメントはこちらです:YOLO26 セマンティックセグメンテーション(Ultralytics 公式)

前提条件・環境の事前確認

まずグローバル環境の状態を確認しました。私の場合はこうなっていました。

Python 3.10.6
torch 2.2.2+cpu
ultralytics 8.3.146

ここで確認しておきたいポイントが3つあります。

ひとつ目。ultralytics 8.3.146 は同梱されているモデル設定が yolo12 までで、YOLO26 はまだ含まれていません。YOLO26 を動かすには ultralytics 8.4 以降が必要です。PyPI 上の最新は 8.4.60 でした。

ふたつ目。最新の ultralytics をそのまま入れると numpy が 2.x に上がります。numpy 1.x 向けにビルドされた torch 2.2.2 とは衝突する恐れがあります。

みっつ目。torch 2.2.2+cpu という表示。ここでエージェントは「CPU 環境だ」と早合点しました。後で書きますが、これは間違いです。CPU 版の torch が入っているだけで、GPU はちゃんと載っていました。

手順1:グローバルに入れず、venv で隔離する(人間の判断その1)

エージェントは、ライブラリをグローバル環境にそのまま入れようとしました。ここで私が止めました。

最新の ultralytics を入れれば numpy が上がり、既存の torch と衝突しうる。グローバルでそれをやると、今動いている他の環境まで巻き添えにします。だから「プロジェクト直下に venv を切って、その中だけで構築してくれ」と指示しました。

python -m venv .venv
.\.venv\Scripts\python.exe -m pip install --upgrade pip

以降のコマンドはすべて .\.venv\Scripts\python.exe を直接指定して実行します。activate してもよいのですが、フルパスで叩いた方が「どの Python に入れているか」を取り違えません。再現性を重視するなら、私はこの書き方をおすすめします。

この判断は地味ですが、AI に環境構築を任せるときにいちばん効くガードレールです。

手順2:CPU版torchに惑わされない。GPUを確認する(人間の判断その2)

ここが今回いちばん面白かったところです。

エージェントは、グローバルの torch が 2.2.2+cpu(CUDA: False)なのを見て「このマシンは CPU 環境だ」と判断し、CPU で進めようとしました。でも私は、このマシンに RTX 3090 が載っているのを知っています。「GPU があるんだから、CPU で進めないで」と止めて、確認させました。

nvidia-smi
NVIDIA GeForce RTX 3090   VRAM 24GB
Driver 595.97 / CUDA 13.2 対応

やはり載っていました。

ここが落とし穴です。「torch が CPU 版」イコール「GPU が無い」ではありません。torch は CPU 用と GPU 用でビルドが分かれていて、たまたま CPU 版が入っていただけです。GPU を使いたいなら、CUDA 版の torch を入れ直すだけで済みます。

AI エージェントは目の前のバージョン文字列からは正しく推論します。ですが「このマシンに何が物理的に載っているか」は、見えていないことがあります。実機を知っている人間が一言入れれば、GPU を遊ばせずに済みます。

なお nvcc(CUDA Toolkit のコンパイラ)は見つかりませんでした。ですが問題ありません。PyTorch の CUDA ホイールは自前の CUDA ランタイムを同梱しているので、CUDA Toolkit を別途入れなくても GPU 推論できます。ドライバが CUDA 13.2 と新しいので、PyTorch 側の CUDA ホイールは後方互換でどれでも動きます。

手順3:CUDA 版 PyTorch を venv に入れる

PyTorch 公式の CUDA 12.6 ホイールを venv に入れます。

.\.venv\Scripts\python.exe -m pip install torch torchvision --index-url https://download.pytorch.org/whl/cu126

--index-url で PyTorch 公式の配布先を指定するのが要点です。これを付けないと PyPI の CPU 版が入ってしまい、また振り出しに戻ります。

CUDA ホイールは約2.5GBあり、ダウンロードに数分かかります。入ったら確認します。

.\.venv\Scripts\python.exe -c "import torch; print(torch.__version__, torch.cuda.is_available(), torch.cuda.get_device_name(0))"
2.12.0+cu126 True NVIDIA GeForce RTX 3090

True が出れば GPU 推論の準備は完了です。compute capability は (8, 6)、Ampere 世代の sm_86 でした。

手順4:YOLO26 対応版の ultralytics を入れる

YOLO26 に対応した ultralytics 8.4.60 を入れます。

.\.venv\Scripts\python.exe -m pip install "ultralytics==8.4.60"

確認します。

ultralytics 8.4.60 | numpy 2.2.6 | cv2 4.13.0
同梱モデル設定に yolo26-sem.yaml が存在

yolo26-sem.yaml が含まれていれば、YOLO26 のセマンティックセグメンテーションに対応したバージョンです。

ここで、最初に心配していた numpy の衝突が自然に解消しています。torch 2.12 は numpy 2.x に対応しているので、numpy 2.2.6 でも問題ありません。CPU 版 torch 2.2.2 を使い続けるなら numpy を 1.x に据え置く必要がありましたが、GPU を使うために torch ごと新しくしたことで、この制約は気にしなくてよくなりました。GPU への切り替えが、結果的に numpy 問題まで片付けたわけです。

手順5:推論して塗り分け画像を保存する

公式のサンプルに、Cityscapes 19クラスのカラーパレットによる色付けと、元画像へのオーバーレイ保存を足したスクリプトを書きます。要点は次の部分です。

from ultralytics import YOLO
import numpy as np, torch, cv2

device = "cuda" if torch.cuda.is_available() else "cpu"
model = YOLO("yolo26n-sem.pt")
results = model("https://ultralytics.com/images/bus.jpg", device=device)

for result in results:
    mask = result.semantic_mask.data
    mask = mask.cpu().numpy().squeeze().astype("int64")
    color = CITYSCAPES_PALETTE[mask]

yolo26n-sem.pt は初回実行時に重み(約3.3MB)が自動でダウンロードされます。クラスIDマップを Cityscapes のパレットで色に変換し、元画像と 0.5 ずつのアルファ合成で重ねると、塗り分けのオーバーレイ画像になります。

実行するとこうなりました。

.\.venv\Scripts\python.exe semantic_seg.py
[info] device = cuda
[info] GPU    = NVIDIA GeForce RTX 3090
image 1/1 bus.jpg: 1024x768  70.8ms
Speed: 6.4ms preprocess, 70.8ms inference, 9.5ms postprocess
[result 0] mask shape = (1080, 810)
[result 0] saved: outputs\semantic_mask_0.png / outputs\semantic_overlay_0.png

device = cuda と出ています。手順2で GPU に切り替えた成果がここに出ています。RTX 3090 で1枚あたり推論 70.8ms、おおよそ14fps相当でした。nano モデルかつ 1024×768 入力にしては妥当な速度です。

(ここに塗り分けオーバーレイ画像 semantic_overlay_0.png を挿入。画像はご自身で差し替えてください)

bus.jpg からは、道路・歩道・建物・フェンス・ポール・標識・植生・人・車・トラック・電車系の11クラスが検出されました。バスの車体、奥の建物、足元の道路まで、きれいにピクセル単位で塗り分けられます。

手順6:動画にかけてプレビューしながら保存する

静止画が動いたら、次は動画です。cv2.VideoCapture でフレームを読み、各フレームに YOLO26-sem をかけて cv2.imshow でライブ表示しつつ、結果を mp4 に書き出します。ここで2つ詰まりました。

(ここに動画の塗り分け結果を挿入。画像・動画はご自身で差し替えてください)

つまずきやすいトラブルと対策

プレビューウィンドウが画面に出ない

cv2.imshow のウィンドウが画面に出ないことがありました。原因は、AI エージェント経由で起動したプロセスが、Windows の対話デスクトップに繋がらないためです。バックグラウンドのサービスから起動したプロセスでも同じことが起きます。

対策はシンプルで、自分の PowerShell ウィンドウから直接スクリプトを実行することです。対話セッションから起動すれば、ウィンドウはちゃんと表示されます。GUIプレビューを使うときは、エージェント任せにせず手元の端末で動かす、と覚えておくと迷いません。これも「AI に任せる範囲と、自分でやる範囲」の線引きの一例です。

保存した mp4 が X に投稿できない

これが今回いちばん厄介でした。

最初は cv2.VideoWriter_fourcc(*"mp4v") で保存していました。これは MPEG-4 Part 2 という古いコーデックです。拡張子が .mp4 でも、中身が X やブラウザ、多くのSNSが要求する H.264(AVC)ではないため、「mp4なのに投稿で弾かれる」状態になります。

X が受け付ける条件は、H.264 映像 + yuv420p + faststart(音声があれば AAC)です。

OpenCV の VideoWriteravc1 を指定しても、Windows では H.264 エンコーダが同梱されておらず失敗しがちです。そこで、ffmpeg(libx264)に生フレームをパイプして H.264 で書き出す処理に切り替えて解決しました。

cmd = ["ffmpeg", "-y",
       "-f", "rawvideo", "-pix_fmt", "bgr24", "-s", "1920x1080", "-r", "30",
       "-i", "-", "-an",
       "-c:v", "libx264", "-preset", "medium", "-crf", "20",
       "-pix_fmt", "yuv420p",
       "-movflags", "+faststart",
       "outputs\\1_sem_x.mp4"]
proc = subprocess.Popen(cmd, stdin=subprocess.PIPE)

-pix_fmt yuv420p が互換性の要、-movflags +faststart がストリーミング再生用の指定です。各フレームを proc.stdin に書き込んでいきます。解像度とフレームレートは入力動画に合わせて書き換えてください。

書き出した mp4 を ffprobe で確認すると、ちゃんと H.264 になっています。

ffprobe outputs\1_sem_x.mp4
codec_name = h264
pix_fmt    = yuv420p
compatible_brands = isomiso2avc1mp41

avc1 が H.264 互換を示します。拡張子だけでなく中身のコーデックが H.264 / yuv420p になり、X にそのまま投稿できる動画になりました。

実行例です。入力 1.mp4 に最高精度の x モデルをかけ、2フレームに1回処理して書き出す場合はこうなります。

.\.venv\Scripts\python.exe video_seg.py 1.mp4 --model yolo26x-sem.pt --save outputs\1_sem_x.mp4 --stride 2

AIエージェントに任せる時代に、人間が入れるべき判断

今回、手を動かしたのは AI エージェントです。コマンドを書き、スクリプトを組み、エラーを潰す。その速さは確かに段違いです。

ですが、最適な作り方に寄せられたのは、要所で人間が作り方そのものを指示し直したからです。整理するとこうなります。

エージェントが得意なのは、目の前の情報から動くものを作ることです。torch 2.2.2+cpu という文字列を見れば「CPU 環境」と推論しますし、ライブラリを入れろと言われればそのまま入れます。それで動くものはできる。間違いではありません。

人間が入れたのは、その外側の判断でした。「このマシンには物理的に RTX 3090 が載っている」「グローバルに入れると他の環境に響く」。実機の事情と、その先の運用への影響。ここはエージェントには見えていない部分です。だから、動くだけの作り方ではなく、最適な作り方を指示できます。

そして、ここがいちばん伝えたい点です。人間が口を出すのは、AI のブレーキ役としてだけではありません。人間の知識を入れてあげるほど、AI が作るものの質そのものが上がります。 「このマシンには RTX 3090 が載っている」「グローバルは隔離した方がいい」という前提を渡した瞬間に、エージェントは GPU を使った、環境を壊さない作り方へと自分で組み替えていきました。知識を与えるほど、AI の出力の天井が上がるのです。

「とりあえず AI に任せれば速い」のは本当です。ですが、任せきると、動くけれど環境を壊しやすい作り方や、性能を引き出しきれない作り方のまま進みます。逆に、現場とドメインの知識を持った人間が要所で前提を渡せば、同じ AI から一段良いものが出てきます。どこを任せ、どこで知識を渡して作り方を指示し直すか。その設計こそが、AI を現場で使うときの肝になります。

まとめ

  • YOLO26 のセマンティックセグメンテーションは、ultralytics 8.4 以降 + CUDA 版 PyTorch を venv に入れれば、数行のコードで動きます。
  • AI エージェントに環境構築を任せるなら、まず venv で隔離させてください。グローバルを巻き添えにせず、失敗しても作り直せます。
  • 「torch が CPU 版」だからと GPU を諦めないでください。nvidia-smi で実機を確認し、CUDA 版 torch に入れ替えれば GPU 推論に切り替わります。実機を知っている人間の一言が効きます。
  • 動画を SNS に上げるなら、mp4v ではなく ffmpeg で H.264 + yuv420p + faststart に書き出してください。ここまでできれば、最新モデルの塗り分け結果をそのまま X に投稿できます。

「AI エージェントに任せてはいるが、どこで自分が判断すべきか分からない」「最新の YOLO を自社のデータや現場の映像で動かすところまで一緒に進めてほしい」という方は、無料の30分オンライン診断から状況をお伺いします。

この記事の技術を、現場で実装したい方へ

AI×IoTの技術顧問として、月額契約で継続伴走しています。PoC設計・技術判断・組織設計・ベンダー管理・実装支援まで、現場で動くまで一緒に進めます。受託開発(請負)ではありません。

AI技術顧問サービスの詳細無料30分オンライン診断料金一覧

About The Author

Hideki
東京大学発AIスタートアップでロボット開発室室長・画像解析室室長・動画解析室室長を務め、画像認識関連のAI特許を在籍中に3件取得。その後、KDDIグループでプロダクトリーダーとして自然言語処理パッケージの自社開発を経て、現在はAGRIST株式会社の執行役員CTO 兼 VPoEとして、農業の人手不足解決に向けた収穫ロボットの開発組織を統括しています。AI・ハード・エレキ・通信・クラウド・IoTまでを一気通貫で設計できる視点を強みに、性能だけでなく「感動やワクワク体験」までデザインできるロボットの研究を進めています。並行して、AI coordinatorとして企業のAI導入・教育機関のAI授業・地域の技術相談を月額契約で継続伴走しています。

LEAVE A REPLY

*
*
* (公開されません)