Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

不使用cmake搭建环境 #1521

Open
arkerman opened this issue May 11, 2024 · 21 comments
Open

不使用cmake搭建环境 #1521

arkerman opened this issue May 11, 2024 · 21 comments

Comments

@arkerman
Copy link

Env

  • GPU : 3080laptop
  • Win10
  • Cuda 11.3
  • TensorRT 8.2.4.2

About this repo

yolov5

Your problem

能不能使用vs2019新建一个空项目,单独在解决方案属性中的debug和release模式下配置环境?

我这样尝试了。


VC++目录   -->  包含目录  -->  D:\libtorch_opencv_cuda\opencv460\opencv\build\include\opencv2
                         -->  D:\libtorch_opencv_cuda\opencv460\opencv\build\include
                         -->  D:\libtorch_opencv_cuda\v11.3\include
                         -->  D:\libtorch_opencv_cuda\tensorrt\include

          -->  库目录  -->  D:\libtorch_opencv_cuda\opencv460\opencv\build\x64\vc15\lib
                      -->  D:\libtorch_opencv_cuda\v11.3\lib\x64
                      -->  D:\libtorch_opencv_cuda\tensorrt\lib


连接器         -->   输入     -->   nvinfer.lib
                                   nvinfer_plugin.lib
                                   nvonnxparser.lib
                                   nvparsers.lib
                                   cublas.lib
                                   cublasLt.lib
                                   cuda.lib
                                   cudadevrt.lib
                                   cudart.lib
                                   cudart_static.lib
                                   cudnn.lib
                                   cudnn64_8.lib
                                   cudnn_adv_infer.lib
                                   cudnn_adv_infer64_8.lib
                                   cudnn_adv_train.lib
                                   cudnn_adv_train64_8.lib
                                   cudnn_cnn_infer.lib
                                   cudnn_cnn_infer64_8.lib
                                   cudnn_cnn_train.lib
                                   cudnn_cnn_train64_8.lib
                                   cudnn_ops_infer.lib
                                   cudnn_ops_infer64_8.lib
                                   cudnn_ops_train.lib
                                   cudnn_ops_train64_8.lib
                                   cufft.lib
                                   cufftw.lib
                                   curand.lib
                                   cusolver.lib
                                   cusolverMg.lib
                                   cusparse.lib
                                   nppc.lib
                                   nppial.lib
                                   nppicc.lib
                                   nppidei.lib
                                   nppif.lib
                                   nppig.lib
                                   nppim.lib
                                   nppist.lib
                                   nppisu.lib
                                   nppitc.lib
                                   npps.lib
                                   nvblas.lib
                                   nvjpeg.lib
                                   nvml.lib
                                   nvptxcompiler_static.lib
                                   nvrtc.lib
                                   OpenCL.lib
                                   opencv_world460d.lib
                                   D:\libtorch_opencv_cuda\NVIDIA Corporation\NvToolsExt\lib\x64\nvToolsExt64_1.lib

然后我把源文件和头文件加了进来

头文件-->calibrator.h
           -->config.h
           -->cuda_utils.h
           -->dirent.h
           -->logging.h
           -->macros.h
           -->model.h
           -->postprocess.h
           -->preprocess.h
           -->types.h
           -->utils.h
           -->yololayer.h

源文件-->calibrator.cpp
           -->model.cpp
           -->postprocess.cpp
           -->preprocess.cu
           -->yololayer.cu
           -->yolov5_det.cpp

但是还是会产生报错:

严重性	代码	说明	项目	文件	行	禁止显示状态
错误	MSB3721	命令“"D:\libtorch_opencv_cuda\v11.3\bin\nvcc.exe" -gencode=arch=compute_86,code=\"sm_86,compute_86\" --use-local-env -ccbin "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.24.28314\bin\HostX86\x64" -x cu   -ID:\libtorch_opencv_cuda\v11.3\include -ID:\libtorch_opencv_cuda\v11.3\include  -G   --keep-dir x64\Debug  -maxrregcount=0  --machine 64 --compile -cudart static  -g  -D_DEBUG -D_CONSOLE -D_UNICODE -DUNICODE -Xcompiler "/EHsc /W3 /nologo /Od /Fdx64\Debug\vc142.pdb /FS /Zi /RTC1 /MDd " -o x64\Debug\yololayer.cu.obj "E:\dl\c++\yolov5_trtx\yolov5_trtx\yololayer.cu"”已退出,返回代码为 1。	yolov5_trtx	C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Microsoft\VC\v160\BuildCustomizations\CUDA 11.3.targets	785	

