jetson Orin nx + yolov8 TensorRT 加速量化 环境配置

参考【Jetson】Jetson Orin NX纯系统配置环境-CSDN博客 

一 系统环境配置:

1.更换源:

sudo vi /etc/apt/sources.list.d/nvidia-l4t-apt-source.list

2.更新源:

sudo apt upgrade
sudo apt update
sudo apt dist-upgrade
sudo apt-get update --fix-missing
sudo reboot

3.安装jetpack

sudo apt install nvidia-jetpack

4.安装jtop 

sudo apt install python3-pip
sudo -H pip3 install -U pip
sudo -H pip install jetson-stats

 jtop查看:

sudo jtop

5.安装超级终端 terminator

sudo apt-get install terminator -y

6.配置CUDA和CUDNN

(1)配置环境变量:

gedit ~/.bashrc

添加以下内容: 

export LD_LIBRARY_PATH=/usr/local/cuda/lib64
export PATH=/usr/local/cuda/bin:$PATH
export CUDA_HOME=/usr/local/cuda

(2)更新环境变量

source ~/.bashrc

(3)复制文件到cuda目录

cd /usr/include && sudo cp cudnn* /usr/local/cuda/include
cd /usr/lib/aarch64-linux-gnu && sudo cp libcudnn* /usr/local/cuda/lib64

(4)查看cuda

nvcc -V

(5)修改文件权限

sudo chmod 777 /usr/local/cuda/include/cudnn.h 
sudo chmod 777 /usr/local/cuda/lib64/libcudnn*

(6)重新软链接

#这里的8.6.0和8对应安装的cudnn版本号和首数字
cd /usr/local/cuda/lib64

sudo ln -sf libcudnn.so.8.6.0 libcudnn.so.8

sudo ln -sf libcudnn_ops_train.so.8.6.0 libcudnn_ops_train.so.8
sudo ln -sf libcudnn_ops_infer.so.8.6.0 libcudnn_ops_infer.so.8

sudo ln -sf libcudnn_adv_train.so.8.6.0 libcudnn_adv_train.so.8
sudo ln -sf libcudnn_adv_infer.so.8.6.0 libcudnn_adv_infer.so.8

sudo ln -sf libcudnn_cnn_train.so.8.6.0 libcudnn_cnn_train.so.8
sudo ln -sf libcudnn_cnn_infer.so.8.6.0 libcudnn_cnn_infer.so.8

sudo ldconfig

(7)查看cudnn

dpkg -l libcudnn8

二.安装pytorch、torchvision

1、安装pytorch

下载文档根据下载文档选择jetpack对应的pytorch版本,我的jetpack是5.1.3,下载pytorch2.0

下载地址  下载python3.8 对应的pytorch2.0的whl文件    到home目录下

安装依赖环境 

sudo apt-get install libhdf5-serial-dev hdf5-tools libhdf5-dev zlib1g-dev zip libjpeg8-dev
sudo apt-get install liblapack-dev libblas-dev gfortran

sudo apt-get install libopenblas-base libopenmpi-dev
sudo pip3 install mpi4py
sudo pip3 install Cython

安装pytorch

pip install torch-2.0.0+nv23.05-cp38-cp38-linux_aarch64.whl

 2、安装torchvision

torchvision  自己下对应版本 或者gitclone

torch2.0.0对应torchvision0.15.1

git clone --branch  v0.15.1 https://github.com/pytorch/vision torchvision
export BUILD_VERSION=0.15.1

 进入torchvision文件夹编译

cd torchvision
python3 setup.py install --user

  验证:

import torch
import torchvision
import tensorrt as trt

torch.cuda.is_available()		# 检查cuda是否可用
torch.version.cuda				# 查看Pytorch运行时使用的cuda版本
torch.backends.cudnn.enabled	# 查看cudnn是否可用
torch.backends.cudnn.version()  # 查看cudnn版本
print(trt.__version__)
print(torchvision._version_)
# '/usr/local/cuda'

pip3 show tensorrt		# 查看tensorrt版本
import torch
torch.__version__
torch.cuda.is_available()
torch.cuda.current_device()
torch.cuda.get_device_name()
python
import torch
import torchvision
print(torch.cuda.is_available())	# 这一步如果输出True那么就成功了!
quit()	# 最后退出python编译

三:安装anaconda 

下载镜像Index of /

Anaconda3-2024.02-1-Linux-aarch64.sh

chmod +x Anaconda3-2024.2-1-Linux-aarch64.sh 

./Anaconda3-2024.2-1-Linux-aarch64.sh

yes

四:安装vscode

