💨

GPT4oを使って、訓練無しで物体検出(BBox)ができるか試してみる

2024/05/14に公開

今日も今日とてopenAIの新発表が機械学習界隈を賑わせていますね。
今回は、2024/05/14に発表されたGPT4oについてです。
返答速度があがったり画像認識精度があがったり音声会話の性能が良くなったりと色々話題が尽きません。
具体的にどのあたりが凄くなったのかは僕以外にもまとめている人が多そうなのでこの記事では触れません。

個人的に特に気になっているのが画像認識の精度向上部分で、今回は画像認識精度がどの程度あがったのか?というのを画像系機械学習の主要なタスクであるBBoxによる物体認識というタスクで簡単にチェックしてみようと思います。

BBoxとは

BBoxはBoundingBoxの略で、画像内の特定のオブジェクトを囲むために使用される長方形のボックスの事を指します。
BoundingBoxの定義は以下の通り

このBBox検出は画像系機械学習モデルの基本的なタスクであり、自動運転の標識認識であったり、錆やひびの異常検知から、セミが蛹から羽化した瞬間を検出するタスクなど様々な場所で使われています。

当然、この検出のためには学習用データセットを用意し、画像のどの部分に検出したいものが映っているかを人手で教師データとして与えてあげたうえで機械学習モデルを鍛え上げる必要がありました。

これを、学習データを用意せず、学習を行う事もなく、GPT4oの画像認識力だけで解くことができるのか?というのが今回試したい内容になります。

検証事例①

適当に写真フォルダにあった写真から、物体検出向きなものを引っ張ってきました。

この写真に写っている信号機の座標を検出させてみます。

まずは力試しということで、そもそも画像を認識できているのか確認してみましょう。

認識は問題ないようですね。
では、実際にbboxを検出させてみます。


ちゃんと信号機に対してbboxを指定出来ていますね。
ところで、出力結果をみるとPythonを使ったと書かれています。
この出力を見ると、裏側でなんらかの検出モデルをPythonで動かしてその結果を出している可能性も捨てきれません。
ということで、分析に使ったコードを見てみましょう。

from PIL import Image
import matplotlib.pyplot as plt

# Load the image
image_path = "/mnt/data/2A01425A-7F11-42C6-8EEF-8AA67DD2F910.jpeg"
image = Image.open(image_path)

# Display the image to identify the traffic light's bounding box visually
plt.imshow(image)
plt.axis('on')
plt.show()


# Define the bounding box coordinates for the traffic light
bbox = [270, 50, 420, 230]

# Draw the bounding box on the image
fig, ax = plt.subplots(1)
ax.imshow(image)
rect = plt.Rectangle((bbox[0], bbox[1]), bbox[2] - bbox[0], bbox[3] - bbox[1],
                     linewidth=2, edgecolor='r', facecolor='none')
ax.add_patch(rect)

plt.show()

どっから持ってきたそのbboxの座標
ということで、bbox表示にPythonは使っている物の、bboxの座標自体は完全にマジックナンバー、つまりGPT4oくんが入力された画像を元に勝手に設定していると見てよさそうです。

ただ、たまたまあっていた可能性も否定できないのでもう一例くらいみてみましょう。

検証事例②

次はこの画像を入力として、道路標識を検出できるか試してみます。

こちらも、まずは認識できているかから確認。

この程度は朝飯前のようですね。
では、bboxを検出してみます。


多少ずれているものの、大体の位置は把握できているようです。
GPTが分析に用いたコードはこちら

import matplotlib.patches as patches

# Create figure and axes
fig, ax = plt.subplots()

# Display the image
ax.imshow(image)

# Create a Rectangle patch
bbox = [350, 600, 500, 850]
rect = patches.Rectangle((bbox[0], bbox[1]), bbox[2]-bbox[0], bbox[3]-bbox[1], linewidth=2, edgecolor='r', facecolor='none')

# Add the patch to the Axes
ax.add_patch(rect)

plt.show()

また謎の座標を引っ張ってきていますね。
今回もPythonは描画にだけ用い、座標の決定はちゃんとGPT4oがやっているようです。

検証事例③

と、ここまでうまくいった例を続けて紹介していきましたが、だめな例も紹介していきます。
検証に使う画像はこちら

この画像からキノコを検出させます。
いままでの画像と比べると対象物が小さく、画像も誤認しやすいものが多く存在するため難易度は高めです。

まずは認識ができているかのチェック。

個人的にはキノコの同定ができているだけでもすごい。
ちなみのこのキノコはタマゴタケです。
富士の樹海を散歩してるときに見つけました。

では、bbox検出ができるかを確認。

残念ながら結構大幅に外してしまっています。
体感としては、ある程度座標は認識している物の、かなりおおざっぱな座標認識のため、検出対象が小さすぎるとうまくいかない気がします。

終わりに

という事で、今回は画像系機械学習タスクの基本である、bboxによる物体検出をGPT4oはできるのか?を試してみました!
完ぺきではないとはいえ、ゼロショットでここまでできるとなると、機械学習タスクの在り方も色々見直しが必要そうです。

ただし、この結果をもってして既存の機械学習手法はいらない!とならない点には注意です!
特に、この実験はあくまでお試しであり、既存の検出手法と比較する場合はちゃんと評価用のデータセットを用意して、mean Average Precision等の評価スコアで厳密に比較をすべきであるという事をご留意ください!

とはいえ、GPT4では全くとけなかったbbox検出がある程度できるようになっているのは間違いないとみて良いかと思います。
この調子でいけば、いずれ既存手法と同等の精度を学習無しで解けるようになるのも夢ではないでしょう。
AI周りの今後の発展がこれからも楽しみですね!

Discussion