YoloV5在tensorRT上加速(Windows)(C++)(webcam)

网友投稿 1435 2022-11-23

YoloV5在tensorRT上加速(Windows)(C++)(webcam)

YoloV5在tensorRT上加速(Windows)(C++)(webcam)

文章目录

​​1. 软件安装​​

​​1.1 OpenCV安装​​​​1.2 cmake安装​​​​1.3 TensorRT安装​​​​1.4 tensorrtx配置​​​​1.5 yolov5​​

​​2. 修改CMakeList.txt​​​​3. 编译tensorrtx/yolov5​​​​4. 测试示例​​​​5. webcam版本​​

1. 软件安装

cuda11.1对应版本的cudnnopencv-3.4.0VS2017TensorRT-7.2.3.4Cmaketensorrtx(yolov5-4.0版本)yolov5(yolov5-4.0版本)

对于cuda、cudnn和VS的安装在此就不做叙述了

1.1 OpenCV安装

VS2017中配置OpenCV

工程中右击–>属性

包含目录 + 库目录 + 链接器(debug里面加了,releas也可以加)

包含目录 配置:VC++目录—>包含目录:D:\opencv\build\include ;D:\opencv\build\include\opencv;D:\opencv\build\include\opencv2库目录 配置:VC++目录—>库目录:D:\opencv\build\x64\vc15\lib注意:(1)此处的x64表示电脑是64位,32位选择x86(2)vc10表示VS是2010,vc11对应VS2012,vc12对应VS2013,vc14对应VS2015 ,vc15对应VS2017链接器 配置:链接器–>输入–>附加依赖项opencv_world341.lib 注意release里面opencv_world341d.lib 注意,这是在debug里,不能混用,不然会闪退的

1.2 cmake安装

1.3 TensorRT安装

-解压后,将lib路径添加到Path环境变量中​​​tensorrtx配置

1.5 yolov5

​​// -权重文件yolov5s.pt // 将文件tensorrtx/yolov5/gen_wts.py 复制到ultralytics/yolov5 // ensure the file name is yolov5s.pt and yolov5s.wts in gen_wts.py // go to ultralytics/yolov5 执行

python gen_wts.py

2. 修改CMakeList.txt

修改后的版本

cmake_minimum_required(VERSION 3.2)project(yolov5)set(OpenCV_DIR "D:\\MyWorkSpace\\Lib\\opencv\\build") #1set(TRT_DIR "D:\\MyWorkSpace\\Lib\\TensorRT-7.2.3.4") #2set(OpenCV_INCLUDE_DIRS "D:\\MyWorkSpace\\Lib\\opencv\\build\\include") #3set(OpenCV_LIBS "D:\\MyWorkSpace\\Lib\\opencv\\build\\x64\\vc14\\lib\\opencv_world340.lib") #4add_definitions(-std=c++11)option(CUDA_USE_STATIC_CUDA_RUNTIME OFF)set(CMAKE_CXX_STANDARD 11)set(CMAKE_BUILD_TYPE Debug)set(THREADS_PREFER_PTHREAD_FLAG ON)find_package(Threads)# setup CUDAfind_package(CUDA REQUIRED)message(STATUS " libraries: ${CUDA_LIBRARIES}")message(STATUS " include path: ${CUDA_INCLUDE_DIRS}")include_directories(${CUDA_INCLUDE_DIRS})####enable_language(CUDA) # add this line, then no need to setup cuda path in vs####include_directories(${PROJECT_SOURCE_DIR}/include)include_directories(${TRT_DIR}\\include)include_directories(D:\\MyWorkSpace\\git\\tensorrtx-master\\include) # 5##### find package(opencv)include_directories(${OpenCV_INCLUDE_DIRS})include_directories(${OpenCV_INCLUDE_DIRS}\\opencv2) #6# -D_MWAITXINTRIN_H_INCLUDED for solving error: identifier "__builtin_ia32_mwaitx" is undefinedset(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -Ofast -D_MWAITXINTRIN_H_INCLUDED")# setup opencvfind_package(OpenCV QUIET NO_MODULE NO_DEFAULT_PATH NO_CMAKE_PATH NO_CMAKE_ENVIRONMENT_PATH NO_SYSTEM_ENVIRONMENT_PATH NO_CMAKE_PACKAGE_REGISTRY NO_CMAKE_BUILDS_PATH NO_CMAKE_SYSTEM_PATH NO_CMAKE_SYSTEM_PACKAGE_REGISTRY)message(STATUS "OpenCV library status:")message(STATUS " version: ${OpenCV_VERSION}")message(STATUS " libraries: ${OpenCV_LIBS}")message(STATUS " include path: ${OpenCV_INCLUDE_DIRS}")include_directories(${OpenCV_INCLUDE_DIRS})link_directories(${TRT_DIR}\\lib) #7link_directories(${OpenCV_DIR}\\x64\\vc14\\lib) #8add_executable(yolov5 ${PROJECT_SOURCE_DIR}/calibrator.cpp ${PROJECT_SOURCE_DIR}/yolov5.cpp ${PROJECT_SOURCE_DIR}/yololayer.cu ${PROJECT_SOURCE_DIR}/yololayer.h) target_link_libraries(yolov5 "nvinfer" "nvinfer_plugin") #5target_link_libraries(yolov5 ${OpenCV_LIBS}) #6target_link_libraries(yolov5 ${CUDA_LIBRARIES}) #7target_link_libraries(yolov5 Threads::Threads) #8