下载vscode1.85.2

https://update.code.visualstudio.com/1.85.2/linux-deb-arm64/stable

 安装:

sudo dpkg -i code_1.85.2-1705560689_arm64.deb

  打开文件夹:  code .

五.配置yolov8环境

conda create -n yolov8 python=3.8

pip install ultralytics

六.安装ros

Jetson Orin NX 开发指南(3): 安装 ROS 系统_jetson orin nano是ros吗-CSDN博客

七.安装mavros

sudo apt-get install ros-noetic-mavros ros-noetic-mavros-extras
wget https://raw.githubusercontent.com/mavlink/mavros/master/mavros/scripts/install_geographiclib_datasets.sh
chmod +x install_geographiclib_datasets.sh
sudo ./install_geographiclib_datasets.sh

八.安装功能包

启动yolov8环境编译  conda activate yolov8

删除build和devel后catkin_make 报错

1、pip install empy==3.3.4

2、pip install catkin_pkg

3.改yolomsg 地址  、 改视觉节点sys.ultralytics路径

九.测试视觉启动代码

roscore

cd yolov8_ws

conda activate yolov8

source ./devel/setup.bash

rosrun communication_yolo yolo_stablesend.py

25w 无RT加速 无int8量化大概35ms一帧

报错:

1、pip install rospkg

2、pip install lap

 十.TensorRT加速

预处理:

将jetpack安装的tensorrt 软连接至你的虚拟环境

1)退出虚拟环境查看tensorrt地址

python3.8 -c "import tensorrt; print(tensorrt.__file__)"

2)建立软连接

ln -s /usr/lib/python3.8/dist-packages/tensorrt /home/zzb/anaconda3/envs/yolov8_trt/lib/python3.8/site-packages/tensorrt

1、转onnx

pip install onnx==1.12.0 -i https://pypi.tuna.tsinghua.edu.cn/simple

pip install onnxruntime -i https://pypi.tuna.tsinghua.edu.cn/simple

pip install polygraphy

2、量化

修改:

L289  onnx路径

L291 标定数据图片  一般用train图片

L300 模型验证图片  一般用val图片

L266数据集yaml路径  验证模型

L56 改数据集yaml路径  获取name类型

L13修改ultralytics路径
 

报错:

1)numpy has no attribute bool

找到报错文件

/home/zzb/anaconda3/envs/yolov8_trt/lib/python3.8/site-packages/tensorrt/__init__.py

 L166修改bool为bool_


int8 code:

#! /usr/bin/env python3

import json
import os
import pathlib
from datetime import datetime
import cv2 as cv
import numpy as np
import onnxruntime
# 注意!必须先导入 YOLO,然后再导入 trt,否则在运行 validate_model 函数时,程序会被中断,并
# 报错 “Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)”
import sys
sys.path.append("/home/zzb/yolov8_ws/src/communication_yolo/yolov8_main/ultralytics")
from ultralytics import YOLO
import tensorrt as trt
from tqdm import tqdm

from polygraphy.backend.trt import NetworkFromOnnxPath, CreateConfig, EngineFromNetwork
from polygraphy.backend.trt import Calibrator
import yaml

def _yolo8_2_onnx(pt_model_path):
    """把 YOLOv8 模型从 .pt 格式转换为 ONNX 模型。

    Arguments:
        pt_model_path (str): 训练好的 YOLOv8 detection (.pt)模型的权重路径。
    """
    # check up wheather this pt_path exists 
    '''
    expanduser():路径中包含~,它会被替换为当前用户的主目录的绝对路径
    pathlib.Path(pt_model_path):这里使用了pathlib库中的Path类来创建一个Path对象
    .resolve():resolve()方法将路径转换为其绝对形式
    '''
    pt_model_path = pathlib.Path(pt_model_path).expanduser().resolve()
    if not pt_model_path.exists():
        raise FileNotFoundError(f'Model not found: {pt_model_path}')
    print(f'{pt_model_path= }')
    model = YOLO(pt_model_path)
    model.export(format='onnx',opset=12)
    onnx_model_name = pt_model_path.stem + '.onnx'
    onnx_model = pt_model_path.parent / onnx_model_name
    print(f'Done! Model is exported as {onnx_model}')


