YoloV8的目标检测推理

YoloV8的目标检测推理

原始的YoloV8封装的层次太高,想要为我们所用可能需要阅读很多API,下面给出比较简单的使用方式

导入所需的库

  • os:用于操作文件系统。
  • cv2 (OpenCV):用于图像处理。
  • numpy:提供数学运算,特别是对数组的操作。
  • ultralytics.YOLO:一个现成的YOLO模型实现,用于对象检测。
  • torch:PyTorch深度学习框架,用于处理模型。
  • serial:用于串口通信。
  • time:用于时间相关的操作。

初始化串口通信的函数:init_serial

  • init_serial 函数用于初始化串口通信。
  • 参数包括端口名称、波特率、字节大小、奇偶校验和停止位。
  • 在尝试打开串口时使用 try-except 结构来捕获异常。
  • 如果串口打开成功,则返回串口对象,否则打印错误信息并退出程序。

加载模型的函数:load_model

  • load_model 函数用于加载YOLO模型。
  • 检查模型权重文件是否存在,不存在则打印错误信息并退出。
  • 使用 YOLO 类从给定路径加载模型,并将其传输到指定的计算设备(CPU或GPU)。
  • 返回加载的模型。

处理图像的函数:process_images

  • process_images 函数负责处理指定路径下的图像。
  • 检查图像路径是否存在,不存在则打印错误信息并退出。
  • 遍历指定路径下的所有 .jpg 图像。
  • 对每张图像应用YOLO模型进行对象检测。
  • 从检测结果中提取类别和边界框信息。
  • 对于检测到的每个对象,绘制边界框并根据类别确定边界框颜色。
  • 根据检测结果通过串口发送“OK”或“not OK”信息。
  • 使用OpenCV显示结果图像,按 q 退出循环。
  • 最后关闭所有OpenCV窗口。

主函数:main

  • 在主函数中设置计算设备。
  • 初始化串口。
  • 加载模型。
  • 调用 process_images 函数处理图像。
  • 使用 if __name__ == "__main__": 确保在直接运行脚本时执行主函数。
import os
import cv2
import numpy as np
from ultralytics import YOLO
import torch
import serial
import timedef init_serial(port, baudrate, bytesize, parity, stopbits):try:ser = serial.Serial(port, baudrate, bytesize, parity, stopbits)time.sleep(1)  # 等待串口初始化return serexcept serial.SerialException as e:print(f"Error opening serial port: {e}")exit()def load_model(weights_path, device):if not os.path.exists(weights_path):print("Model weights not found!")exit()model = YOLO(weights_path).to(device)model.fuse()model.info(verbose=False)return modeldef process_images(path, model, serial_port):if not os.path.exists(path):print(f"Path {path} does not exist!")exit()for img_file in os.listdir(path):if not img_file.endswith(".jpg"):continueimg_path = os.path.join(path, img_file)img = cv2.imread(img_path)if img is None:print(f"Failed to load image {img_path}")continuemask = img.copy()result = model(img)cls, xywh = result[0].boxes.cls, result[0].boxes.xywhcls_, xywh_ = cls.detach().cpu().numpy(), xywh.detach().cpu().numpy()for pos, cls_value in zip(xywh_, cls_):pt1, pt2 = (np.int_([pos[0] - pos[2] / 2, pos[1] - pos[3] / 2]),np.int_([pos[0] + pos[2] / 2, pos[1] + pos[3] / 2]))color = [0, 0, 255] if cls_value == 0 else [0, 255, 0]cv2.rectangle(mask, tuple(pt1), tuple(pt2), color, 2)res_ = "Yes" if np.any(cls_ == 1) else "No"print(res_)serial_port.write((res_ + "\r\n").encode())cv2.imshow("result", mask)if cv2.waitKey(1) & 0xFF == ord('q'):breakcv2.destroyAllWindows()def main():device = torch.device("cuda" if torch.cuda.is_available() else "cpu")print("Using device:", device)serial_port = init_serial("/dev/ttyTHS1", 115200, serial.EIGHTBITS, serial.PARITY_NONE, serial.STOPBITS_ONE)model = load_model("./weights/best.pt", device)process_images("./datasets/pre/", model, serial_port)if __name__ == "__main__":main()

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

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

相关文章

【翻译】从Store生成Checkbox Group

原文:Ext JS: Generating a Checkbox Group from a StoreExt JS的checkbox group可以用来将复选框组合成一个单一的逻辑字段。由于复选框时不时需要动态的从Store中生成,因而,如果将store绑定到扩展类,就最好不过了。以下是第一次…

25种代码坏味道总结+优化示例

前言什么样的代码是好代码呢?好的代码应该命名规范、可读性强、扩展性强、健壮性......而不好的代码又有哪些典型特征呢?这25种代码坏味道大家要注意啦1. Duplicated Code (重复代码)重复代码就是不同地点,有着相同的程…

滚动照片抽奖软件

CODE GitHub 源码 1、女友说很丑的一个软件 说个最近的事情,女友公司过年了要搞活动,需要个抽奖的环节,当时就问我能不能给做一个,正好我也没啥事儿,就在周末的时候用C#做了一个,虽然派上用场了&#xf…

