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 の VideoWriter で avc1 を指定しても、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分オンライン診断 / 料金一覧






LEAVE A REPLY