
餃子作りの工程認識 NVIDIA SOP Monitoring Services
はじめに
こんにちは!クラスメソッド製造ビジネステクノロジー部のtanaka-takeruです。
以前餃子を包む様子を撮影した動画を題材に時間研究・動作研究を行いました。
今回は続編として「区間推定精度を上げる工夫が必要」という課題に取り組むために、NVIDIAが公開しているSOP Monitoring Blueprints を使って作業動画からの工程認識を、ファインチューニングしたAIモデルで自動化してみました。
この記事では、次のことを説明します。
・SOP Monitoring Blueprintsの推論パイプライン概要
・実行環境
・タスク説明
・結果
※環境構築の手順、アノテーション・学習の工夫については別記事に分けさせていただきます。
SOP Monitoring Blueprintsの推論パイプライン概要
大まかに次のような構造となっています。
ポイントになるのは、まず①DDM-Netで各工程(皮取り -> 餡つけ -> 水つけ -> ヒダ包み -> トレイに置く)を切り出し、②VLMでその工程が何の種類であるかを推定する構造になっていることです。各モデルの特徴と役割を簡単にご説明します。
①DDM-Net
DDM-Netは「動画のどこで動作が切り替わったか(境界)を見つける」ことに特化したモデルで、動画を区切る係です。動画をコマ送りしながら「いま動きの性質が変わったな」というポイントにマーカーを打っていくイメージです。画像空間と時間空間の性質の変化のみを捉えており、それが何を意味するかについては扱いません。
②VLM
VLMは映像と言葉の両方を理解でき、①で切り出された短い動画一つ一つに対して「これは”ヒダ包み”の工程」です」というように判定する係です。また、今回使うCosmos-Reason2-2Bは、NVIDIAが公開しているモデルで、Qwen3-VL-2B-Instructをベースにポストトレーニング(追加学習)された作業映像の理解に強いVLMです。
VLMには次のようなプロンプトを投げます。
There are 6 possible steps for the SOP (Standard Operation Procedure) of the given video.
What step is the operator doing?
(1) pick: reaching to the stack of gyoza wrappers, taking one wrapper, and bringing it back to the working position
(2) fill: scooping filling with a spatula, placing it onto the wrapper, and spreading it over the wrapper
(3) water: dipping a fingertip into the water dish and wetting the edge of the wrapper
(4) pleat: folding the wrapper in half and pinching the edge to form pleats and seal the dumpling
(5) place: placing the finished dumpling onto the metal tray and arranging it
(6) doing action not belong to the defined SOP
単に動画を見せてこれは何の作業?と質問してしまうと、解答の自由度が高すぎるため、適切な回答が得られにくいです。そこで、事前に定義した5つの工程のどれなのか、もしくはいずれにも該当しないのかを問う形としています。
学習では、LLM(Llama-3.1-70B)が言い回し違いのQ&Aを大量生成しています。
我が家の餃子作りを認識するために
上記の汎用AIをファインチューニングして、より今回のデータに適応させます。
なお、VLMの学習には「映像+質問+回答」のペアが大量に必要になりますが、準備には膨大なコストがかかるため、今回は少量のアノテーションデータからデータ拡張を行います。これにはNVIDIA NIM API経由でLLM(Llama-3.1-70B)を使用します。今回私が手でアノテーションしたのは学習用と検証用合わせて約10分の動画です。
最後に全体像のイメージです。
実行環境
今回はVLMのフルファインチューニングになるため、公式要件では A100 80GB ×4枚となっています。
今回はNVIDIAのクラウドGPUサービス Brev で環境を用意しました。
| 項目 | 内容 |
|---|---|
| インスタンス | GCP a2-ultragpu-4g(Brev経由) |
| GPU | NVIDIA A100-SXM4-80GB × 4枚(合計VRAM 320GB) |
| vCPU / メモリ | 48 vCPU / 668 GB RAM |
| ディスク | 500 GB |
| OS / コンテナ | Ubuntu 22.04 / Docker Compose |
| 料金 | 約 $24/時 |
Brevについては過去記事(CLI編・接続編)もご覧ください。
モデルの入手は次のとおりです。
| モデル | 入手元 |
|---|---|
| Cosmos-Reason2-2B | Hugging Face |
| DDM-Net | Blueprint同梱 |
| Llama-3.1-70B | NVIDIA NIM API |
Hugging FaceとNVIDIA NGCのAPI Keyが必要になります。
タスク説明
元動画は前回と同じ、俯瞰視点に固定したカメラで撮影した餃子包み作業(18分32秒)です。
今回は上側に写っている作業者1名を対象に、上部をクロップして使いました。工程定義も前回と同じです。

| ラベル | 名称 | 定義 | IE分類 |
|---|---|---|---|
| pick | 皮取り | 皮の山へ手を伸ばし、1枚取って作業位置へ戻すまで | 付随作業 |
| fill | 餡付け | ヘラで餡をすくう・皮に乗せる・塗り広げる | 付随作業 |
| water | 水付け | 指先を水皿に浸す・皮の縁を濡らす | 付随作業 |
| pleat | ヒダ包み | 皮を二つ折りにし縁をつまんで閉じる | 正味作業 |
| place | トレイ置き | 完成品をトレイへ置く・並べ直す | 付随作業 |
学習用と検証用は時間で分割します。検証区間は学習に使いません。
| 用途 | 区間 | サイクル数 | アノテーション |
|---|---|---|---|
| 学習 | 前半5分 | 約6 | 36クリップ(全区間) |
| 検証 | 後半4分31秒 | 約6 | 30クリップ(答え合わせ用) |
サイクル数は餃子の個数と同数で、学習と検証にそれぞれ6個前後の動画を使いました。
アノテーションはBlueprint付属のWeb UIで行いました。
学習と検証合わせておよそ10分の動画を66区間切り出す作業でしたが、40分程度の作業時間でした。

結果
先に、DDM-Netで工程を区切ってCosmos-Reason2-2Bで見分けた、最終的な結果を示します。

それぞれ単体での結果についても見てみます。
DDM-Net(工程の区切り): precision 1.0 / recall 0.52
| 場面 | 指標 | 実測値 | 補足 |
|---|---|---|---|
| 学習時の検証 | F1(best epoch) | 0.83 | |
| 推論時(上図の区切り) | Precision | 1.00 | 切り出した境界は全て正解 |
| 〃 | Recall | 0.52 | 本物の境界の約半分しか拾えていない |
| 〃 | F1 | 0.68 | 上記の調和平均 |
F1は境界検出のスコアです。「予測した区切り時刻が、正解の区切りと許容誤差(±1秒)以内で一致するか」で判定します。
precision 1.0 / recall 0.52 が今回の実力になります。
recall 0.52がどう結果に効いてくるかについて、直感的には、先述のグラフをにて、紫や水色の細い帯が拾えていない点が目立ちます。
一言で言うと「間違った区切りは打たないが、短工程(水付け・トレイ置き)を見落としやすい」といったところです。
学習時間は約1時間20分でした。
Cosmos-Reason2-2B(工程の見分け): Accuracy 0.967
| 指標 | 実測値 |
|---|---|
| Accuracy | 0.967(29/30) |
| Loss | 0.006 |
工程別の内訳
| 工程 | 正解/全体 | 精度 |
|---|---|---|
| pick 皮取り | 5/5 | 100% |
| fill 餡付け | 6/6 | 100% |
| water 水付け | 6/6 | 100% |
| pleat ヒダ包み | 6/6 | 100% |
| place トレイ置き | 6/6 | 100% |
| SOP外 | 0/1 | 0% |
| 全体 | 29/30 | 96.7% |
定義した5工程はすべて100%でした。見た目が紛らわしそうな「餡付け/水付け/ヒダ包み」も正しく判定しています。
細かな手待ち時間を見逃しましたが、わずか6サイクルのアノテーションでここまで見分けられるのには驚きました。
学習時間は約1時間でした。
おわりに
手作業の工程に関わらず、何にどれくらいの時間を使っているかを把握することは、プロセスを改善していくために必ず必要です。
今回のデータでは、区間切り出し精度は実験的ですが、工程の認識は高い精度で実現できました。
実務環境の制約に合わせてロバストな設計にすることで、層別したい要素に絞って分析することができます。
例えば「作業者が変わっても認識して、治具の使い方に差異がないかみたい」や「拠点違いで作業台やレイアウトが異なるが、とにかく全体のサイクルタイムを見たい」など。
ルールベース処理やQRコード読み取り、物理スイッチでのタイムスタンプなどのアプローチを組み合わせて、安定運用できるソリューションを構築していきたいです。





