利用Grounding DINO进行自动标注——目标检测任务——YOLO格式

news2025/2/25 0:11:00

关于Grounding DINO的环境搭建可以参考我的以前的博客,链接如下所示

如何在Linux上离线部署Grounding DINO-CSDN博客

这个博客主要来介绍如何利用Grounding DINO这个项目去进行目标检测的自动化标注。并且给出了相关的代码已经实验验证。

1.数据集准备

 

 2. 开始实验

2.1 批量标注参考代码如下:

import os
import cv2
import torch
from torchvision.ops import box_convert
from groundingdino.util.inference import load_model, load_image, predict, annotate

# 配置路径
MODEL_CONFIG_PATH = "groundingdino/config/GroundingDINO_SwinT_OGC.py"
MODEL_WEIGHTS_PATH = "weights/groundingdino_swint_ogc.pth"
PROJECT_ROOT="Auto_label/Project1/" # 自动检测的根路径
IMAGE_FOLDER = PROJECT_ROOT + "images"  # 输入图片文件夹
OUTPUT_FOLDER = PROJECT_ROOT + "detect_results"  # 输出标注图片的文件夹
LABELS_FOLDER = PROJECT_ROOT + "labels"  # 输出YOLO标签的文件夹
CLASSES_FILE = PROJECT_ROOT + "classes.txt"  # 类别文件

# YOLO标签格式转换函数
def convert_to_yolo_format(xyxy, image_width, image_height):
    """
    将 `xyxy` 坐标转换为 YOLO 格式的 `x_center, y_center, width, height`
    """
    x_min, y_min, x_max, y_max = xyxy
    x_center = (x_min + x_max) / 2.0 / image_width
    y_center = (y_min + y_max) / 2.0 / image_height
    width = abs(x_max - x_min) / image_width
    height = abs(y_max - y_min) / image_height
    return x_center, y_center, width, height

# 加载类别文件
def load_classes(classes_file):
    with open(classes_file, "r") as f:
        return [line.strip() for line in f.readlines()]

# 主检测与标签生成函数
def process_images(model, classes, image_folder, output_folder, labels_folder):
    os.makedirs(output_folder, exist_ok=True)
    os.makedirs(labels_folder, exist_ok=True)

    for image_file in os.listdir(image_folder):
        if not image_file.lower().endswith(('.png', '.jpg', '.jpeg')):
            continue

        # 加载图片
        image_path = os.path.join(image_folder, image_file)
        image_source, image = load_image(image_path)
        h, w, _ = image_source.shape

        # 推理检测
        boxes, logits, phrases = predict(
            model=model,
            image=image,
            # caption="car . coach . bus . truck . tricycle . person . twowheelsvehicle . taxi . license_plate . other_vehicles",
            caption="person . car . dog . cat",
            box_threshold=0.35, #0.35
            text_threshold=0.25 # 0.25
        )

        # 缩放坐标并转换为 `xyxy`
        yolo_boxes = boxes * torch.Tensor([w, h, w, h])
        xyxy_boxes = box_convert(boxes=yolo_boxes, in_fmt="cxcywh", out_fmt="xyxy").numpy()

        # 创建YOLO标签文件
        label_file = os.path.join(labels_folder, os.path.splitext(image_file)[0] + ".txt")
        with open(label_file, "w") as label_f:
            for xyxy, phrase in zip(xyxy_boxes, phrases):
                # 获取类别索引
                class_idx = classes.index(phrase) if phrase in classes else -1
                if class_idx == -1:
                    continue  # 跳过不在类别文件中的目标
                
                # 转换坐标格式
                x_center, y_center, width, height = convert_to_yolo_format(xyxy, w, h)
                
                # 写入YOLO标签文件
                label_f.write(f"{class_idx} {x_center:.6f} {y_center:.6f} {width:.6f} {height:.6f}\n")

        # 标注图片并保存
        annotated_frame = annotate(image_source=image_source, boxes=boxes, logits=logits, phrases=phrases)
        output_image_path = os.path.join(output_folder, image_file)
        cv2.imwrite(output_image_path, annotated_frame)

        print(f"Processed {image_file}, labels saved to {label_file}, annotated image saved to {output_image_path}")