def _get_metadata():
    """生成 metadata,这个 metadata 将被用于 YOLOv8 的 TensorRT 模型。

    如果是在 Anaconda 虚拟环境中安装的 YOLOv8 ,可以参考官方源码 exporter.py:
     ~/.conda/envs/yolo8/lib/python3.10/site-packages/ultralytics/engine/exporter.py

    :return:
        metadata (dict): 一个字典,包含了 YOLOv8 的 TensorRT 模型所需的元数据。
    """
    description = f'Ultralytics YOLOv8n model'
    # names: 表示类型与名字的对应关系,记得路径参数以获得names数据,如:E:\\ultralytics\\ultralytics\\cfg\\datasets\\coco128.yaml'
    with open("//home/zzb/yolov8_ws/src/communication_yolo/yolov8_main/Datasets/target_train/Dataset.yaml", 'r', encoding="utf-8") as f:
        name = yaml.safe_load(f.read())
    names = name['names']
    metadata = {
        'description': description,
        'author': 'Ultralytics',
        'license': 'AGPL-3.0 https://ultralytics.com/license',
        'date': datetime.now().isoformat(),
        'version': '8.0.186',
        'stride': 32,
        'task': 'detect',
        'batch': 1,
        'imgsz': [640, 640],
        'names': names
    }
    return metadata


def _calib_data_yolo8(onnx_input_name, onnx_input_shape,
                      calibration_images_quantity, calibration_images_folder):
    """生成标定数据,用于对 YOLOv8 模型进行 int8 量化。

    为了有更好的量化效果,得到更好的比例值 scale,需要进行标定。标定时一般有 2 个要求:
        a. 标定数据是经过前处理之后的图片(通常是归一化之后的 [0, 1] 之间的数)。
        b. 标定数据应该使用实际的图片,比如训练集的图片。

    Arguments:
        onnx_input_name (str): 一个字符串,是 ONNX 模型输入的名字。
        onnx_input_shape (tuple(int, int, int, int)): 一个元祖,是 ONNX 模型的输入张量的形状。
        calibration_images_quantity (int): 一个整数,是标定时使用的图片数量。
        calibration_images_folder (str): 一个字符串,指向一个文件夹,该文件夹内的图片将被用于标定。

    :return
        one_batch_data (Generator[dict[str, ndarray]]): 一个字典,包含了一个批次的标定数据。
    """
    print(f' {onnx_input_shape= }')  #
    if onnx_input_shape[1] != 3:  # ONNX 输入的形状可以是:1, 3, 1504, 1504。第一维度是深度通道。
        raise ValueError(f'Error, expected input depth is 3, '
                         f'but {onnx_input_shape= }')
    calibration_images_folder = pathlib.Path(calibration_images_folder).expanduser().resolve()
    if not calibration_images_folder.exists():
        raise FileNotFoundError(f'{calibration_images_folder} does not exist.')
    print(f'{calibration_images_folder= }')

    batch_size = onnx_input_shape[0]
    required_height = onnx_input_shape[2]
    required_width = onnx_input_shape[3]
    # 初始化第 0 批数据。标定时必须给 engine 输入 FP32 格式的数据。
    output_images = np.zeros(shape=onnx_input_shape, dtype=np.float32)

    # 如果图片总数不够,则使用所有图片进行标定。
    calibration_images_quantity = min(calibration_images_quantity,
                                      len(os.listdir(calibration_images_folder)))
    print(f'Calibration images quantity: {calibration_images_quantity}')
    print(f'Calibrating ...')
    # 创建一个进度条。
    tqdm_images_folder = tqdm(calibration_images_folder.iterdir(),
                              total=calibration_images_quantity, ncols=80)
    for i, one_image_path in enumerate(tqdm_images_folder):
        # 只有一个循环完整结束后,tqdm 进度条才会前进一格。因此要在 for 循环的开头
        # 使用 i == calibration_images_quantity 作为停止条件,才能看到完整的 tqdm 进度条
        if i == calibration_images_quantity:
            break
        bgr_image = cv.imread(str(one_image_path))  # noqa
        # 改变图片尺寸,注意是宽度 width 在前。
        bgr_image = cv.resize(bgr_image, (required_width, required_height))  # noqa
        one_rgb_image = bgr_image[..., ::-1]  # 从 bgr 转换到 rgb

        one_image = one_rgb_image / 255  # 归一化,转换到 [0, 1]
        one_image = one_image.transpose(2, 0, 1)  # 形状变为 depth, height, width

        batch_index = i % batch_size  # 该批次数据中的索引位置
        output_images[batch_index] = one_image  # 把该图片放入到该批次数据的对应位置。
        if batch_index == (batch_size - 1):  # 此时一个 batch 的数据已经准备完成
            one_batch_data = {onnx_input_name: output_images}
            yield one_batch_data  # 以生成器 generator 的形式输出数据
            output_images = np.zeros_like(output_images)  # 初始化下一批次数据。


