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

文章目录

  • 背景
  • 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 cv2print("456")
from groundingdino.util.inference import load_model, load_image, predict, annotateprint("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_convertdef save_cropped_images(image, boxes, image_name, output_folder):os.makedirs(output_folder, exist_ok=True)h, w, _ = image.shapeboxes = 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 OpenCVcropped_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 extensionimage_name = os.path.splitext(os.path.basename(image_path))[0]# Save cropped images with image name includedsave_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 folderstart_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 folderfolder_processing_time = time.time() - start_timeprocess_images_in_folder.total_time += folder_processing_timeprint(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.25FOLDERS_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 folderprocess_images_in_folder(FOLDER_PATH, model, BOX_THRESHOLD, TEXT_THRESHOLD)

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

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

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

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

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

相关文章

【数据库】Redis主从复制、哨兵模式、集群

目录 一、Redis的主从复制 1.1 主从复制的架构 1.2 主从复制的作用 1.3 注意事项 1.4 主从复制用到的命令 1.5 主从复制流程 1.6 主从复制实现 1.7 结束主从复制 1.8 主从复制优化配置 二、哨兵模式 2.1 哨兵模式原理 2.2 哨兵的三个定时任务 2.3 哨兵的结构 2.4 哨…

ArkUI开发学习随机——B站视频简介页面,美团购买界面

案例一:B站视频简介页面 代码: build() {Column(){Column(){Stack(){Image($r("app.media.genimpact")).width(200).height(125).borderRadius({topLeft:5,topRight:5})Row(){Image($r("app.media.bz_play")).height(24).fillColor…

【人工智能】Transformers之Pipeline(概述):30w+大模型极简应用

​​​​​​​ 目录 一、引言 二、pipeline库 2.1 概述 2.2 使用task实例化pipeline对象 2.2.1 基于task实例化“自动语音识别” 2.2.2 task列表 2.2.3 task默认模型 2.3 使用model实例化pipeline对象 2.3.1 基于model实例化“自动语音识别” 2.3.2 查看model与task…

如何通过Java操作Redis?——Jedis!

简介 在redis命令行客户端中操作redis是否可行?可行,但不方便且不是主流的方式。最终还是要通过Java代码来操作~ Redis的底层通信是遵守RESP协议的,一些第三方的库就实现了这些协议,然后封装好API,程序猿通过封装好的…

IEC62056标准体系简介-4.IEC62056-53 COSEM应用层

为在通信介质中传输COSEM对象模型,IEC62056参照OSI参考模型,制定了简化的三层通信模型,包括应用层、数据链路层(或中间协议层)和物理层,如图6所示。COSEM应用层完成对COSEM对象的属性和方法的访问&#xff…

01MFC建立单个文件类型——画线

文章目录 选择模式初始化文件作用解析各初始化文件解析类导向创建鼠标按键按下抬起操作函数添加一个变量记录起始位置注意事项代码实现效果图虚实/颜色线选择模式 初始化文件作用解析 运行: 各初始化文件解析 MFC(Microsoft Foundation Classes)是一个C++类库,用于在Win…

昇思25天学习打卡营第16天|基于MindSpore通过GPT实现情感分类

今天的这个代码几乎没有任何解释,结合之前GPT生成文本摘要的代码。 大概记录一下 import numpy as np # 导入NumPy库def process_dataset(dataset, tokenizer, max_seq_len512, batch_size4, shuffleFalse): # 判断当前设备是否为Ascend,如果是ascen的…

防御课综合实验

实验拓扑: 实验要求: 1、DMZ区内的服务器,办公区仅能在办公时间内(9点到18点)可以访问,生产区的设备全天可以访问 2、生产区不允许访问互联网,办公区和游客区允许访问互联网 3、办公区设备10…

二叉平衡树(左单旋,右单旋,左右双旋、右左双旋)

一、AVL树(二叉平衡树:高度平衡的二叉搜索树) 0、二叉平衡树 左右子树高度差不超过1的二叉搜索树。 public class AVLTree{static class AVLTreeNode {public TreeNode left null; // 节点的左孩子public TreeNode right null; // 节点的…

Java 中的异常处理机制是如何工作的?请解释 try-catch-finally 的基本用法?

Java中的异常处理机制是确保程序稳健性的重要组成部分,它允许程序在遇到错误或异常情况时,能够优雅地处理问题,而不是直接崩溃。 这一机制的核心在于使用try-catch-finally结构,以及通过throw和throws关键字来抛出和声明异常。 …

基于Transformer的端到端的目标检测 | 读论文

本文正在参加 人工智能创作者扶持计划 提及到计算机视觉的目标检测,我们一般会最先想到卷积神经网络(CNN),因为这算是目标检测领域的开山之作了,在很长的一段时间里人们都折服于卷积神经网络在图像处理领域的优势&…

Vue2.0和Vue3.0的区别?

Vue.js 3.0 相较于 Vue.js 2.0 在多个方面进行了改进和优化,主要包括以下几点: 性能提升: Vue 3.0 使用了新的响应式系统,称为“Proxy-based”,相比于 Vue 2.0 的“Object.defineProperty”,更加高效。 编…

【深度学习基础】安装包报错——MAC M3-MAX芯片安装scikit-learn库报错。

目录 一、问题描述二、解决方法 一、问题描述 首先想安装scikit-learn库在mac终端显示顺利安装完成,但是测试的时候报错如下所示: /opt/anaconda3/envs/dtc/bin/python /Users/chenfaquan/PycharmProjects/TimeSeries/data_create.py Traceback (most…

论文 | REACT: SYNERGIZING REASONING AND ACTING INLANGUAGE MODELS

本文首先认为,到目前为止,LLM 在语言理解方面令人印象深刻,它们已被用来生成 CoT(思想链)来解决一些问题,它们也被用于执行和计划生成。 尽管这两者是分开研究的,但本文旨在以交错的方式将推理…

JSP入门基础

JSP入门基础 软件开发环境这门课程的复习资料 Web开发技术概述 URL的组成部分 协议、主机DNS名或IP地址和文件名 Tomcat服务器 Tomcat服务器的默认端口号是8080 概念 软件开发环境是围绕着软件开发的一定目标而组织在一起的一组相关软件工具的有机集合 JSP和HTML的区别…

range()用法

range(n):是Python中的函数,作用是可以生成 [0, n)之间的正数range(a,b) :生成[a,b)之间的正数数字,不包含brange(start, end, step):生成的数值规则--- [start, end) 步长是 step,默认 1 详见:http://t.csdnimg.cn/7…

科研入门笔记

自学参考: 沐神论文精读系列 如何读论文 通常,一篇论文的结构为: title标题abstract摘要introduction介绍method方法experiments实验conclusion结论 一篇论文可以考虑读1~3遍 第一遍 海选:标题、摘要、结论,选读方…

SPE连接器技术革新汽车制造业

概述 新的SPE标准在汽车制造业中的应用正日益受到重视,它不仅推动了汽车通信技术的革新,还对汽车性能测试方法产生了深远影响。本文将详细探讨SPE标准在汽车制造业中的应用案例分析,以及它对供应链的挑战与机遇。 SPE标准在汽车制造业中的应…

[leetcode]subarray-product-less-than-k 乘积小于K的子数组

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int numSubarrayProductLessThanK(vector<int>& nums, int k) {if (k 0) {return 0;}int n nums.size();vector<double> logPrefix(n 1);for (int i 0; i < n; i) {logPrefix[i 1] …

揭秘!chatGPT核心技术应用

2022年11月30日&#xff0c;可能将成为一个改变人类历史的日子——美国人工智能开发机构OpenAI推出了聊天机器人ChatGPT-3.5&#xff0c;将人工智能的发展推向了一个新的高度。2023年11月7日&#xff0c;OpenAI首届开发者大会被称为“科技界的春晚”&#xff0c;吸引了全球广大…