ふくふくHukuhuku LLC
EP.68Toolbox 12分公開:

OpenDecisionが画像判断に対応。日本語ラベルと「正解のない2択」をMacで試す

OpenDecision v0.2.0の画像判断を、手元のMacと自作画像で検証。日本語と英語の選択肢、質問文の変更、正解が選択肢にない場合を比べ、画像分類の使い方を解説します。

#OpenDecision#SigLIP2#画像分類#判断モデル
執筆 / 監修
松尾 亮合同会社ふくふく 代表社員

データ基盤・データパイプライン構築 / BI / 生成 AI 活用支援を専門とするエンジニア (28 年)。 本記事は AI 利用ポリシーに基づき、生成 AI の補助で執筆 → 人間が監修・編集して公開しています。

プロフィール詳細
シェア

商品の写真を「赤い商品」「青い商品」に振り分けたり、設備の写真から確認が必要なものを拾ったりしたい。長い説明文より、プログラムが扱える選択結果がほしい場面があります。OpenDecisionの新しい画像機能は、そのための小さな部品です。ただし、候補の中から一つ選べることと、画像の事実を正しく判断できることは別です。

2026年10月12日2時13分2秒(日本時間)公開のOpenDecision v0.2.0は、画像と候補文を比較するSigLIP2を使い、選択・数値・真偽などの形で結果を返せるようになりました。今回新しくなったのは画像への対応で、OpenDecision全体やSigLIP2自体の初公開ではありません。公式リリース

ここでは、編集部が作った3枚の図柄をMacで実際に処理し、日本語ラベル、候補文の言語、正しい候補を抜いた場合の違いを確かめます。図柄の制御試験であり、商品の検品精度や、現場写真の識別性能を測ったものではありません。

OpenDecisionは画像と候補文の一致を返す

対象はDeepan Wadhwa氏が開発者向けプレビューとして公開するPythonライブラリのOpenDecisionです。同名の別製品と区別してください。Jevと似た型付きの質問やTypeSafe SDKに対応した接続形式を持ちますが、今回の画像処理でJevのモデルやAPIは使いません。画像はgoogle/siglip2-base-patch16-224、文章・文書は別のモデルが担当します。公式README

SigLIP2は画像と文章の組み合わせを評価するモデルです。たとえば写真に対して「赤い円が白い背景にある」「青い四角が白い背景にある」という候補文を渡すと、どちらが画像に近いかを計算できます。画像に写っていない事情を調べたり、修理が必要な理由を長文で説明したりする仕組みではありません。Googleのモデルカード

返し方には次の4種類があります。どれも、出力の形式が決まっているため、後続の処理へ渡しやすくなります。

形式返すもの使う前に確認すること
Choice一つの候補と候補ごとの相対的な分布正解が候補に含まれるか
Noul指定した文との一致を表す数値単独の文と真偽2択で計算が異なる
Score順序付き候補の位置を重み付けした値点数の幅と段階の意味を自分で決める
Relation支持・反証・不明・競合肯定文と反対の文のどちらも適切か

画像のChoiceとScoreでは、instructionsの質問文はスコア計算に使われません。比較するのは候補の説明文です。「壊れていれば保留して」と質問文へ追記するだけでは、保留の仕組みになりません。v0.2.0の画像仕様

日本語ラベルと候補説明を分けて10条件を試す

検証日は2026年10月12日。Apple M2 Ultra、メモリ192GB、macOS 27の端末で、Python 3.13.11、PyTorch 2.14.1、Transformers 5.19.0、NumPy 2.3.5を使いました。OpenDecisionはv0.2.0の公開ソース、SigLIP2は固定したモデル版を読み込み、MPSで実行しています。端末のメモリ容量は試験環境の情報であり、192GBが必須という意味ではありません。