我这是哪里搭建错了吗?希望得到指点

@arkerman
Copy link
Author

还有三处关于yololayer的plugin的报错

严重性	代码	说明	项目	文件	行	禁止显示状态
错误		cannot define dllimport entity	yolov5_trtx	E:\dl\c++\yolov5_trtx\yolov5_trtx\yololayer.cu	234	

严重性	代码	说明	项目	文件	行	禁止显示状态
错误		member "nvinfer1::YoloPluginCreator::mFC" may not be initialized	yolov5_trtx	E:\dl\c++\yolov5_trtx\yolov5_trtx\yololayer.cu	234	

严重性	代码	说明	项目	文件	行	禁止显示状态
错误		cannot define dllimport entity	yolov5_trtx	E:\dl\c++\yolov5_trtx\yolov5_trtx\yololayer.cu	235	

@arkerman
Copy link
Author

这几天找了些资料尝试了下,总结了下面的步骤能不借助CMake就能编译通过并跑通;希望对大家有用。

  • 先把tensorrtx库中yolov5的代码下载下来,包括.h文件、cpp文件和.cu文件;

  • 新建一个空的C++项目,按头文件和源文件把上面下载的代码文件按现有项添加进项目;

  • 按照debug和release模式配置opencv、tensorrt和cuda环境;

  • 右击项目名称,选择生成依赖项===>生成自定义CUDA11.3target勾选上;

  • 把带有cuda代码的.cpp文件和.cu文件右击属性===>项类型===>选择CUDA C/C++

  • 右击项目名称,C/C++===>命令行添加/D _CRT_SECURE_NO_WARNINGS

  • 选择CUDA C/C++===>命令行添加%(AdditionalOptions) -std=c++11 -Xcompiler="/EHsc -Ob2"%(AdditionalOptions) -DAPI_EXPORTS

  • 链接器===>命令行添加%(AdditionalOptions) /machine:x64

  • CUDA Linker===>命令行添加-forward-unknown-to-host-compiler -Wno-deprecated-gpu-targets

@ningjianfeng
Copy link

这几天找了些资料尝试了下,总结了下面的步骤能不借助CMake就能编译通过并跑通;希望对大家有用。

  • 先把tensorrtx库中yolov5的代码下载下来,包括.h文件、cpp文件和.cu文件;
  • 新建一个空的C++项目,按头文件和源文件把上面下载的代码文件按现有项添加进项目;
  • 按照debug和release模式配置opencv、tensorrt和cuda环境;
  • 右击项目名称,选择生成依赖项===>生成自定义CUDA11.3target勾选上;
  • 把带有cuda代码的.cpp文件和.cu文件右击属性===>项类型===>选择CUDA C/C++
  • 右击项目名称,C/C++===>命令行添加/D _CRT_SECURE_NO_WARNINGS
  • 选择CUDA C/C++===>命令行添加%(AdditionalOptions) -std=c++11 -Xcompiler="/EHsc -Ob2"%(AdditionalOptions) -DAPI_EXPORTS
  • 链接器===>命令行添加%(AdditionalOptions) /machine:x64
  • CUDA Linker===>命令行添加-forward-unknown-to-host-compiler -Wno-deprecated-gpu-targets
    你是在windows中使用这个吗

@arkerman
Copy link
Author

@ningjianfeng 对的

@ningjianfeng
Copy link

@ningjianfeng 对的

你是不使用cmake命令配置然后也能转engine并使用吗

@arkerman
Copy link
Author

@ningjianfeng 对的

你是不使用cmake命令配置然后也能转engine并使用吗

转engine文件CMAKE没啥关系吧。得到engine不是由pt->wts->engine么。cmake只是搭建好C++工程环境

@ningjianfeng
Copy link

@ningjianfeng 对的

你是不使用cmake命令配置然后也能转engine并使用吗

转engine文件CMAKE没啥关系吧。得到engine不是由pt->wts->engine么。cmake只是搭建好C++工程环境

奥奥,这几天我是一直按照cmake形式编译,但是没有makefile文件产生,导致无法使用make编译。不知道怎么搞了,还有,您使用的那个项目能给我一份吗?我参照着改一下我的项目,通过您这种方式。

