【利用GroundingDINO裁剪分类任务的数据集】及文本提示检测图像任意目标(Grounding DINO) 的使用

news2024/11/14 19:24:37

文章目录

  • 背景
  • 1.Grounding DINO安装
  • 2.裁剪指定目标的脚本

背景

  • 在处理公开数据集ImageNet-21k的时候发现里面有很多的数据有问题,比如,数据目标有很多背景,且部分类别有其他种类的图片。
  • 针对数据目标有很多背景,公开数据集ImageNet-21k的21k种类别进行裁剪。
  • 文本提示检测图像任意目标(Grounding DINO),这更模型可以很好的应用在这个场景。

1.Grounding DINO安装

github地址

  1. 从 GitHub 克隆 GroundingDINO 存储库。
git clone https://github.com/IDEA-Research/GroundingDINO.git
  1. 将当前目录更改为 GroundingDINO 文件夹。
cd GroundingDINO/
  1. 在当前目录中安装所需的依赖项。
pip install -e .
  1. 下载预训练模型权重。
mkdir weights
cd weights
wget -q https://github.com/IDEA-Research/GroundingDINO/releases/download/v0.1.0-alpha/groundingdino_swint_ogc.pth
cd ..
  1. 下载bert-base-uncased到text_encoder_type(自己创建一个文件夹)

需要下载下面的三个文件,放进text_encoder_type里面就好。
在这里插入图片描述

  1. 修改地址

修改/GroundingDINO/groundingdino/config/GroundingDINO_SwinT_OGC.py文件中text_encoder_type的路径。

在这里插入图片描述

  1. 如果您有 CUDA 环境,请确保设置了环境变量 CUDA_HOME 。如果没有可用的 CUDA,它将在仅 CPU 模式下编译。

  2. 可能遇到的bug

 Segmentation fault (core dumped)

是因为timm版本和cuda,pytorch等版本不匹配重新安装可以解决这个bug。

pip uninstall timm
pip install timm

2.裁剪指定目标的脚本

  1. 如下是测试的demo
import cv2

print("456")
from groundingdino.util.inference import load_model, load_image, predict, annotate

print("123")
model = load_model("groundingdino/config/GroundingDINO_SwinT_OGC.py", "weight/groundingdino_swint_ogc.pth", "cpu")
IMAGE_PATH = r"images/th.jpg"
TEXT_PROMPT = "dolphins"
BOX_TRESHOLD = 0.35
TEXT_TRESHOLD = 0.25
print("456")
image_source, image = load_image(IMAGE_PATH)

print("789")
boxes, logits, phrases = predict(
    model=model,
    image=image,
    caption=TEXT_PROMPT,
    box_threshold=BOX_TRESHOLD,
    text_threshold=TEXT_TRESHOLD
)

print("10")
print(boxes)
annotated_frame = annotate(image_source=image_source, boxes=boxes, logits=logits, phrases=phrases)
cv2.imwrite("annotated_image.jpg", annotated_frame)

在这里插入图片描述

在这里插入图片描述

  1. 裁剪指定目标的脚本

该脚本指定目录后,会对该目录下子文件夹的不同目标类别,进行裁剪并将裁剪结果放在与原路径对应的相对路径种。

脚本全部代码:

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

def save_cropped_images(image, boxes, image_name, output_folder):
    os.makedirs(output_folder, exist_ok=True)
    h, w, _ = image.shape
    boxes = boxes * torch.tensor([w, h, w, h])
    xyxy_boxes = box_convert(boxes=boxes, in_fmt="cxcywh", out_fmt="xyxy").numpy()

    for i, box in enumerate(xyxy_boxes):
        x_min, y_min, x_max, y_max = map(int, box)
        cropped_image = image[y_min:y_max, x_min:x_max]
        # Ensure the color channels are in BGR order for OpenCV
        cropped_image_bgr = cv2.cvtColor(cropped_image, cv2.COLOR_RGB2BGR)
        cv2.imwrite(f"{output_folder}/{image_name}_cropped_{i}.jpg", cropped_image_bgr)

