Sahi+Yolov10

一、前言

    了解到Sahi,是通过切图,实现提高小目标的检测效果。sahi 目前支持yolo5\yolo8\mmdet\detection2 等等算法,本篇主要通过实验onnx加载模型的方式使sahi支持yolov10。

二、代码

(1)转换模型

      首先使用  conda创建虚拟环境,配置好yolov10环境,然后 pip 将sahi 安装上

pip install sahi

     将yolov10 模型导出为 onnx格式文件,命令窗cd 至 模型文件所在目录 执行

 yolo export model=vitrolite_best.pt  format=onnx opset=11 simplify

     转换成功,将在目录下生成同名 onnx格式文件

 (2)加载onnx 模型推理代码

参考 sahi 提供的demo 文件 inference_for_yolov8_onnx.ipynb ,分块大小和重叠比例可设置

from sahi import AutoDetectionModel
from sahi.utils.cv import read_image
from sahi.utils.file import download_from_url
from sahi.predict import get_prediction, get_sliced_prediction, predictimport timeif __name__ == '__main__':yolov8_onnx_model_path = "runs\\detect\\train_v102\\weights\\vitrolite_best.onnx"  #加载自己的onnx模型文件#yolov8_onnx_model_path = "D:\\Project\\yolov8\\weights\\yolov8x.onnx"category_mapping = {'0': 'p0', '1': 'p1', '2': 'p2', '3': 'p3'  }  #类别映射,换成你的detection_model = AutoDetectionModel.from_pretrained(model_type='yolov8onnx',model_path=yolov8_onnx_model_path,confidence_threshold=0.3,category_mapping=category_mapping,device='cuda:0', # or 'cuda:0'  #这里要使用GPU)#img_path = "datasets\\vitrolite\\images\\val\\c144846_5_10.png"   #推导图片路径#result = get_prediction(read_image(img_path), detection_model)  #第一次启动GOU ,时间比较慢,必须先启动一次#分块检测result = get_sliced_prediction("D:\\Project\\vitroliteDefect\\tile_round1_train_20201231\\train_imgs\\197_2_t20201119084924170_CAM1.jpg",detection_model,slice_height=640,slice_width=640,overlap_height_ratio=0.05,overlap_width_ratio=0.05)result.export_visuals(export_dir="demo_data/")

(3)修改sahi的接口文件  

找到pip安装的sahi 位置 , 修改 yolov8onnx.py

修改 _post_process 函数 , 主要是由于yolov8 和yolov10 输出 shape有所不同,yolov10没有nms

    def _post_process(self, outputs: np.ndarray, input_shape: Tuple[int, int], image_shape: Tuple[int, int]) -> List[torch.Tensor]:image_h, image_w = image_shapeinput_w, input_h = input_shapepredictions = np.squeeze(outputs[0])  # 不用.T 转置  ,  #( 300,6)# 在下面这个地方改动,by zjy ,  self.confidence_threshold 是0.3#for row in predictions:#print(  "row:" ,  row.shape   )scores =  predictions[: , 4]  #shape 为 ( 300,6) ,第5个,下标为4#self.confidence_threshold = 0.9predictions = predictions[ scores > self.confidence_threshold, : ]scores = scores[scores > self.confidence_threshold]boxes = predictions[:, :4]boxes = boxes.astype(np.int32)class_ids = predictions[:,  5 ].astype(np.int32)# Format the resultsprediction_result = []for bbox, score, label in zip(boxes , scores , class_ids ):bbox = bbox.tolist()cls_id = int(label)prediction_result.append([bbox[0], bbox[1], bbox[2], bbox[3], score, cls_id])"""  # Filter out object confidence scores below thresholdscores = np.max(predictions[:, 4:], axis=1)predictions = predictions[scores > self.confidence_threshold, :]scores = scores[scores > self.confidence_threshold]class_ids = np.argmax(predictions[:, 4:], axis=1)boxes = predictions[:, :4]# Scale boxes to original dimensionsinput_shape = np.array([input_w, input_h, input_w, input_h])boxes = np.divide(boxes, input_shape, dtype=np.float32)boxes *= np.array([image_w, image_h, image_w, image_h])boxes = boxes.astype(np.int32)# Convert from xywh two xyxyboxes = xywh2xyxy(boxes).round().astype(np.int32)# Perform non-max supressionsindices = non_max_supression(boxes, scores, self.iou_threshold)# Format the resultsprediction_result = []for bbox, score, label in zip(boxes[indices], scores[indices], class_ids[indices]):bbox = bbox.tolist()cls_id = int(label)prediction_result.append([bbox[0], bbox[1], bbox[2], bbox[3], score, cls_id])"""prediction_result = [torch.tensor(prediction_result)]# prediction_result = [prediction_result]return prediction_result

