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