点击下方卡片,关注「集智书童」公众号
作者丨深度眸@知乎(已授权转载) 来源丨https://zhuanlan.zhihu.com/p/628631687 编辑丨小书童
近两天港科大 LMFlow 团队 & 港大 NLP 实验室提出了一个针对特定场景下的多模态算法 DetGPT,其提出了一个新的**「推理式目标检测任务」** 。
推理式目标检测不同于我们常说的目标检测,它是基于用户输入描述,然后检测出和描述息息相关的物体。例如给定一张包括**「冰箱」** 的图片,然后用户输入:「我想要喝冷饮」 ,推理式检测会将冰箱标记处理,原因是一般冷饮要存储到冰箱里面。可以看出其相当于常规目标检测更通用化的做法。
可以预计的是一旦 DetGPT 的推理过程很鲁棒,将其嵌入到机器人中,机器人就能够直接理解用户质量,并且执行用户的命令例如前面说的他自己给你打开冰箱拿冷饮了,这样的机器人将会非常有趣。
基于 DetGPT 推理式检测我快速体验了下,并看了下实现。本文将对其原理进行简析,并在 OpenMMLab 的 Playground 中采用不同的实现方式进行了探索。
官方 project: https://detgpt.github.io/
作者也提供了在线体验地址
Playground: https://github.com/open-mmlab/playground/det\_gpt
如果本文对你有点帮助,或者有点意思,欢迎给 Playground star ~~~
1、任务简介
目前通用目标检测研究方向都朝着多模态大模型发展。除了图片输入外,目前新的研究大部分都会加入文本模态来提升性能。一旦加入文本模态后,通用检测算法就会出现一些非常好的性质,典型的如:
- 可以充分利用大量容易获取的文本数据来联合训练
- 容易实现开放词汇目标检测,进而通向真正的通用检测
- 可以和 NLP 中已经发布的超强模型联合使用,从而做到一些很有趣且实用的功能
从目前来看,通用目标检测可以分成两大类:
- 封闭集目标检测 Closed-Set Object Detection,即只能检测训练集出现的固定类别数的物体
- 开放集目标检测 Open-Set Object Detection,即可以检测训练集外的类别的物体 随着多模态算法的流行,开放类别的目标检测已经成为了新的研究方向,在这其中有 3 个比较热门的研究方向:
- Zero-Shot Object Detection,即零样本目标检测,其强调的是测试集类别不在训练集中
- Open-Vocabulary Object Detection,即开放词汇目标检测,给定图片和类别词汇表,检测所有物体
- Grounding Object Detection,即给定图片和文本描述,预测文本中所提到的在图片中的物体位置
而 DetGPT 做法可以简单归纳为:「Visual-Lang model + Grounding Object Detection」 。其首先使用 Visual-Lang model 生成句子中包括的物体类别,然后将类别词和图片输入到 Grounding 目标检测中。
如果用户输入的句子中包括了明确的待检测的类别,那么其实直接输入给 Grounding Object Detection 即可,因为内部会首先进行命名实体识别,然后再进行 Grounding 检测。因此推理式目标检测的核心就在于输入的句子是抽象的,需要模型进行推理解析。
2、DetGPT 原理简析
整体架构如上所示,可以发现和 MiniGPT-4 非常类似,采用的模型也几乎一样,实际上代码也是写的几乎一样。也是仅仅训练一个线性连接层,连接视觉特征和文本特征,其余模型参数全部估固定。和 MiniGPT-4 不同之处可能主要是数据集不一样,并且 LLM 选择的也可以不一样。
整个训练过程可以说是一个 PEFT 过程,核心在于跨模态文本-图片对的构建(后面细说),然后基于这个数据集进行微调即可。目前训练代码还没有开放,不过是说未来会开源。
根据官方描述:「针对文本推理检测任务,模型要能够实现特定格式(task-specific)的输出,而尽可能不损害模型原本的能力。为指导语言模型遵循特定的模式,在理解图像和用户指令的前提下进行推理和生成符合目标检测格式的输出,作者利用 ChatGPT 生成跨模态 instruction data 来微调模型。具体而言,基于 5000 个 coco 图片,他们利用 ChatGPT 创建了 3w 个跨模态图像 - 文本微调数据集。为了提高训练的效率,他们固定住其他模型参数,只学习跨模态线性映射」 。实验效果证明,即使只有线性层被微调,语言模型也能够理解细粒度的图像特征,并遵循特定的模式来执行基于推理的图像检测任务、表现出优异的性能。由于结构和 MiniGPT-4 太类似了,因此本文就不详细说明结构长啥样。
为了让大家一下子就理解推理过程,我绘制了如下结构图
视觉语义多模态模型会同时接受图片和文本,配合自定义的 prompt ,会以特定格式返回可以轻松解析的物体,例如上图中的,我想看电视,模型能够基于图片推断出实际上应该用遥控器,因此多模态模型会输出 remote control,然后将该文本和图片输入给 Grounding J检测算法,从而把遥控器检测出来。作者提供了一些有意思的结果,图像所示:
还是蛮有意思的。
3、DetGPT 数据集格式和制作过程
DetGPT 核心在于特定数据集构建,模型设计和PEFT做法是参考 MiniGPT-4 的。因此很有必要来看看数据集构建和 prompt。
首先作者制作的数据集格式样例如下所示:
{
"image\_id": "000000102331",
"task": "What is the person doing on the motorcycle?",
"answer": "In the image, the person is riding a motorcycle and performing tricks in the air. Therefore the answer is: [motorcycle stunts, performing tricks]"
},
{
"image\_id": "000000102331",
"task": "Find all the objects with wheels in the image.",
"answer": "In the image, there is a motorcycle present, which has wheels. Therefore the answer is: [motorcycle]"
},
{
"image\_id": "000000103723",
"task": "Find all animals present in the image.",
"answer": "In the image, there is an elephant present. There is no other animal present in the image. Therefore the answer is: [elephant]"
},
{
"image\_id": "000000103723",
"task": "Find all living beings present in this image.",
"answer": "In the image, there is an elephant present, as well as a person observing it. Therefore the answer is: [elephant, person]"
},
某张图片中可能包括了多个物体,作者针对不同构建了不同的 task 输入,对应的答案会采用固定格式组织,特别是最后,一定是 Therefore the answer is: [obj name],这样方便后续程序解析。作者没有仔细说明这个数据集是如何构建的,可能需要等到论文出来才知道。不过我们可以大胆猜测:
- 从 COCO 数据集中抽取 5000张图片和标注,其中包括实例级别标注和图片详细描述 coco_caption
- 基于 5000 张图片人为构建了 3w 条 task (至于是不是全部手动就不清楚了)
- 将 task 和coco_caption 按照一定的格式组织输入给 ChatGPT 让他提供回答
- 对回答进行人工筛选,保留高质量回复
在 LLM 中 Prompt 非常关键。可以从作者代码中查到 prompt。
首先 「system_message」 如下:
"You must strictly answer the question step by step:\n"
"Step-1. describe the given image in detail.\n"
"Step-2. find all the objects related to user input, and concisely explain why these objects meet the requirement.\n" \
"Step-3. list out all related objects existing in the image strictly as follows: <Therefore the answer is: [object\_names]>.\n" \
"If you did not complete all 3 steps as detailed as possible, you will be killed.\n
You must finish the answer with complete sentences."
中文解释是:
"你必须严格按照步骤回答问题:\n"
"第一步:详细描述给定的图像。\n"
"第二步:找出与用户输入相关的所有对象,并简要解释为什么这些对象符合要求。\n"
"第三步:按照以下格式严格列出图像中所有相关的对象:<因此答案是:[object\_names]>。\n"
"如果你没有尽可能地完成所有三个步骤,你将被杀死。\n"
"你必须用完整的句子完成回答。"
看起来对 LLM 非常严厉,有点吓人~~~
除了上述系统消息,在对话开始,还会再次强调:
Answer me with several sentences. End the answer by listing out target objects to my question strictly as follows: <Therefore the answer is: [object_names]>.
请用几个句子来回答我的问题,并以以下严格的格式列出与问题相关的目标对象:<因此答案是:[object_names]>。
「我后面的探索也是借用了这个 prompt 来自动解析格式。」
3、Playground 中探索
前面说过 DetGPT 作者是通过微调的方式来促使模型输出符合特定格式的输出。那如果不微调呢?或者说如果不专门微调而直接使用 MiniGPT-4 来实现这个功能效果如何?又或者将 LLM 模型换成 ChatGPT 呢?本项目就是做了这个比较简单的探索。
- 直接使用 MiniGPT-4,通过构造合适的 prompt 来实现推理式检测
- 不采用联合多模态算法,而是采用视觉+LLM 分离的无需训练的做法来实现推理式检测
至于说是探索呢?是因为这类任务暂时还没有评测指标,我们无法公平的进行对比不同做法在推理式目标检测上的性能。不过如果 DetGPT 作者如果公布了 5000 张图片的图片文本和检测框的对应结果,那么是可以采用常规目标检测评估指标的。但是一个新的难题是 prompt 不同性能会差异巨大,也难以公布比较~~~
3.1 探索 MiniGPT-4 推理式目标检测
这个部分我没有写专门的代码来实现,因为没有很大意义。因为推理式目标检测包括两个部分,我们其实只需要利用 MiniGPT-4 让其能够检测出物体类别就可以,接还是不接 Grounding 检测算法问题都不大。用户如果有兴趣实现,其实也很容易。只需要本地化部署 MiniGPT-4 ,并将其结果传给 Grounding 算法即可。
因此这里为了方便,我就直接本地部署了 MiniGPT-4 ,并构造了和 DetGPT 中类似的 prompt 来进行检测。如果你想知道如何本地部署,可以参考
https://github.com/hhaAndroid/awesome-mm-chat/blob/main/minigpt4.md
下面进行测试
翻译的话是:
给出的图片是一个有冰箱、水槽、炉子、微波炉和洗碗机的厨房。厨房光线充足,有白色墙壁和灰色台面。冰箱是不锈钢的,门上有一个饮水机。水槽有一个单水龙头和一个垃圾处理器。炉子有四个燃烧器和一个内置烤箱。微波炉在炉子上方,有一个转盘和一个通风口。洗碗机位于水槽旁边,有一个不锈钢门。
图像中与用户输入有关的物体是冰箱和水槽。冰箱可以用来储存冷饮,水槽可以用来在享用冷饮前清洗和冲洗杯子。这些物体符合与用户想要冷饮的输入有关的要求。
因此,答案是:冰箱和水槽。
答案居然有水槽,当然它也解释了说是因为 水槽可以用来在享用冷饮前清洗和冲洗杯子,我只能说你的想象力有点大~~~~
翻译的话是:
第一步:给定的图片显示两只猫躺在一条粉红色的毯子上。一只猫仰面躺着,前爪在空中,而另一只猫侧身躺着,爪子放在另一只猫的头上。这些猫看起来很放松,很满足。
第二步:图像中与用户输入的 "我想看电视 "有关的物体是躺在猫咪旁边的毯子上的遥控器。这些遥控器满足了让用户控制电视,改变频道或调整音量的要求。
第三步:[遥控器]
因此,答案是:【遥控器】。
这次完全回答对了。
翻译的话是:
第一步:
给定的图像显示一只猫站在一辆自行车附近。这只猫似乎正紧紧地盯着房间另一边的东西。这只猫是一只灰色和黑色条纹的国内短毛猫。自行车是标准的直立型,黑色车架,白色车轮,红色后轮胎。自行车靠在墙上,前轮放在地板上。
第二步:
猫和自行车都是与用户想带着喜欢的动物去远方旅行的输入有关的物体。猫代表了旅行和冒险的概念,因为它似乎在看向房间以外的东西。自行车代表了用户可能用来带他们最喜欢的动物去旅行的交通方式。
第三步:
[猫,自行车]
虽然答案对了,但是输出没有特别符合格式,虽然能用。
「整体来看 MiniGPT-4 其实已经有很强的指令跟随功能了,每次都能正确的按照我要求的格式输出,但是效果好像是差一点,输出格式不稳定,不是每次都会完全按照要求返回。同时 DetGPT 设置的 beam search 参数是 5,而由于机器显存有限,MiniGPT-4 中我只能设置为 1,否则会 OOM, 因此这个参数也有点影响。」
总的来说通过特定的数据集微调效果确实还是比 MiniGPT-4 好一些,但是 MiniGPT-4 也还行,如果能构建更好的 prompt 估计会更好。更多的尝试大家可以自己去体验。
下面探索采用强大的 ChatGPT 效果如何。
3.2 探索 BLIP+ChatGPT 推理式目标检测
这个部分已经在 Playground 中实现了,代码位于 simulate_det_gpt.py。
其实现原理也非常简单,如下所示:
左边是官方实现,右边是我的实现。相比于官方实现,我这个不需要训练,换成 BLIP2 或许会更好。
下面直接给出结果,安装和使用方法附加到后面。注意:你需要有 OpenAI Key 才能跑,如果没有 Key,那么你也可以修改代码,将 ChatGPT 换成其他开源 LLM 或者干脆直接使用开源的多模态算法。
「输入提示:I want to have a cold beverage # 我想要个冷饮」
也是可以正常推理出来的,而且 ChatGPT 还会告诉你这个是不锈钢冰箱。
「输入提示:I want to watch TV # 我想看电视」
模型正确理解了看电视需要遥控器,并成功检测出来了。
「输入提示:I want to take my favorite animal on a trip to a very faraway place # 我想带上我最喜欢的动物去很远的地方旅行」
模型理解了带心爱的动物去很远的地方旅行,需要找一辆自行车,并且带上猫~~~。
3.3 Playground 安装和使用过程
环境没有特别的要求,只要你能成功安装上 Grounding DINO 或者 GLIP 就行。无需多大的显存。
(1) 安装基础环境
conda create -n mmdet-sam python=3.8 -y
conda activate mmdet-sam
pip install torch==1.9.1+cu111 torchvision==0.10.1+cu111 -f https://download.pytorch.org/whl/torch_stable.html
pip install mmengine
git clone https://github.com/open-mmlab/playground.git
cd playground
(2) 安装其他依赖
pip install openai transformers
cd playground
pip install git+https://github.com/IDEA-Research/GroundingDINO.git # 需要编译 CUDA OP,请确保你的 PyTorch 版本、GCC 版本和 NVCC 编译版本兼容
# 下载权重
mkdir ../models
wget -P ../models/ https://github.com/IDEA-Research/GroundingDINO/releases/download/v0.1.0-alpha/groundingdino_swint_ogc.pth
(3) 安装 GLIP [可选]
cd playground
pip install git+https://github.com/facebookresearch/segment-anything.git
pip install einops shapely timm yacs tensorboardX ftfy prettytable pymongo transformers nltk inflect scipy pycocotools opencv-python matplotlib
git clone https://github.com/microsoft/GLIP.git
cd GLIP; python setup.py build develop --user # 需要编译 CUDA OP,请确保你的 PyTorch 版本、GCC 版本和 NVCC 编译版本兼容,暂时不支持 PyTorch 1.11+ 版本
# 权重下载
mkdir ../models
wget -P ../models/ https://penzhanwu2bbs.blob.core.windows.net/data/GLIPv1_Open/models/glip_a_tiny_o365.pth
上述就把环境安装好了,在运行前你需要设置环境变量
export OPENAI_API_KEY=YOUR_API_KEY
运行命令如下:
cd det_gpt
python simulate_det_gpt.py ../images/big_kitchen.jpg \
configs/GroundingDINO_SwinT_OGC.py \
../models/groundingdino_swint_ogc.pth \
'I want to have a cold beverage' # 我想要个冷饮
其中 BLIP 算法默认会用 CPU 跑,Grounding 算法用 GPU。如果想打印详细的运行过程和中间结果,可以设置 --verbose 参数。
4、总结
MiniGPT-4 和 ChatGPT3 都有不错的质量跟随能力。由于模型本身没有被专门微调过,因此在构造 prompt 时候非常关键,如果你设置的好那效果可能就非常棒了!专门进行微调的模型效果会更好,微调的一个关键就是不能微调 LLM 和视觉编码器部分,否则可能出现 shift。从上面的效果来看,有时候 LLM 可能会推理多了一个不需要的或者漏掉一些,一个非常容易解决的办法就是**「引入 LLM 天生具备的对话功能」** 。当 LLM 推理的命名实体不正确的时候,用户可以通过多次和 LLM 对话来修正结果,或者**「引入一些点或者框的交互,这样可以大大提供准确率,而无需完全依靠强大的视觉语言模型」** 。以上只是我个人的一些小验证,如果大家有更好的更酷的想法,也欢迎交流和沟通。
如果本文对你有点帮助或者能给你提供点启发,可以给 Playground star~~~ 谢谢~
palyground:https://github.com/open-mmlab/playground
最后提一句:
Playground:一个整合各类 OpenMMLab 有趣应用的平台。目前包括了很多有趣的应用,如
- 探索通过将闭集、开放词汇、Grounding 目标检测与 SAM 结合,实现实例分割领域的创新玩法。2。探索旋转框检测模型与 SAM 的结合,运用弱监督水平框检测技术实现旋转框目标检测。
- 探究开放目标检测与各类姿态估计算法的融合。
- 探索开放目标检测和视频任务相结合,轻松实现开放类别的视频跟踪和分割。5. 探索结合 MMOCR、SAM、和 Stable Diffusion 等技术实现字符分割、文本擦除和文本编辑功能
- 将 Label-Studio 和 SAM 结合实现半自动化标注,标注利器
欢迎大家来提 idea 或者试用,详情见如下链接
- OpenMMLab:OpenMMLab Playground:社区共探 SAM (https://zhuanlan.zhihu.com/p/621915394)
- 深度眸:简单说说 Playground 和 Segment Anything 结合的由来(https://zhuanlan.zhihu.com/p/622204180)
[
全新YOLO模型YOLOCS来啦 | 面面俱到地改进YOLOv5的Backbone/Neck/Head](https://mp.weixin.qq.com/s?__biz=MzU5OTA2Mjk5Mw==&mid=2247507908&idx=1&sn=7248cc2286665afac288b73799c51478&chksm=feb83f7ac9cfb66c8f4b89ecab183636aed33fb27b3096eb9ffa0b0b2d54616d95918c9f64ba&scene=21#wechat_redirect)
[
GPTQ-for-LLaMa 量化分析和优化](https://mp.weixin.qq.com/s?__biz=MzU5OTA2Mjk5Mw==&mid=2247507762&idx=1&sn=490168066ee44bfabf759f517ed3b65a&chksm=feb83f8cc9cfb69a7fed594b28bd34ecb5688f1fe76616ba0d44af33b557c78560bc17d9c924&scene=21#wechat_redirect)
[
目标检测落地Trick | Det-PTQ让2D和3D目标检测器都可以进行量化加速落地](https://mp.weixin.qq.com/s?__biz=MzU5OTA2Mjk5Mw==&mid=2247507259&idx=1&sn=3016cc0807e2c7d89916d80329a92c81&chksm=feb83d85c9cfb4935bd6499b0fb7c86595a737189a0430407adba3532ce196b03e55d2bf248f&scene=21#wechat_redirect)
扫码加入👉「集智书童」交流群
(备注: 方向+学校/公司+昵称 )
想要了解更多:
前沿AI视觉感知全栈知识👉「分类、检测、分割、关键点、车道线检测、3D视觉(分割、检测)、多模态、目标跟踪、NerF」
行业技术方案 👉「AI安防、AI医疗、AI自动驾驶」
AI模型部署落地实战 👉「CUDA、TensorRT、NCNN、OpenVINO、MNN、ONNXRuntime以及地平线框架」
欢迎扫描上方二维码,加入「 集智书童-知识星球 」,日常分享论文、学习笔记、问题解决方案、部署方案以及全栈式答疑,期待交流!
免责声明
凡本公众号注明“来源:XXX(非集智书童)”的作品,均转载自其它媒体,版权归原作者所有,如有侵权请联系我们删除,谢谢。
点击下方“ 阅读原文 ”,
了解更多AI学习路上的 「武功秘籍」