def process_image(image_path, model, output_folder, box_threshold=0.35, text_threshold=0.25):
    image_source, image = load_image(image_path)
    try:
      boxes, logits, phrases = predict(
          model=model,
          image=image,
          caption=TEXT_PROMPT,
          box_threshold=box_threshold,
          text_threshold=text_threshold
      )
    except RuntimeError as e:
      print(f"RuntimeError: {e}")

    # Get the image name without extension
    image_name = os.path.splitext(os.path.basename(image_path))[0]

    # Save cropped images with image name included
    save_cropped_images(image_source, boxes, image_name, output_folder)

def process_images_in_folder(folder_path, model, box_threshold=0.35, text_threshold=0.25):
    folder_name = os.path.basename(folder_path.rstrip('/'))
    output_folder = os.path.join("/animals_classify/Cropped_Dataset/QuanKe", folder_name)
    print(f"{folder_name}, cropping.")
    # Start timer for processing this folder
    start_time = time.time()
    
    for filename in os.listdir(folder_path):
        if filename.endswith(".jpg") or filename.endswith(".png") or filename.endswith(".JPEG"):
            image_path = os.path.join(folder_path, filename)
            process_image(image_path, model, output_folder, box_threshold, text_threshold)
    
    # End timer for processing this folder
    folder_processing_time = time.time() - start_time
    process_images_in_folder.total_time += folder_processing_time
    
    print(f"{folder_name}, cropped. Time taken: {folder_processing_time:.2f} seconds")
    print(f"Total time taken so far: {process_images_in_folder.total_time:.2f} seconds")

# Initialize the total time taken to 0
process_images_in_folder.total_time = 0.0

# Configuration and model loading
model = load_model("groundingdino/config/GroundingDINO_SwinT_OGC.py", "weight/groundingdino_swint_ogc.pth")
TEXT_PROMPT = "canine"
BOX_THRESHOLD = 0.35
TEXT_THRESHOLD = 0.25

FOLDERS_PATH = "/animals_classify/Raw_Dataset/QuanKe"
for FOLDER_Name in os.listdir(FOLDERS_PATH):
	FOLDER_PATH = os.path.join(FOLDERS_PATH, FOLDER_Name)
	# Process all images in the folder
	process_images_in_folder(FOLDER_PATH, model, BOX_THRESHOLD, TEXT_THRESHOLD)

裁剪示例:
原图:
在这里插入图片描述

结果:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

TongRDS 2214 docker版指引(by lqw )

文章目录 前言准备工作中心节点服务节点哨兵节点 前言 部署docker版本,建议先参考TongRDS2214手动部署版指引(by lqwsy) 在本地手动部署了一套适合业务场景的rds 服务后,再通过dockerfile 打镜像。 准备工作 1.准备对应的安装包…

新书速览|HTML5+CSS3 Web前端开发与实例教程:微课视频版

《HTML5CSS3 Web前端开发与实例教程:微课视频版》 本书内容 《HTML5CSS3 Web前端开发与实例教程:微课视频版》秉承“思政引领,立德树人”的教育理念,自然融入多维度、深层次的思政元素,全面对标企业和行业需求&#x…

【Windows】实现窗口子类化(基于远程线程注入)

