YOLOv8结合SAHI推理图像和视频

文章目录

  • 前言
  • 视频效果
  • 必要环境
  • 一、完整代码
  • 二、运行方法
    • 1、 推理图像
    • 2、 推理视频
  • 总结


前言

在上一篇文章中,我们深入探讨了如何通过结合YOLOv8和SAHI来增强小目标检测效果
,并计算了相关评估指标,虽然我们也展示了可视化功能,但是这些功能往往需要结合实际的ground truth(GT)数据进行对比,这在实际操作中可能会稍显不便。

为了进一步简化操作,这篇文章将直接分享可以用来推理图像和视频的代码,通过这段代码,我们能够更加方便地使用SAHI进行小目标检测,而不需要反复处理和对比GT数据。

不多说啦,以下是完整的代码示例,供大家参考使用
在这里插入图片描述


视频效果

b站链接:使用SAHI增强YOLOv8推理,提升小目标检测效果(附教程)


必要环境

  1. 参考上期博客
    地址:使用YOLOv8+SAHI增强小目标检测效果并计算评估指标

一、完整代码

import os
import cv2
from sahi import AutoDetectionModel
from sahi.predict import get_sliced_prediction
import argparse
from tqdm import tqdm
import timeparser = argparse.ArgumentParser(description="Object Detection Evaluation Script")
parser.add_argument('--filepath', type=str, default='test/images', help='Path to the images folder or video file')
parser.add_argument('--output_dir', type=str, default='output', help='Directory to save the output images or video')parser.add_argument('--model_type', type=str, default='yolov8', help='Type of the detection model')
parser.add_argument('--model_path', type=str, default='yolov8n.pt', help='Path to the model weights')
parser.add_argument('--confidence_threshold', type=float, default=0.5, help='Confidence threshold for the model')
parser.add_argument('--device', type=str, default="cuda:0", help='Device to run the model on')
parser.add_argument('--slice_height', type=int, default=256, help='Height of the image slices')
parser.add_argument('--slice_width', type=int, default=256, help='Width of the image slices')
parser.add_argument('--overlap_height_ratio', type=float, default=0.2, help='Overlap height ratio for slicing')
parser.add_argument('--overlap_width_ratio', type=float, default=0.2, help='Overlap width ratio for slicing')
parser.add_argument('--visualize_predictions', action='store_true', default=False, help='Visualize prediction results')
parser.add_argument('--images_format', type=str, nargs='+', default=['.png', '.jpg', '.jpeg'],help='List of acceptable image formats')
parser.add_argument('--videos_format', type=str, nargs='+', default=['.mp4', '.avi'],help='List of acceptable video formats')
args = parser.parse_args()def get_color(idx):idx = int(idx) + 5return ((37 * idx) % 255, (17 * idx) % 255, (29 * idx) % 255)def load_detection_model():return AutoDetectionModel.from_pretrained(model_type=args.model_type,model_path=args.model_path,confidence_threshold=args.confidence_threshold,device=args.device)def process_image(image_name, model):img_path = os.path.join(args.filepath, image_name)img_vis = cv2.imread(img_path)result = get_sliced_prediction(img_path,model,slice_height=args.slice_height,slice_width=args.slice_width,overlap_height_ratio=args.overlap_height_ratio,overlap_width_ratio=args.overlap_width_ratio,)for pred in result.object_prediction_list:bbox = pred.bboxcls = pred.category.idscore = pred.score.valuename = pred.category.namexmin_pd, ymin_pd, xmax_pd, ymax_pd = bbox.minx, bbox.miny, bbox.maxx, bbox.maxycv2.rectangle(img_vis, (int(xmin_pd), int(ymin_pd)), (int(xmax_pd), int(ymax_pd)),get_color(cls), 2, cv2.LINE_AA)cv2.putText(img_vis, f"{name} {score:.2f}", (int(xmin_pd), int(ymin_pd - 5)),cv2.FONT_HERSHEY_COMPLEX, 0.5, get_color(cls), thickness=2)if args.visualize_predictions:cv2.imshow(image_name, img_vis)cv2.waitKey(0)cv2.destroyAllWindows()# 保存结果图像output_path = os.path.join(args.output_dir, image_name)os.makedirs(args.output_dir, exist_ok=True)cv2.imwrite(output_path, img_vis)def process_video(video_path, model):cap = cv2.VideoCapture(video_path)output_path = os.path.join(args.output_dir, os.path.basename(video_path))os.makedirs(args.output_dir, exist_ok=True)fourcc = cv2.VideoWriter_fourcc(*'XVID')out = Nonefps_list = []while cap.isOpened():ret, frame = cap.read()if not ret:breakstart_time = time.time()result = get_sliced_prediction(frame,model,slice_height=args.slice_height,slice_width=args.slice_width,overlap_height_ratio=args.overlap_height_ratio,overlap_width_ratio=args.overlap_width_ratio,)for pred in result.object_prediction_list:bbox = pred.bboxcls = pred.category.idscore = pred.score.valuename = pred.category.namexmin_pd, ymin_pd, xmax_pd, ymax_pd = bbox.minx, bbox.miny, bbox.maxx, bbox.maxycv2.rectangle(frame, (int(xmin_pd), int(ymin_pd)), (int(xmax_pd), int(ymax_pd)),get_color(cls), 2, cv2.LINE_AA)cv2.putText(frame, f"{name} {score:.2f}", (int(xmin_pd), int(ymin_pd - 5)),cv2.FONT_HERSHEY_COMPLEX, 0.8, get_color(cls), thickness=2)end_time = time.time()fps = 1 / (end_time - start_time)fps_list.append(fps)cv2.putText(frame, f"FPS: {fps:.2f}", (30, 60), cv2.FONT_HERSHEY_SIMPLEX, 2, (0, 255, 0), 4)if out is None:frame_height, frame_width = frame.shape[:2]out = cv2.VideoWriter(output_path, fourcc, cap.get(cv2.CAP_PROP_FPS), (frame_width, frame_height))out.write(frame)if args.visualize_predictions:cv2.imshow('Video', frame)if cv2.waitKey(1) & 0xFF == ord('q'):breakcap.release()out.release()cv2.destroyAllWindows()avg_fps = sum(fps_list) / len(fps_list)print(f"Average FPS: {avg_fps:.2f}")def main():detection_model = load_detection_model()if os.path.isfile(args.filepath) and os.path.splitext(args.filepath)[1].lower() in args.videos_format:process_video(args.filepath, detection_model)else:image_names = [name for name in os.listdir(args.filepath) ifos.path.splitext(name)[1].lower() in args.images_format]for i, image_name in enumerate(tqdm(image_names, desc="Processing images")):process_image(image_name, detection_model)if __name__ == "__main__":main()

