目录
- 参考文献:需要本文的详细复现过程的项目源码、数据和预训练好的模型可从该地址处获取完整版:地址
目标检测发展历程
目标检测作为计算机视觉领域的一项重要任务,旨在从图像中准确地识别并定位出感兴趣的目标。近年来,随着深度学习技术的快速发展,目标检测算法取得了显著的进展。本文将带您回顾目标检测技术的发展历程,从早期的二阶段算法,到YOLO系列,再到如今的Grounding Dino。
二阶段目标检测算法
R-CNN(Regions with CNN features)
R-CNN是第一个将深度学习应用于目标检测的算法,于2014年由Girshick等人提出。R-CNN采用选择性搜索算法提取候选区域,然后利用卷积神经网络(CNN)提取特征,最后通过支持向量机(SVM)进行分类。
Fast R-CNN
为了解决R-CNN速度慢、重复计算的问题,Girshick于2015年提出了Fast R-CNN。Fast R-CNN采用ROI(Region of Interest)Pooling层,实现了候选区域的共享特征提取,大大提高了检测速度。
Faster R-CNN
2015年,Ren等人在Fast R-CNN的基础上提出了Faster R-CNN。Faster R-CNN引入了区域建议网络(RPN),实现了候选区域的端到端训练,进一步提高了检测速度和准确性。
YOLO系列
YOLO(You Only Look Once)模型是一种流行的实时目标检测算法,它将目标检测任务视为一个单一的回归问题,通过单个卷积神经网络(CNN)同时预测多个边界框和类别概率,实现了端到端的快速检测,极大地提高了检测速度,同时保持了较高的准确性,使其在视频监控、自动驾驶等实时应用场景中具有广泛的应用价值。
Grounding Dino
Grounding Dino模型是一种创新的视觉目标检测方法,它结合了自然语言处理和计算机视觉的技术,通过使用Transformer架构来实现对图像中目标的定位和描述。
第一段:模型架构 Grounding Dino模型的核心是一个基于Transformer的编码器-解码器结构。编码器用于提取图像的特征,而解码器则负责将自然语言查询与图像特征进行匹配,生成目标的定位信息。这种架构允许模型理解图像内容与文本描述之间的关联,从而无需传统的边界框标注,直接通过文本指令来定位图像中的目标。
第二段:工作原理 在执行目标检测时,Grounding Dino模型接收一个图像和一个相关的文本查询作为输入。模型首先使用编码器提取图像的深层特征,然后解码器将这些特征与文本查询中的单词进行交互,通过注意力机制找出与查询最相关的图像区域。最终,模型输出一个定位热图,指示查询文本所指目标在图像中的位置。
第三段:优势与应用 Grounding Dino模型的优势在于其无需精确的边界框标注,降低了数据准备的成本,并且能够处理细粒度的目标检测任务。此外,由于其基于文本的查询机制,模型在处理复杂场景和具有描述性需求的应用中表现出色。这使得Grounding Dino在图像检索、交互式视觉问答系统等领域具有广泛的应用潜力。
演示效果
TEXT_PROMPT = “chair . person . dog . cat .”
TEXT_PROMPT = “chair . person . dog . cat .”
Grounding DINO
Model Overall (总体架构)
输入: Input Text: 输入文本,例如“cat . person . mouse .”或“A cat sets on a
table.” Input Image: 输入图像。 Text and Image Backbone Networks
(文本和图像主干网络)Text Backbone: 提取文本特征。 Image Backbone: 提取图像特征。 Feature Enhancer
(特征增强器)接收原始的文本特征和图像特征,并对其进行增强处理。 Cross-Modality Decoder (跨模态解码器)
Language-guide Query Selection: 根据语言信息选择查询。 Cross-Modality Queries:
生成跨模态查询。 Model Outputs (模型输出)
包括对比损失(Contrastive loss)和定位损失(Localization loss)。
Feature Enhancer (特征增强器)
功能模块:
- Text-to-image Cross-Attention: 利用文本特征对图像特征进行增强。
- Image-to-text Cross-Attention: 利用图像特征对文本特征进行增强。
- Self-Attention Mechanism: 对文本和图像特征进行自注意力处理。
- Feed Forward Network (FFN): 对增强后的特征进行进一步处理。
流程:
- 文本特征和图像特征分别经过各自的主干网络得到初步表示。
- 这些初步表示被送入特征增强器中。
- 特征增强器首先通过文本到图像的跨注意力机制增强图像特征,然后通过图像到文本的跨注意力机制增强文本特征。
- 增强后的特征再经过自注意力机制进一步优化。
- 最后,通过前馈神经网络(FFN)对特征进行最终处理。
A Decoder Layer (解码器层)
功能模块:
- Cross-Modality Attention: 更新跨模态查询。
- Self-Attention Mechanism: 对文本和图像特征进行自注意力处理。
- Feed Forward Network (FFN): 对处理后的特征进行进一步处理。
流程:
- 跨模态查询通过跨模态注意力机制进行更新。
- 更新后的查询与文本和图像特征一起进入解码器层。
- 解码器层首先对文本和图像特征进行自注意力处理。
- 然后,通过前馈神经网络(FFN)对特征进行进一步处理。
Grounding DINO使用代码
预测多个类别
from groundingdino.util.inference import load_model, load_image, predict, annotate
import cv2
model = load_model("groundingdino/config/GroundingDINO_SwinT_OGC.py", "groundingdino/weights/groundingdino_swint_ogc.pth")
IMAGE_PATH = ".asset/cat_dog.jpeg"
TEXT_PROMPT = "chair . person . dog . cat ."
BOX_TRESHOLD = 0.35
TEXT_TRESHOLD = 0.25
image_source, image = load_image(IMAGE_PATH)
boxes, logits, phrases = predict(
model=model,
image=image,
caption=TEXT_PROMPT,
box_threshold=BOX_TRESHOLD,
text_threshold=TEXT_TRESHOLD,
device="cuda"
)
annotated_frame = annotate(image_source=image_source, boxes=boxes, logits=logits, phrases=phrases)
cv2.imwrite("annotated_image.jpg", annotated_frame)
模型训练
- 将model.eval()改成model.train()
- 修改代码67,68行
- 微调训练框架
from groundingdino.util.inference import load_model, load_image, predict, annotate
import cv2
model = load_model("groundingdino/config/GroundingDINO_SwinT_OGC.py", "groundingdino/weights/groundingdino_swint_ogc.pth")
"""
for epoch in range(epoches):
# 加载符合模型数据集标准的数据:每一次输入是一个列表,每一项是一个字典
for data in train_dataloader:
IMAGE_PATH=data['image_path']
image_source, image = load_image(IMAGE_PATH)
boxes, logits, phrases = predict(
model=model,
image=image,
caption=TEXT_PROMPT,
box_threshold=BOX_TRESHOLD,
text_threshold=TEXT_TRESHOLD,
device="cuda"
)
loss=loss_function(output,data['real_predict'])
optimiezer.zero_gard()
loss.backward()
optimiezer.step()
"""
模型部署
安装依赖配置
设置环境变量
- 然后进入附件中:
pip install .
- 最后,运行代码
python demo.py
- 参考文献:需要本文的详细复现过程的项目源码、数据和预训练好的模型可从该地址处获取完整版:地址