Gemini 可以进行目标检测了!

科技   2024-11-10 10:06   中国香港  

点击上方小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

我们对Gemini印象深刻的多模态能力已经很熟悉了,特别是在涉及图像数据推理时——无论是涉及图像描述、OCR、分类,还是识别图像中的特定内容。与其开放模型对应物PaliGemma不同,Gemini模型并没有明确针对目标检测任务进行训练。这一事实促使我进行一些实验并撰写这篇博客。   
PaliGemma链接:https://ai.google.dev/gemma/docs/paligemma
注意:在这里,当我们谈论目标检测时,我们指的是通过绘制边界框来识别和定位对象,就像YOLO、DETR、EfficientDet、Florence-2和PaliGemma等模型所做的那样。
先决条件
我们只需要Gemini的API密钥——别无他物。我假设你已经熟悉Gemini API。如果你不熟悉,请查看这篇博客,了解如何在Google AI Studio上创建你的Gemini API密钥。打开仓库中的Colab笔记本:https://github.com/NSTiwari/Object-Detection-using-Gemini
步骤1:安装必要的库和依赖项
# Install Generative AI SDK.!pip install -q -U google-generativeai
# Import librariesfrom google.colab import userdataimport google.generativeai as genaiimport refrom PIL import Imageimport cv2import 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)
让我们从一个简单的例子开始:
目标:单个对象的图像
提示:以列表格式返回图像中人物的边界框。[ymin, xmin, ymax, xmax, object_name]。
好的开始,现在让我们尝试多个对象。
目标:多个对象的图像
提示:以列表格式返回图像中所有对象的边界框。[ymin, xmin, ymax, xmax, object_name]。如果有一个以上的对象,请为每个对象返回单独的列表。
狗和自行车
一点也不差。它准确地检测到了对象,但这些都是常见的对象,对吧?让我们进一步挑战Gemini。我有一张著名的画作“Ram Darbar”的图片,来自《罗摩衍那》。让我们看看Gemini是否能识别和检测画中的所有角色。
提示:这是《罗摩衍那》中“Ram Darbar”的一幅画。以列表格式返回图像中所有角色的边界框。[ymin, xmin, ymax, xmax, character_name]。
《罗摩衍那》中的Ram Darbar画作
我印象深刻的是,它不仅绘制了边界框,还准确地识别了每个角色,尤其是当我特别要求他们的名字时。是时候测试一些非传统图像了。我画了阿尔伯特·爱因斯坦(抱歉,这是我能做的最好的了)。让我们试一试。
目标:一幅绘画的图片
提示:以列表格式返回图像中著名人物的名称和边界框。[ymin, xmin, ymax, xmax, object_name]。
作者画的阿尔伯特·爱因斯坦
在对不同图像进行一系列测试后:从识别人和物体到识别绘画和绘画中的人物,并准确地用边界框定位它们,Gemini确实满足了我对目标检测的期望。我个人不会将Gemini与专门设计用于目标检测的模型进行比较,因为它的优势在于不同的领域。然而,这个实验满足了我的好奇心:它能够很好地处理检测任务,并且能够检测几乎所有的物体。
下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲
小白学视觉公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲
小白学视觉公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群


欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~


小白学视觉
哈工大在读博士的公众号,《OpenCV 4快速入门》的作者,面向初学者介绍计算机视觉基础知识、OpenCV使用、SLAM技术,深度学习等内容。
 最新文章