二、运行方法

1、 推理图像

  • 将文件命名为 yolov8_sahi_inference.py
  • 运行如下命令,输出结果将保存到output文件夹下
    python yolov8_sahi_inference.py --filepath test/images  --output_dir output --model_type yolov8 --model_path yolov8n.pt
    

关键参数详解:

  • –filepath: 指定要推理的图像文件夹的路径
  • –output_dir: 指定保存推理结果的路径
  • –model_type: 指定检测模型的类型 (默认为yolov8)
  • –model_path: 指定模型权重文件的路径
  • –visualize_predictions: 如果设置True,将在运行代码过程中可视化推理结果

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

2、 推理视频

  • 将文件命名为 yolov8_sahi_inference.py
  • 运行如下命令,输出结果将保存到output文件夹下
    python yolov8_sahi_inference.py --filepath inputvideo.mp4  --output_dir output --model_type yolov8 --model_path yolov8n.pt --visualize_predictions
    

关键参数详解:

  • –filepath: 指定要推理的视频路径
  • –output_dir: 指定保存推理结果的路径
  • –model_type: 指定检测模型的类型 (默认为yolov8)
  • –model_path: 指定模型权重文件的路径
  • –visualize_predictions: 如果设置True,将在运行代码过程中可视化推理结果

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


总结

本期博客就到这里啦,喜欢的小伙伴们可以点点关注,感谢!

最近经常在b站上更新一些有关目标检测的视频,大家感兴趣可以来看看 https://b23.tv/1upjbcG

学习交流群:995760755

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

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

相关文章

入门PHP就来我这(高级)13 ~ 图书添加功能

有胆量你就来跟着路老师卷起来! -- 纯干货,技术知识分享 路老师给大家分享PHP语言的知识了,旨在想让大家入门PHP,并深入了解PHP语言。 今天给大家接着上篇文章编写图书添加功能。 1 添加页面 创建add.html页面样式,废…

去O化神器 Exbase

随着去O化进程推动,很多旧业务依赖的oracle数据库,都需要实现做数据库的替换,当下能很好兼容Oracle,并实现异构数据库之间转换的工具并不多。这里给大家推荐一个商业工具数据库迁移工具exbase(北京海量)&am…

排序格式排序格式

排序格式排序格式

CosyVoice - 阿里最新开源语音克隆、文本转语音项目 支持情感控制及粤语 本地一键整合包下载

近日,阿里通义实验室发布开源语音大模型项目FunAudioLLM,而且一次包含两个模型:SenseVoice和CosyVoice。 CosyVoice专注自然语音生成,支持多语言、音色和情感控制,支持中英日粤韩5种语言的生成,效果显著优于…

Java多线程不会?一文解决——

方法一 新建类如MyThread继承Thread类重写run()方法再通过new MyThread类来新建线程通过start方法启动新线程 案例&#xff1a; class MyThread extends Thread {public MyThread(String name) {super(name);}Overridepublic void run() {for(int i0;i<10;i){System.out.…

深度学习中的Channel,通道数是什么?

参考文章&#xff1a; 直观理解深度学习的卷积操作&#xff0c;超赞&#xff01;-CSDN博客​​​​​​如何理解卷积神经网络中的通道&#xff08;channel&#xff09;_神经网络通道数-CSDN博客 深度学习-卷积神经网络—卷积操作详细介绍_深度卷积的作用-CSDN博客 正文&…

