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.pswp.cn/diannao/42064.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/42064.shtml
英文地址,請注明出處:http://en.pswp.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…

RPC與REST

RPC與REST 訪問遠程服務1遠程服務調用(Remote Procedure Call,RPC):RPC 解決什么問題?如何解決的?為什么要那樣解決?1.1 先解決兩個進程間如何交換數據的問題,也就是進程間通信&…

最新扣子(Coze)實戰案例:使用擴圖功能,讓你的圖任意變換,完全免費教程

🧙?♂? 大家好,我是斜杠君,手把手教你搭建扣子AI應用。 📜 本教程是《AI應用開發系列教程之扣子(Coze)實戰教程》,完全免費學習。 👀 微信關注公從號:斜杠君,可獲取完整版教程。&a…

如何快速搭建python項目的虛擬環境

itopen組織1、提供OpenHarmony優雅實用的小工具2、手把手適配riscv qemu linux的三方庫移植3、未來計劃riscv qemu ohos的三方庫移植 小程序開發4、一切擁抱開源,擁抱國產化 你在開發python工具的時候還一直使用系統默認的環境嗎?是否有遇到有時候…

2024年【北京市安全員-B證】報名考試及北京市安全員-B證最新解析

題庫來源:安全生產模擬考試一點通公眾號小程序 2024年北京市安全員-B證報名考試為正在備考北京市安全員-B證操作證的學員準備的理論考試專題,每個月更新的北京市安全員-B證最新解析祝您順利通過北京市安全員-B證考試。 1、【多選題】《中華人民共和國安…

android輪播圖入門2——觸摸停止與指示器

前言 這次要在上一篇輪播圖的基礎上做改造,增加兩個功能: 用戶觸摸到輪播圖時,停止輪播在輪播圖上展示一個小指示器,指示當前輪播組件的位置 觸摸停播 觸摸停播的設計思路是:監聽實現輪播圖的觸摸事件,…

手把手教你從零開始構建 AI 視頻生成模型

在 GitHub 上發現一篇教程,作者詳細介紹了如何使用 Python 語言,從零開始構建一個文本到視頻生成模型。 涵蓋了從理解理論概念到架構編碼,最終實現輸入文本提示即可生成視頻的全過程。 相關鏈接 GitHub:github.com/FareedKhan-…

python-redis-lock是如何實現鎖自動續期的

python-redis-lock簡介 python-redis-lock是一個python的第三方庫,基于Redis,封裝了分布式鎖的邏輯,提供了更高級的API來簡化鎖的獲取、保持和釋放過程。包括自動續期、鎖超時、重入鎖等功能。 相比于直接使用redis的setnx,避免了…

倒退型自閉癥與輕度自閉癥有什么區別?

作為星貝育園自閉癥兒童康復中心的一名專業教師,我深知家長們在面對自閉癥譜系障礙(ASD)時的種種疑問與挑戰,尤其是關于倒退型自閉癥與輕度自閉癥之間的區別。今天,我將從專業視角出發,深入淺出地解析這兩種…

精通Vim編輯器:Linux系統下的強大文本編輯工具

精通Vim編輯器:Linux系統下的強大文本編輯工具 引言 在Linux世界中,Vim是一個功能強大、高度可定制的文本編輯器,它繼承自經典的vi編輯器并提供了一系列增強功能。無論是系統管理員、開發人員還是普通用戶,掌握Vim的使用都能大幅…

游戲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. 優缺點 …

Segmentation fault (core dumped)

錯誤簡介 出現 “Segmentation fault (core dumped)” 錯誤通常意味著程序訪問了未分配的內存或者越界訪問了已分配內存之外的區域。 段錯誤通常發生在以下情況: 空指針解引用:嘗試對空指針進行操作。內存越界:訪問了超出分配內存邊界的區…

大廠面試官贊不絕口的后端技術亮點【后端項目亮點合集(2)】

本文將持續更新~~ hello hello~ ,這里是絕命Coding——老白~💖💖 ,歡迎大家點贊🥳🥳關注💥💥收藏🌹🌹🌹 💥個人主頁:絕命C…

提高論文發表機會:Nature Communications 最新研究教你如何巧妙回復審稿意見

我是娜姐 迪娜學姐 ,一個SCI醫學期刊編輯,探索用AI工具提效論文寫作和發表。 對于科研搬磚人來說,在論文投稿過程中,如何有效回復審稿意見才能得到審稿人的認可,一直是一個讓人困惑又帶點玄學的問題。 但是&#xff0c…

vue3 按鈕復制粘貼功能

1.html <div click"copy(item.envelopePassword)" > 復制口令 </div> 2.utils 創建copy.js export const copy (val: string): void > {let { isSuccessRef } useCopyToClipboard(val) as anyif (isSuccessRef) {// 輕提示showNotify("復制…

【強化學習的數學原理】課程筆記--3(蒙特卡洛方法)

目錄 蒙特卡洛方法MC Basic算法sparse reward MC Greedy 算法樣本使用效率MC ? \epsilon ?-Greedy 算法一些例子 蒙特卡洛方法 第二節 推導貝爾曼最優公式中的&#xff1a; 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) 并將其傳遞給應用&#xff1a; import { createApp } from v…

代碼隨想錄算法訓練Day57|LeetCode200-島嶼數量、LeetCode695-島嶼的最大面積

島嶼數量 題目描述 力扣200-島嶼數量 給你一個由 1&#xff08;陸地&#xff09;和 0&#xff08;水&#xff09;組成的的二維網格&#xff0c;請你計算網格中島嶼的數量。 島嶼總是被水包圍&#xff0c;并且每座島嶼只能由水平方向和/或豎直方向上相鄰的陸地連接形成。 此…

前端vue后端java使用easyexcel框架下載表格xls數據工具類

一 使用alibaba開源的 easyexcel框架&#xff0c;后臺只需一個工具類即可實現下載 后端下載實現 依賴 pom.xml <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependen…