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

汇智网翻译整理,转载请标明出处