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