目录 前言 原理解释 完整项目 相关文献 文章出处链接:[https://blog.csdn.net/qq_59075481/article/details/140334106] 前言 众所周知,DLL 注入有多种用途,如热修补、日志记录、子类化等。本文重点介绍使用 DLL 注入对窗口进行子类化。…

技术文件国产化准备

技术文档的本地化涉及调整内容以满足特定目标市场的文化、语言和技术要求。这一过程超越了简单的翻译,确保文件在文化上适合预期受众,在技术上准确无误。适当的准备对于成功的本地化至关重要,以下步骤概述了一种全面的方法。 分析目标受众 …

022-GeoGebra中级篇-几何对象之直线与坐标轴

本文主要介绍一下GeoGebra中直线的常见输入方式,比如工具栏输入、表达式输入、函数输入,最后再把坐标轴的调用简单介绍一下。内容比起传统的教学更偏向于实战一些,若感兴趣欢迎继续阅读。 目录 一、直线1. 关于工具栏绘制(1&#…

Dify中的工具

Dify中的工具分为内置工具(硬编码)和第三方工具(OpenAPI Swagger/ChatGPT Plugin)。工具可被Workflow(工作流)和Agent使用,当然Workflow也可被发布为工具,这样Workflow(工…

macOS系统下载navicat安装包

链接: https://pan.baidu.com/s/1SqTIXNL-B8ZMJxIBu1DfIw?pwdc1z8 提取码: c1z8 安装后效果

【Android组件】封装加载弹框

📖封装加载弹框 ✅1. 构造LoadingDialog✅2. 调用LoadingDialog 效果: ✅1. 构造LoadingDialog 构造LoadingDialog类涉及到设计模式中的建造者模式,进行链式调用,注重的是构建的过程,设置需要的属性。 步骤一&#x…

流模型flow

流模型 Flow 超详解,基于 Flow 的生成式模型,从思路到基础到公式推导到模型理解与应用(Flow-based Generative Model)_generative flows-CSDN博客

做一个专业的声音分析系统,需要对声音那些评判标准进行计算

为了构建一个专业的声音分析系统,需要对以下评判标准进行计算。每个标准需要相应的算法和技术指标来实现。下面是一些关键的评判标准和如何计算这些标准的具体方法: 1. 音质 清晰度 信噪比(SNR):计算音频信号中的信…

Linux udp编程

我最近开了几个专栏,诚信互三! > |||《算法专栏》::刷题教程来自网站《代码随想录》。||| > |||《C专栏》::记录我学习C的经历,看完你一定会有收获。||| > |||《Linux专栏》&#xff1…

Milvus 核心概念(1) ---- 数据一致性的等级及使用场景

目录 背景 Milvus的数据一致性 设置数据一致性等级 等级类型 PACELC定理 level 详细解释 Strong Bounded staleness Session Eventually 总结 背景 分布式上的可扩展性是个比较重要的concept。Chroma 核心之前写过了,他的最大优势在于轻量级且好用。Milvus相对Ch…

C++ //练习 14.44 编写一个简单的桌面计算器使其能处理二元运算。

C Primer(第5版) 练习 14.44 练习 14.44 编写一个简单的桌面计算器使其能处理二元运算。 环境:Linux Ubuntu(云服务器) 工具:vim 代码块 /**********************************************************…

轻松理解c++17的string_view

文章目录 轻松理解c17的string_view设计初衷常见用法构造 std::string_view常用操作作为函数参数 注意事项总结 轻松理解c17的string_view std::string_view 是 C17 引入的一个轻量级、不拥有(non-owning)的字符串视图类。它的设计初衷是提供一种高效、…

今天小编强烈推荐几款国产APP!

AI视频生成:小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频https://aitools.jurilu.com/ 今天小编强烈推荐几款国产APP,算得上是国产之光。如果能帮助到大家,别忘了给小编点点赞加关注哟!更多精彩还在后面。 一、…

第二证券:转股溢价率是什么意思?高好还是低好?

转股溢价率是指可转债在商场上的交易价格相对于其转股价值的溢价份额,能够用来衡量投资者为取得将债券转换为股票权力而付出的额定金额,是可转债的重要指标。 转股溢价率的核算公式为:溢价率=(转债价格-转股价值&…

C++ 重载运算符 addition (+), subtraction (-) and multiplication (*)

C 重载运算符 addition , subtraction - and multiplication * 1. Operator Overloading (运算符重载)2. Developing an Operator Overloading Example2.1. Adding an Addition Operator (添加加法运算符)2.2. Overloading Restrictions (重载限制)2.3. 重载运算符 - 和 * Refe…

数字统计

import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别// 注意 while 处理多个 caseint a in.nextInt();i…

拯救中国足球,要不尝试一下DDD事件风暴?

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 张逸老师写了新文章《领域建模的常见问题及解决方案》,我来谈一谈对这篇文章的感想。 (1)文章一开始,张逸老师大大地赞扬了事件风暴&am…

Linux系统中磁盘管理LVM与挂载

Linux系统中磁盘管理LVM与挂载 本文以属于Linux系统基本概念,如果以查找教程教程,解决问题为主,只需要查看本文后半部分。如需要系统性学习请查看本文前半部分。 本文操作极容易导致主机无法自动重启,请慎重操作。操作前务必要进…