Gemini目标检测实测
我们熟悉 Gemini 令人印象深刻的多模态能力,尤其是在推理图像数据时——无论是字幕、OCR、分类还是识别图像中的特定内容。
与其开放模型对手 PaliGemma 不同,Gemini 模型并未专门针对对象检测任务进行训练。这一事实促使我进行了一些实验并撰写了这篇博客。
注意:在这里,当我们谈论对象检测时,我们的意思是通过绘制边界框来识别和定位对象,就像 YOLO、DETR、EfficientDet、Florence-2 和 PaliGemma 等模型一样。
所以,事不宜迟,让我们来看看 Gemini 是否可以执行对象检测和定位。如果是,在多大程度上?
1、代码实现
我们只需要 Gemini API 密钥—不需要其他任何东西。我假设你已经熟悉 Gemini API。如果还不熟悉,请查看此博客以了解如何在 Google AI Studio 上创建 Gemini API 密钥。
点击这里打开存储库中提供的 Colab 笔记本。
第1步:安装必要的库和依赖项
# Install Generative AI SDK.
!pip install -q -U google-generativeai
# Import libraries
from google.colab import userdata
import google.generativeai as genai
import re
from PIL import Image
import cv2
import numpy as np
第 2 步:配置 API 密钥和模型
你可以随意选择 Gemini 1.5 Flash 或 Gemini 1.5 Pro,以喜欢为准。
API_KEY = userdata.get('gemini')
genai.configure(api_key=API_KEY)
model = genai.GenerativeModel(model_name='gemini-1.5-pro')
第3步:传递输入图像和文本提示
使用示例使文本提示清晰简单。对于此案例,我们要求 Gemini 给出边界框坐标,如下所示: [ymin, xmin, ymax, xmax, object_name]
。
input_image = "image.jpg" # @param {type : 'string'}
img = Image.open(input_image)
response = model.generate_content([
img,
(
"Return bounding boxes for all objects in the image in the following format as"
" a list. \n [ymin, xmin, ymax, xmax, object_name]. If there are more than one object, return separate lists for each object"
),
])
result = response.text
第4步:解析模型响应
def parse_bounding_box(response):
bounding_boxes = re.findall(r'\[(\d+,\s*\d+,\s*\d+,\s*\d+,\s*[\w\s]+)\]', response)
# Convert each group into a list of integers and labels.
parsed_boxes = []
for box in bounding_boxes:
parts = box.split(',')
numbers = list(map(int, parts[:-1]))
label = parts[-1].strip()
parsed_boxes.append((numbers, label))
# Return the list of bounding boxes with their labels.
return parsed_boxes
bounding_box = parse_bounding_box(result)
第 5 步:绘制边界框
模型提供的边界框坐标必须通过将图像的高度和宽度除以 1000 进行归一化。
label_colors = {}
def draw_bounding_boxes(image, bounding_boxes_with_labels):
if image.mode != 'RGB':
image = image.convert('RGB')
image = np.array(image)
for bounding_box, label in bounding_boxes_with_labels:
# Normalize the bounding box coordinates.
width, height = image.shape[1], image.shape[0]
ymin, xmin, ymax, xmax = bounding_box
x1 = int(xmin / 1000 * width)
y1 = int(ymin / 1000 * height)
x2 = int(xmax / 1000 * width)
y2 = int(ymax / 1000 * height)
if label not in label_colors:
color = np.random.randint(0, 256, (3,)).tolist()
label_colors[label] = color
else:
color = label_colors[label]
font = cv2.FONT_HERSHEY_SIMPLEX
font_scale = 0.5
font_thickness = 1
box_thickness = 2
text_size = cv2.getTextSize(label, font, font_scale, font_thickness)[0]
text_bg_x1 = x1
text_bg_y1 = y1 - text_size[1] - 5
text_bg_x2 = x1 + text_size[0] + 8
text_bg_y2 = y1
cv2.rectangle(image, (text_bg_x1, text_bg_y1), (text_bg_x2, text_bg_y2), color, -1)
cv2.putText(image, label, (x1 + 2, y1 - 5), font, font_scale, (255, 255, 255), font_thickness)
cv2.rectangle(image, (x1, y1), (x2, y2), color, box_thickness)
image = Image.fromarray(image)
return image
output = draw_bounding_boxes(img, bounding_box)
这就是代码的全部内容。现在是时候评估它在某些图像上的表现了。
2、检测示例
让我们从一个简单的例子开始。
只有一个对象的图像。这是我的照片。这里唯一的对象是人。
提示:
Return bounding boxes for person in the image in the following format as a list. [ymin, xmin, ymax, xmax, object_name].
很好的开始,现在让我们尝试使用多个对象。
包含多个对象的图像。一张狗和自行车的图像。
提示:
Return bounding boxes for all the objects in the image in the following format as a list. [ymin, xmin, ymax, xmax, object_name]. If there are more than one object, return separate lists for each object.
还不错。它成功地准确地检测到了物体,但这些都是常见的物体,对吧?让我们进一步挑战 Gemini。
我有一张来自Ramayan的著名画作“Ram Darbar”的图片。让我们看看 Gemini 能否识别和检测所有的角色。
提示:
This is a painting of “Ram Darbar” from Ramayan. Return bounding boxes for all the characters in the image in the following format as a list. [ymin, xmin, ymax, xmax, character_name].
这真是太棒了。它不仅绘制了边界框,还准确识别了每个角色,这让我印象深刻,尤其是因为我特别要求输入他们的名字。
是时候测试一些非常规图像了。我画了阿尔伯特·爱因斯坦(抱歉,这是我能做的最好的)。让我们试一试。
一张绘画图片
提示:
Return name and bounding boxes of a famous personality in the image in the following format as a list [ymin, xmin, ymax, xmax, object_name].
哇哦,猜猜怎么着?我画画还不错。或者也许双子座足够聪明,能认出这是爱因斯坦。😜
欢迎直接尝试Hugging Face🤗空间:
3、结束语
经过对不同图像的一系列测试:从识别人物和物体到识别绘画和素描中的人物,再到使用边界框准确定位,Gemini 确实满足了我对物体检测的期望。
我个人不会将 Gemini 与专门为物体检测而设计的模型进行比较,因为它的优势在于不同的领域。然而,这个实验满足了我的好奇心:是的,它可以很好地管理检测任务,并且能够检测几乎任何物体。
原文链接:Yes, Gemini can do object detection
汇智网翻译整理,转载请标明出处