| docker pull nvcr.io/nvidia/tensorrt:22.12-py3 |
| docker run -it --privileged --network host --gpus all \ |
| -v /tmp/.X11-unix:/tmp/.X11-unix \ |
| -e DISPLAY \ |
| --device=/dev/bus/usb \ |
| -v /etc/localtime:/etc/localtime:ro \ |
| -v ~/workspace:/workspace \ |
| --name yolo_infer \ |
| --workdir=/workspace \ |
| nvcr.io/nvidia/tensorrt:22.12-py3 /bin/bash |
这个 docker run
命令用于启动一个容器,支持 GPU、USB 设备、网络以及图形界面的运行,具体解释如下:
-
-it
:交互模式,-i
保持输入流,-t
分配一个伪终端。用于在容器内运行交互式 shell。
-
--privileged
:赋予容器超级权限,允许访问主机上的所有设备和资源。适用于需要与硬件、系统资源打交道的应用。
-
--network host
:使用主机网络模式,容器的网络配置与主机一致,这样容器可以直接使用主机的网络接口。
-
--gpus all
:启用对主机所有 GPU 的访问,用于需要 GPU 加速的应用程序,如深度学习、计算加速等。
-
-v /tmp/.X11-unix:/tmp/.X11-unix
:将主机的 X11 Unix socket 挂载到容器中,允许容器中的应用通过主机的 X11 服务器显示图形界面。通常与 DISPLAY
环境变量配合使用。
-
-e DISPLAY
:设置 DISPLAY
环境变量,指定容器的 GUI 应用程序输出到主机的显示屏上。
-
--device=/dev/bus/usb
:挂载主机的 USB 总线设备到容器中,允许容器与主机的 USB 设备进行直接通信,比如摄像头、传感器等设备。
-
-v /etc/localtime:/etc/localtime:ro
:将主机的本地时间和时区设置挂载到容器中,确保容器内的时间与主机保持一致。以只读模式挂载,避免容器修改主机时间配置。
-
-v ~/workspace:/workspace
:将主机的 ~/workspace
目录挂载到容器的 /workspace
目录,允许容器访问主机的工作空间,便于读取或保存数据。
-
--name yolo_infer
:为容器指定名称 yolo_infer
,方便之后管理和操作容器。
-
nvcr.io/nvidia/tensorrt:22.12-py3
:使用名为 nvcr.io/nvidia/tensorrt
的 Docker 镜像,版本号为 22.12-py3
。
-
/bin/bash
:启动容器后进入 Bash shell,提供交互式命令行环境。
这个命令整体用于运行一个带有高权限、支持 GPU 和 USB 设备、并且能够运行 GUI 应用的容器环境,适合运行像 YOLO 这样需要硬件加速和外部设备支持的应用。
| git clone https://github.com/shouxieai/infer.git |
| cd infer/ |
修改 Makefile:
| |
| cc := g++ |
| nvcc := /usr/local/cuda/bin/nvcc |
| |
| |
| cpp_srcs := $(shell find src -name "*.cpp") |
| cpp_objs := $(cpp_srcs:.cpp=.cpp.o) |
| cpp_objs := $(cpp_objs:src/%=objs/%) |
| cpp_mk := $(cpp_objs:.cpp.o=.cpp.mk) |
| |
| cu_srcs := $(shell find src -name "*.cu") |
| cu_objs := $(cu_srcs:.cu=.cu.o) |
| cu_objs := $(cu_objs:src/%=objs/%) |
| cu_mk := $(cu_objs:.cu.o=.cu.mk) |
| |
| include_paths := src \ |
| /usr/include/opencv4 \ |
| /usr/local/cuda/include \ |
| /usr/include/x86_64-linux-gnu/TensorRT |
| |
| |
| |
| library_paths := /usr/local/cuda/lib64 \ |
| /usr/lib/x86_64-linux-gnu \ |
| /usr/local/cuda/lib64/stubs \ |
| /usr/lib/x86_64-linux-gnu/TensorRT \ |
| /usr/local/cuda/lib64/stubs \ |
| /usr/local/cuda/lib64 |
| |
| |
| link_librarys := opencv_core opencv_imgproc opencv_videoio opencv_imgcodecs \ |
| nvinfer nvinfer_plugin nvonnxparser \ |
| cuda cublas cudart cudnn \ |
| stdc++ dl |
| |
| |
| empty := |
| export_path := $(subst $(empty) $(empty),:,$(library_paths)) |
| |
| run_paths := $(foreach item,$(library_paths),-Wl,-rpath=$(item)) |
| |
| |
| include_paths := $(foreach item,$(include_paths),-I$(item)) |
| library_paths := $(foreach item,$(library_paths),-L$(item)) |
| link_librarys := $(foreach item,$(link_librarys),-l$(item)) |
| |
| cpp_compile_flags := -std=c++11 -fPIC -w -g -pthread -fopenmp -O0 |
| cu_compile_flags := -std=c++11 -g -w -O0 -Xcompiler "$(cpp_compile_flags)" |
| link_flags := -pthread -fopenmp -Wl,-rpath='$$ORIGIN' |
| |
| cpp_compile_flags += $(include_paths) |
| cu_compile_flags += $(include_paths) |
| link_flags += $(library_paths) $(link_librarys) $(run_paths) |
| |
| |
| ifneq ($(MAKECMDGOALS), clean) |
| -include $(cpp_mk) $(cu_mk) |
| endif |
| |
| |
| pro := workspace/pro |
| expath := library_path.txt |
| |
| library_path.txt : |
| @echo LD_LIBRARY_PATH=$(export_path):"$$"LD_LIBRARY_PATH > $@ |
| |
| workspace/pro : $(cpp_objs) $(cu_objs) |
| @echo Link $@ |
| @mkdir -p $(dir $@) |
| @$(cc) $^ -o $@ $(link_flags) |
| |
| objs/%.cpp.o : src/%.cpp |
| @echo Compile CXX $< |
| @mkdir -p $(dir $@) |
| @$(cc) -c $< -o $@ $(cpp_compile_flags) |
| |
| objs/%.cu.o : src/%.cu |
| @echo Compile CUDA $< |
| @mkdir -p $(dir $@) |
| @$(nvcc) -c $< -o $@ $(cu_compile_flags) |
| |
| objs/%.cpp.mk : src/%.cpp |
| @echo Compile depends CXX $< |
| @mkdir -p $(dir $@) |
| @$(cc) -M $< -MF $@ -MT $(@:.cpp.mk=.cpp.o) $(cpp_compile_flags) |
| |
| objs/%.cu.mk : src/%.cu |
| @echo Compile depends CUDA $< |
| @mkdir -p $(dir $@) |
| @$(nvcc) -M $< -MF $@ -MT $(@:.cu.mk=.cu.o) $(cu_compile_flags) |
| |
| run : workspace/pro |
| @cd workspace && ./pro |
| |
| |
| debug : |
| @echo $(include_paths) |
| @echo $(library_paths) |
| @echo $(link_librarys) |
| |
| clean : |
| @rm -rf library_path.txt |
| @rm -rf objs workspace/pro |
| @rm -rf workspace/Result.jpg |
| |
| .PHONY : debug clean run |
| |
| export LD_LIBRARY_PATH:=$(export_path):$(LD_LIBRARY_PATH) |
| wget -O workspace/yolov5s.onnx https://github.com/ultralytics/yolov5/releases/download/v7.0/yolov5s.onnx --no-check-certificate |
| trtexec --onnx=workspace/yolov5s.onnx --saveEngine=workspace/yolov5s.engine |
| make run |
报错:fatal error: opencv2/opencv.hpp: No such file or directory
| apt update |
| apt install libopencv-dev |
| ls /usr/include/opencv4 |
| make run |
输出结果
| Compile depends CXX src/main.cpp |
| Compile CXX src/main.cpp |
| Compile CUDA src/yolo.cu |
| Compile CUDA src/infer.cu |
| Link workspace/pro |
| [infer.cu:393]: Infer 0x7f2b88000d70 [StaticShape] |
| [infer.cu:405]: Inputs: 1 |
| [infer.cu:409]: 0.images : shape {1x3x640x640} |
| [infer.cu:412]: Outputs: 1 |
| [infer.cu:416]: 0.output0 : shape {1x25200x85} |
| [yolo.cu:574]: When using static shape model, number of images[16] must be less than or equal to the maximum batch[1]. |
| [BATCH16]: 0.05018 ms |
| [yolo.cu:574]: When using static shape model, number of images[16] must be less than or equal to the maximum batch[1]. |
| [BATCH16]: 0.12086 ms |
| [yolo.cu:574]: When using static shape model, number of images[16] must be less than or equal to the maximum batch[1]. |
| [BATCH16]: 0.10445 ms |
| [yolo.cu:574]: When using static shape model, number of images[16] must be less than or equal to the maximum batch[1]. |
| [BATCH16]: 0.10317 ms |
| [yolo.cu:574]: When using static shape model, number of images[16] must be less than or equal to the maximum batch[1]. |
| [BATCH16]: 0.02646 ms |
| [BATCH1]: 190.41962 ms |
| [BATCH1]: 4.47782 ms |
| [BATCH1]: 4.47869 ms |
| [BATCH1]: 4.36294 ms |
| [BATCH1]: 4.35104 ms |
CMakeLists.txt
| cmake_minimum_required(VERSION 3.10) |
| project(MyProject) |
| |
| |
| set(CMAKE_CXX_STANDARD 11) |
| set(CMAKE_CXX_STANDARD_REQUIRED True) |
| |
| |
| find_package(CUDA REQUIRED) |
| find_package(OpenCV REQUIRED) |
| |
| |
| |
| file(GLOB_RECURSE CPP_SRCS src/*.cpp) |
| file(GLOB_RECURSE CU_SRCS src/*.cu) |
| |
| |
| include_directories( |
| src |
| ${OpenCV_INCLUDE_DIRS} |
| ${CUDA_INCLUDE_DIRS} |
| ) |
| |
| |
| link_directories( |
| /usr/local/cuda/lib64 |
| /usr/lib/x86_64-linux-gnu |
| ) |
| |
| |
| set(LINK_LIBS |
| ${OpenCV_LIBS} |
| nvinfer nvinfer_plugin nvonnxparser |
| cuda cublas cudart cudnn |
| stdc++ dl |
| ) |
| |
| |
| set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS} -std=c++11 -O0 -g") |
| set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -fPIC -pthread -fopenmp -O0") |
| |
| |
| cuda_add_executable(${PROJECT_NAME} ${CPP_SRCS} ${CU_SRCS}) |
| |
| |
| target_link_libraries(${PROJECT_NAME} ${LINK_LIBS}) |
| |
| |
| set_target_properties(${PROJECT_NAME} PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE) |
| |
| |
| add_custom_target(run |
| COMMAND ${PROJECT_NAME} |
| DEPENDS ${PROJECT_NAME} |
| ) |
| chmod 777 ./workspace/build.sh |
| ./workspace/build.sh |
| |
| cd workspace |
| cmake .. |
| make run |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现