3. 编译tensorrtx/yolov5

PS: 使用Release模式

4. 测试示例

生成engine

yolov5.exe -s yolov5s.wts yolov5s.engine s

yolov5.exe -d yolov5s.engine ./samples

5. webcam版本

修改yolov5.cpp(270-323)

int fcount = 0; cv::VideoCapture capture(0); cv::Mat frame; while (true) { fcount++; if (fcount < BATCH_SIZE) continue; capture.read(frame); for (int b = 0; b < fcount; b++) { cv::Mat img = frame; if (img.empty()) continue; cv::Mat pr_img = preprocess_img(img, INPUT_W, INPUT_H); // letterbox BGR to RGB int i = 0; for (int row = 0; row < INPUT_H; ++row) { uchar* uc_pixel = pr_img.data + row * pr_img.step; for (int col = 0; col < INPUT_W; ++col) { data[b * 3 * INPUT_H * INPUT_W + i] = (float)uc_pixel[2] / 255.0; data[b * 3 * INPUT_H * INPUT_W + i + INPUT_H * INPUT_W] = (float)uc_pixel[1] / 255.0; data[b * 3 * INPUT_H * INPUT_W + i + 2 * INPUT_H * INPUT_W] = (float)uc_pixel[0] / 255.0; uc_pixel += 3; ++i; } } } // Run inference auto start = std::chrono::system_clock::now(); doInference(*context, stream, buffers, data, prob, BATCH_SIZE); auto end = std::chrono::system_clock::now(); std::cout << std::chrono::duration_cast(end - start).count() << "ms" << std::endl; std::vector> batch_res(fcount); for (int b = 0; b < fcount; b++) { auto& res = batch_res[b]; nms(res, &prob[b * OUTPUT_SIZE], CONF_THRESH, NMS_THRESH); } for (int b = 0; b < fcount; b++) { auto& res = batch_res[b]; //std::cout << res.size() << std::endl; cv::Mat img = frame; for (size_t j = 0; j < res.size(); j++) { cv::Rect r = get_rect(img, res[j].bbox); cv::rectangle(img, r, cv::Scalar(0x27, 0xC1, 0x36), 2); cv::putText(img, std::to_string((int)res[j].class_id), cv::Point(r.x, r.y - 1), cv::FONT_HERSHEY_PLAIN, 1.2, cv::Scalar(0xFF, 0xFF, 0xFF), 2); } //cv::imwrite("_" + file_names[f - fcount + 1 + b], img); cv::imshow("frame", img); int c = cv::waitKey(10); if (c == 27) { break; } } fcount = 0; }

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:python工程打包上传pypi
下一篇:YoloV5在tensorRT上加速(Ubuntu)(C++)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~