Java即时类| 带示例的compareTo()方法

即时类compareTo()方法 (Instant Class compareTo() method) compareTo() method is available in java.time package. compareTo()方法在java.time包中可用。 compareTo() method is used to compare this Instant object to the given object. compareTo()方法用于将此Instan…

11个小技巧,玩转Spring!

前言最近有些读者私信我说希望后面多分享spring方面的文章,这样能够在实际工作中派上用场。正好我对spring源码有过一定的研究,并结合我这几年实际的工作经验,把spring中我认为不错的知识点总结一下,希望对您有所帮助。一 如何获取…

MFC中的几种播放声音的方法

一.播放声音文件的简单方法  在VC 中的多媒体动态连接库中提供了一组与音频设备有关的函数。利用这些函数可以方便地播放声音。最简单的播放声音方法就是直接调用VC中提供的声音播放函 数BOOL sndPlaySound ( LPCSTR lpszSound,UINT fuSound ); 或BOOL PlaySound(…

标志枚举的使用

标志枚举的使用大多是在标记多重状态,比如说文件的属性:只读,可写,隐藏,系统文件等相关属性,都对应相应的标志位,如果在C#中想实现自己的标志枚举,也是可以的,下文是亲身…

duration java_Java Duration类| 带示例的getUnits()方法

duration java持续时间类getUnits()方法 (Duration Class getUnits() method) getUnits() method is available in java.time package. getUnits()方法在java.time包中可用。 getUnits() method is used to get the List object that contains the units of seconds and Nanos …

synchronized 的超多干货!

synchronized 这个关键字的重要性不言而喻,几乎可以说是并发、多线程必须会问到的关键字了。synchronized 会涉及到锁、升级降级操作、锁的撤销、对象头等。所以理解 synchronized 非常重要,本篇文章就带你从 synchronized 的基本用法、再到 synchronize…

团队项目—第二阶段第三天

昨天:快捷键的设置已经实现了 今天:协助成员实现特色功能之一 问题:技术上遇到了困难,特色功能一直没太大的进展。网上相关资料不是那么多,我们无从下手。 有图有真相: 转载于:https://www.cnblogs.com/JJJ…

C# struct 装箱拆箱例子

值类型:拆箱、装箱 struct是值类型 struct和class的区别 类是引用类型,struct是值类型在托管堆上创建类的实例,在栈上创建struct实例类实例的赋值,赋的是引用地址,struct实例的赋值,赋的是值类作为参数类…

stl min函数_std :: min_element()函数以及C ++ STL中的示例

stl min函数C STL std :: min_element()函数 (C STL std::min_element() function) min_element() function is a library function of algorithm header, it is used to find the smallest element from the range, it accepts a container range [start, end] and returns a…

不重启JVM,替换掉已经加载的类,偷天换日?

来源 | 美团技术博客在遥远的希艾斯星球爪哇国塞沃城中,两名年轻的程序员正在为一件事情苦恼,程序出问题了,一时看不出问题出在哪里,于是有了以下对话:“Debug一下吧。”“线上机器,没开Debug端口。”“看日…

[nodejs] 利用openshift 撰寫應用喔

2019独角兽企业重金招聘Python工程师标准>>> 朋友某一天告訴我,可以利用openshift來架站,因為他架了幾個nodejs應用放在上面,我也來利用這個平台架看看,似乎因為英文不太行,搞很久啊!! 先來架一個看看,不過架好之後,可以有三個應用,每個應用有1G的空間,用完就沒啦~~…

C#单例模式的简单使用

单例模式示例: public sealed class WindowService {//定义一个私有的静态全局变量来保存该类的唯一实例private static WindowService Service;//定义一个只读静态对象//且这个对象是在程序运行时创建的private static readonly object syncObject new object();…

stl max函数_std :: max_element()函数以及C ++ STL中的示例

stl max函数C STL std :: max_element()函数 (C STL std::max_element() function) max_element() function is a library function of algorithm header, it is used to find the largest element from the range, it accepts a container range [start, end] and returns an…

详解4种经典的限流算法

最近,我们的业务系统引入了Guava的RateLimiter限流组件,它是基于令牌桶算法实现的,而令牌桶是非常经典的限流算法。本文将跟大家一起学习几种经典的限流算法。限流是什么?维基百科的概念如下:In computer networks, rate limiting is used t…

css clearfix_如何使用CSS清除浮点数(clearfix)?

css clearfixIntroduction: 介绍: Dealing with various elements on a website or web page can sometimes prove to create many problems hence one should be aware of many properties, tricks or ways to cope with those problems. We do not want our webs…

C# 写入注册表启动项

C# 写入注册表启动项 private void RegisterSelfKey() {try{string strName Application.ExecutablePath;if (!File.Exists(strName))return;string strnewName strName.Substring(strName.LastIndexOf("\\") 1);RegistryKey RKey Registry.LocalMachine.OpenSu…

将你的Windows,快速打造成Docker工作站!

手里的macbook因为键盘问题返厂维修了,只好抱起了久违的Windows。首先面临的,就是Docker问题。docker好用,但安装麻烦,用起来也命令繁多。一个小白,如何打造舒适的docker环境,是一个非常有挑战的问题。本文…