12
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Jevにウォーリーを探させたら0.4秒で見つけやがった!!

12
Last updated at Posted at 2026-10-15

先にタイトル詐欺についてお詫び申し上げます。正確には"ウォーリーを探せ"ではなく"ウォーリーを探せっぽい画像"から探させた検証になります。実際の"ウォーリーをさがせ"はもっと難しいので同じ結果にはならないかもしれません:bow_tone1:

📸 Jevの画像対応

Jevで画像入力が使えるようになりました:raised_hands:また、画像の中の位置を答える新機能も搭載されました。目が使えるならやることはひとつ‼️”ウォーリーを探せ”ですよね:point_up:

🧐 対象者

・Jevの画像認識精度が知りたい人
・Jev好きな人
・ウォーリーを探せが得意な人

:writing_hand:主な仕様

  • 画像はnoul / choice / score / boxのどの質問でも使える
  • 新しい質問タイプboxが追加。画像の中の「どこ」を四角で返してくれる(1.14専用)
  • まだ実験機能扱いで、リクエストにTypeSafe-Danger-Zone-Images: trueヘッダが必要
  • 使える画像はPNGかJPEGだけ。各辺256〜1568px
  • 上限を超えた画像は自動で縮小されないので自分で縮めておく必要がある
  • 料金はテキストと同じ単価で画像の追加料金はなし(詳しくは下の料金と応答時間で)

🔧 検証のやり方

大人の事情でウォーリー本人の画像は使えないので”ウォーリーを探せ風”の画像をAIで生成しました(細部の荒さはご了承ください:bow_tone1:)いろいろな作品のパロディっぽいキャラが紛れ込んでいますがそこも含めて探してみてください。ウォーリー役はこのキャラクターです。

hunt3_ref_h392.png

今回の検証の条件はこちらです。

項目 内容
モデル jev-1.14.0
SDK 公式Python SDK typesafe-sdk 0.7.5
実行環境 AWSのus-east-2(オハイオ)のLambda(Python 3.14)から計測
渡す画像 2枚(場面+見本)
見本画像 基本は全身の立ち絵(882×1568)
場面画像 1568×876(ゴールドソーサー・警察署)、1376×768(そのほか)
質問 1回のリクエストで2問(下の表)
実行回数 結果3回の中央値
いる判定 0.1以上(noul)
位置判定 ◎0.5以上 ○0.1以上 ×0.1未満(確信度)

Jevを呼ぶコードをはこんな感じです。キャラが画像内にいるか?という質問とその座標を聞く質問の2つを投げました。

with TypeSafeClient(api_key=api_key, model=MODEL) as client:
    resp = client.system_one(
        # 判定の材料(state): 2 枚の画像に "scene" と "ref" という名前を付けて渡す
        state={"scene": Image(scene), "ref": Image(ref)},
        # 質問(questions): 質問文の中では、画像をバッククォートで囲んだ名前(`scene` / `ref`)で指す
        questions={
            # 質問 1(noul = はい/いいえ): 見本の人は場面の中にいる?
            "present": Noul(instructions="Is the person shown in `ref` somewhere in `scene`?"),
            # 質問 2(box = 位置): 場面の中のどこにいる?
            "where": Box(instructions="The same person as in `ref` within `scene`."),
        },
        extra_headers={"TypeSafe-Danger-Zone-Images": "true"},
    )

box = resp.boxes["where"]                                      # 質問 2 の答え(四角形と確信度)
result = {
    "noul": resp.nouls["present"].noul,                        # 質問 1 の答え: いる確率(0〜1)
    "box": box.box.model_dump(),                               # 四角形の位置
    "confidence": box.confidence,                              # 四角形の確信度(0〜1)
    "input_tokens": resp.usage.input_tokens,
}
APIのレスポンス(ゴールドソーサー)
{
  "model": "jev-1.14.0",
  "answers": {
    "present": {
      "type": "noul",
      "noul": 0.59
    },
    "where": {
      "type": "box",
      "box": {
        "top": 0.63,
        "bottom": 0.76,
        "left": 0.23,
        "right": 0.29
      },
      "confidence": 0.75
    }
  },
  "usage": {
    "input_tokens": 7547,
    "output_tokens": 36
  }
}

