YOLO检测和分类pt模型的读取和使用

自YOLOv5增加分类功能后,它成为全能模型,但实践中常需将检测和分类一起使用或集成到其他代码,YOLO pt格式模型的读取和使用成问题。本文以YOLOv5为例,介绍了YOLO检测和分类模型pt文件的读取及使用方法,尤其指出分类模型使用较繁琐。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景:

自从YOLOv5增加分类功能以来,YOLO成为了一个堪称全能的模型。然而,在具体实践中,不可能单单做检测或者单单做分类,往往需要一起使用或者集成到其他的代码中去。那么对于YOLOpt格式的模型如何读取和使用变成了一个极大的问题

以往的方法:

YOLO官方提供了export.py 文件,可以通过该文件将pt文件转换为其他格式的模型文件例如:ONNX。但是既然有YOLO自己读取pt文件的例子在,又何必多此一举转换成其他文件呢?

对于pt模型的使用,检测模型尚可,分类模型的使用极为繁琐,无法直接使用。下面就将介绍YOLOpt文件的读取和使用的具体方式----以YOLOv5为例

YOLO检测模型:

读取文件:

使用torch.hub.load来读取,注意最后一定要加上“local”,不然该方法默认从网上下载模型而不是本地读取。注意,读取模型的路径可以随意(不一定要放在YOLO文件夹内),但是YOLO的地址需要准确。

detecter = torch.hub.load('path of your YOLO root,例如:E:/Yolov5', 'custom', path='path of your pt,例如:E:/detect.pt', source='local')

检测方法:

直接检测,但是对于返回的值需要重点说明

#frame就是一个普通的图片cv2.imread直接读取的那种
results = detecter(frame)
#对于绝大多数信息都保存在results.xyxy[0]中,我也不知道为什么好好的xyxy非要放在另一个列表里
for xyxy in results.xyxy[0]:
    #获取到当前图片真正的xyxy,原来的格式应该是tensor,需要转化为列表
    xyxy = xyxy.tolist()
    #下面四行不用过多说明吧,检测框左上角坐标和右下角坐标
    xStart = xyxy[0]
    yStart = xyxy[1]
    xEnd = xyxy[2]
    yEnd = xyxy[3]
    #检测置信度
    conf = xyxy[4]
    #检测类别    
    cls = xyxy[5]

YOLO分类模型

读取文件:

和检测模型一样的读取方式

classifier_YOLO = torch.hub.load('E:\\yolov5-master', 'custom', path='models\\classify.pt', source='local')

使用方法:

对于YOLO分类模型的使用极为麻烦,如下,关于该函数请无脑使用,想理解可以配合源码服用。不想理解直接调用即可

#这些头文件是YOLO文件夹下 utils文件夹的文件,需要把这个文件复制到你的项目根目录下
from utils.general import (LOGGER, Profile, check_file, check_img_size, check_imshow, check_requirements, colorstr, cv2,
                           increment_path, print_args, strip_optimizer)
from utils.augmentations import classify_transforms

import torch
import torch.nn.functional as F

#classifier为pt模型,frame为待检测图片
def recognition_YOLO(classifier,frame):
    imgsz = (224, 224)
    stride, names, pt = classifier.stride, classifier.names, classifier.pt
    imgsz = check_img_size(imgsz, s=stride)  # check image size
    
    frame = classify_transforms(imgsz[0])(frame)
    
    #转为tensor类型
    frame = torch.Tensor(frame).to(classifier.device)
    if len(frame.shape) == 3:
        frame = frame[None]  # 增加batch维度
    #分类
    finalclasses = F.softmax(classifier(frame),dim=1)
    
    for i, prob in enumerate(finalclasses):  # per image
        #获取置信度最高的两个可能性
        top2i = prob.argsort(0, descending=True)[:2].tolist()  # top 2 indices
        classify_result = f"{', '.join(f'{names[j]} {prob[j]:.2f}' for j in top2i)}, "
    #返回分类结果
    return classify_result

### 使用 Python YOLO 实现视频对象检测 为了使用 Python YOLO 模型进行视频对象检测,通常会采用如下方法: #### 准备环境 安装必要的库工具包对于项目至关重要。确保已安装 `opencv-python` 库用于处理视频流,并选择合适的框架来加载 YOLO 模型,比如 PyTorch 或者 Darknet 原生版本。 ```bash pip install opencv-python torch torchvision ``` #### 加载预训练模型 可以从官方资源获取预训练权重文件并下载对应的配置文件。如果选用的是基于 PyTorch 的实现,则可以直接通过 GitHub 仓库中的脚本完成这一过程[^1]。 #### 初始化网络结构 定义函数读取配置文件初始化神经网络架构,并加载之前准备好的权重参数。 ```python import cv2 from models import * # 导入YOLOv3的PyTorch实现模块 from utils.utils import * device = 'cuda' if torch.cuda.is_available() else 'cpu' model = Darknet('cfg/yolov3.cfg', img_size=(416, 416)).to(device) if device == 'cuda': model.load_darknet_weights('weights/yolov3.weights') else: weights = torch.load('weights/yolov3.pt')['model'].state_dict() model.load_state_dict(weights) ``` #### 处理每一帧图像 编写循环遍历视频每一帧,在每一步执行预测操作并将结果可视化显示出来。这里需要注意将原始尺寸转换为目标大小以匹配输入需求。 ```python def detect_video(video_path='data/samples/video.mp4'): cap = cv2.VideoCapture(video_path) while True: ret, frame = cap.read() if not ret: break # 图像预处理 img = letterbox(frame)[0] img = img[:, :, ::-1].transpose(2, 0, 1) # BGR to RGB & HWC to CHW img = np.ascontiguousarray(img, dtype=np.float32) / 255.0 tensor_img = torch.from_numpy(img).unsqueeze(0).to(device) with torch.no_grad(): pred = model(tensor_img)[0] detections = non_max_suppression(pred, conf_thres=0.7, nms_thres=0.4) draw_boxes(detections, frame) cv2.imshow('Video Detection', frame) key = cv2.waitKey(1) if key == ord('q'): # 按下 q 键退出播放 break cap.release() cv2.destroyAllWindows() detect_video() ``` 上述代码片段展示了如何逐帧捕获视频内容并通过调用 `non_max_suppression()` 方法去除冗余框体从而获得最终检测结果;最后利用 OpenCV 将带有标注框的画面实时展示给用户观看[^2]。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千天夜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值