def onnx_2_trt_by_polygraphy(onnx_file, optimization_level=2,
                             conversion_target='int8', engine_suffix='engine',
                             calibration_method='min-max', calibration_images_quantity=64,
                             calibration_images_folder=None,
                             onnx_input_shape=None):
    """把 onnx 模型转换为 TensorRT 模型。可以进行 int8 量化,也可以转换为 FP16 格式的模型。

    Arguments:
        onnx_file (str | pathlib.Path): 一个字符串或 Path 对象,指向一个 ONNX 文件。
        optimization_level (int): 一个整数,代表优化等级。level 越大,则会花更多时间对 engine 进行优化,得
            到的 engine 性能有可能会更好。
        conversion_target (str): 一个字符串,是 'int8', 'fp16' 或者 'fp32'。int8 表示进行 int8 量化,
            而 fp16、fp32 则表示转换为 FP16 或 FP32 格式的 TensorRT 模型。
        engine_suffix (str): 是输出的 TensorRT 模型的文件名后缀,可以是 'plan' 、'engine' 或 'trt'。
        calibration_method (str): 是进行 int8 量化时的标定方法。如果输入 None,则使用默认的
            entropy 方法,如果输入 min-max,则使用 min-max 标定方法。
        calibration_images_quantity (int): 一个整数,是标定时使用的图片数量,只在 int8 量化时有效。
        onnx_input_shape (tuple(int, int, int, int) | None): 一个元祖,是 ONNX 模型的输入张量的形状。

    :return
        converted_trt (str): 一个字符串,是生成的 TensorRT 模型的绝对路径。
    """
    if conversion_target.lower() not in ['int8', 'fp16', 'fp32']:
        raise ValueError(f"The conversion_target must be one of ['int8', 'fp16', 'fp32'], "
                         f"but get {conversion_target= }")
    if engine_suffix not in ['plan', 'engine', 'trt']:
        raise ValueError(f"The engine_suffix must be one of ['plan', 'engine', 'trt'], "
                         f"but get {engine_suffix= }")
    onnx_file = pathlib.Path(onnx_file).expanduser().resolve()
    if not onnx_file.exists():
        raise FileNotFoundError(f'Onnx file not found: {onnx_file}')
    print(f"Succeeded finding ONNX file! {onnx_file= }")

    print(f'Polygraphy inspecting model:')
    os.system(f"polygraphy inspect model {onnx_file}")  # 用 polygraphy 查看 ONNX 模型

    network = NetworkFromOnnxPath(str(onnx_file))  # 必须输入字符串给 NetworkFromOnnxPath

    # 1. 准备转换 engine 文件时的配置。包括 optimization_level 和 flag 等。
    #builder_config = CreateConfig(builder_optimization_level=optimization_level)
    builder_config = CreateConfig()
    print(f'{builder_config.builder_optimization_level= }')

    converted_trt_name = (f"{onnx_file.stem}_optimization_level_{optimization_level}"
                          f"_{conversion_target}")
    if conversion_target.lower() == 'fp16':
        builder_config.fp16 = True
        print(f'{builder_config.fp16= }')
    elif conversion_target.lower() == 'int8':
        # 2. 准备 int8 量化所需的 5 个配置。
        # 2.1 设置 INT8 的 flag
        builder_config.int8 = True
        print(f'{builder_config.int8= }')

        # 2.2 用 onnxruntime 获取模型输入的名字和形状.
        session = onnxruntime.InferenceSession(onnx_file, providers=['CPUExecutionProvider'])
        onnx_input_name = session.get_inputs()[0].name
        if onnx_input_shape is None:  # 查询 ONNX 中的输入张量形状。
            onnx_input_shape = session.get_inputs()[0].shape

        # 2.3 准备标定用的 cache 文件。
        if conversion_target.lower() == 'fp16':
            calibration_cache_file = f"./{onnx_file.stem}_fp16.cache"
        else :
            calibration_cache_file = f"./{onnx_file.stem}_int8.cache"
        calibration_cache_file = pathlib.Path(calibration_cache_file).expanduser().resolve()
        if calibration_cache_file.exists():  # 始终使用一个新的 cache,才能每次都生成新的 TensorRT 模型。
            os.remove(calibration_cache_file)

        # 2.4 设置标定方法。实际验证发现,对于 YOLOv8 模型,IInt8MinMaxCalibrator 标定的效果最好。
        if calibration_method == 'min-max':
            calibrator_class = trt.IInt8MinMaxCalibrator
        else:
            # 默认使用 entropy 方法,该方法通过减少量化时的信息损失 information loss,对模型进行标定。
            calibrator_class = trt.IInt8EntropyCalibrator2
        # 2.5 在 Calibrator 类中,传入标定方法,标定数据和 cache 等。
        builder_config.calibrator = Calibrator(
            BaseClass=calibrator_class,
            data_loader=_calib_data_yolo8(onnx_input_name=onnx_input_name, onnx_input_shape=onnx_input_shape,
                                          calibration_images_quantity=calibration_images_quantity,
                                          calibration_images_folder=calibration_images_folder),
            cache=calibration_cache_file)
        int8_suffix = f'_{calibration_method}_images{calibration_images_quantity}'
        converted_trt_name = converted_trt_name + int8_suffix

    converted_trt = onnx_file.parent / (converted_trt_name + f'.{engine_suffix}')

    print('Building the engine ...')
    # 3. 按照前面的配置 config,设置 engine。注意 EngineFromNetwork 返回的是一个可调用对象 callable。
    build_engine = EngineFromNetwork(network, config=builder_config)

    # 4. 调用一次 build_engine,即可生成 engine,然后保存 TensorRT 模型即可。
    with build_engine() as engine, open(converted_trt, 'wb') as t:
        yolo8_metadata = _get_metadata()  # 需要创建 YOLOv8 的原数据 metadata
        meta = json.dumps(yolo8_metadata)  # 转换为 json 格式的字符串

        # 保存 TensorRT 模型时,必须先写入 metadata,然后再写入模型的数据。
        t.write(len(meta).to_bytes(4, byteorder='little', signed=True))
        t.write(meta.encode())
        t.write(engine.serialize())

    engine_saved = ''
    if not pathlib.Path(converted_trt).exists():
        engine_saved = 'not '
    print(f'Done! {converted_trt} is {engine_saved.upper()}saved.')
    return str(converted_trt)