🕵️ ウォーリー(?)をさがせ!

それではみんなで一緒に探してみましょう!Jevより先に見つけられたらあなたの勝ちです。

hunt3_ref_h196.png

1.ゴールドソーサー
hunt5_scene.png

2.警察署
hunt6_scene.png

3.re:Invent会場
hunt7_scene.png

4.木の葉の里
hunt8_scene.png

5.交差点
hunt10_scene.png

皆さんは見つけられましたか?Jevはどうでしょう?

📋 結果一覧

先に結果を一覧にしておきます

場面 見本 いる? 確信度 判定 応答速度(us-east-2)
ゴールドソーサー 立ち絵 0.59 0.75 ◎ 400ms
警察署 立ち絵 0.55 0.78 ◎ 346ms
re:Invent会場 立ち絵 0.24 0.17 ○ 369ms
木の葉の里 立ち絵 0.15 0.18 ○ 574ms
キャラがいない版 立ち絵 0.08 0.05 × 407ms
交差点 白いスーツの怪盗 切り抜き 0.98 0.76 ◎ 409ms※
交差点 カフェの店員さん 切り抜き 0.89 0.74 ◎ 409ms※
交差点 窓の女の人 切り抜き 0.87 0.59 ◎ 409ms※
交差点 エンジニアちゃん 立ち絵 0.46 0.15 ○ 409ms※
交差点 メガネの男の子 切り抜き 0.59 0.08 × 409ms※

応答速度はAWSのus-east-2(オハイオ)のLambdaから3回測った中央値です。※交差点は5人を1回のリクエストで探しているので5人とも同じ値です。

🎯 場面ごとの結果

hunt5_summary.png

しっかり探せていました。元の画像より荒いのですがちゃんと判定していますね。遊園地で迷子を探す係に向いているかもしれませんね

hunt6_summary.png

こちらもちゃんと検知できていますね。元画像と姿勢が違いますが検知できています。後ろのゾンビに食われそうなのが心配です

hunt7_summary.png

確信度が下がっていますが検知できていますね。画像が小さくて荒いため判断に迷ったものと思われます。

hunt8_standing_summary.png

こちらはめちゃめちゃ荒い画像になっていて人間が見ても「これは同一人物なのか?」と審議の余地があるレベルですね:sweat_smile:...判定的にはギリギリ見つけられた判定でした。

:imp:意地悪な問題

いない人を探させたらどうなるのか試してみました。

hunt9_summary.png

boxは仕様上必ず四角を返すので枠自体は露店前の隙間に出てきますが、「いる?」と確信度が両方低く出ていて「いなさそう」という雰囲気は伝わってきます。

右下の「綱手様」を誤判定するかと思いましたがしませんでしたw

:spy_tone3:同じ絵で5人を探す

交差点の絵で5人を探してもらいました。1回のリクエストで複数人を判定させるにはこんな感じで書きました。※refsには画像パスのリストが入ります

state = {"scene": Image(scene)}
questions = {}
for i, ref in enumerate(refs, start=1):
    state[f"ref{i}"] = Image(ref)
    questions[f"present{i}"] = Noul(instructions=f"Is the person shown in `ref{i}` somewhere in `scene`?")
    questions[f"where{i}"] = Box(instructions=f"The same person as in `ref{i}` within `scene`.")

# Jevには一回だけ
with TypeSafeClient(api_key=api_key, model=MODEL) as client:
    resp = client.system_one(
        state=state,
        questions=questions,
        extra_headers={"TypeSafe-Danger-Zone-Images": "true"},
    )

