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讀取視頻的代碼即可

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