NANO上利用 tensorRT的trt-yolo 进行视频检测

写在前面

1、tensorRT是NVIDIA 的高性能的推断C++库,可以用于深度学习加速。
nano上如果不使用tensorRT加速,则:
yolo v3 速度<1fps
yolov3 tiny 速度<8fps
所以必须使用tensorRT加速。毕竟官网上说可以25fps。
2、tensorRT的支持 caffe 、tensorflow、和ONNX,如果不是以上模式,需要转换成ONNX模式。
3、NANO的技术网站
https://devtalk.nvidia.com/default/topic/1050377/jetson-nano/deep-learning-inference-benchmarking-instructions/
中提供 了darknet的 trt-yolo 和deepstream-yolo 。
在这里插入图片描述

  • trt-yolo 可以利用了tensorRT加速,可以测试图片。
  • deepstream-yolo被设计为可以利用deepstream进行多视频输入测试,但是deepstream现在还不能在nano上使用,所以相当于目前没用。
使用 trt-yolo

在这里插入图片描述
在这里插入图片描述

修改和增加功能

1、设置保存 和显示

对应方法
修改 cfg文件中yolov3-tiny.txt 的set viewing 和set saveing 删除注释
在这里插入图片描述

2、修改代码使 读取视频

这里有些复杂,要慢慢讲
第一步首先阅读app/trt-yolo/trt-yolo-app.cpp
大概的步骤是先读取list,然后循环,每次都在dsImages中更新batch的图片在这里插入图片描述所以我们修改dsImages 使得其每次只读取本视频帧,之后部分则可以不修改。
在这里插入图片描述
dsImages是 std::vector dsImages;定义,则看DsImage是如何定义?是否可以直接利用fream定义?
找到其定义于deepstream_reference_apps/yolo/lib/ds_image.cpp
只有两种方法,所以需要自己定义一种利用mat输入,生成dsimage对象的方法
在这里插入图片描述
新定义的方法

DsImage::DsImage( cv::Mat a, const int& inputH, const int& inputW)
{
     m_ImageName = "1.jpg";
    m_OrigImage = a;

    if (!m_OrigImage.data || m_OrigImage.cols <= 0 || m_OrigImage.rows <= 0)
    {
        //std::cout << "Unable to open image : " << path << std::endl;
        assert(0);
    }

    if (m_OrigImage.channels() != 3)
    {
        //std::cout << "Non RGB images are not supported : " << path << std::endl;
        assert(0);
    }

    m_OrigImage.copyTo(m_MarkedImage);
    m_Height = m_OrigImage.rows;
    m_Width = m_OrigImage.cols;

    // resize the DsImage with scale
    float dim = std::max(m_Height, m_Width);
    int resizeH = ((m_Height / dim) * inputH);
    int resizeW = ((m_Width / dim) * inputW);
    m_ScalingFactor = static_cast<float>(resizeH) / static_cast<float>(m_Height);

    // Additional checks for images with non even dims
    if ((inputW - resizeW) % 2) resizeW--;
    if ((inputH - resizeH) % 2) resizeH--;
    assert((inputW - resizeW) % 2 == 0);
    assert((inputH - resizeH) % 2 == 0);

    m_XOffset = (inputW - resizeW) / 2;
    m_YOffset = (inputH - resizeH) / 2;

    assert(2 * m_XOffset + resizeW == inputW);
    assert(2 * m_YOffset + resizeH == inputH);

    // resizing
    cv::resize(m_OrigImage, m_LetterboxImage, cv::Size(resizeW, resizeH), 0, 0, cv::INTER_CUBIC);
    // letterboxing
    cv::copyMakeBorder(m_LetterboxImage, m_LetterboxImage, m_YOffset, m_YOffset, m_XOffset,
                       m_XOffset, cv::BORDER_CONSTANT, cv::Scalar(128, 128, 128));
    // converting to RGB
    cv::cvtColor(m_LetterboxImage, m_LetterboxImage, CV_BGR2RGB);
}

之后修改trt-yolo-app中在这里插入图片描述
之后添加利用opencv读取视频的代码即可

  • 6
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 21
    评论
在Jetson Nano上使用TensorRT加速Yolov5的推理可以按照以下步骤进行: 1. 安装TensorRT和Yolov5:首先确保你已经在Jetson Nano上安装了JetPack SDK,该包中包含了TensorRT和CUDA等必要的组件。你可以从NVIDIA官方网站下载并安装JetPack SDK。然后,你可以从Yolov5的GitHub页面获取Yolov5的代码。 2. 将Yolov5模型转换为TensorRT引擎:在Yolov5代码的根目录下,有一个`yolov5s.yaml`文件,它定义了模型的结构和超参数。你可以使用`convert.py`脚本将模型转换为TensorRT引擎。具体命令如下: ``` python convert.py --weights yolov5s.pt --cfg yolov5s.yaml --output yolov5s.engine ``` 这将生成一个名为`yolov5s.engine`的TensorRT引擎文件。 3. 编写推理代码:使用TensorRT引擎进行推理,可以使用Jetson Inference库。首先,确保你已经在Jetson Nano上安装了Jetson Inference库。然后,创建一个新的Python文件,并添加以下代码: ```python import ctypes import numpy as np import cv2 import jetson.inference import jetson.utils ctypes.CDLL('libnvinfer_plugin.so', mode=ctypes.RTLD_GLOBAL) engine_path = 'yolov5s.engine' input_width = 640 input_height = 640 # 加载TensorRT引擎 trt_yolov5 = jetson.inference.detectNet(engine_path, threshold=0.5) # 加载输入图像 input_image = jetson.utils.loadImage('input.jpg') input_image = jetson.utils.cudaFromNumpy(input_image) # 设置网络的输入尺寸 trt_yolov5.SetInputWidth(input_width) trt_yolov5.SetInputHeight(input_height) # 进行目标检测 detections = trt_yolov5.Detect(input_image, input_width, input_height) # 处理检测结果 for detection in detections: class_name = trt_yolov5.GetClassDesc(detection.ClassID) print(f'Object: {class_name}, Confidence: {detection.Confidence:.2f}') left = int(detection.Left) top = int(detection.Top)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值