@arkerman
Copy link
Author

@ningjianfeng 对的

你是不使用cmake命令配置然后也能转engine并使用吗

转engine文件CMAKE没啥关系吧。得到engine不是由pt->wts->engine么。cmake只是搭建好C++工程环境

奥奥,这几天我是一直按照cmake形式编译,但是没有makefile文件产生,导致无法使用make编译。不知道怎么搞了,还有,您使用的那个项目能给我一份吗?我参照着改一下我的项目,通过您这种方式。

我那个项目删除了。你可以按照我这个issue的步骤配一下环境,基本能成功,我这个一步一步写的挺清楚的。

@ningjianfeng
Copy link

@ningjianfeng 对的

你是不使用cmake命令配置然后也能转engine并使用吗

转engine文件CMAKE没啥关系吧。得到engine不是由pt->wts->engine么。cmake只是搭建好C++工程环境

奥奥,这几天我是一直按照cmake形式编译,但是没有makefile文件产生,导致无法使用make编译。不知道怎么搞了,还有,您使用的那个项目能给我一份吗?我参照着改一下我的项目,通过您这种方式。

我那个项目删除了。你可以按照我这个issue的步骤配一下环境,基本能成功,我这个一步一步写的挺清楚的。

ok

@ningjianfeng
Copy link

@ningjianfeng 对的

你是不使用cmake命令配置然后也能转engine并使用吗

转engine文件CMAKE没啥关系吧。得到engine不是由pt->wts->engine么。cmake只是搭建好C++工程环境

奥奥,这几天我是一直按照cmake形式编译,但是没有makefile文件产生,导致无法使用make编译。不知道怎么搞了,还有,您使用的那个项目能给我一份吗?我参照着改一下我的项目,通过您这种方式。

我那个项目删除了。你可以按照我这个issue的步骤配一下环境,基本能成功,我这个一步一步写的挺清楚的。

ok

对了,大佬,您这是通过这种方式运行程序,您知道如果使用cmake方式进行编译,没有makefile生成的原因吗?还是说在windows中这个方式不能使用,您才采用这个不使用cmake的方式。

@arkerman
Copy link
Author

这个我不太清楚,之前我也用过CMAKE在windows上编译成功过。这是我当时的cmakelist,你参考下:

cmake_minimum_required(VERSION 2.6)

project(yolov5) 

#change to your own path
##################################################
set(OpenCV_DIR "D:\\opencv460\\opencv\\build")  
set(TRT_DIR "E:\\TensorRT-8.2.1.1\\TensorRT-8.2.2.1")  
set(Dirent_INCLUDE_DIRS "E:\\DL_file\\Yolov5_Tensorrt_Win10-master\\include")
##################################################

add_definitions(-std=c++11)
add_definitions(-DAPI_EXPORTS)
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 CUDA
find_package(CUDA REQUIRED)
message(STATUS "    libraries: ${CUDA_LIBRARIES}")
message(STATUS "    include path: ${CUDA_INCLUDE_DIRS}")
include_directories(${CUDA_INCLUDE_DIRS})
include_directories(${Dirent_INCLUDE_DIRS}) 

#change to your GPU own compute_XX
###########################################################################################
set(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS};-std=c++11;-g;-G;-gencode;arch=compute_86;code=sm_86)
###########################################################################################

####
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)

# -D_MWAITXINTRIN_H_INCLUDED for solving error: identifier "__builtin_ia32_mwaitx" is undefined
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -Ofast -D_MWAITXINTRIN_H_INCLUDED")

# setup opencv
find_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)

add_executable(yolov5 ${PROJECT_SOURCE_DIR}/yolov5.cpp ${PROJECT_SOURCE_DIR}/yololayer.cu ${PROJECT_SOURCE_DIR}/yololayer.h ${PROJECT_SOURCE_DIR}/preprocess.cu) 

target_link_libraries(yolov5 "nvinfer" "nvinfer_plugin")  
target_link_libraries(yolov5 ${OpenCV_LIBS})     
target_link_libraries(yolov5 ${CUDA_LIBRARIES})  
target_link_libraries(yolov5 Threads::Threads)     

@ningjianfeng
Copy link

这个我不太清楚,之前我也用过CMAKE在windows上编译成功过。这是我当时的cmakelist,你参考下:

cmake_minimum_required(VERSION 2.6)

project(yolov5) 

#change to your own path
##################################################
set(OpenCV_DIR "D:\\opencv460\\opencv\\build")  
set(TRT_DIR "E:\\TensorRT-8.2.1.1\\TensorRT-8.2.2.1")  
set(Dirent_INCLUDE_DIRS "E:\\DL_file\\Yolov5_Tensorrt_Win10-master\\include")
##################################################

add_definitions(-std=c++11)
add_definitions(-DAPI_EXPORTS)
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 CUDA
find_package(CUDA REQUIRED)
message(STATUS "    libraries: ${CUDA_LIBRARIES}")
message(STATUS "    include path: ${CUDA_INCLUDE_DIRS}")
include_directories(${CUDA_INCLUDE_DIRS})
include_directories(${Dirent_INCLUDE_DIRS}) 

#change to your GPU own compute_XX
###########################################################################################
set(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS};-std=c++11;-g;-G;-gencode;arch=compute_86;code=sm_86)
###########################################################################################

####
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)

# -D_MWAITXINTRIN_H_INCLUDED for solving error: identifier "__builtin_ia32_mwaitx" is undefined
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -Ofast -D_MWAITXINTRIN_H_INCLUDED")

# setup opencv
find_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)

add_executable(yolov5 ${PROJECT_SOURCE_DIR}/yolov5.cpp ${PROJECT_SOURCE_DIR}/yololayer.cu ${PROJECT_SOURCE_DIR}/yololayer.h ${PROJECT_SOURCE_DIR}/preprocess.cu) 

target_link_libraries(yolov5 "nvinfer" "nvinfer_plugin")  
target_link_libraries(yolov5 ${OpenCV_LIBS})     
target_link_libraries(yolov5 ${CUDA_LIBRARIES})  
target_link_libraries(yolov5 Threads::Threads)     

你好,楼主,我使用您的这个代码完成了部署,但是只能使用yolov5s.pt模型,使用我自己.pt模型在wts转engine时显示网络结构有错,您是怎么解决的?另外这个如何让他能够使用摄像头检测?

@arkerman
Copy link
Author

你用的什么模型?

@ningjianfeng
Copy link

你用的什么模型?
yolov5

@arkerman
Copy link
Author

我猜你没有把模型的大小参数加上去
./yolov5_det -s [.wts] [.engine] [n/s/m/l/x/n6/s6/m6/l6/x6 or c/c6 gd gw]
这是生成engine的命令行,最后需要选一下模型大小的参数

@ningjianfeng
Copy link

我猜你没有把模型的大小参数加上去 ./yolov5_det -s [.wts] [.engine] [n/s/m/l/x/n6/s6/m6/l6/x6 or c/c6 gd gw] 这是生成engine的命令行,最后需要选一下模型大小的参数

我猜你没有把模型的大小参数加上去 ./yolov5_det -s [.wts] [.engine] [n/s/m/l/x/n6/s6/m6/l6/x6 or c/c6 gd gw] 这是生成engine的命令行,最后需要选一下模型大小的参数

应该不是这个我的生成命令yolov5 -s best.wts best.engine s

@arkerman
Copy link
Author

那我就不清楚了

@ningjianfeng
Copy link

那我就不清楚了

好吧 谢谢鸡哥

@ningjianfeng
Copy link

鸡哥,我在winddows部署的效果感觉是c++的版本,因为不能使用这个开源代码的yolov5trt.py文件。只能使用特定的命令,并且不能使用摄像头实时监测。

@arkerman
Copy link
Author

@ningjianfeng 我觉得你可能需要了解下tensortRT部署的流程,包括python代码和C++代码;
关于使用摄像头实时检测,你可以使用opencv里面的camcapture函数(是不是这个函数名我忘了,你可以搜一搜);
还有就是你需要学会去debugC++的代码,将命令行中的参数写死在代码里,这样可以摆脱特定命令行

@ningjianfeng
Copy link

@ningjianfeng 我觉得你可能需要了解下tensortRT部署的流程,包括python代码和C++代码; 关于使用摄像头实时检测,你可以使用opencv里面的camcapture函数(是不是这个函数名我忘了,你可以搜一搜); 还有就是你需要学会去debugC++的代码,将命令行中的参数写死在代码里,这样可以摆脱特定命令行

ok

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants