
Cosmos 3 Superで欠陥画像の合成をやってみた
はじめに
「製造業向けにVLMをドメイン特化で学習させたいけど、NGパターンの学習素材が集めにくい。だからNG素材の合成データ作成に興味がある」
こんな相談をもらったのをきっかけに、NVIDIAのCosmos 3 Superでリアルな欠陥画像の合成ができるのかを試してみました。
環境はAWSを使用しています。
先に結論だけ書いておきます。
- 今回の検証においては欠陥画像の生成はうまくいきませんでした。text2imageで欠陥付き部品の画像は出ますが、CG調で実写の検査画像には見えず、プロンプトやパラメータを工夫しても実写レベルには届きませんでした。これはsim2realでギャップが大きくなり、ネックになる可能性が高いです。ただこれは私の検証方法の問題の可能性もあるため、引き続き検証を続けていきます。
- image2videoから画像を切り出すアプローチも試しましたが、仕様上、入力画像を保持するだけのため、自然に傷を足すことはできませんでした。
- こういった用途にはやはりサンプル画像を複数用意してimage2imageのアプローチが良さそうです。
- また、
Cosmos-AnomalyGenを使うのが良さそうだという感触を得たので、次回以降で試してみます。
というわけで、ここからは試行錯誤の記録です。
環境
| 項目 | 内容 |
|---|---|
| インスタンス | p5.48xlarge(NVIDIA H100 80GB × 8) |
| 確保方法 | EC2 Capacity Block(東京・$755/24h) |
| モデル | nvidia/Cosmos3-Super(64B) |
| 実行 | 公式 cosmos-framework(torchrun --nproc-per-node=8, FSDPで8枚に分割) |
このあたりの、AWS上でのCosmos3 Superの環境構築の詳しいことについては前回の記事をご覧ください。
text2imageで欠陥画像生成
まずはテキストから欠陥画像を生成してみます。入力はJSONで、num_frames:1にすると画像、増やすと動画になります。
torchrun --nproc-per-node=8 -m cosmos_framework.scripts.inference \
--parallelism-preset=throughput --dp-shard-size=8 --dp-replicate-size=1 --cp-size=1 --cfgp-size=1 \
-i "inputs/defect/*.json" -o outputs/defect_super \
--checkpoint-path /mnt/weights/Cosmos3-Super --no-guardrails --seed=0
いくつかの素材で「傷・クラック・欠け・異物」あたりを生成してみた結果がこちら。





- 欠陥はそれっぽい形では出ます。ただし全体的にCG調で、実写の検査写真には見えません(sim2realのギャップが大きくなる可能性)。
- 素材の制御が地味に弱い。「black plastic part(黒い樹脂部品)」と指定したのに金属部品が出てくる、みたいな取り違えが起きました。
- ただこの時点では、単純にプロンプトがシンプルすぎる影響によるものだと思います。
プロンプトをもっといじってみた
「いや、プロンプトが甘いだけでは?」という可能性を潰したかったので、段階的に調整していきました。
- 詳細な手書きプロンプト+negative_prompt: 素材の質感・成形痕などを細かく書いて、
negative_promptで"CGI, 3D render, cartoon, illustration"を打ち消す。
→ 素材の制御はよくなりました(樹脂がちゃんと樹脂で出る)。でもリアルさは大きくは変わらず。 - LLMによるプロンプト拡張(prompt upsampler): 短い文をLLMが詳細な記述に自動で展開してから生成してくれる、cosmos-frameworkに用意されている機能です。展開後の文は出力の
sample_args.jsonに残ります。
→ 短文・詳細手書きと大差なし。
さらにパラメータ設定もいじってみました。text2imageの既定は guidance=4.0 / shift=3.0 / num_steps=50(実行時に出力されるsample_args.jsonの既定値です)。ここからguidanceを4→6→7、shiftを3→10(画像の仕上がりテイストをいじるパラメータです)、num_stepsを35/50——公式diffusersのtext2video / video2videoサンプルが使う guidance=6.0 / flow_shift=10.0 / num_steps=35 の組み合わせも含めて試したんですが、画質・リアルさはほとんど変わりませんでした。
というわけで、様々試してみましたが、ゼロからの画像生成において、リアルさについては求める水準に達しませんでした。
CG調になる問題はプロンプトやパラメータの問題というより、Cosmos 3の性質に由来する可能性が高いと見ています。ただし、私の検証方法の問題の可能性もあるため、引き続き調査は続けていきます。


image2videoでトライ
手持ちの良品画像に欠陥を足す方法ならと思い実験してみました。
Cosmos 3にはimage2imageの編集モードが無いので、image2videoで「傷が現れる動画」を作って後半フレームを抜く、という方法を試しました。
{"model_mode":"image2video","prompt":"a deep scratch gradually appears on the metal surface","vision_path":"<良品jpg>","num_frames":33,"resolution":"720"}
結果は、元画像を1秒の動画にしただけで欠陥は出てきませんでした。調べてみると、公式のdiffusersドキュメントにこう書いてあります。
image2videoは「入力画像を第1フレームに固定して、残りをdenoiseする」。しかもdenoise強度(strength)のパラメータが無い。
image2videoもvideo2videoも"先頭フレーム/潜在を固定して残りを生成する"条件付けで、strengthもmaskも持っていないんですね。つまり今のCosmos 3には、狙った位置に欠陥を足すような局所編集(mask/strength)のモードが無い(構造制御のTransferはCosmos 3では"coming soon")。
編集できないのは仕様どおりでした。
Cosmos-AnomalyGen
他の方法でどうにかできないものかと色々調べているとAnomalyGenというものを見つけました。
これはCosmosプラットフォームのagent skillのようです。
AnomalyGenが何をするかというと、ざっくり言うと良品の写真に、欠陥を描き足すツールです。
まさに今回やりたかったやつですね。
次回以降、こちらを用いた画像生成を試してみます。
まとめ
次回以降で、このAnomalyGenを実際に動かして、良品画像からリアルな欠陥画像の合成ができるかを検証してみます。
Built on NVIDIA Cosmos. 生成物はnvidia/Cosmos3-Super(OpenMDW-1.1)を使用しています。









