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读取视频的代码即可

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章