def validate_model(model_path, conf, iou, imgsz, dataset_split, agnostic_nms,
                   batch_size=1,  **kwargs):
    """验证 YOLOv8 模型的指标。可以是 TensorRT 模型或 PyTorch 的模型。

    Arguments:
        model_path (str): 一个字符串,是一个训练好的 YOLOv8 detection 模型的路径。
        conf (float): 一个范围在 [0, 1] 的浮点数,表示在预测时,使用的置信度阈值。
        iou (float): 一个范围在 [0, 1] 的浮点数,表示在预测时,使用的交并比。
        imgsz (int): 一个整数,是预测时,使用的图片最大高度和最大高度。
        dataset_split (str): 一个字符串,是 val 或 test,分别代表验证集或测试集。
            如果使用 val_test,必须把标签和图片都放入同一个文件夹 val_test 中。
        agnostic_nms (bool): 一个布尔值,如果为 True,则在进行 NMS 时,不区分类别,即把所有
            类别都看做同一个类别。而如果为 False,则只有相同类别的框,才会用来进行 NMS。
        batch_size (int): 一个整数,是预测时的 batch 大小。
    """
    model_path = pathlib.Path(model_path).expanduser().resolve()
    if not model_path.exists():
        raise FileNotFoundError(f'Model not found: {model_path}')
    print(f'{model_path= }')
    print(f'{conf= }, {iou= }, {imgsz= }')

    model = YOLO(model_path, task='detect')  # 须在创建模型时设置 task。

    detect_data = "/home/zzb/yolov8_ws/src/communication_yolo/yolov8_main/Datasets/target_train/Dataset.yaml"
    metrics = model.val(split=dataset_split, save=False,
                        data=detect_data,
                        agnostic_nms=agnostic_nms, batch=batch_size,
                        conf=conf, iou=iou, imgsz=imgsz,
                        **kwargs)
    map50 = round(metrics.box.map50, 3)
    print(f'{dataset_split} mAP50= {map50}')


