GPT-4oを使った訓練無しでの物体検出(BBox)の精度はセグメンテーションの活用で改善できる
背景
以下の記事で検証されているように、GPT-4oの画像検出力のみに頼った場合、バウンディングボックス形式の物体検出の精度は正直微妙です。
この記事から、うまくいったパターンの画像(標識の検出)を引用しますが、以下の通り、ある程度はうまくいってますが、まだまだといった様子です。
うまくいっていないパターン(キノコの検出)では、かすりもしていません。
精度上げようとして失敗したパターン
画像にグリッド線を表示して、それを参考に答えさせることにしました。ロボットかどうかを判定するあれみたいなイメージで、付加的な情報があることで考えやすくなるかなと。
この場合、以下のような回答となりました。
この回答をわかりやすく以下に図解すると、完全に的はずれな位置を指定していることがわかります。
うまくいったパターン
信号機
グリッドでは与える情報としては不十分なのかと思い、適当なセグメンテーションを指示してその画像を基に考えてもらいました。
セグメンテーション後の画像は以下になります。
セグメンテーション自体は、ChatGPTでよしなに実行してくれてました。
生成してくれたコードは以下です。skimageのsegmentation実行しているだけですね。
# Import necessary modules
from skimage import segmentation, color, measure, io
import matplotlib.pyplot as plt
# Load the image
image_path = '/mnt/data/image.png'
image = io.imread(image_path)
# Perform SLIC (Simple Linear Iterative Clustering) segmentation
labels = segmentation.slic(image, compactness=30, n_segments=400, start_label=1)
# Mark boundaries on the original image and apply labels for visibility
segmented_image = color.label2rgb(labels, image, kind='avg', bg_label=0)
# Display the segmented image with segment numbers
plt.figure(figsize=(10, 10))
plt.imshow(segmented_image)
plt.axis('off')
# Get region properties and annotate each segment with its label number
regions = measure.regionprops(labels)
for region in regions:
# Get the centroid of the segment
y, x = region.centroid
plt.text(x, y, str(region.label), color='red', fontsize=6, ha='center', va='center')
plt.show()
ChatGPTの回答としては以下になります。
図解もしてもらいましたが、セグメンテーションなしの場合のことを思うと、明らかに精度が上がっていると考えて良さそうです。
(ただし、「信号機」ではうまくいかず、「信号機のライト」としてようやくうまくいきました)
キノコ
同様にキノコの方も試します。
セグメンテーション後の画像は以下になります。
ChatGPTの回答としては以下になります。
可視化するとわかりやすいですが、こちらは完璧に捉えられてますね。
嬉しいやら悲しいやら
このあと気づいたのですが、MetaのSegment Anything Model (SAM)とGPT-4Vを組み合わせると上手くいくという論文が実は1年前にマイクロソフトから出ていました。
スター数も1000を超えている、、、
また、解説&補足するZenn記事も既に存在します。
結論
1年遅れですが、マイクロソフト社員と同じ発想ができただけでもきっとすごいですね(完)
Discussion