# 主函数
if __name__ == "__main__":
    # 加载模型和类别
    model = load_model(MODEL_CONFIG_PATH, MODEL_WEIGHTS_PATH)
    classes = load_classes(CLASSES_FILE)

    # 处理图片并生成标签
    process_images(model, classes, IMAGE_FOLDER, OUTPUT_FOLDER, LABELS_FOLDER)

上面的注释非常详细了,就不过多赘述了。

主要根据自己的环境修改以下内容

  1. 配置路径
  2. 提示词

2.2 开始实验

我主要想检测,因此我的提升词设置如下:

caption="person . car . dog . cat",

检测结果

Auto_label/Project1/detect_results文件夹

 标签文件

Auto_label/Project1/labels文件夹

2.3 实验验证

分析获得标签是否正确,可以可视化标签,可视化标签代码可以参考我以前的博客,链接如下所示

目标检测-可视化YOLO格式标签_yolo标签可视化-CSDN博客

 非常的完美!!!

最近有更新了Grounding DINO-X,其效果更好,链接如下

GitHub - IDEA-Research/DINO-X-API: DINO-X: The World's Top-Performing Vision Model for Open-World Object Detection and Understanding

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2255362.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1.使用docker 部署redis Cluster模式 集群3主3从

1.使用docker 部署redis Cluster模式 集群3主3从 1.1 先安装docker 启动docker服务,拉取redis镜像 3主3从我们要在docker启动6个容器docker run --name redis-node-1 --net host --privilegedtrue -v /data/redis/share/redis-node-1:/data redis:6.0.8 --cluster-…

开发类似的同款小程序系统制作流程

很多老板想要开发一款和别人家类似的同款小程序系统,但是不知道该怎么开发制作,本文就为大家详细介绍一下开发类似的同款小程序的流程为大家做参考。 一、前期准备找到对标小程序:首先,需要找到你想要模仿的同款小程序&#xff0…

Jenkins凭据管理及使用详解

简介:Jenkins凭据管理是指对Jenkins中存储的敏感信息进行管理的功能,这些信息通常用于认证和授权,以确保Jenkins能够安全地与其他系统和服务进行交互。以下是关于Jenkins凭据管理添加及作用的详细介绍: 一、Jenkins凭据管理的添加 进入凭据管理页面: 登录Jenkins后,点击…

车载VR可视化解决方案

车载VR可视化解决方案是通过融合跟踪用户头部运动的特殊预测算法与惯性测量数据而开发的。该系统将大范围虚拟现实跟踪技术与IMU传感器相结合,为VR和AR应用打造了一套全面的运动跟踪与渲染流程,极大地方便了虚拟现实头显制造商定制可视化流程。 该车载VR…

鸿蒙实现数据管理

目录: 1、鸿蒙实现数据管理的三种方式2、用户首选项3、键值型数据管理3.1、获取KVManager实例,用于管理数据库对象3.2、创建并获取键值数据库3.3、调用put()方法向键值数据库中插入数据3.4、调用get()方法获取指定键的值3.5、调用delete()方法删除指定键…

【环境搭建】WordPress本地部署搭建及历史版本插件安装(windows系统)