def main():
    """把 YOLOv8 模型进行 int8 量化,然后用验证集、测试集的数据,验证量化后模型的指标。

    一共有 3 个步骤,第一个步骤是把 pt 模型转换为 ONNX 模型,第二个步骤是进行 int8 量化,
    第三个步骤是验证量化模型的指标。
    注意第一个步骤要和后面两个步骤分开执行。即先注释第二步和第三步,执行第一步转换 ONNX 模型。
    然后将第一步注释掉,再次运行 main 程序,执行后面的第二步和第三步。
    """
    # 1. 先用下面 2 行,把 PyTorch 模型转换为 ONNX 模型。
    # pt_model_path = ('/home/zzb/yolov8_ws/src/communication_yolo/yolov8_main/Datasets/target_train/12.19_GM_best.pt')
    # _yolo8_2_onnx(pt_model_path=pt_model_path)

    # 2. 用 ONNX 模型进行 int8 量化,生成 TensorRT 的模型。
    onnx_file = ("/home/zzb/yolov8_ws/src/communication_yolo/yolov8_main/Datasets/target_train/12.19_GM_best.onnx")
    calibration_images = 64  # 也可以尝试 100, 32 等其它图片数量进行标定。
    calibration_images_folder = "/home/zzb/yolov8_ws/src/communication_yolo/yolov8_main/Datasets/target_train/images/train"  # 使用训练集的图片进行标定。
    saved_engine = onnx_2_trt_by_polygraphy(
        onnx_file=onnx_file, optimization_level=2, conversion_target='int8',
        engine_suffix='engine', calibration_images_quantity=calibration_images,
        calibration_images_folder=calibration_images_folder)

    # 3. 用验证集和测试集,检查 int8 量化后的模型指标。
    # 也可以输入 pt_model_path 验证 PyTorch 模型的指标。
    validate_model(model_path=saved_engine,
                   dataset_split="val_test", imgsz=640,
                   conf=0.5, iou=0.7, agnostic_nms=True)


if __name__ == '__main__':
    main()

100%|███████████████████████████████████████████| 64/64 [00:55<00:00,  1.14it/s]
[I] Saving calibration cache to /home/zzb/yolov8_ws/src/communication_yolo/yolov8_main/12.19_GM_best_int8.cache
[W] Missing scale and zero-point for tensor (Unnamed Layer* 347) [Constant]_output, expect fall back to non-int8 implementation for any layer consuming or producing given tensor
[I] Finished engine building in 532.004 seconds
Done! /home/zzb/yolov8_ws/src/communication_yolo/yolov8_main/Datasets/target_train/12.19_GM_best_optimization_level_2_int8_min-max_images64.engine is saved.
model_path= PosixPath('/home/zzb/yolov8_ws/src/communication_yolo/yolov8_main/Datasets/target_train/12.19_GM_best_optimization_level_2_int8_min-max_images64.engine')
conf= 0.5, iou= 0.7, imgsz= 640
Ultralytics YOLOv8.0.218 🚀 Python-3.8.20 torch-2.0.0+nv23.05 CUDA:0 (Orin, 15503MiB)
Loading /home/zzb/yolov8_ws/src/communication_yolo/yolov8_main/Datasets/target_train/12.19_GM_best_optimization_level_2_int8_min-max_images64.engine for TensorRT inference...
[12/26/2024-19:14:38] [TRT] [I] The logger passed into createInferRuntime differs from one already provided for an existing builder, runtime, or refitter. Uses of the global logger, returned by nvinfer1::getLogger(), will return the existing value.

[12/26/2024-19:14:38] [TRT] [I] Loaded engine size: 4 MiB
[12/26/2024-19:14:38] [TRT] [I] [MemUsageChange] TensorRT-managed allocation in engine deserialization: CPU +0, GPU +4, now: CPU 0, GPU 4 (MiB)
[12/26/2024-19:14:38] [TRT] [I] [MemUsageChange] TensorRT-managed allocation in IExecutionContext creation: CPU +0, GPU +28, now: CPU 0, GPU 32 (MiB)
Traceback (most recent call last):
  File "/home/zzb/yolov8_ws/src/communication_yolo/yolov8_main/ultralytics/data/base.py", line 104, in get_img_files
    p = Path(p)  # os-agnostic
  File "/home/zzb/anaconda3/envs/yolov8_trt/lib/python3.8/pathlib.py", line 1042, in __new__
    self = cls._from_parts(args, init=False)
  File "/home/zzb/anaconda3/envs/yolov8_trt/lib/python3.8/pathlib.py", line 683, in _from_parts
    drv, root, parts = self._parse_args(args)
  File "/home/zzb/anaconda3/envs/yolov8_trt/lib/python3.8/pathlib.py", line 667, in _parse_args
    a = os.fspath(a)
