• JetsonNano部署yolo5 c++ onnx


    编译OpenCV最新4.5.x版本

    Jetson Nano自带的OpenCV版本比较低,Jetpack4.6对应的OpenCV版本为4.1的

    OpenCV当前最新版本已经到了4.5跟4.6了,4.5.x中OpenCV DNN支持了很多新的模型推理跟新的特性都无法在OpenCV4.1上演示,所以我决定从源码编译OpenCV升级版本到 4.5.4,然后我发一个非常好的网站,提供了完整的脚本,于是我直接运行了该脚本就完成了安装,整个安装过程需要等待几个小时,耐心点。这个完整的脚本下载地址如下:

    https://github.com/Qengineering/Install-OpenCV-Jetson-Nano

    关于脚本每一个步骤的解释与说明如下:

    https://qengineering.eu/install-opencv-4.5-on-jetson-nano.html

    这里我也搬运了一下,选择OpenCV4.5.4版本完成编译与安装,对应完整的脚本如下:

    1. #!/bin/bash
    2. set -e
    3. echo "Installing OpenCV 4.5.4 on your Jetson Nano"
    4. echo "It will take 2.5 hours !"
    5. # reveal the CUDA location
    6. cd ~
    7. sudo sh -c "echo '/usr/local/cuda/lib64' >> /etc/ld.so.conf.d/nvidia-tegra.conf"
    8. sudo ldconfig
    9. # install the dependencies
    10. sudo apt-get install -y build-essential cmake git unzip pkg-config zlib1g-dev
    11. sudo apt-get install -y libjpeg-dev libjpeg8-dev libjpeg-turbo8-dev libpng-dev libtiff-dev
    12. sudo apt-get install -y libavcodec-dev libavformat-dev libswscale-dev libglew-dev
    13. sudo apt-get install -y libgtk2.0-dev libgtk-3-dev libcanberra-gtk*
    14. sudo apt-get install -y python-dev python-numpy python-pip
    15. sudo apt-get install -y python3-dev python3-numpy python3-pip
    16. sudo apt-get install -y libxvidcore-dev libx264-dev libgtk-3-dev
    17. sudo apt-get install -y libtbb2 libtbb-dev libdc1394-22-dev libxine2-dev
    18. sudo apt-get install -y gstreamer1.0-tools libv4l-dev v4l-utils qv4l2 
    19. sudo apt-get install -y libgstreamer-plugins-base1.0-dev libgstreamer-plugins-good1.0-dev
    20. sudo apt-get install -y libavresample-dev libvorbis-dev libxine2-dev libtesseract-dev
    21. sudo apt-get install -y libfaac-dev libmp3lame-dev libtheora-dev libpostproc-dev
    22. sudo apt-get install -y libopencore-amrnb-dev libopencore-amrwb-dev
    23. sudo apt-get install -y libopenblas-dev libatlas-base-dev libblas-dev
    24. sudo apt-get install -y liblapack-dev liblapacke-dev libeigen3-dev gfortran
    25. sudo apt-get install -y libhdf5-dev protobuf-compiler
    26. sudo apt-get install -y libprotobuf-dev libgoogle-glog-dev libgflags-dev
    27. # remove old versions or previous builds
    28. cd ~ 
    29. sudo rm -rf opencv*
    30. # download the latest version
    31. wget -O opencv.zip https://github.com/opencv/opencv/archive/4.5.4.zip 
    32. wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.5.4.zip 
    33. # unpack
    34. unzip opencv.zip 
    35. unzip opencv_contrib.zip 
    36. # some administration to make live easier later on
    37. mv opencv-4.5.4 opencv
    38. mv opencv_contrib-4.5.4 opencv_contrib
    39. # clean up the zip files
    40. rm opencv.zip
    41. rm opencv_contrib.zip
    42. set install dir
    43. cd ~/opencv
    44. mkdir build
    45. cd build
    46. run cmake
    47. cmake -D CMAKE_BUILD_TYPE=RELEASE \
    48. -D CMAKE_INSTALL_PREFIX=/usr \
    49. -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules \
    50. -D EIGEN_INCLUDE_PATH=/usr/include/eigen3 \
    51. -D WITH_OPENCL=OFF \
    52. -D WITH_CUDA=ON \
    53. -D CUDA_ARCH_BIN=5.3 \
    54. -D CUDA_ARCH_PTX="" \
    55. -D WITH_CUDNN=ON \
    56. -D WITH_CUBLAS=ON \
    57. -D ENABLE_FAST_MATH=ON \
    58. -D CUDA_FAST_MATH=ON \
    59. -D OPENCV_DNN_CUDA=ON \
    60. -D ENABLE_NEON=ON \
    61. -D WITH_QT=OFF \
    62. -D WITH_OPENMP=ON \
    63. -D BUILD_TIFF=ON \
    64. -D WITH_FFMPEG=ON \
    65. -D WITH_GSTREAMER=ON \
    66. -D WITH_TBB=ON \
    67. -D BUILD_TBB=ON \
    68. -D BUILD_TESTS=OFF \
    69. -D WITH_EIGEN=ON \
    70. -D WITH_V4L=ON \
    71. -D WITH_LIBV4L=ON \
    72. -D OPENCV_ENABLE_NONFREE=ON \
    73. -D INSTALL_C_EXAMPLES=OFF \
    74. -D INSTALL_PYTHON_EXAMPLES=OFF \
    75. -D BUILD_opencv_python3=TRUE \
    76. -D OPENCV_GENERATE_PKGCONFIG=ON \
    77. -D BUILD_EXAMPLES=OFF ..
    78. run make
    79. FREE_MEM="$(free -m | awk '/^Swap/ {print $2}')"
    80. Use "-j 4" only swap space is larger than 5.5GB
    81. if [[ "FREE_MEM" -gt "5500" ]]; then
    82.   NO_JOB=4
    83. else
    84.   echo "Due to limited swap, make only uses 1 core"
    85.   NO_JOB=1
    86. fi
    87. make -j ${NO_JOB} 
    88. sudo rm -r /usr/include/opencv4/opencv2
    89. sudo make install
    90. sudo ldconfig
    91. # cleaning (frees 300 MB)
    92. make clean
    93. sudo apt-get update
    94. echo "Congratulations!"
    95. echo "You've successfully installed OpenCV 4.5.4 on your Jetson Nano"

    直接在终端命令行中执行下载下来得脚本文件就可以完成安装了。安装完整之后得显示:

    验证与导入安装好之后的OpenCV4.5.4版本

    OpenCV C++程序编译与演示 

    自己找个代码把 然后放到jetson编译 最后运行

    CMakeLists.txt文件里面得内容如下:

    1. cmake_minimum_required( VERSION 2.8 )
    2. # 声明一个 cmake 工程
    3. project(yolov5_opencv_demo)
    4. # 设置编译模式
    5. #set( CMAKE_BUILD_TYPE "Debug" )
    6. #添加OPENCV库
    7. #指定OpenCV版本,代码如下
    8. #find_package(OpenCV 4.5.4 REQUIRED)
    9. #如果不需要指定OpenCV版本,代码如下
    10. find_package(OpenCV REQUIRED)
    11. include_directories(
    12.     ./src/)
    13. #添加OpenCV头文件
    14. include_directories(${OpenCV_INCLUDE_DIRS})
    15. #显示OpenCV_INCLUDE_DIRS的值
    16. message(${OpenCV_INCLUDE_DIRS})
    17. FILE(GLOB_RECURSE TEST_SRC
    18.     src/*.cpp
    19.     )
    20. # 添加一个可执行程序
    21. # 语法:add_executable( 程序名 源代码文件 )
    22. add_executable(target yolov5_opencv.cpp ${TEST_SRC})
    23. # 将库文件链接到可执行程序上
    24. target_link_libraries(target  ${OpenCV_LIBS})

    OpenCV + YOLOv5,CUDA加速支持的源码

    1. #include <opencv2/opencv.hpp>
    2. #include <iostream>
    3. #include <fstream>
    4. std::string label_map = "classes.txt";
    5. int main(int argc, char** argv) {
    6.     std::vector<std::string> classNames;
    7.     std::ifstream fp(label_map);
    8.     std::string name;
    9.     while (!fp.eof()) {
    10.         getline(fp, name);
    11.         if (name.length()) {
    12.             classNames.push_back(name);
    13.         }
    14.     }
    15.     fp.close();
    16.     std::vector<cv::Scalar> colors;
    17.     colors.push_back(cv::Scalar(02550));
    18.     colors.push_back(cv::Scalar(0255255));
    19.     colors.push_back(cv::Scalar(2552550));
    20.     colors.push_back(cv::Scalar(25500));
    21.     colors.push_back(cv::Scalar(00255));
    22.     std::string onnxpath = "yolov5s.onnx";
    23.     auto net = cv::dnn::readNetFromONNX(onnxpath);
    24.     net.setPreferableBackend(cv::dnn::DNN_BACKEND_CUDA);
    25.     net.setPreferableTarget(cv::dnn::DNN_TARGET_CUDA);
    26.     cv::VideoCapture capture("example_dsh.mp4");
    27.     cv::Mat frame;
    28.     while (true) {
    29.         bool ret = capture.read(frame);
    30.         if (frame.empty()) {
    31.             break;
    32.         }
    33.         int64 start = cv::getTickCount();
    34.         // 图象预处理 - 格式化操作
    35.         int w = frame.cols;
    36.         int h = frame.rows;
    37.         int _max = std::max(h, w);
    38.         cv::Mat image = cv::Mat::zeros(cv::Size(_max, _max), CV_8UC3);
    39.         cv::Rect roi(00, w, h);
    40.         frame.copyTo(image(roi));
    41.         float x_factor = image.cols / 640.0f;
    42.         float y_factor = image.rows / 640.0f;
    43.         // 推理
    44.         cv::Mat blob = cv::dnn::blobFromImage(image, 1 / 255.0, cv::Size(640640), cv::Scalar(000), truefalse);
    45.         net.setInput(blob);
    46.         cv::Mat preds = net.forward();
    47.         // 后处理, 1x25200x85
    48.         cv::Mat det_output(preds.size[1], preds.size[2], CV_32F, preds.ptr<float>());
    49.         float confidence_threshold = 0.5;
    50.         std::vector<cv::Rect> boxes;
    51.         std::vector<int> classIds;
    52.         std::vector<float> confidences;
    53.         for (int i = 0; i < det_output.rows; i++) {
    54.             float confidence = det_output.at<float>(i, 4);
    55.             if (confidence < 0.25) {
    56.                 continue;
    57.             }
    58.             cv::Mat classes_scores = det_output.row(i).colRange(5, preds.size[2]);
    59.             cv::Point classIdPoint;
    60.             double score;
    61.             minMaxLoc(classes_scores, 0&score, 0&classIdPoint);
    62.             // 置信度 01之间
    63.             if (score > 0.25)
    64.             {
    65.                 float cx = det_output.at<float>(i, 0);
    66.                 float cy = det_output.at<float>(i, 1);
    67.                 float ow = det_output.at<float>(i, 2);
    68.                 float oh = det_output.at<float>(i, 3);
    69.                 int x = static_cast<int>((cx - 0.5 * ow) * x_factor);
    70.                 int y = static_cast<int>((cy - 0.5 * oh) * y_factor);
    71.                 int width = static_cast<int>(ow * x_factor);
    72.                 int height = static_cast<int>(oh * y_factor);
    73.                 cv::Rect box;
    74.                 box.x = x;
    75.                 box.y = y;
    76.                 box.width = width;
    77.                 box.height = height;
    78.                 boxes.push_back(box);
    79.                 classIds.push_back(classIdPoint.x);
    80.                 confidences.push_back(score);
    81.             }
    82.         }
    83.         // NMS
    84.         std::vector<int> indexes;
    85.         cv::dnn::NMSBoxes(boxes, confidences, 0.250.50, indexes);
    86.         for (size_t i = 0; i < indexes.size(); i++) {
    87.             int index = indexes[i];
    88.             int idx = classIds[index];
    89.             cv::rectangle(frame, boxes[index], colors[idx%5], 28);
    90.             cv::rectangle(frame, cv::Point(boxes[index].tl().x, boxes[index].tl().y - 20),
    91.                 cv::Point(boxes[index].br().x, boxes[index].tl().y), cv::Scalar(255255255), -1);
    92.             cv::putText(frame, classNames[idx], cv::Point(boxes[index].tl().x, boxes[index].tl().y - 10), cv::FONT_HERSHEY_SIMPLEX, .5, cv::Scalar(000));
    93.         }
    94.         float t = (cv::getTickCount() - start/ static_cast<float>(cv::getTickFrequency());
    95.         putText(frame, cv::format("FPS: %.2f"1.0 / t), cv::Point(2040), cv::FONT_HERSHEY_PLAIN, 2.0, cv::Scalar(25500), 28);
    96.         char c = cv::waitKey(1);
    97.         if (c == 27) {
    98.             break;
    99.         }
    100.         cv::imshow("OpenCV4.5.4 CUDA + YOLOv5", frame);
    101.     }
    102.     cv::waitKey(0);
    103.     cv::destroyAllWindows();
    104.     return 0;
    105. }

    whaosoft aiot http://143ai.com 

    只是个demo 最好的还是你转成trt的吧~~ 下面就说说trt的

    TRT部署

    软件版本信息​​​​​​​

    JetPack4.6.0(4.6.12有bug- 不过老外git上说已修复 就在这几天 22-11-18)CUDA10.2TensorRT8.0.1OpenCV4.5.4 (默认的4.1也可以)

    导出模型py直接导

    导出engine模型文件支持,命令行如下:

    python export.py --weights yolov5.pt --include onnx engine

    这里需要注意的TensorRT版本一致问题。如果engine文件不是在Jetson Nano上生成的,而在其他PC机器上生成,则TensorRT版本必须与Jetson Nano上使用的版本保持一致。

    首先创建编译CMakeLists.txt文件,然后把下面的内容copy进去:​​​​​​​

    首先创建编译CMakeLists.txt文件,然后把下面的内容copy进去:​​​​​​​​​​​​​​

    cmake_minimum_required( VERSION 2.8 )# 声明一个 cmake 工程project(yolov5_tensorrt_demo)# 设置编译模式#set( CMAKE_BUILD_TYPE "Release" )#添加OPENCV库#指定OpenCV版本,代码如下#find_package(OpenCV 4.5.4 REQUIRED)#如果不需要指定OpenCV版本,代码如下find_package(OpenCV REQUIRED)find_package(CUDA REQUIRED)
    include_directories(       ./src/)#添加OpenCV头文件include_directories(${OpenCV_INCLUDE_DIRS})# 添加CUDA10.2头文件include_directories(/usr/local/cuda-10.2/include)link_directories(/usr/local/cuda-10.2/lib64)# tensorRTinclude_directories(/usr/local/cuda/include)link_directories(/usr/lib/arrch64-linux-gnu)#显示OpenCV_INCLUDE_DIRS的值message(${OpenCV_INCLUDE_DIRS})
    FILE(GLOB_RECURSE TEST_SRC       src/*.cpp       )# 添加一个可执行程序# 语法:add_executable( 程序名 源代码文件 )add_executable(target main.cpp ${TEST_SRC})# 将库文件链接到可执行程序上target_link_libraries(target  nvinfer)target_link_libraries(target  cudart)target_link_libraries(target  ${OpenCV_LIBS})
    ​​​​​​​可能出现的错误

    错误一:

    error: 'cudaMalloc' was not declared in this scope

    这个是因为没有添加下面的头文件:​​​​​​​

    #include #include 

    添加之后就可以解决。

     错误二:

    Engine文件版本一致导致,原因是我之前导出的是在tensorRT8.4版本,jetsonNano是8.0的,重新在Jetson Nano上导出一下就可以解决。

    代码

    1. #include <fstream>
    2. #include <iostream>
    3. #include <sstream>
    4. #include <opencv2/opencv.hpp>
    5. #include "tensorrt_yolov5_demo.h"
    6. using namespace cv;
    7. std::string label_map = "classes.txt";
    8. int main(int argc, char** argv) {
    9.     std::vector<std::string> classNames;
    10.     std::ifstream fp(label_map);
    11.     std::string name;
    12.     while (!fp.eof()) {
    13.         getline(fp, name);
    14.         if (name.length()) {
    15.             classNames.push_back(name);
    16.         }
    17.     }
    18.     fp.close();
    19.     auto detector = std::make_shared<YOLOv5TRTDetector>();
    20.     detector->initConfig("yolov5s.engine"0.250.25);
    21.     std::vector<DetectResult> results;
    22.     cv::VideoCapture capture("example_dsh.mp4");
    23.     cv::Mat frame;
    24.     while (true) {
    25.         bool ret = capture.read(frame);
    26.         if (!ret) {
    27.             break;
    28.         }
    29.         detector->detect(frame, results);
    30.         for (DetectResult dr : results) {
    31.             cv::Rect box = dr.box;
    32.             cv::putText(frame, classNames[dr.classId], cv::Point(box.tl().x, box.tl().y - 10), cv::FONT_HERSHEY_SIMPLEX, .5, cv::Scalar(000));
    33.         }
    34.         cv::imshow("YOLOv5-6.1 + TensorRT8.4 + Jetson Nano - by gloomyfish", frame);
    35.         char c = cv::waitKey(1);
    36.         if (c == 27) { // ESC 退出
    37.             break;
    38.         }
    39.         // reset for next frame
    40.         results.clear();
    41.     }
    42.     cv::waitKey(0);
    43.     cv::destroyAllWindows();
    44.     return 0;
    45. }

  • 相关阅读:
    重装系统 + C盘怎么设置 (如何设置将电脑软件安装在非c 盘)
    String类常见构造方法大全(Java)
    神经网络气温预测
    《工程伦理与学术道德》之《工程活动中的环境伦理》
    卷王杯 easy unserialize
    SpringBoot整合redis实现过期Key监控处理(最简单模式)
    鸿蒙学习笔记(1)基于eTS的入门应用结构简单梳理
    thinkphp withJoin 模式下field 无效
    mybatis
    云原生|kubernetes|kubernetes集群使用私有镜像仓库拉取镜像(harbor或者官方的registry私有镜像仓库)
  • 原文地址:https://blog.csdn.net/qq_29788741/article/details/127900477