土豆炒肉做法

菜单&#xff1a;土豆、葱、铁辣子、纯瘦肉、淀粉、生抽、酱油、刀、案板、十三香、盐巴、擦板 流程&#xff1a; 洗土豆&#xff0c;削皮&#xff0c;擦成条&#xff0c;用凉水过滤两遍淀粉&#xff0c;顺便放个燥里洗肉&#xff0c;切成条&#xff0c;按照生抽、酱油、淀粉、…

QT入门笔记-自定义控件封装 30

具体代码如下: QT core guigreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c17# You can make your code fail to compile if it uses deprecated APIs. # In order to do so, uncomment the following line. #DEFINES QT_DISABLE_DEPRECATED_BEFORE0x060000 …

vue3项目 前端blocked:mixed-content问题解决方案

一、问题分析 blocked:mixed-content其实浏览器不允许在https页面里嵌入http的请求&#xff0c;现在高版本的浏览器为了用户体验&#xff0c;都不会弹窗报错&#xff0c;只会在控制台上打印一条错误信息。一般出现这个问题就是在https协议里嵌入了http请求&#xff0c;解决方法…

react dangerouslySetInnerHTML将html字符串以变量方式插入页面,点击后出现编辑状态

1.插入变量 出现以下编辑状态 2.解决 给展示富文本的标签添加css样式 pointerEvents: none

Python28-7.4 独立成分分析ICA分离混合音频

独立成分分析&#xff08;Independent Component Analysis&#xff0c;ICA&#xff09;是一种统计与计算技术&#xff0c;主要用于信号分离&#xff0c;即从多种混合信号中提取出独立的信号源。ICA在处理盲源分离&#xff08;Blind Source Separation&#xff0c;BSS&#xff0…

cmake find_package 使用笔记

目录 1 find_package2 config mode2.1 搜索的文件名2.2 搜索路径 3 module mode3.1 搜索的文件名3.2 搜索路径 参考 1 find_package 这是官方文档 下面是学习总结&#xff1a; 首先是find_package的作用是什么&#xff1f;引入预编译的库。 find_package有两种模式&#xff1a…

论文研读|AI生成图像检测发展历程及研究现状

前言&#xff1a;本篇博客系统性梳理AI生成图像检测的研究工作。 「人工智能生成图像检测」研究及发展现状介绍 参考资料 https://fdmas.github.io/AIGCDetect/针对AIGC检测的鲁棒性测试——常见攻击手段汇总论文研读&#xff5c;以真实图像为参考依据的AIGC检测论文研读&…

导航栏样式,盒子模型

1.代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><style>li{he…

第一百四十七节 Java数据类型教程 - Java字符串字符

Java数据类型教程 - Java字符串字符 索引字符 您可以使用charAt()方法从String对象中获取特定索引处的字符。索引从零开始。 下面的代码打印索引值和字符在“W3CSCHOOL.CN"字符串中的每个索引处: public class Main {public static void main(String[] args) {String s…

【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【21】【购物车】

持续学习&持续更新中… 守破离 【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【21】【购物车】 购物车需求描述购物车数据结构数据Model抽取实现流程&#xff08;参照京东&#xff09;代码实现参考 购物车需求描述 用户可以在登录状态下将商品添加到购物车【用户购物…

读人工智能全传05专家系统

1. 知识就是力量 1.1. 人工智能领域此前存在的问题是过度关注搜索和解决问题这种通用法则 1.2. “弱”方法缺少一个关键的要素&#xff0c;而这一要素才是在所有智能行为中起决定性作用的组成部分&#xff1a;知识 1.3. 一种基于知识的人工智能系统&#xff1a;专家系统开始…

2024年第十四届亚太地区大学生数学建模竞赛(中文赛项)B题洪水灾害的数据分析与预测论文和代码分析

经过不懈的努力&#xff0c; 2024年第十四届亚太地区大学生数学建模竞赛&#xff08;中文赛项&#xff09;B题洪水灾害的数据分析与预测论文和代码已完成&#xff0c;代码为C题全部问题的代码&#xff0c;论文包括摘要、问题重述、问题分析、模型假设、符号说明、模型的建立和求…

python函数和c的区别有哪些

Python有很多内置函数&#xff08;build in function&#xff09;&#xff0c;不需要写头文件&#xff0c;Python还有很多强大的模块&#xff0c;需要时导入便可。C语言在这一点上远不及Python&#xff0c;大多时候都需要自己手动实现。 C语言中的函数&#xff0c;有着严格的顺…

Excel 宏录制与VBA编程 ——VBA编程技巧篇三 (未初始化Range判断、遍历工作表方法、工作表多行重复内容剔除)

未初始化Range的判断 有时候需要对已定义未初始化的range对象做判断 dim curRange as range If curRange Is Nothing Thendebug.print("未初始化的..") End If遍历工作表方法 Chr&#xff08;10&#xff09;&#xff1a;ASCII码中的换行键&#xff0c;相当于vbLF。 …