TypeError: expected str, bytes or os.PathLike object, not NoneType

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "TensorRT_int8.py", line 306, in <module>
    main()
  File "TensorRT_int8.py", line 299, in main
    validate_model(model_path=saved_engine,
  File "TensorRT_int8.py", line 267, in validate_model
    metrics = model.val(split=dataset_split, save=False,
  File "/home/zzb/yolov8_ws/src/communication_yolo/yolov8_main/ultralytics/engine/model.py", line 273, in val
    validator(model=self.model)
  File "/home/zzb/.local/lib/python3.8/site-packages/torch/utils/_contextlib.py", line 115, in decorate_context
    return func(*args, **kwargs)
  File "/home/zzb/yolov8_ws/src/communication_yolo/yolov8_main/ultralytics/engine/validator.py", line 150, in __call__
    self.dataloader = self.dataloader or self.get_dataloader(self.data.get(self.args.split), self.args.batch)
  File "/home/zzb/yolov8_ws/src/communication_yolo/yolov8_main/ultralytics/models/yolo/detect/val.py", line 197, in get_dataloader
    dataset = self.build_dataset(dataset_path, batch=batch_size, mode='val')
  File "/home/zzb/yolov8_ws/src/communication_yolo/yolov8_main/ultralytics/models/yolo/detect/val.py", line 193, in build_dataset
    return build_yolo_dataset(self.args, img_path, batch, self.data, mode=mode, stride=self.stride)
  File "/home/zzb/yolov8_ws/src/communication_yolo/yolov8_main/ultralytics/data/build.py", line 80, in build_yolo_dataset
    return YOLODataset(
  File "/home/zzb/yolov8_ws/src/communication_yolo/yolov8_main/ultralytics/data/dataset.py", line 41, in __init__
    super().__init__(*args, **kwargs)
  File "/home/zzb/yolov8_ws/src/communication_yolo/yolov8_main/ultralytics/data/base.py", line 72, in __init__
    self.im_files = self.get_img_files(self.img_path)
  File "/home/zzb/yolov8_ws/src/communication_yolo/yolov8_main/ultralytics/data/base.py", line 120, in get_img_files
    raise FileNotFoundError(f'{self.prefix}Error loading data from {img_path}\n{HELP_URL}') from e
FileNotFoundError: val: Error loading data from None
See https://docs.ultralytics.com/datasets/detect for dataset formatting guidance.

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Burp炮台实现(动态ip发包)

基本步骤 1.使用 zmap 爬取大量代理ip 2.使用py1脚本初步筛选可用ip 3.利用py2脚本再次筛选对目标网站可用ip&#xff08;不带payload安全检测&#xff09; 4.配置 burp 插件并加载收集到的代理池 5.加载payload&#xff0c;开始爆破 Zmap kali安装 sudo apt update apt …

springboot495基于java的物资综合管理系统的设计与实现(论文+源码)_kaic

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统物资综合管理系统信息管理难度大&#xff0c;容错率低&am…

STM32-笔记16-定时器中断点灯

一、实验目的 使用定时器 2 进行中断点灯&#xff0c;500ms LED 灯翻转一次。 二&#xff0c;定时器溢出时间计算 Tout&#xff1a;定时器溢出时间 Ft&#xff1a;定时器的时钟源频率 ARR&#xff1a;自动重装载寄存器的值 PSC&#xff1a;预分频器寄存器的值 例如&#xff0c…

【MySQL】 SQL优化讲解

一、优化前的思考 在定位到慢查询后&#xff0c;面试官常问如何优化或分析慢查询的SQL语句。若存在聚合查询、多表查询&#xff0c;可尝试优化SQL语句结构&#xff0c;如多表查询可新增临时表&#xff1b;若表数据量过大&#xff0c;可添加索引&#xff0c;但添加索引后仍慢则…

C/C++ 数据结构与算法【栈和队列】 栈+队列详细解析【日常学习,考研必备】带图+详细代码

一、介绍 栈和队列是限定插入和删除只能在表的“端点”进行的线性表&#xff0c;是线性表的子集&#xff0c;是插入和删除位置受限的线性表。 &#xff08;操作受限的线性表&#xff09; 二、栈 1&#xff09;概念&#xff1a; 栈(stack)是一个特殊的线性表&#xff0c;是限…

【HarmonyOS应用开发——ArkTS语言】购物商城的实现【合集】

目录 &#x1f60b;环境配置&#xff1a;华为HarmonyOS开发者 &#x1f4fa;演示效果&#xff1a; &#x1f4d6;实验步骤及方法&#xff1a; 1. 在src/main/ets文件中创建components文件夹并在其中创建Home.ets和HomeProduct.ets文件。​ 2. 在Home.ets文件中定义 Home 组…

连锁餐饮行业数据可视化分析方案

引言 随着连锁餐饮行业的迅速发展&#xff0c;市场竞争日益激烈。企业需要更加精准地把握运营状况、消费者需求和市场趋势&#xff0c;以制定科学合理的决策&#xff0c;提升竞争力和盈利能力。可视化数据分析可以帮助连锁餐饮企业整合多源数据&#xff0c;通过直观、动态的可…

学习threejs,THREE.RingGeometry 二维平面圆环几何体

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.RingGeometry 圆环几…

计算机网络实验室建设方案

一、计算机网络实验室拓扑结构 计算机网络综合实验室解决方案&#xff0c;是面向高校网络相关专业开展教学实训的综合实训基地解决方案。教学实训系统采用 B&#xff0f;S架构&#xff0c;通过公有云教学实训平台在线学习模式&#xff0c;轻松实现网络系统建设与运维技术的教学…

ThinkPHP 8开发环境安装

【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客 《ThinkPHP 8高效构建Web应用 夏磊 编程与应用开发丛书 清华大学出版社》【摘要 书评 试读】- 京东图书 1. 安装PHP8 Windows系统用户可以前往https://windows.php.net/downloads/releases/archives/下载PHP 8.0版本&am…

Nmap基础入门及常用命令汇总

Nmap基础入门 免责声明&#xff1a;本文单纯分享技术&#xff0c;请大家使用过程中遵守法律法规~ 介绍及安装 nmap是网络扫描和主机检测的工具。作为一个渗透测试人员&#xff0c;必不可少的就是获取信息。那么nmap就是我们从互联网上获取信息的途径&#xff0c;我们可以扫描互…

使用openvino加速部署paddleocr文本方向分类模型(C++版)

使用openvino加速部署paddleocr文本方向分类模型(C++版) 大体流程方向分类器在openvino上的部署代码C++大体流程 原始图像: 先resize 再归一化 方向分类器在openvino上的部署代码C++ #include <iostream> #include <string>#include <vector> #i…

嵌入式单片机窗口看门狗控制与实现

窗口看门狗 注意:WWDG外设没有独立的时钟源,而是挂载在APB1总线下,APB1总线外设时钟为42MHZ。 了解WWDG外设的使用流程,可以参考stm32f4xx_wwdg.c的开头注释,具体流程如下图所示

【KLEE】源码阅读笔记----KLEE执行流程

本文架构 1. 动机2.KLEE简介3.KLEE的代码工程结构4. 从KLEE主函数入手main函数step1: 初始化step2&#xff1a;加载.bc文件进行符号执行 读取测试用例输出日志信息 1. 动机 最近准备对KLEE进行修改使其符合我的需要&#xff0c;因此免不了需要对源码进行修改。读懂源码是对在其…

【hackmyvm】soul靶机wp

tags: HMVrbash绕过图片隐写PHP配置解析 1. 基本信息^toc 文章目录 1. 基本信息^toc2. 信息收集3. 图片解密3.1. 爆破用户名3.2. 绕过rbash3.3. 提权检测 4. 获取webshell4.1. 修改php配置 5. www-data提权gabriel6. gabriel提取到Peter7. Peter提权root 靶机链接 https://ha…

macos 隐藏、加密磁盘、文件

磁盘加密 打开磁盘工具 点击添加 设置加密参数 设置密码 查看文件 不用的时候右键卸载即可使用的时候装载磁盘&#xff0c;并输入密码即可 修改密码 解密 加密&#xff0c;输入密码即可 禁止开机自动挂载此加密磁盘 如果不禁止自动挂载磁盘&#xff0c;开机后会弹出输入…

基于OpenCV和Python的人脸识别系统_django

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 管理员登录 管理员功能界面 用户管理 公告信息管理 操作日志管理 用户登录界面 用户…

如何永久解决Apache Struts文件上传漏洞

Apache Struts又双叒叕爆文件上传漏洞了。 自Apache Struts框架发布以来&#xff0c;就存在多个版本的漏洞&#xff0c;其中一些漏洞涉及到文件上传功能。这些漏洞可能允许攻击者通过构造特定的请求来绕过安全限制&#xff0c;从而上传恶意文件。虽然每次官方都发布补丁进行修…

回归预测 | MATLAB实现CNN-LSTM卷积长短期记忆神经网络多输入单输出回归预测

回归预测 | MATLAB实现CNN-LSTM卷积长短期记忆神经网络多输入单输出回归预测 目录 回归预测 | MATLAB实现CNN-LSTM卷积长短期记忆神经网络多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现CNN-LSTM卷积长短期记忆神经网络多输入单输出回归…

LeetCode - Google 校招100题 第5天 双指针(Two Pointers) (11题)

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/144742777 LeetCode 合计最常见的 112 题: 校招100题 第1天 链表(List) (19题)校招100题 第2天 树(Tree) (21题)校招100题 第3天 动态规划(DP) (20题)