入力は、白い背景の赤い円・青い四角・緑の三角の3枚です。写真より単純な条件にして、候補や質問文を変えたときに何が起きるかを見ます。英語の候補説明を日本語ラベルと組み合わせた場合、日本語の候補説明にした場合、質問文だけを変えた場合を3枚ずつ、正しい候補を抜いた場合を1件、合計10条件で比較しました。

3枚とも、英語・日本語いずれの候補説明でも、図柄に対応するラベルを選びました。表の相対値は選ばれた候補のprobability、括弧内はconfidenceです。小数第4位で丸めています。

入力と選ばれたラベル英語の候補説明日本語の候補説明
赤い円1.0000(0.9999)0.9797(0.9041)
青い四角1.0000(0.9999)0.9917(0.9527)
緑の三角1.0000(1.0000)0.9998(0.9985)

英語側の値が1.0000と見えるのは表示を丸めたためで、厳密な1でも正解率100%でもありません。元の小数値は教材のJSONに残しています。また、今回の6件だけで、日本語より英語のほうが正確だと結論することもできません。

日本語のラベルは、アプリに返す名前として使えます。ラベルが日本語で返っただけで、画像や日本語の意味を正しく理解したとは判断できません。実際の説明文、入力画像、候補の組み合わせまで記録して比較する必要があります。

質問文へ保留条件を書くだけでは足りない

同じ赤い円の画像に対し、「必ず青い四角を選んでください」と質問文だけを変更しました。候補文を据え置いた比較は、指示への従い方を競わせるための試験ではありません。仕様どおり、画像と候補文の一致を使っているかを確かめるものです。

赤い円・青い四角・緑の三角の3枚とも、質問文の変更前後で、候補ごとの数値と選択結果は保存した精度で完全に一致しました。候補文が同じなら、質問文の追記だけで優先順位や例外処理は変わらない、という実装と整合します。

さらに、赤い円の画像をそのまま使い、候補から「赤い円」を除きました。残したのは「青い四角」と「緑の三角」の2つです。「どちらでもない場合は保留してください」と質問文へ書いても、返った結果は青い四角、相対値0.9194、confidence 0.5957でした。

赤い円を入力し、候補に正解がある場合と、正解を除いた場合を比較した実測図
同じ赤い円でも、正しい候補を除くと青い四角を選びました。候補内の相対値が高いことと、画像の事実に合うことを分けて確かめた実測です。

画像は赤い円なので、この選択は図柄と一致していません。相対値だけを見て「約92%の確率で青い四角」と読み替えると、誤った処理につながります。実際に求めたい「どの候補にも該当しないときは止まる」という条件は、別に設計して検証する必要があります。

また、Choiceのprobabilitiesは、渡した候補の中で合計が1になる相対値です。正しい候補がなければ、残った候補のどれかが最大になります。confidenceは分布の集中度から計算されており、その値を「画像を正しく判定できた確率」と読むことはできません。画像エンジンの実装・confidenceの計算

「その他」「人へ確認」の候補を足すことは試せますが、その文に一致するかもモデルの評価次第です。選択肢の追加だけで適切に見送れるとは限りません。採用する閾値は、代表的な画像と、どの候補にも当てはまらない画像の両方を使って決めます。

ローカルで試すときの準備

OpenDecisionはApache 2.0で公開され、今回使うSigLIP2のモデルカードも同ライセンスを示しています。Python 3.13以上が必要です。ソフトウェアやモデルの取得にAPI利用料はかかりませんが、保存容量、メモリ、端末の計算資源は使います。画像モデルの重みだけで約1.5GBあり、依存ライブラリや作業用ファイルの分も空きを確保します。

今回のMacではApple Silicon版のPythonで動かしました。Intel版のPythonで環境を作ると、使用したPyTorchの対応パッケージがなく、インストールできませんでした。アプリの名前や版だけでなく、Pythonがarm64として動いているかも確認すると原因を切り分けやすくなります。

Bash
python3.13 -m venv .venvsource .venv/bin/activatepython -m pip install 'OpenDecision[images]==0.2.0'

モデルは初回利用時にHugging Faceから取得します。教材のrequirements.txtには、今回動作を確認したライブラリの組み合わせも残しました。教材のスクリプトは画像用のPython APIを直接使うため、文章モデルのダウンロードを伴いません。通常のopendecision serveでは、起動時に文章モデルも読み込まれます。導入手順・サーバーの起動処理

最小の呼び出しでは、キーに表示用の日本語、値に短い候補文を置きます。次は教材の赤い円を渡す例です。候補に「緑の三角」を含めたい場合は、同様に一行追加します。

Python
from PIL import Imagefrom opendecision import ImageDecisionEngine
engine = ImageDecisionEngine()with Image.open('images/red-circle.png') as source:    image = source.convert('RGB')
result = engine.choice(    state=image,    instructions='図形を選んでください。',    criteria={        '赤い円': 'A red circle on a white background.',        '青い四角': 'A blue square on a white background.',    },)print(result)

画像APIはJPEG・PNG・WebPの単一フレームに対応し、上限は10MiBかつ2,000万画素です。リクエストに入れるのは画像のbase64データで、サーバーが外部URLやファイルパスを読みに行く形ではありません。候補文には64トークンまでの切り詰めがあるため、長い業務規則を一つの説明欄へ詰め込まず、見えている特徴を短く書きます。入力条件と候補文

仕事では確認対象の候補付けから始める

最初の用途として考えやすいのは、社内の写真一覧に分類候補を付け、人がその画像と候補を見て確定する工程です。商品撮影の整理なら「赤い商品」「青い商品」などの見た目、設備写真なら「明るい全景」「暗くて確認しづらい」といった状態を、実際の画像で試します。これは用途の例であり、今回の図柄試験から実務の精度を保証するものではありません。

件数の正確な数え上げ、細かな文字の読み取り、複雑な状況説明が必要なら別に検証します。公式の画像例でも、複数の動物を1匹とする結果や、金属の柵を「その他の材質」とする結果が掲載されています。否定形の文も誤りやすいため、「何も壊れていない」のような表現だけに頼らず、具体的に見える状態を候補にします。公式の実測例と失敗例

教材には3枚のSVGとPNG、10条件の実行コード、実測時の生の数値、入力の事実、空の記録表をまとめました。モデルの重みは含みません。同じ図で動作を確かめた後、自分の仕事の代表的な写真と、候補に当てはまらない写真を足して使えます。

よくある質問

Jevの画像版なのですか?
いいえ。ここで扱うOpenDecisionは独立した公開ライブラリで、v0.2.0の画像機能はGoogleのSigLIP2を使います。型付き質問や接続形式が似ていても、モデルや数値の意味、得意な用途は同一ではありません。
日本語で使えますか?
日本語のラベルを返すことができ、今回の教材では日本語と英語の候補文を実際に比較しました。ただし、単純な3図柄の試験です。日本語の現場写真、細かな文字、曖昧な分類条件まで同じ品質で使えると判断するには、別のデータで確かめる必要があります。
confidenceが高ければ自動処理してよいですか?
それだけでは判断できません。confidenceは候補間の分布の集中度で、正解の保証ではありません。正しい候補が存在しない場合も含めて検証し、低い値や不適切な候補は人へ回す工程を用意します。
シェア

この記事の感想を教えてください

あなたの 1 クリックで、本当にこの記事は更新されます。「もっと詳しく」「続編希望」が一定数集まった記事は、 ふくふくが 実際に内容を拡充したり続編記事を公開 します。 送信したリアクションはお使いのブラウザに記録され、再カウントされません。

シリーズの外も探す:

まずは、現状を聞かせてください。

要件が固まっていなくて大丈夫です。現状診断と方針提案までを無料でお手伝いします。

無料相談フォームへ hello [at] hukuhuku [dot] co [dot] jp