三、结果

运行推理代码,在 demo_data 文件夹下生成结果图片, 实验图片是一张高分辨率瓷砖图片

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

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

相关文章

大数的排列组合公式C代码

我们知道,计算排列A(n,m)和组合C(n,m)可以用先求阶乘的方式实现,但是当数很大时求阶乘很容易溢出,所以这里给出非阶乘的方式求排列组合 求排列 分母和分子可以抵消,最后代码如下 unsigned long long A(int n, int m) {unsigned…

华为机试HJ34图片整理

华为机试HJ34图片整理 题目: 想法: 将输入的字符串中每个字符都转为ASCII码,再通过快速排序进行排序并输出 input_str input() input_list [int(ord(l)) for l in input_str]def partition(arr, low, high):i low - 1pivot arr[high]f…

最新扣子(Coze)实战案例:使用扩图功能,让你的图任意变换,完全免费教程

🧙‍♂️ 大家好,我是斜杠君,手把手教你搭建扣子AI应用。 📜 本教程是《AI应用开发系列教程之扣子(Coze)实战教程》,完全免费学习。 👀 微信关注公从号:斜杠君,可获取完整版教程。&a…

2024年【北京市安全员-B证】报名考试及北京市安全员-B证最新解析

题库来源:安全生产模拟考试一点通公众号小程序 2024年北京市安全员-B证报名考试为正在备考北京市安全员-B证操作证的学员准备的理论考试专题,每个月更新的北京市安全员-B证最新解析祝您顺利通过北京市安全员-B证考试。 1、【多选题】《中华人民共和国安…

手把手教你从零开始构建 AI 视频生成模型

在 GitHub 上发现一篇教程,作者详细介绍了如何使用 Python 语言,从零开始构建一个文本到视频生成模型。 涵盖了从理解理论概念到架构编码,最终实现输入文本提示即可生成视频的全过程。 相关链接 GitHub:github.com/FareedKhan-…

倒退型自闭症与轻度自闭症有什么区别?

作为星贝育园自闭症儿童康复中心的一名专业教师,我深知家长们在面对自闭症谱系障碍(ASD)时的种种疑问与挑战,尤其是关于倒退型自闭症与轻度自闭症之间的区别。今天,我将从专业视角出发,深入浅出地解析这两种…

游戏AI的创造思路-技术基础-强化学习(2)

上一篇中引出了深度强化学习这个大坑,本篇浅浅填一下~~~~ 目录 6. 深度强化学习概述 6.1. 基本概念 6.2. 发展历史 6.3. 基本公式 6.4. Python实现 6.5. 运行原理 6.5.1. 核心要素 6.5.2. 运行原理 6.5.3. 典型算法 6.5.4. Python实现代码 6.6. 优缺点 …

大厂面试官赞不绝口的后端技术亮点【后端项目亮点合集(2)】

本文将持续更新~~ hello hello~ ,这里是绝命Coding——老白~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 💥个人主页:绝命C…

提高论文发表机会:Nature Communications 最新研究教你如何巧妙回复审稿意见

我是娜姐 迪娜学姐 ,一个SCI医学期刊编辑,探索用AI工具提效论文写作和发表。 对于科研搬砖人来说,在论文投稿过程中,如何有效回复审稿意见才能得到审稿人的认可,一直是一个让人困惑又带点玄学的问题。 但是&#xff0c…

【强化学习的数学原理】课程笔记--3(蒙特卡洛方法)

目录 蒙特卡洛方法MC Basic算法sparse reward MC Greedy 算法样本使用效率MC ϵ \epsilon ϵ-Greedy 算法一些例子 蒙特卡洛方法 第二节 推导贝尔曼最优公式中的: q π k ( s , a ) ∑ r P ( r ∣ s , a ) r γ ∑ s ′ P ( s ′ ∣ s , a ) v π k ( s ′ ) q…

vue3 ~ pinia学习

先看两个图 一个vuex 一个pinia 根据图看出来 pinia更简单了 那么具体怎么操作呢 我们来看下~ 第一步 下载 yarn add pinia # 或者使用 npm npm install pinia 第二步 注册 创建一个 pinia 实例 (根 store) 并将其传递给应用: import { createApp } from v…

代码随想录算法训练Day57|LeetCode200-岛屿数量、LeetCode695-岛屿的最大面积

岛屿数量 题目描述 力扣200-岛屿数量 给你一个由 1(陆地)和 0(水)组成的的二维网格,请你计算网格中岛屿的数量。 岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此…

前端vue后端java使用easyexcel框架下载表格xls数据工具类

一 使用alibaba开源的 easyexcel框架&#xff0c;后台只需一个工具类即可实现下载 后端下载实现 依赖 pom.xml <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependen…

MATLAB-分类CPO-RF-Adaboost冠豪猪优化器(CPO)优化RF随机森林结合Adaboost分类预测(二分类及多分类)

MATLAB-分类CPO-RF-Adaboost冠豪猪优化器&#xff08;CPO&#xff09;优化RF随机森林结合Adaboost分类预测&#xff08;二分类及多分类&#xff09; 分类CPO-RF-Adaboost冠豪猪优化器&#xff08;CPO&#xff09;优化RF随机森林结合Adaboost分类预测&#xff08;二分类及多分类…

【web前端HTML+CSS+JS】--- HTML学习笔记01

学习链接&#xff1a;黑马程序员pink老师前端入门教程&#xff0c;零基础必看的h5(html5)css3移动端前端视频教程_哔哩哔哩_bilibili 学习文档&#xff1a; Web 开发技术 | MDN (mozilla.org) 一、前后端工作流程 WEB模型&#xff1a;前端用于采集和展示信息&#xff0c;中…

Web漏洞扫描工具AppScan与AWVS测评及使用体验

AppScan和AWVS业界知名的Web漏洞扫描工具&#xff0c;你是否也好奇到底哪一个能力更胜一筹呢&#xff1f;接下来跟随博主一探究竟吧。 1. 方案概览 第一步&#xff1a;安装一个用于评测的Web漏洞靶场&#xff08;本文采用最知名和最广泛使用的靶场&#xff0c;即OWASP Benchma…

啥?你没听过SpringBoot的FatJar?

写在最前面&#xff1a; SpringBoot是目前企业里最流行的框架之一&#xff0c;SpringBoot的部署方式多数采用jar包形式。通常&#xff0c;我们使用java -jar便可以直接运行jar文件。普通的jar只包含当前 jar的信息&#xff0c;当内部依赖第三方jar时&#xff0c;直接运行则会报…

robotframework-appiumLibrary 应用 - 实现 app 自动化

1、安装appiumLibrary第三方库 运行pip命令&#xff1a;pip install robotframework-appiumlibrary 若已安装&#xff0c;需要更新版本可以用命令&#xff1a;pip install -U robotframework-appiumlibrary 2、安装app自动化环境。 参考我的另外一篇专门app自动化环境安装的…

设计模式探索:策略模式

1. 什么是策略模式&#xff08;Strategy Pattern&#xff09; 定义 策略模式&#xff08;Strategy Pattern&#xff09;的原始定义是&#xff1a;定义一系列算法&#xff0c;将每一个算法封装起来&#xff0c;并使它们可以相互替换。策略模式让算法可以独立于使用它的客户端而…

打卡第4天----链表

通过学习基础,发现我的基本功还得需要再练练,思路得再更加清晰明了,这样子做算法题才能驾轻就熟。每天记录自己的进步。 一、两两交换 题目编号:24 题目描述: 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本…