🏘️个人主页: 点燃银河尽头的篝火(●’◡’●) 如果文章有帮到你的话记得点赞👍收藏💗支持一下哦 【环境搭建】WordPress本地部署搭建及历史版本插件安装(windows系统) WordPress搭建环境部署(…

【教程】创建NVIDIA Docker共享使用主机的GPU

转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 这套是我跑完整理的。直接上干货,复制粘贴即可! # 先安装toolkit sudo apt-get update sudo apt-get install -y ca-certifica…

突破空间限制!从2D到3D:北大等开源Lift3D,助力精准具身智能操作!

文章链接:https://arxiv.org/pdf/2411.18623 项目链接:https://lift3d-web.github.io/ 亮点直击 提出了Lift3D,通过系统地提升隐式和显式的3D机器人表示,提升2D基础模型,构建一个3D操作策略。 对于隐式3D机器人表示&a…

详解MySQL安装

目录 Ubantu 1. 使⽤apt安装MySQL 2.查看MySQL状态 3. MySQL 安装安全设置 4.设置密码 卸载MySQL Centos 1. 确认当前的系统版本 2.下载MySQL源 3.安装MySQL 4.启动mysqld 5.查看MySQL状态 6.设置开机自启动 7.查看MySQL密码,并登录 8.修改密码 Ubant…

Java线程的interrupt中断、wait-notify/all(源码级分析)

实例方法: interrupt()方法是设置结束阻塞(sleep、),并且设置中断标记true isInterrupted()判断当前是否中断 静态方法: Thread.interrupted():调用这个方法的线程中断标记位还原为false 那么好,既然上面的方法作用是清晰的&…

[Python学习日记-70] 元类

[Python学习日记-70] 元类 简介 什么是元类 关键字 class 创建类的流程分析 自定义元类控制类的创建 自定义元类控制类的调用 自定义元类的属性查找 自定义元类的应用与练习 简介 在上一篇章当中我们已经了解了面向对象的各种内置函数了,本篇我们将讲述“元类…

【前端】浏览器输入url到页面呈现发生了什么?

前言 在此总结记录下浏览器输入url到页面呈现期间的流程。 浏览器输入url发生了什么? 从浏览器地址栏上输入url到页面渲染主要分为以下流程: 解析请求url,建立连接发送请求浏览器渲染页面 在输入url地址后,浏览器识别输入的是…

深入云电脑PC Farm技术探讨,以阿里云、华为云、ToDesk为例

🌝引言 近年来,云计算技术的飞速发展为各行各业的数字化转型带来了全新机遇,其中云电脑作为一种虚拟化桌面解决方案,逐渐成为个人用户与企业的核心选择。从远程办公、在线教育到高性能计算需求,云电脑通过为用户提供随…

Windows中MySQL8.3.4 MSI版本——详细安装教程

一、下载MySQL安装文件。 下载地址:MySQL官网 进入后点击下面的MySQL社区版下载 点击MySQL Comunity Server。 我这里选择的是版本8.4.3LTS版本,在线对应的msi文件。 点击No thanks,直接下载。 二、安装MySQL 2.1、双击刚刚下载好的msi文件,…

Appium:安装uiautomator2失败

目录 1、通过nmp安装uiautomator2:失败 2、通过 Appium 的平台直接安装驱动程序 3、通过pip 来安装 uiautomator2 1、通过nmp安装uiautomator2:失败 我先是通过npm安装的uiautomator2,也显示已经安装成功了: npm install -g …

计算机网络-IPSec VPN基本概念

企业分支之间经常有互联的需求,企业互联的方式很多,可以使用专线线路或者Internet线路。部分企业从成本和需求出发会选择使用Internet线路进行互联,但是使用Internet线路存在安全风险,如何保障数据在传输时不会被窃取?…

【Linux】环境ChatGLM-4-9B 模型之 openai API 服务

一、摘要 最近看到 Function Call 比较感兴趣,它的核心是赋予大模型能够调用外部API的能力,能够解决大模型功能扩展性问题,允许模型调用外部数据库或API,提供特定领域的详细信息;解决信息实时性问题,模型可以实时获取最新数据;解决数据局限性问题,大模型训练数据虽多但…

实践教程|Transformer Decoder-Only 模型批量生成 Trick

导读 本文给出了一个用单Transformer decoder( GPT)模型进行批量生成时的解决方法。 发现用单 Transformer decoder (Aka GPT)模型进行生成时,因为位置对齐等问题,进行批量生成时十分麻烦。 训练时&#…

【NoSQL数据库】MongoDB数据库——文档的查询操作(多条件查询、聚合aggregate、管道)

往期文章: ​​​​​​【NoSQL数据库】MongoDB数据库的安装与卸载-CSDN博客 【NoSQL数据库】MongoDB数据库——集合和文档的基本操作(创建、删除、更新、查询)-CSDN博客 目录 一、MongoDB文档查询原理 1、使用 find() 方法进行文档基本…

git pull error: cannot lock ref

Git: cannot lock ref ‘refs/remotes/origin/feature/xxx’: refs/remotes/origin/feature/xxx/car’ exists; cannot create refs/remotes/origin/feature/xxx git remote prune origin重新整理服务端和本地的关联关系即可