# 人ごとの答えを取り出す
people = []
for i, ref in enumerate(refs, start=1):
    box = resp.boxes[f"where{i}"]
    people.append({
        "ref": str(ref.resolve()),                         # 使った見本画像(フルパス)
        "noul": resp.nouls[f"present{i}"].noul,            # いる確率(0〜1)
        "box": box.box.model_dump(),                       # 四角形の位置:
        "confidence": box.confidence,                      # 四角形の確信度(0〜1)
    })
APIのレスポンス(交差点・5人)
{
  "model": "jev-1.14.0",
  "answers": {
    "present1": {
      "type": "noul",
      "noul": 0.46
    },
    "where1": {
      "type": "box",
      "box": {
        "top": 0.74,
        "bottom": 0.95,
        "left": 0.81,
        "right": 0.87
      },
      "confidence": 0.15
    },
    "present2": {
      "type": "noul",
      "noul": 0.98
    },
    "where2": {
      "type": "box",
      "box": {
        "top": 0.03,
        "bottom": 0.26,
        "left": 0.84,
        "right": 0.93
      },
      "confidence": 0.76
    },
    "present3": {
      "type": "noul",
      "noul": 0.89
    },
    "where3": {
      "type": "box",
      "box": {
        "top": 0.58,
        "bottom": 0.65,
        "left": 0.16,
        "right": 0.21
      },
      "confidence": 0.74
    },
    "present4": {
      "type": "noul",
      "noul": 0.87
    },
    "where4": {
      "type": "box",
      "box": {
        "top": 0.11,
        "bottom": 0.25,
        "left": 0.19,
        "right": 0.22
      },
      "confidence": 0.59
    },
    "present5": {
      "type": "noul",
      "noul": 0.59
    },
    "where5": {
      "type": "box",
      "box": {
        "top": 0.65,
        "bottom": 0.78,
        "left": 0.23,
        "right": 0.25
      },
      "confidence": 0.08
    }
  },
  "usage": {
    "input_tokens": 8289,
    "output_tokens": 174
  }
}

hunt10_summary.png

怪盗はきれいに囲めましたがほかの4人は枠が隣の人にずれたり半分かかったりしました。

🧮 画像のトークン数

画像はいったい何トークンなのか。公式には1枚あたりの目安が載っていないので今回の結果から数えてみました。

場面 場面画像 見本画像 入力トークン
ゴールドソーサー 1568×876 882×1568 7,547
警察署 1568×876 882×1568 7,550
re:Invent会場 1376×768 882×1568 6,765
木の葉の里 1376×768 882×1568 6,764
キャラがいない版 1376×768 882×1568 6,765
交差点(5人) 1376×768 882×1568+280×398+280×468+280×340+280×369 8,289

トークン数は画像の大きさでほぼ決まります。ざっくり計算すると画像はおおよそ19×19ピクセルで1トークンでした。

💰 料金と応答時間

場面 料金 応答時間(us-east-2)
ゴールドソーサー 0.048円 400ms
警察署 0.048円 346ms
re:Invent会場 0.043円 369ms
木の葉の里 0.043円 574ms
キャラがいない版 0.043円 407ms
交差点(5人) 0.052円 409ms

1回あたり約0.04〜0.05円です。これは激安ですね。

🍜 締め

ウォーリー(エンジニアちゃん)を0.4秒以内に見つけられた方はいますか?その方はJevより優秀です:raised_hands:今回はネタ寄りの検証でしたが触ってみて分かったのは次のような感じです。

  • 見本と場面の絵柄がそろっていてそこそこ大きく写っている相手ならちゃんと見つけてくれる
  • 小さい相手や絵柄が違う相手はまだ苦手で枠がちょっとズレるクセがありそう
  • 1回0.05円以下・0.4秒前後なので気軽に投げられる

対象にもよりますがJevに最後まで任せるより「たぶんこのへん」を素早く安く絞り込んでもらって最後は人が確かめるくらいの使い方が合っていそうです。(Boxの精度がもう少し上がればかなり使い勝手良い感じになりそうです)

12
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?