yolo v8

本文详细探讨了YOLOv8的量化过程,包括ONNX导出和TensorRT优化。还讨论了YOLOv8与YOLOv5在loss计算、正负匹配等方面的差异,以及新引入的C2F结构、Distribution Focal Loss等改进。此外,文章介绍了训练数据增强策略和蒸馏技术的应用。
摘要由CSDN通过智能技术生成

这个系列代码被封装的非常的精致,对二次开发不太友好,虽然也还是可以做些调节

量化

量化需要根据目标运行的机子确定。如果是CPU,就选ONNX,如果是GPU,ONNX是不work的,要用tensorrt
在这里插入图片描述

ONNX (自带)

Export

model.export(format='onnx',int8=True)

Predict

from onnxruntime import InferenceSession
import numpy as np
from PIL import Image
from opyv8 import Predictor
import time
session = InferenceSession(path_or_bytes=r"runs\detect\train4\weights\best.onnx")
predictor = Predictor(model=session, names=['red','blue'])
start_time = time.time()
img = Image.open('test2.jpg')
print(predictor.predict(img))
print(time.time()-start_time)

ONNX (torch)

有三种方式试过,都可以导出onnx的模型
1. 用yolov8
源码来自:ultralytics\yolo\engine\exporter.py
(不固定尺寸)

yolo export model=path/to/best.pt format=onnx dynamic=True

2. 用yolov5 里 export.py
但是attempt_load_weights这一步,要用yolo v8

3. 直接用 torch

class Demo(nn.Module):
    def __init__(self, model=None):
        super(Demo, self).__init__()
        self.model = YOUR_PROCESS(model, 0, 255, False)

    def forward(self, img):
        return self.model(img)[0]

from ultralytics.nn.tasks import attempt_load_weights
model = attempt_load_weights(weights, device=0, inplace=True, fuse=True)
model = Demo(model)
model.to(device).eval() 
#......(过程省略)  
torch.onnx.export(self.model, img, output_path, verbose=False, opset_version=11, input_names=['images'],
                          output_names=['output'],
                          dynamic_axes={
   'images': {
   0: 'batch', 2: 'height', 3: 'width'}})  
  • 这里的Demo和YOUR_PROCESS都需要基于 nn.Module,在YOUR_PROCESS用于包含一些模型额外的处理。
    • YOUR_PROCESS 中的内容,如果是用于前处理,记得不要进行梯度计算,并对运算过程和整个层做梯度忽略。如下:
with torch.no_grad():
    # 在这个代码块中执行的操作不会被记录用于自动求导
    output = model(input)
self.conv_xx.eval()
# 对于self.conv_xx层以及与其相关的层,将启用评估模式的行为
output = self.conv_xx(input)
  • attempt_load_weights这一步,要用yolo v8的

TensorRT

以下三个libraries是比较重要的

pip install pycuda
pip install cuda-python
pip install tensorrt

一般前两个不会有什么问题,但是第三个会报错ERROR: Could not build wheels for tensorrt, which is required to install pyproject.toml-based projects

  • 第一步:更新pip
F:\anaconda3\envs\detection\python.exe -m pip install --upgrade pip setuptools

然后重新尝试pip install tensorrt

  • 第二步:
    如果你在看这篇po的时候,pip 里面还是没有更新到对应你的 wheel,那么你需要自己来
    假设之前,你已经下载了Nvidia 的TensorRT的zip 了(https://developer.nvidia.com/nvidia-tensorrt-8x-download)

好吧,以防万一,你还木有装,我还是说一下吧~ 下载的ZIp 解压到 “C:\Program Files\NVIDIA Corporation” , 解压的地址其实随便啦,但是我喜欢统一将Nvidia的都放这里。接着,我会将以下地址放入到 System’s PATH: C:\Program Files\NVIDIA Corporation\TensorRT\lib

set 完path 后,这个里面有救命的wheel file, tensorrt 配套的都放在 C:\Program Files\NVIDIA Corporation\TensorRT\python,好滴,找到符合你python version的wheel file,(emmmm…我不是太喜欢Windows 系统,不晓得为啥不能在原地调absolute path 操作。)

好嘛,我copy & paste它们到本地,比如我需要操作: pip install YOLOv8\tensorrt-8.6.1-cp39-none-win_amd64.whl

viola~~ 你的tensorrt 就装好啦,快给我点个👍

  • 从onnx导出 tensorrt 的engine format:
C:\Program Files\NVIDIA Corporation\TensorRT/bin/trtexec \
--onnx=yolov8s.onnx \
--saveEngine=yolov8s.engine \
--fp16

咋用呢? inference那一步,用法如果你搞过了ONNX,其实就是大同小异。后处理有点麻烦,暂时先不搞了,思路是到时候调用以下yolov8里后处理的部分,改一下代码就行

  • github 上提供了例子:
    https://github.com/NVIDIA/TensorRT/blob/main/quickstart/SemanticSegmentation/tutorial-runtime.ipynb

等我有空再续

predict

在预测时,头N个,时间花销要大点,如果测时间,得等它跑几轮,速度才会快起来。比如下面这个,前几轮是2秒,然后是0.06秒

i = 0
while i < 3:
    start_time = time.time()
    res = model('test2.jpg',save=True,device = 0)
    print(time.time()-start_time)
    i+=1
start_time = time.time()
img = Image.open('test2.jpg')
res = model('test2.jpg',save=True,device = 0)
print(time.time()-start_time)

multi-scale

def preprocess_batch(self, batch, imgsz_train, gs):
        """
        Allows custom preprocessing model inputs and ground truths depending on task type.
        """
        sz = random.randrange(int(self.args.imgsz 
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLO(You Only Look Once)是一种目标检测算法,它的主要思想是将目标检测任务转化为一个回归问题,通过单次前向传播即可同时预测图像中多个目标的位置和类别。 YOLO v8YOLO系列中的不同版本,包括YOLO v8s、YOLO v8m、YOLO v8l和YOLO v8x。它们在网络结构和性能上有所不同,下面是它们的基本内容和优劣势: 1. YOLO v8s(Small): - 网络结构较小,参数量较少,适合在计算资源有限的设备上运行。 - 速度较快,适合实时目标检测应用。 - 但由于网络较小,检测精度可能相对较低。 2. YOLO v8m(Medium): - 网络结构中等大小,参数量适中。 - 在速度和精度之间取得了平衡,可以在一定程度上提供较高的检测精度。 - 适合在计算资源相对充足的设备上运行。 3. YOLO v8l(Large): - 网络结构较大,参数量较多。 - 具有更高的检测精度,可以处理更小目标或者更复杂的场景。 - 但由于网络较大,速度可能较慢,需要更多的计算资源。 4. YOLO v8x(Extra Large): - 网络结构非常大,参数量非常多。 - 在检测精度上有所提升,可以处理更小目标或者更复杂的场景。 - 但由于网络非常大,速度非常慢,需要更多的计算资源。 总的来说,YOLO v8s适合计算资源有限且对速度要求较高的场景;YOLO v8m在速度和精度之间取得了平衡;YOLO v8l和YOLO v8x适合对检测精度要求较高的场景,但需要更多的计算资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值