tf.image.non_max_suppression()

本文详细介绍了非最大值抑制(NMS)的概念及其在目标检测中的应用,特别是使用TensorFlow实现这一过程的方法。NMS是一种用于减少重复边界框的技术,确保每个目标只被检测一次。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在吴恩达老师深度学习yolo算法实现自动驾驶的编程题中出现了这个函数,这个函数的功能是在检测算法中我们的一个目标被检测了多次,如何排除掉多余的边界框。比如下面的图,来自于编程题中的图片,下面的这个车被多次检测到,存在多个边界框,保留概率最大的那个,去除掉与这个概率最大的边界框的IoU大于一个阙值的其余边界框。这个过程就成为非最大值抑制=NMS

函数原型:

tf.image.non_max_suppression(
    boxes,
    scores,
    max_output_size,
    iou_threshold=0.5,
    score_threshold=float('-inf'),
    name=None
)

按照参数scores的降序贪婪的选择边界框的子集。

删除掉那些与之前的选择的边框具有很高的IOU的边框。边框是以[y1,x1,y2,x2],(y1,x1)和(y2,x2)是边框的对角坐标,当然也可以提供被归一化的坐标。返回的是被选中的那些留下来的边框在参数boxes里面的下标位置。那么你可以使用tf.gather的操作或者利用keras.backend的gather函数来从参数boxes来获取选中的边框。

例如:

selected_indices=tf.image.non_max_suppression(boxes,scores,max_output_size,iou_thresholde)

selected_boxes=tf.gather(boxes,selected_indices)

参数:boxes:2-D的float类型的,大小为[num_boxes,4]的张量;

scores:1-D的float类型的大小为[num_boxes]代表上面boxes的每一行,对应的每一个box的一个score;

max_output_size:一个整数张量,代表我最多可以利用NMS选中多少个边框;

iou_threshold:一个浮点数,IOU阙值展示的是否与选中的那个边框具有较大的重叠度;

score_threshold:一个浮点数,来决定上面时候删除这个边框

name:可选

返回的是selected_indices:表示的是一个1-D的整数张量,大小为[M],代表的是选出来的留下来的边框下标,M小于等于max_outpuy_size.

例子:

>------ 已启动生成: 项目: opencv_imgproc_SSE4_1, 配置: Release x64 ------ 2>------ 已启动生成: 项目: opencv_imgproc_AVX512_SKX, 配置: Release x64 ------ 3>------ 已启动生成: 项目: opencv_imgproc_AVX2, 配置: Release x64 ------ 4>------ 已启动生成: 项目: opencv_imgproc_AVX, 配置: Release x64 ------ 5>------ 已启动生成: 项目: opencv_features2d_SSE4_1, 配置: Release x64 ------ 6>------ 已启动生成: 项目: opencv_features2d_AVX512_SKX, 配置: Release x64 ------ 7>------ 已启动生成: 项目: opencv_features2d_AVX2, 配置: Release x64 ------ 8>------ 已启动生成: 项目: opencv_dnn_AVX512_SKX, 配置: Release x64 ------ 9>------ 已启动生成: 项目: opencv_dnn_AVX2, 配置: Release x64 ------ 10>------ 已启动生成: 项目: opencv_dnn_AVX, 配置: Release x64 ------ 11>------ 已启动生成: 项目: opencv_cudev, 配置: Release x64 ------ 12>------ 已启动生成: 项目: opencv_core_SSE4_2, 配置: Release x64 ------ 13>------ 已启动生成: 项目: opencv_core_SSE4_1, 配置: Release x64 ------ 14>------ 已启动生成: 项目: opencv_core_AVX512_SKX, 配置: Release x64 ------ 15>------ 已启动生成: 项目: opencv_core_AVX2, 配置: Release x64 ------ 16>------ 已启动生成: 项目: opencv_core_AVX, 配置: Release x64 ------ 1>accum.sse4_1.cpp 1>box_filter.sse4_1.cpp 1>color_hsv.sse4_1.cpp 1>color_rgb.sse4_1.cpp 1>color_yuv.sse4_1.cpp 1>filter.sse4_1.cpp 1>median_blur.sse4_1.cpp 1>morph.sse4_1.cpp 1>smooth.sse4_1.cpp 1>imgwarp.sse4_1.cpp 1>resize.sse4_1.cpp 2>sumpixels.avx512_skx.cpp 5>sift.sse4_1.cpp 6>sift.avx512_skx.cpp 3>accum.avx2.cpp 3>bilateral_filter.avx2.cpp 3>box_filter.avx2.cpp 3>color_hsv.avx2.cpp 3>color_rgb.avx2.cpp 3>color_yuv.avx2.cpp 3>filter.avx2.cpp 3>median_blur.avx2.cpp 3>morph.avx2.cpp 3>smooth.avx2.cpp 3>sumpixels.avx2.cpp 3>imgwarp.avx2.cpp 3>resize.avx2.cpp 8>layers_common.avx512_skx.cpp 9>layers_common.avx2.cpp 4>accum.avx.cpp 4>corner.avx.cpp 10>conv_block.avx.cpp 10>conv_depthwise.avx.cpp 10>conv_winograd_f63.avx.cpp 10>fast_gemm_kernels.avx.cpp 10>layers_common.avx.cpp 7>sift.avx2.cpp 7>fast.avx2.cpp 14>matmul.avx512_skx.cpp 13>arithm.sse4_1.cpp 13>matmul.sse4_1.cpp 15>arithm.avx2.cpp 15>convert.avx2.cpp 15>convert_scale.avx2.cpp 12>stat.sse4_2.cpp 15>count_non_zero.avx2.cpp 15>has_non_zero.avx2.cpp 15>mathfuncs_core.avx2.cpp 15>matmul.avx2.cpp 15>mean.avx2.cpp 15>merge.avx2.cpp 15>split.avx2.cpp 15>stat.avx2.cpp 15>sum.avx2.cpp 11>stub.cpp 6>opencv_features2d_AVX512_SKX.vcxproj -> E:\opencv-build\build\modules\features2d\opencv_features2d_AVX512_SKX.dir\Release\opencv_features2d_AVX512_SKX.lib 17>------ 已启动生成: 项目: opencv_calib3d_AVX2, 配置: Release x64 ------ 16>mathfuncs_core.avx.cpp 5>opencv_features2d_SSE4_1.vcxproj -> E:\opencv-build\build\modules\features2d\opencv_features2d_SSE4_1.dir\Release\opencv_features2d_SSE4_1.lib 9>layers_common.avx2.cpp 17>undistort.avx2.cpp 4>opencv_imgproc_AVX.vcxproj -> E:\opencv-build\build\modules\imgproc\opencv_imgproc_AVX.dir\Release\opencv_imgproc_AVX.lib 18>------ 已启动生成: 项目: gen_opencv_python_source, 配置: Release x64 ------ 2>opencv_imgproc_AVX512_SKX.vcxproj -> E:\opencv-build\build\modules\imgproc\opencv_imgproc_AVX512_SKX.dir\Release\opencv_imgproc_AVX512_SKX.lib 11> 正在创建库 E:/opencv-build/build/lib/Release/opencv_cudev4110.lib 和对象 E:/opencv-build/build/lib/Release/opencv_cudev4110.exp 8>layers_common.avx512_skx.cpp 10>opencv_dnn_AVX.vcxproj -> E:\opencv-build\build\modules\dnn\opencv_dnn_AVX.dir\Release\opencv_dnn_AVX.lib 7>opencv_features2d_AVX2.vcxproj -> E:\opencv-build\build\modules\features2d\opencv_features2d_AVX2.dir\Release\opencv_features2d_AVX2.lib 11>opencv_cudev.vcxproj -> E:\opencv-build\build\bin\Release\opencv_cudev4110.dll 3>opencv_imgproc_AVX2.vcxproj -> E:\opencv-build\build\modules\imgproc\opencv_imgproc_AVX2.dir\Release\opencv_imgproc_AVX2.lib 12>opencv_core_SSE4_2.vcxproj -> E:\opencv-build\build\modules\core\opencv_core_SSE4_2.dir\Release\opencv_core_SSE4_2.lib 1>opencv_imgproc_SSE4_1.vcxproj -> E:\opencv-build\build\modules\imgproc\opencv_imgproc_SSE4_1.dir\Release\opencv_imgproc_SSE4_1.lib 13>opencv_core_SSE4_1.vcxproj -> E:\opencv-build\build\modules\core\opencv_core_SSE4_1.dir\Release\opencv_core_SSE4_1.lib 15>opencv_core_AVX2.vcxproj -> E:\opencv-build\build\modules\core\opencv_core_AVX2.dir\Release\opencv_core_AVX2.lib 16>opencv_core_AVX.vcxproj -> E:\opencv-build\build\modules\core\opencv_core_AVX.dir\Release\opencv_core_AVX.lib 9>conv_block.avx2.cpp 9>conv_depthwise.avx2.cpp 9>conv_winograd_f63.avx2.cpp 9>fast_gemm_kernels.avx2.cpp 17>opencv_calib3d_AVX2.vcxproj -> E:\opencv-build\build\modules\calib3d\opencv_calib3d_AVX2.dir\Release\opencv_calib3d_AVX2.lib 14>opencv_core_AVX512_SKX.vcxproj -> E:\opencv-build\build\modules\core\opencv_core_AVX512_SKX.dir\Release\opencv_core_AVX512_SKX.lib 19>------ 已启动生成: 项目: opencv_core, 配置: Release x64 ------ 8>opencv_dnn_AVX512_SKX.vcxproj -> E:\opencv-build\build\modules\dnn\opencv_dnn_AVX512_SKX.dir\Release\opencv_dnn_AVX512_SKX.lib 19>cmake_pch.cxx 9>opencv_dnn_AVX2.vcxproj -> E:\opencv-build\build\modules\dnn\opencv_dnn_AVX2.dir\Release\opencv_dnn_AVX2.lib 19>opencl_kernels_core.cpp 19>algorithm.cpp 19>arithm.cpp 19>arithm.dispatch.cpp 19>array.cpp 19>async.cpp 19>batch_distance.cpp 19>bindings_utils.cpp 19>buffer_area.cpp 19>channels.cpp 19>check.cpp 19>command_line_parser.cpp 19>conjugate_gradient.cpp 19>convert.dispatch.cpp 19>convert_c.cpp 19>convert_scale.dispatch.cpp 19>copy.cpp 19>count_non_zero.dispatch.cpp 19>cuda_gpu_mat.cpp 19>cuda_gpu_mat_nd.cpp 19>cuda_host_mem.cpp 19>cuda_info.cpp 19>cuda_stream.cpp 19>datastructs.cpp 19>directx.cpp 19>downhill_simplex.cpp 19>dxt.cpp 19>gl_core_3_1.cpp 19>glob.cpp 19>hal_internal.cpp 19>has_non_zero.dispatch.cpp 19>kmeans.cpp 19>lapack.cpp 19>lda.cpp 19>logger.cpp 19>lpsolver.cpp 19>D:\Visual Studio\VC\Tools\MSVC\14.43.34808\include\xutility(506,82): warning C4267: “参数”: 从“size_t”转换到“const unsigned int”,可能丢失数据 19>(编译源文件“../../../opencv/modules/core/src/cuda_stream.cpp”) 19> D:\Visual Studio\VC\Tools\MSVC\14.43.34808\include\xutility(506,82): 19> 模板实例化上下文(最早的实例化上下文)为 19> E:\opencv-build\opencv\modules\core\src\cuda_stream.cpp(468,13): 19> 查看对正在编译的函数 模板 实例化“cv::Ptr<cv::cuda::Stream::Impl> cv::makePtr<cv::cuda::Stream::Impl,size_t>(const size_t &)”的引用 19> E:\opencv-build\opencv\modules\core\include\opencv2\core\cvstd_wrapper.hpp(146,27): 19> 查看对正在编译的函数 模板 实例化“std::shared_ptr<T> std::make_shared<_Tp,const size_t&>(const size_t &)”的引用 19> with 19> [ 19> T=cv::cuda::Stream::Impl, 19> _Tp=cv::cuda::Stream::Impl 19> ] 19> D:\Visual Studio\VC\Tools\MSVC\14.43.34808\include\memory(2903,46): 19> 查看对正在编译的函数 模板 实例化“std::_Ref_count_obj2<_Ty>::_Ref_count_obj2<const size_t&>(const size_t &)”的引用 19> with 19> [ 19> _Ty=cv::cuda::Stream::Impl 19> ] 19> D:\Visual Studio\VC\Tools\MSVC\14.43.34808\include\memory(2092,18): 19> 查看对正在编译的函数 模板 实例化“void std::_Construct_in_place<_Ty,const size_t&>(_Ty &,const size_t &) noexcept(false)”的引用 19> with 19> [ 19> _Ty=cv::cuda::Stream::Impl 19> ] 19>lut.cpp 19>mathfuncs.cpp 19>mathfuncs_core.dispatch.cpp 19>matmul.dispatch.cpp 19>matrix.cpp 19>matrix_c.cpp 19>matrix_decomp.cpp 19>matrix_expressions.cpp 19>matrix_iterator.cpp 19>matrix_operations.cpp 19>matrix_sparse.cpp 19>matrix_transform.cpp 19>matrix_wrap.cpp 19>mean.dispatch.cpp 19>merge.dispatch.cpp 19>minmax.cpp 19>norm.cpp 19>ocl.cpp 19>opencl_clblas.cpp 19>opencl_clfft.cpp 19>opencl_core.cpp 19>opengl.cpp 19>out.cpp 19>ovx.cpp 19>parallel_openmp.cpp 19>parallel_tbb.cpp 19>parallel_impl.cpp 19>pca.cpp 19>persistence.cpp 19>persistence_base64_encoding.cpp 19>persistence_json.cpp 19>persistence_types.cpp 19>persistence_xml.cpp 19>persistence_yml.cpp 19>rand.cpp 19>softfloat.cpp 19>split.dispatch.cpp 19>stat.dispatch.cpp 19>stat_c.cpp 19>stl.cpp 19>sum.dispatch.cpp 19>system.cpp 19>tables.cpp 19>trace.cpp 19>types.cpp 19>umatrix.cpp 19>datafile.cpp 19>filesystem.cpp 19>logtagconfigparser.cpp 19>logtagmanager.cpp 19>samples.cpp 19>va_intel.cpp 19>alloc.cpp 19>parallel.cpp 19>parallel.cpp 19> 正在创建库 E:/opencv-build/build/lib/Release/opencv_core4110.lib 和对象 E:/opencv-build/build/lib/Release/opencv_core4110.exp 19>LINK : warning LNK4098: 默认库“LIBCMT”与其他库的使用冲突;请使用 /NODEFAULTLIB:library 19>opencv_core.vcxproj -> E:\opencv-build\build\bin\Release\opencv_core4110.dll 19>已完成生成项目“opencv_core.vcxproj”的操作。 20>------ 已启动生成: 项目: opencv_version_win32, 配置: Release x64 ------ 21>------ 已启动生成: 项目: opencv_version, 配置: Release x64 ------ 22>------ 已启动生成: 项目: opencv_signal, 配置: Release x64 ------ 23>------ 已启动生成: 项目: opencv_ml, 配置: Release x64 ------ 24>------ 已启动生成: 项目: opencv_imgproc, 配置: Release x64 ------ 25>------ 已启动生成: 项目: opencv_flann, 配置: Release x64 ------ 26>------ 已启动生成: 项目: opencv_cudaarithm, 配置: Release x64 ------ 20>opencv_version.cpp 22>cmake_pch.cxx 23>cmake_pch.cxx 25>cmake_pch.cxx 21>opencv_version.cpp 26>cmake_pch.cxx 24>cmake_pch.cxx 22>opencv_signal_main.cpp 22>signal_resample.cpp 23>opencv_ml_main.cpp 23>ann_mlp.cpp 23>boost.cpp 23>data.cpp 23>em.cpp 23>gbt.cpp 23>inner_functions.cpp 23>kdtree.cpp 23>knearest.cpp 23>lr.cpp 23>nbayes.cpp 23>rtrees.cpp 23>svm.cpp 23>svmsgd.cpp 23>testset.cpp 23>tree.cpp 21>opencv_version.vcxproj -> E:\opencv-build\build\bin\Release\opencv_version.exe 24>opencl_kernels_imgproc.cpp 24>opencv_imgproc_main.cpp 24>accum.cpp 24>accum.dispatch.cpp 24>approx.cpp 24>bilateral_filter.dispatch.cpp 24>blend.cpp 24>box_filter.dispatch.cpp 24>canny.cpp 20>opencv_version_win32.vcxproj -> E:\opencv-build\build\bin\Release\opencv_version_win32.exe 24>clahe.cpp 24>color.cpp 24>color_hsv.dispatch.cpp 24>color_lab.cpp 24>color_rgb.dispatch.cpp 24>color_yuv.dispatch.cpp 24>colormap.cpp 24>connectedcomponents.cpp 24>contours.cpp 24>contours_approx.cpp 24>contours_common.cpp 24>contours_link.cpp 25>opencv_flann_main.cpp 24>contours_new.cpp 24>convhull.cpp 25>flann.cpp 24>corner.cpp 25>miniflann.cpp 24>cornersubpix.cpp 22> 正在创建库 E:/opencv-build/build/lib/Release/opencv_signal4110.lib 和对象 E:/opencv-build/build/lib/Release/opencv_signal4110.exp 26>opencv_cudaarithm_main.cpp 24>demosaicing.cpp 26>arithm.cpp 24>deriv.cpp 26>core.cpp 24>distransform.cpp 24>drawing.cpp 24>emd.cpp 24>emd_new.cpp 24>featureselect.cpp 26>element_operations.cpp 24>filter.dispatch.cpp 26>lut.cpp 26>reductions.cpp 24>floodfill.cpp 24>gabor.cpp 24>generalized_hough.cpp 24>geometry.cpp 24>grabcut.cpp 24>hershey_fonts.cpp 24>histogram.cpp 24>hough.cpp 24>imgwarp.cpp 24>intelligent_scissors.cpp 24>intersection.cpp 24>linefit.cpp 24>lsd.cpp 24>main.cpp 23> 正在创建库 E:/opencv-build/build/lib/Release/opencv_ml4110.lib 和对象 E:/opencv-build/build/lib/Release/opencv_ml4110.exp 24>matchcontours.cpp 24>median_blur.dispatch.cpp 24>min_enclosing_triangle.cpp 24>moments.cpp 24>morph.dispatch.cpp 24>phasecorr.cpp 24>pyramids.cpp 24>resize.cpp 24>rotcalipers.cpp 24>samplers.cpp 24>segmentation.cpp 24>shapedescr.cpp 24>smooth.dispatch.cpp 24>spatialgradient.cpp 24>stackblur.cpp 22>opencv_signal.vcxproj -> E:\opencv-build\build\bin\Release\opencv_signal4110.dll 24>subdivision2d.cpp 24>sumpixels.dispatch.cpp 24>tables.cpp 24>templmatch.cpp 24>thresh.cpp 24>utils.cpp 23>opencv_ml.vcxproj -> E:\opencv-build\build\bin\Release\opencv_ml4110.dll 26> 正在创建库 E:/opencv-build/build/lib/Release/opencv_cudaarithm4110.lib 和对象 E:/opencv-build/build/lib/Release/opencv_cudaarithm4110.exp 26>LINK : warning LNK4098: 默认库“LIBCMT”与其他库的使用冲突;请使用 /NODEFAULTLIB:library 26>opencv_cudaarithm.vcxproj -> E:\opencv-build\build\bin\Release\opencv_cudaarithm4110.dll 26>已完成生成项目“opencv_cudaarithm.vcxproj”的操作。 25> 正在创建库 E:/opencv-build/build/lib/Release/opencv_flann4110.lib 和对象 E:/opencv-build/build/lib/Release/opencv_flann4110.exp 25>opencv_flann.vcxproj -> E:\opencv-build\build\bin\Release\opencv_flann4110.dll 27>------ 已启动生成: 项目: opencv_surface_matching, 配置: Release x64 ------ 27>cmake_pch.cxx 24> 正在创建库 E:/opencv-build/build/lib/Release/opencv_imgproc4110.lib 和对象 E:/opencv-build/build/lib/Release/opencv_imgproc4110.exp 24>opencv_imgproc.vcxproj -> E:\opencv-build\build\bin\Release\opencv_imgproc4110.dll 28>------ 已启动生成: 项目: opencv_reg, 配置: Release x64 ------ 29>------ 已启动生成: 项目: opencv_quality, 配置: Release x64 ------ 30>------ 已启动生成: 项目: opencv_plot, 配置: Release x64 ------ 31>------ 已启动生成: 项目: opencv_phase_unwrapping, 配置: Release x64 ------ 32>------ 已启动生成: 项目: opencv_intensity_transform, 配置: Release x64 ------ 33>------ 已启动生成: 项目: opencv_imgcodecs, 配置: Release x64 ------ 34>------ 已启动生成: 项目: opencv_img_hash, 配置: Release x64 ------ 35>------ 已启动生成: 项目: opencv_hfs, 配置: Release x64 ------ 36>------ 已启动生成: 项目: opencv_fuzzy, 配置: Release x64 ------ 37>------ 已启动生成: 项目: opencv_features2d, 配置: Release x64 ------ 38>------ 已启动生成: 项目: opencv_dnn, 配置: Release x64 ------ 39>------ 已启动生成: 项目: opencv_cudawarping, 配置: Release x64 ------ 40>------ 已启动生成: 项目: opencv_cudafilters, 配置: Release x64 ------ 31>cmake_pch.cxx 30>cmake_pch.cxx 29>cmake_pch.cxx 32>cmake_pch.cxx 28>map.cpp 28>mapaffine.cpp 28>mapper.cpp 28>mappergradaffine.cpp 28>mappergradeuclid.cpp 28>mappergradproj.cpp 28>mappergradshift.cpp 28>mappergradsimilar.cpp 28>mapperpyramid.cpp 28>mapprojec.cpp 28>mapshift.cpp 34>cmake_pch.cxx 36>cmake_pch.cxx 27>opencv_surface_matching_main.cpp 27>icp.cpp 40>cmake_pch.cxx 27>pose_3d.cpp 27>ppf_helpers.cpp 27>ppf_match_3d.cpp 35>cmake_pch.cxx 27>t_hash_int.cpp 38>cmake_pch.cxx 39>cmake_pch.cxx 29>opencv_quality_main.cpp 29>qualitybrisque.cpp 29>qualitygmsd.cpp 34>opencv_img_hash_main.cpp 32>opencv_intensity_transform_main.cpp 31>opencv_phase_unwrapping_main.cpp 30>opencv_plot_main.cpp 29>qualitymse.cpp 29>qualityssim.cpp 34>average_hash.cpp 34>block_mean_hash.cpp 34>color_moment_hash.cpp 31>histogramphaseunwrapping.cpp 32>bimef.cpp 34>img_hash_base.cpp 32>intensity_transform.cpp 30>plot.cpp 34>marr_hildreth_hash.cpp 34>phash.cpp 35>opencv_hfs_main.cpp 34>radial_variance_hash.cpp 35>hfs.cpp 35>hfs_core.cpp 35>magnitude.cpp 36>opencv_fuzzy_main.cpp 36>fuzzy_F0_math.cpp 36>fuzzy_F1_math.cpp 36>fuzzy_image.cpp 35>merge.cpp 35>gslic_engine.cpp 35>slic.cpp 33>cmake_pch.cxx 40>opencv_cudafilters_main.cpp 40>filtering.cpp 27> 正在创建库 E:/opencv-build/build/lib/Release/opencv_surface_matching4110.lib 和对象 E:/opencv-build/build/lib/Release/opencv_surface_matching4110.exp 39>opencv_cudawarping_main.cpp 38>opencl_kernels_dnn.cpp 28> 正在创建库 E:/opencv-build/build/lib/Release/opencv_reg4110.lib 和对象 E:/opencv-build/build/lib/Release/opencv_reg4110.exp 39>pyramids.cpp 39>remap.cpp 39>resize.cpp 39>warp.cpp 38>opencv_dnn_main.cpp 38>opencv-caffe.pb.cc 38>opencv-onnx.pb.cc 38>attr_value.pb.cc 38>function.pb.cc 38>graph.pb.cc 38>op_def.pb.cc 38>tensor.pb.cc 38>tensor_shape.pb.cc 38>types.pb.cc 38>versions.pb.cc 38>caffe_importer.cpp 38>caffe_io.cpp 38>caffe_shrinker.cpp 38>darknet_importer.cpp 38>darknet_io.cpp 31> 正在创建库 E:/opencv-build/build/lib/Release/opencv_phase_unwrapping4110.lib 和对象 E:/opencv-build/build/lib/Release/opencv_phase_unwrapping4110.exp 32> 正在创建库 E:/opencv-build/build/lib/Release/opencv_intensity_transform4110.lib 和对象 E:/opencv-build/build/lib/Release/opencv_intensity_transform4110.exp 29> 正在创建库 E:/opencv-build/build/lib/Release/opencv_quality4110.lib 和对象 E:/opencv-build/build/lib/Release/opencv_quality4110.exp 27>opencv_surface_matching.vcxproj -> E:\opencv-build\build\bin\Release\opencv_surface_matching4110.dll 38>debug_utils.cpp 28>opencv_reg.vcxproj -> E:\opencv-build\build\bin\Release\opencv_reg4110.dll 30> 正在创建库 E:/opencv-build/build/lib/Release/opencv_plot4110.lib 和对象 E:/opencv-build/build/lib/Release/opencv_plot4110.exp 38>dnn.cpp 38>dnn_params.cpp 38>dnn_read.cpp 38>dnn_utils.cpp 32>opencv_intensity_transform.vcxproj -> E:\opencv-build\build\bin\Release\opencv_intensity_transform4110.dll 38>graph_simplifier.cpp 31>opencv_phase_unwrapping.vcxproj -> E:\opencv-build\build\bin\Release\opencv_phase_unwrapping4110.dll 38>halide_scheduler.cpp 38>ie_ngraph.cpp 38>init.cpp 35> 正在创建库 E:/opencv-build/build/lib/Release/opencv_hfs4110.lib 和对象 E:/opencv-build/build/lib/Release/opencv_hfs4110.exp 35>LINK : warning LNK4098: 默认库“LIBCMT”与其他库的使用冲突;请使用 /NODEFAULTLIB:library 30>opencv_plot.vcxproj -> E:\opencv-build\build\bin\Release\opencv_plot4110.dll 34> 正在创建库 E:/opencv-build/build/lib/Release/opencv_img_hash4110.lib 和对象 E:/opencv-build/build/lib/Release/opencv_img_hash4110.exp 38>layers_rvp052.cpp 38>quantization_utils.cpp 38>layer.cpp 38>layer_factory.cpp 29>opencv_quality.vcxproj -> E:\opencv-build\build\bin\Release\opencv_quality4110.dll 38>accum_layer.cpp 38>arg_layer.cpp 38>attention_layer.cpp 36> 正在创建库 E:/opencv-build/build/lib/Release/opencv_fuzzy4110.lib 和对象 E:/opencv-build/build/lib/Release/opencv_fuzzy4110.exp 38>blank_layer.cpp 38>concat_layer.cpp 38>const_layer.cpp 38>correlation_layer.cpp 38>conv_depthwise.cpp 38>conv_winograd_f63.cpp 38>conv_winograd_f63.dispatch.cpp 38>convolution.cpp 38>fast_gemm.cpp 38>fast_norm.cpp 38>softmax.cpp 38>crop_and_resize_layer.cpp 38>cumsum_layer.cpp 38>depth_space_ops_layer.cpp 38>detection_output_layer.cpp 34>opencv_img_hash.vcxproj -> E:\opencv-build\build\bin\Release\opencv_img_hash4110.dll 38>einsum_layer.cpp 38>expand_layer.cpp 33>opencv_imgcodecs_main.cpp 35>opencv_hfs.vcxproj -> E:\opencv-build\build\bin\Release\opencv_hfs4110.dll 39> 正在创建库 E:/opencv-build/build/lib/Release/opencv_cudawarping4110.lib 和对象 E:/opencv-build/build/lib/Release/opencv_cudawarping4110.exp 33>bitstrm.cpp 33>exif.cpp 33>grfmt_avif.cpp 39>LINK : warning LNK4098: 默认库“LIBCMT”与其他库的使用冲突;请使用 /NODEFAULTLIB:library 38>flatten_layer.cpp 33>grfmt_base.cpp 38>flow_warp_layer.cpp 38>gather_elements_layer.cpp 33>grfmt_bmp.cpp 33>grfmt_exr.cpp 33>grfmt_gdal.cpp 33>grfmt_gdcm.cpp 33>grfmt_gif.cpp 33>grfmt_hdr.cpp 33>grfmt_jpeg.cpp 38>gather_layer.cpp 38>gemm_layer.cpp 33>grfmt_jpeg2000.cpp 33>grfmt_jpeg2000_openjpeg.cpp 40> 正在创建库 E:/opencv-build/build/lib/Release/opencv_cudafilters4110.lib 和对象 E:/opencv-build/build/lib/Release/opencv_cudafilters4110.exp 33>grfmt_jpegxl.cpp 40>LINK : warning LNK4098: 默认库“LIBCMT”与其他库的使用冲突;请使用 /NODEFAULTLIB:library 38>group_norm_layer.cpp 33>grfmt_pam.cpp 38>instance_norm_layer.cpp 33>grfmt_pfm.cpp 33>grfmt_png.cpp 33>grfmt_pxm.cpp 33>grfmt_spng.cpp 36>opencv_fuzzy.vcxproj -> E:\opencv-build\build\bin\Release\opencv_fuzzy4110.dll 33>grfmt_sunras.cpp 33>grfmt_tiff.cpp 33>grfmt_webp.cpp 38>layer_norm.cpp 38>layers_common.cpp 33>loadsave.cpp 33>rgbe.cpp 33>utils.cpp 38>lrn_layer.cpp 38>matmul_layer.cpp 38>max_unpooling_layer.cpp 38>mvn_layer.cpp 38>nary_eltwise_layers.cpp 38>normalize_bbox_layer.cpp 38>not_implemented_layer.cpp 38>padding_layer.cpp 38>permute_layer.cpp 38>prior_box_layer.cpp 39>opencv_cudawarping.vcxproj -> E:\opencv-build\build\bin\Release\opencv_cudawarping4110.dll 39>已完成生成项目“opencv_cudawarping.vcxproj”的操作。 35>已完成生成项目“opencv_hfs.vcxproj”的操作。 38>proposal_layer.cpp 38>recurrent_layers.cpp 38>reduce_layer.cpp 38>region_layer.cpp 38>reorg_layer.cpp 38>reshape_layer.cpp 38>resize_layer.cpp 38>scatterND_layer.cpp 38>scatter_layer.cpp 40>opencv_cudafilters.vcxproj -> E:\opencv-build\build\bin\Release\opencv_cudafilters4110.dll 38>shuffle_channel_layer.cpp 38>slice_layer.cpp 33>LINK : fatal error LNK1181: 无法打开输入文件“E:\Anaconda\Library\bin\avif.dll” 38>split_layer.cpp 40>已完成生成项目“opencv_cudafilters.vcxproj”的操作。 38>tile_layer.cpp 33>已完成生成项目“opencv_imgcodecs.vcxproj”的操作 - 失败。 41>------ 已启动生成: 项目: opencv_videoio, 配置: Release x64 ------ 42>------ 已启动生成: 项目: opencv_cudaimgproc, 配置: Release x64 ------ 38>topk_layer.cpp 38>legacy_backend.cpp 38>model.cpp 38>net.cpp 38>net_cann.cpp 37>cmake_pch.cxx 38>net_impl_backend.cpp 38>net_impl.cpp 38>net_impl_fuse.cpp 38>net_openvino.cpp 38>net_quantization.cpp 38>nms.cpp 38>common.cpp 38>math_functions.cpp 38>ocl4dnn_conv_spatial.cpp 38>ocl4dnn_inner_product.cpp 38>ocl4dnn_lrn.cpp 38>ocl4dnn_pool.cpp 38>ocl4dnn_softmax.cpp 38>onnx_graph_simplifier.cpp 38>onnx_importer.cpp 41>cmake_pch.cxx 38>op_cann.cpp 38>op_cuda.cpp 38>op_halide.cpp 38>op_inf_engine.cpp 38>op_timvx.cpp 38>op_vkcom.cpp 38>op_webnn.cpp 38>registry.cpp 38>tf_graph_simplifier.cpp 38>tf_importer.cpp 42>cmake_pch.cxx 38>tf_io.cpp 38>tflite_importer.cpp 38>THDiskFile.cpp 38>THFile.cpp 38>THGeneral.cpp 38>torch_importer.cpp 38>conv_1x1_fast_spv.cpp 38>conv_depthwise_3x3_spv.cpp 38>conv_depthwise_spv.cpp 38>conv_implicit_gemm_spv.cpp 38>gemm_spv.cpp 38>nary_eltwise_binary_forward_spv.cpp 38>spv_shader.cpp 38>buffer.cpp 38>command.cpp 38>context.cpp 38>fence.cpp 38>internal.cpp 37>opencl_kernels_features2d.cpp 37>opencv_features2d_main.cpp 37>affine_feature.cpp 38>op_base.cpp 38>op_conv.cpp 37>agast.cpp 37>agast_score.cpp 37>akaze.cpp 37>bagofwords.cpp 37>blobdetector.cpp 37>brisk.cpp 37>draw.cpp 37>dynamic.cpp 38>op_matmul.cpp 38>op_naryEltwise.cpp 38>pipeline.cpp 38>tensor.cpp 37>evaluation.cpp 37>fast.cpp 37>fast_score.cpp 38>vk_functions.cpp 37>feature2d.cpp 37>gftt.cpp 38>vk_loader.cpp 37>kaze.cpp 37>AKAZEFeatures.cpp 37>KAZEFeatures.cpp 37>fed.cpp 37>nldiffusion_functions.cpp 37>keypoint.cpp 37>main.cpp 37>matchers.cpp 37>mser.cpp 37>orb.cpp 37>sift.dispatch.cpp 42>opencv_cudaimgproc_main.cpp 42>bilateral_filter.cpp 42>blend.cpp 42>canny.cpp 42>color.cpp 42>connectedcomponents.cpp 42>corners.cpp 42>generalized_hough.cpp 42>gftt.cpp 42>histogram.cpp 42>hough_circles.cpp 42>hough_lines.cpp 42>hough_segments.cpp 42>match_template.cpp 42>mean_shift.cpp 42>moments.cpp 42>mssegmentation.cpp 41>opencv_videoio_main.cpp 41>backend_static.cpp 41>cap.cpp 41>cap_dshow.cpp 41>cap_images.cpp 41>cap_mjpeg_decoder.cpp 41>cap_mjpeg_encoder.cpp 41>cap_msmf.cpp 41>obsensor_stream_channel_msmf.cpp 41>obsensor_uvc_stream_channel.cpp 41>cap_obsensor_capture.cpp 41>container_avi.cpp 41>videoio_c.cpp 41>videoio_registry.cpp 38>backend.cpp 42> 正在创建库 E:/opencv-build/build/lib/Release/opencv_cudaimgproc4110.lib 和对象 E:/opencv-build/build/lib/Release/opencv_cudaimgproc4110.exp 42>LINK : warning LNK4098: 默认库“LIBCMT”与其他库的使用冲突;请使用 /NODEFAULTLIB:library 42>opencv_cudaimgproc.vcxproj -> E:\opencv-build\build\bin\Release\opencv_cudaimgproc4110.dll 42>已完成生成项目“opencv_cudaimgproc.vcxproj”的操作。 43>------ 已启动生成: 项目: opencv_photo, 配置: Release x64 ------ 37> 正在创建库 E:/opencv-build/build/lib/Release/opencv_features2d4110.lib 和对象 E:/opencv-build/build/lib/Release/opencv_features2d4110.exp 43>cmake_pch.cxx 41>backend_plugin.cpp 37>opencv_features2d.vcxproj -> E:\opencv-build\build\bin\Release\opencv_features2d4110.dll 44>------ 已启动生成: 项目: opencv_saliency, 配置: Release x64 ------ 45>------ 已启动生成: 项目: opencv_line_descriptor, 配置: Release x64 ------ 46>------ 已启动生成: 项目: opencv_cudafeatures2d, 配置: Release x64 ------ 47>------ 已启动生成: 项目: opencv_calib3d, 配置: Release x64 ------ 38>batch_norm_layer.cpp 44>cmake_pch.cxx 45>cmake_pch.cxx 46>cmake_pch.cxx 47>cmake_pch.cxx 38>convolution_layer.cpp 41>LINK : fatal error LNK1181: 无法打开输入文件“..\..\lib\Release\opencv_imgcodecs4110.lib” 41>已完成生成项目“opencv_videoio.vcxproj”的操作 - 失败。 48>------ 已启动生成: 项目: opencv_highgui, 配置: Release x64 ------ 49>------ 已启动生成: 项目: opencv_cudacodec, 配置: Release x64 ------ 43>opencl_kernels_photo.cpp 43>opencv_photo_main.cpp 43>align.cpp 43>calibrate.cpp 43>contrast_preserve.cpp 43>denoise_tvl1.cpp 43>denoising.cpp 43>denoising.cuda.cpp 43>hdr_common.cpp 43>inpaint.cpp 43>merge.cpp 43>npr.cpp 43>seamless_cloning.cpp 43>seamless_cloning_impl.cpp 43>tonemap.cpp 48>cmake_pch.cxx 49>cmake_pch.cxx 44>opencv_saliency_main.cpp 44>CmFile.cpp 44>CmShow.cpp 44>FilterTIG.cpp 44>ValStructVec.cpp 44>objectnessBING.cpp 44>motionSaliency.cpp 44>motionSaliencyBinWangApr2014.cpp 44>objectness.cpp 44>saliency.cpp 44>staticSaliency.cpp 44>staticSaliencyFineGrained.cpp 44>staticSaliencySpectralResidual.cpp 47>opencl_kernels_calib3d.cpp 47>opencv_calib3d_main.cpp 47>ap3p.cpp 47>calibinit.cpp 47>calibration.cpp 47>calibration_base.cpp 45>opencv_line_descriptor_main.cpp 47>calibration_handeye.cpp 45>LSDDetector.cpp 45>binary_descriptor.cpp 47>checkchessboard.cpp 47>chessboard.cpp 47>circlesgrid.cpp 45>binary_descriptor_matcher.cpp 47>compat_ptsetreg.cpp 47>dls.cpp 47>epnp.cpp 47>fisheye.cpp 47>five-point.cpp 45>draw.cpp 47>fundam.cpp 47>homography_decomp.cpp 47>ippe.cpp 47>levmarq.cpp 46>opencv_cudafeatures2d_main.cpp 46>brute_force_matcher.cpp 46>fast.cpp 47>main.cpp 46>feature2d_async.cpp 47>p3p.cpp 46>orb.cpp 47>polynom_solver.cpp 38>elementwise_layers.cpp 47>ptsetreg.cpp 47>quadsubpix.cpp 47>rho.cpp 47>solvepnp.cpp 47>sqpnp.cpp 47>stereo_geom.cpp 47>stereobm.cpp 47>stereosgbm.cpp 47>triangulate.cpp 47>undistort.dispatch.cpp 47>upnp.cpp 47>bundle.cpp 47>degeneracy.cpp 47>dls_solver.cpp 47>essential_solver.cpp 47>estimator.cpp 47>fundamental_solver.cpp 45> 正在创建库 E:/opencv-build/build/lib/Release/opencv_line_descriptor4110.lib 和对象 E:/opencv-build/build/lib/Release/opencv_line_descriptor4110.exp 44> 正在创建库 E:/opencv-build/build/lib/Release/opencv_saliency4110.lib 和对象 E:/opencv-build/build/lib/Release/opencv_saliency4110.exp 47>gamma_values.cpp 47>homography_solver.cpp 47>local_optimization.cpp 47>pnp_solver.cpp 46> 正在创建库 E:/opencv-build/build/lib/Release/opencv_cudafeatures2d4110.lib 和对象 E:/opencv-build/build/lib/Release/opencv_cudafeatures2d4110.exp 47>quality.cpp 38>eltwise_layer.cpp 47>ransac_solvers.cpp 47>sampler.cpp 46>LINK : warning LNK4098: 默认库“LIBCMT”与其他库的使用冲突;请使用 /NODEFAULTLIB:library 43> 正在创建库 E:/opencv-build/build/lib/Release/opencv_photo4110.lib 和对象 E:/opencv-build/build/lib/Release/opencv_photo4110.exp 47>termination.cpp 43>LINK : warning LNK4098: 默认库“LIBCMT”与其他库的使用冲突;请使用 /NODEFAULTLIB:library 47>utils.cpp 49>E:\opencv-build\opencv_contrib\modules\cudacodec\src\video_decoder.hpp(107,118): error C2065: “cudaVideoSurfaceFormat_YUV444”: 未声明的标识符 49>(编译源文件“CMakeFiles/opencv_cudacodec.dir/cmake_pch.cxx”) 49>E:\opencv-build\opencv_contrib\modules\cudacodec\src\video_decoder.hpp(107,19): error C2737: “type”: 必须初始化 const 对象 49>(编译源文件“CMakeFiles/opencv_cudacodec.dir/cmake_pch.cxx”) 49>已完成生成项目“opencv_cudacodec.vcxproj”的操作 - 失败。 45>opencv_line_descriptor.vcxproj -> E:\opencv-build\build\bin\Release\opencv_line_descriptor4110.dll 44>opencv_saliency.vcxproj -> E:\opencv-build\build\bin\Release\opencv_saliency4110.dll 46>opencv_cudafeatures2d.vcxproj -> E:\opencv-build\build\bin\Release\opencv_cudafeatures2d4110.dll 43>opencv_photo.vcxproj -> E:\opencv-build\build\bin\Release\opencv_photo4110.dll 48>opencv_highgui_main.cpp 48>backend.cpp 48>roiSelector.cpp 48>window.cpp 48>window_w32.cpp 43>已完成生成项目“opencv_photo.vcxproj”的操作。 50>------ 已启动生成: 项目: opencv_xphoto, 配置: Release x64 ------ 46>已完成生成项目“opencv_cudafeatures2d.vcxproj”的操作。 50>bm3d_image_denoising.cpp 50>dct_image_denoising.cpp 50>grayworld_white_balance.cpp 50>inpainting.cpp 50>learning_based_color_balance.cpp 50>oilpainting.cpp 38>fully_connected_layer.cpp 50>simple_color_balance.cpp 50>tonemap.cpp 48>LINK : fatal error LNK1181: 无法打开输入文件“..\..\lib\Release\opencv_videoio4110.lib” 48>已完成生成项目“opencv_highgui.vcxproj”的操作 - 失败。 51>------ 已启动生成: 项目: opencv_visualisation, 配置: Release x64 ------ 52>------ 已启动生成: 项目: opencv_ts, 配置: Release x64 ------ 53>------ 已启动生成: 项目: opencv_bioinspired, 配置: Release x64 ------ 54>------ 已启动生成: 项目: opencv_annotation, 配置: Release x64 ------ 51>opencv_visualisation.cpp 54>opencv_annotation.cpp 52>cmake_pch.cxx 53>cmake_pch.cxx 38>pooling_layer.cpp 38>scale_layer.cpp 53>opencl_kernels_bioinspired.cpp 53>opencv_bioinspired_main.cpp 53>basicretinafilter.cpp 53>imagelogpolprojection.cpp 53>magnoretinafilter.cpp 53>parvoretinafilter.cpp 53>retina.cpp 53>retina_ocl.cpp 53>retinacolor.cpp 53>retinafasttonemapping.cpp 53>retinafilter.cpp 53>transientareassegmentationmodule.cpp 54>LINK : fatal error LNK1181: 无法打开输入文件“..\..\lib\Release\opencv_highgui4110.lib” 54>已完成生成项目“opencv_annotation.vcxproj”的操作 - 失败。 52>cuda_perf.cpp 52>cuda_test.cpp 52>ocl_perf.cpp 52>ocl_test.cpp 52>ts.cpp 52>ts_arrtest.cpp 52>ts_func.cpp 52>ts_gtest.cpp 52>ts_perf.cpp 52>ts_tags.cpp 38>softmax_layer.cpp 53>LINK : fatal error LNK1181: 无法打开输入文件“..\..\lib\Release\opencv_highgui4110.lib” 51>LINK : fatal error LNK1181: 无法打开输入文件“..\..\lib\Release\opencv_highgui4110.lib” 53>已完成生成项目“opencv_bioinspired.vcxproj”的操作 - 失败。 51>已完成生成项目“opencv_visualisation.vcxproj”的操作 - 失败。 38>batch_norm_layer.cpp 50> 正在创建库 E:/opencv-build/build/lib/Release/opencv_xphoto4110.lib 和对象 E:/opencv-build/build/lib/Release/opencv_xphoto4110.exp 50>opencv_xphoto.vcxproj -> E:\opencv-build\build\bin\Release\opencv_xphoto4110.dll 38>convolution_layer.cpp 52>opencv_ts.vcxproj -> E:\opencv-build\build\lib\Release\opencv_ts4110.lib 38>elementwise_layers.cpp 38>eltwise_layer.cpp 38>fully_connected_layer.cpp 38>pooling_layer.cpp 47> 正在创建库 E:/opencv-build/build/lib/Release/opencv_calib3d4110.lib 和对象 E:/opencv-build/build/lib/Release/opencv_calib3d4110.exp 47>opencv_calib3d.vcxproj -> E:\opencv-build\build\bin\Release\opencv_calib3d4110.dll 55>------ 已启动生成: 项目: opencv_structured_light, 配置: Release x64 ------ 56>------ 已启动生成: 项目: opencv_shape, 配置: Release x64 ------ 57>------ 已启动生成: 项目: opencv_rgbd, 配置: Release x64 ------ 58>------ 已启动生成: 项目: opencv_rapid, 配置: Release x64 ------ 59>------ 已启动生成: 项目: opencv_cudastereo, 配置: Release x64 ------ 60>------ 已启动生成: 项目: opencv_ccalib, 配置: Release x64 ------ 55>cmake_pch.cxx 56>cmake_pch.cxx 57>cmake_pch.cxx 58>cmake_pch.cxx 60>cmake_pch.cxx 59>cmake_pch.cxx 38>scale_layer.cpp 58>opencv_rapid_main.cpp 55>opencv_structured_light_main.cpp 58>histogram.cpp 58>rapid.cpp 55>graycodepattern.cpp 55>sinusoidalpattern.cpp 56>opencv_shape_main.cpp 56>aff_trans.cpp 56>emdL1.cpp 56>haus_dis.cpp 56>hist_cost.cpp 56>sc_dis.cpp 60>opencv_ccalib_main.cpp 56>tps_trans.cpp 60>ccalib.cpp 60>multicalib.cpp 60>omnidir.cpp 60>randpattern.cpp 59>opencv_cudastereo_main.cpp 57>opencl_kernels_rgbd.cpp 59>disparity_bilateral_filter.cpp 57>opencv_rgbd_main.cpp 59>stereobm.cpp 57>colored_kinfu.cpp 57>colored_tsdf.cpp 57>depth_cleaner.cpp 57>depth_registration.cpp 57>depth_to_3d.cpp 57>dqb.cpp 57>dynafu.cpp 57>dynafu_tsdf.cpp 59>stereobp.cpp 59>stereocsbp.cpp 57>fast_icp.cpp 59>stereosgm.cpp 57>hash_tsdf.cpp 59>util.cpp 57>kinfu.cpp 57>kinfu_frame.cpp 57>large_kinfu.cpp 57>linemod.cpp 57>nonrigid_icp.cpp 57>normal.cpp 57>odometry.cpp 57>plane.cpp 57>pose_graph.cpp 57>tsdf.cpp 57>tsdf_functions.cpp 57>utils.cpp 57>volume.cpp 57>warpfield.cpp 38>softmax_layer.cpp 58> 正在创建库 E:/opencv-build/build/lib/Release/opencv_rapid4110.lib 和对象 E:/opencv-build/build/lib/Release/opencv_rapid4110.exp 55> 正在创建库 E:/opencv-build/build/lib/Release/opencv_structured_light4110.lib 和对象 E:/opencv-build/build/lib/Release/opencv_structured_light4110.exp 56> 正在创建库 E:/opencv-build/build/lib/Release/opencv_shape4110.lib 和对象 E:/opencv-build/build/lib/Release/opencv_shape4110.exp 59> 正在创建库 E:/opencv-build/build/lib/Release/opencv_cudastereo4110.lib 和对象 E:/opencv-build/build/lib/Release/opencv_cudastereo4110.exp 59>LINK : warning LNK4098: 默认库“LIBCMT”与其他库的使用冲突;请使用 /NODEFAULTLIB:library 55>opencv_structured_light.vcxproj -> E:\opencv-build\build\bin\Release\opencv_structured_light4110.dll 58>opencv_rapid.vcxproj -> E:\opencv-build\build\bin\Release\opencv_rapid4110.dll 56>opencv_shape.vcxproj -> E:\opencv-build\build\bin\Release\opencv_shape4110.dll 61>------ 已启动生成: 项目: opencv_xfeatures2d, 配置: Release x64 ------ 59>opencv_cudastereo.vcxproj -> E:\opencv-build\build\bin\Release\opencv_cudastereo4110.dll 59>已完成生成项目“opencv_cudastereo.vcxproj”的操作。 60>LINK : fatal error LNK1181: 无法打开输入文件“..\..\lib\Release\opencv_highgui4110.lib” 60>已完成生成项目“opencv_ccalib.vcxproj”的操作 - 失败。 61>cmake_pch.cxx 61>opencl_kernels_xfeatures2d.cpp 61>opencv_xfeatures2d_main.cpp 61>affine_feature2d.cpp 61>beblid.cpp 61>brief.cpp 61>daisy.cpp 61>ellipticKeyPoint.cpp 61>fast.cpp 61>freak.cpp 61>gms.cpp 61>harris_lapace_detector.cpp 61>latch.cpp 61>Match.cpp 61>Point.cpp 61>PointPair.cpp 61>lucid.cpp 61>msd.cpp 61>pct_signatures.cpp 61>grayscale_bitmap.cpp 61>pct_clusterizer.cpp 61>pct_sampler.cpp 61>pct_signatures_sqfd.cpp 61>stardetector.cpp 61>surf.cpp 61>surf.cuda.cpp 61>surf.ocl.cpp 61>tbmr.cpp 61>xfeatures2d_init.cpp 57> 正在创建库 E:/opencv-build/build/lib/Release/opencv_rgbd4110.lib 和对象 E:/opencv-build/build/lib/Release/opencv_rgbd4110.exp 38> 正在创建库 E:/opencv-build/build/lib/Release/opencv_dnn4110.lib 和对象 E:/opencv-build/build/lib/Release/opencv_dnn4110.exp 38>LINK : warning LNK4098: 默认库“LIBCMT”与其他库的使用冲突;请使用 /NODEFAULTLIB:library 57>opencv_rgbd.vcxproj -> E:\opencv-build\build\bin\Release\opencv_rgbd4110.dll 38>opencv_dnn.vcxproj -> E:\opencv-build\build\bin\Release\opencv_dnn4110.dll 38>已完成生成项目“opencv_dnn.vcxproj”的操作。 62>------ 已启动生成: 项目: opencv_video, 配置: Release x64 ------ 63>------ 已启动生成: 项目: opencv_text, 配置: Release x64 ------ 64>------ 已启动生成: 项目: opencv_objdetect, 配置: Release x64 ------ 65>------ 已启动生成: 项目: opencv_model_diagnostics, 配置: Release x64 ------ 66>------ 已启动生成: 项目: opencv_mcc, 配置: Release x64 ------ 67>------ 已启动生成: 项目: opencv_dnn_superres, 配置: Release x64 ------ 68>------ 已启动生成: 项目: opencv_dnn_objdetect, 配置: Release x64 ------ 63>cmake_pch.cxx 62>cmake_pch.cxx 65>model_diagnostics.cpp 64>cmake_pch.cxx 66>cmake_pch.cxx 67>cmake_pch.cxx 68>cmake_pch.cxx 63>opencv_text_main.cpp 63>erfilter.cpp 63>ocr_beamsearch_decoder.cpp 63>ocr_hmm_decoder.cpp 63>ocr_holistic.cpp 63>ocr_tesseract.cpp 63>text_detectorCNN.cpp 63>text_detector_swt.cpp 62>opencl_kernels_video.cpp 64>opencl_kernels_objdetect.cpp 62>opencv_video_main.cpp 62>bgfg_KNN.cpp 62>bgfg_gaussmix2.cpp 64>opencv_objdetect_main.cpp 64>apriltag_quad_thresh.cpp 62>camshift.cpp 64>zmaxheap.cpp 64>aruco_board.cpp 64>aruco_detector.cpp 64>aruco_dictionary.cpp 62>dis_flow.cpp 64>aruco_utils.cpp 64>charuco_detector.cpp 62>ecc.cpp 62>kalman.cpp 68>opencv_dnn_objdetect_main.cpp 62>lkpyramid.cpp 62>optflowgf.cpp 62>optical_flow_io.cpp 64>barcode.cpp 64>abs_decoder.cpp 62>tracker_feature.cpp 64>hybrid_binarizer.cpp 64>super_scale.cpp 64>utils.cpp 64>ean13_decoder.cpp 62>tracker_feature_set.cpp 64>ean8_decoder.cpp 64>upcean_decoder.cpp 62>tracker_mil_model.cpp 68>core_detect.cpp 62>tracker_mil_state.cpp 62>tracker_model.cpp 64>bardetect.cpp 62>tracker_sampler.cpp 62>tracker_sampler_algorithm.cpp 62>tracker_state_estimator.cpp 62>tracking_feature.cpp 64>cascadedetect.cpp 62>tracking_online_mil.cpp 64>cascadedetect_convert.cpp 64>detection_based_tracker.cpp 62>tracker.cpp 64>face_detect.cpp 62>tracker_dasiamrpn.cpp 64>face_recognize.cpp 62>tracker_goturn.cpp 64>graphical_code_detector.cpp 64>hog.cpp 62>tracker_mil.cpp 67>opencv_dnn_superres_main.cpp 64>main.cpp 64>qrcode.cpp 64>qrcode_encoder.cpp 62>tracker_nano.cpp 62>tracker_vit.cpp 62>variational_refinement.cpp 67>dnn_superres.cpp 66>opencv_mcc_main.cpp 66>bound_min.cpp 66>ccm.cpp 66>charts.cpp 66>checker_detector.cpp 66>checker_model.cpp 66>color.cpp 66>colorspace.cpp 66>common.cpp 66>debug.cpp 66>distance.cpp 66>graph_cluster.cpp 66>io.cpp 66>linearize.cpp 66>mcc.cpp 66>operations.cpp 66>utils.cpp 66>wiener_filter.cpp 65>opencv_model_diagnostics.vcxproj -> E:\opencv-build\build\bin\Release\opencv_model_diagnostics.exe 68>LINK : fatal error LNK1181: 无法打开输入文件“..\..\lib\Release\opencv_highgui4110.lib” 68>已完成生成项目“opencv_dnn_objdetect.vcxproj”的操作 - 失败。 67> 正在创建库 E:/opencv-build/build/lib/Release/opencv_dnn_superres4110.lib 和对象 E:/opencv-build/build/lib/Release/opencv_dnn_superres4110.exp 67>opencv_dnn_superres.vcxproj -> E:\opencv-build\build\bin\Release\opencv_dnn_superres4110.dll 63> 正在创建库 E:/opencv-build/build/lib/Release/opencv_text4110.lib 和对象 E:/opencv-build/build/lib/Release/opencv_text4110.exp 62> 正在创建库 E:/opencv-build/build/lib/Release/opencv_video4110.lib 和对象 E:/opencv-build/build/lib/Release/opencv_video4110.exp 63>opencv_text.vcxproj -> E:\opencv-build\build\bin\Release\opencv_text4110.dll 69>------ 已启动生成: 项目: opencv_datasets, 配置: Release x64 ------ 62>opencv_video.vcxproj -> E:\opencv-build\build\bin\Release\opencv_video4110.dll 70>------ 已启动生成: 项目: opencv_ximgproc, 配置: Release x64 ------ 71>------ 已启动生成: 项目: opencv_cudabgsegm, 配置: Release x64 ------ 72>------ 已启动生成: 项目: opencv_bgsegm, 配置: Release x64 ------ 69>ar_hmdb.cpp 71>cmake_pch.cxx 69>ar_sports.cpp 69>dataset.cpp 69>fr_adience.cpp 72>cmake_pch.cxx 69>fr_lfw.cpp 69>gr_chalearn.cpp 69>gr_skig.cpp 69>hpe_humaneva.cpp 69>hpe_parse.cpp 70>cmake_pch.cxx 69>ir_affine.cpp 69>ir_robot.cpp 69>is_bsds.cpp 69>is_weizmann.cpp 69>msm_epfl.cpp 69>msm_middlebury.cpp 69>or_imagenet.cpp 66> 正在创建库 E:/opencv-build/build/lib/Release/opencv_mcc4110.lib 和对象 E:/opencv-build/build/lib/Release/opencv_mcc4110.exp 69>or_mnist.cpp 66>opencv_mcc.vcxproj -> E:\opencv-build\build\bin\Release\opencv_mcc4110.dll 69>or_pascal.cpp 69>or_sun.cpp 69>pd_caltech.cpp 69>pd_inria.cpp 69>slam_kitti.cpp 69>slam_tumindoor.cpp 69>sr_bsds.cpp 69>sr_div2k.cpp 69>sr_general100.cpp 69>tr_chars.cpp 69>tr_icdar.cpp 69>tr_svt.cpp 64> 正在创建库 E:/opencv-build/build/lib/Release/opencv_objdetect4110.lib 和对象 E:/opencv-build/build/lib/Release/opencv_objdetect4110.exp 69>track_alov.cpp 69>track_vot.cpp 69>util.cpp 71>opencv_cudabgsegm_main.cpp 71>mog.cpp 71>mog2.cpp 64>opencv_objdetect.vcxproj -> E:\opencv-build\build\bin\Release\opencv_objdetect4110.dll 73>------ 已启动生成: 项目: opencv_xobjdetect, 配置: Release x64 ------ 74>------ 已启动生成: 项目: opencv_wechat_qrcode, 配置: Release x64 ------ 75>------ 已启动生成: 项目: opencv_interactive-calibration, 配置: Release x64 ------ 76>------ 已启动生成: 项目: opencv_face, 配置: Release x64 ------ 77>------ 已启动生成: 项目: opencv_cudalegacy, 配置: Release x64 ------ 78>------ 已启动生成: 项目: opencv_aruco, 配置: Release x64 ------ 70>opencl_kernels_ximgproc.cpp 70>opencv_ximgproc_main.cpp 70>adaptive_manifold_filter_n.cpp 70>anisodiff.cpp 70>bilateral_texture_filter.cpp 70>brightedges.cpp 70>deriche_filter.cpp 70>disparity_filters.cpp 70>domain_transform.cpp 70>dtfilter_cpu.cpp 70>edge_drawing.cpp 70>edgeaware_filters_common.cpp 70>edgeboxes.cpp 70>edgepreserving_filter.cpp 70>estimated_covariance.cpp 70>fast_hough_transform.cpp 70>fast_line_detector.cpp 70>fbs_filter.cpp 70>fgs_filter.cpp 70>find_ellipses.cpp 70>fourier_descriptors.cpp 70>graphsegmentation.cpp 70>guided_filter.cpp 72>opencv_bgsegm_main.cpp 72>bgfg_gaussmix.cpp 72>bgfg_gmg.cpp 72>bgfg_gsoc.cpp 72>bgfg_subcnt.cpp 70>joint_bilateral_filter.cpp 76>cmake_pch.cxx 70>l0_smooth.cpp 70>lsc.cpp 70>niblack_thresholding.cpp 70>paillou_filter.cpp 75>calibController.cpp 70>peilin.cpp 70>quaternion.cpp 70>radon_transform.cpp 75>calibPipeline.cpp 75>frameProcessor.cpp 72>synthetic_seq.cpp 73>cmake_pch.cxx 75>main.cpp 70>ridgedetectionfilter.cpp 75>parametersController.cpp 70>rolling_guidance_filter.cpp 70>scansegment.cpp 70>seeds.cpp 70>run_length_morphology.cpp 70>selectivesearchsegmentation.cpp 70>slic.cpp 75>rotationConverters.cpp 74>cmake_pch.cxx 70>sparse_match_interpolators.cpp 70>structured_edge_detection.cpp 78>cmake_pch.cxx 70>thinning.cpp 70>weighted_median_filter.cpp 77>cmake_pch.cxx 71> 正在创建库 E:/opencv-build/build/lib/Release/opencv_cudabgsegm4110.lib 和对象 E:/opencv-build/build/lib/Release/opencv_cudabgsegm4110.exp 71>LINK : warning LNK4098: 默认库“LIBCMT”与其他库的使用冲突;请使用 /NODEFAULTLIB:library 61>boostdesc.cpp 71>opencv_cudabgsegm.vcxproj -> E:\opencv-build\build\bin\Release\opencv_cudabgsegm4110.dll 74>opencv_wechat_qrcode_main.cpp 69>LINK : fatal error LNK1181: 无法打开输入文件“..\..\lib\Release\opencv_imgcodecs4110.lib” 74>binarizermgr.cpp 74>decodermgr.cpp 74>align.cpp 74>ssd_detector.cpp 74>imgsource.cpp 74>super_scale.cpp 74>wechat_qrcode.cpp 74>binarizer.cpp 74>binarybitmap.cpp 74>adaptive_threshold_mean_binarizer.cpp 74>fast_window_binarizer.cpp 74>global_histogram_binarizer.cpp 74>hybrid_binarizer.cpp 74>simple_adaptive_binarizer.cpp 74>bitarray.cpp 70>LINK : fatal error LNK1181: 无法打开输入文件“..\..\lib\Release\opencv_imgcodecs4110.lib” 72> 正在创建库 E:/opencv-build/build/lib/Release/opencv_bgsegm4110.lib 和对象 E:/opencv-build/build/lib/Release/opencv_bgsegm4110.exp 74>bitmatrix.cpp 74>bitsource.cpp 74>bytematrix.cpp 74>characterseteci.cpp 74>decoder_result.cpp 69>已完成生成项目“opencv_datasets.vcxproj”的操作 - 失败。 79>------ 已启动生成: 项目: opencv_tracking, 配置: Release x64 ------ 70>已完成生成项目“opencv_ximgproc.vcxproj”的操作 - 失败。 71>已完成生成项目“opencv_cudabgsegm.vcxproj”的操作。 80>------ 已启动生成: 项目: opencv_optflow, 配置: Release x64 ------ 74>detector_result.cpp 74>greyscale_luminance_source.cpp 74>greyscale_rotated_luminance_source.cpp 74>grid_sampler.cpp 74>imagecut.cpp 74>kmeans.cpp 74>perspective_transform.cpp 74>genericgf.cpp 74>genericgfpoly.cpp 74>reed_solomon_decoder.cpp 74>str.cpp 74>stringutils.cpp 74>unicomblock.cpp 74>errorhandler.cpp 74>luminance_source.cpp 74>bitmatrixparser.cpp 61>logos.cpp 74>datablock.cpp 78>opencv_aruco_main.cpp 74>datamask.cpp 74>decoded_bit_stream_parser.cpp 78>aruco.cpp 74>decoder.cpp 78>aruco_calib.cpp 74>mode.cpp 78>charuco.cpp 74>alignment_pattern.cpp 74>alignment_pattern_finder.cpp 76>opencv_face_main.cpp 74>detector.cpp 76>bif.cpp 74>finder_pattern.cpp 74>finder_pattern_finder.cpp 76>eigen_faces.cpp 74>finder_pattern_info.cpp 74>pattern_result.cpp 76>face_alignment.cpp 74>error_correction_level.cpp 74>format_information.cpp 76>face_basic.cpp 76>facemark.cpp 76>facemarkAAM.cpp 76>facemarkLBF.cpp 76>facerec.cpp 76>fisher_faces.cpp 76>getlandmarks.cpp 74>qrcode_reader.cpp 74>version.cpp 76>lbph_faces.cpp 76>mace.cpp 76>predict_collector.cpp 74>reader.cpp 74>result.cpp 76>regtree.cpp 74>resultpoint.cpp 80>cmake_pch.cxx 76>trainFacemark.cpp 72>opencv_bgsegm.vcxproj -> E:\opencv-build\build\bin\Release\opencv_bgsegm4110.dll 75>LINK : fatal error LNK1181: 无法打开输入文件“..\..\lib\Release\opencv_highgui4110.lib” 73>opencv_xobjdetect_main.cpp 75>已完成生成项目“opencv_interactive-calibration.vcxproj”的操作 - 失败。 73>feature_evaluator.cpp 73>lbpfeatures.cpp 73>waldboost.cpp 79>cmake_pch.cxx 73>wbdetector.cpp 61>Logos.cpp 77>opencv_cudalegacy_main.cpp 77>NCV.cpp 77>bm.cpp 77>bm_fast.cpp 77>calib3d.cpp 77>fgd.cpp 77>gmg.cpp 77>graphcuts.cpp 77>image_pyramid.cpp 77>interpolate_frames.cpp 77>needle_map.cpp 61>vgg.cpp 78> 正在创建库 E:/opencv-build/build/lib/Release/opencv_aruco4110.lib 和对象 E:/opencv-build/build/lib/Release/opencv_aruco4110.exp 73>LINK : fatal error LNK1181: 无法打开输入文件“..\..\lib\Release\opencv_imgcodecs4110.lib” 73>已完成生成项目“opencv_xobjdetect.vcxproj”的操作 - 失败。 81>------ 已启动生成: 项目: opencv_waldboost_detector, 配置: Release x64 ------ 78>opencv_aruco.vcxproj -> E:\opencv-build\build\bin\Release\opencv_aruco4110.dll 81>waldboost_detector.cpp 77> 正在创建库 E:/opencv-build/build/lib/Release/opencv_cudalegacy4110.lib 和对象 E:/opencv-build/build/lib/Release/opencv_cudalegacy4110.exp 80>opencl_kernels_optflow.cpp 80>opencv_optflow_main.cpp 80>deepflow.cpp 80>interfaces.cpp 80>motempl.cpp 80>pcaflow.cpp 80>geo_interpolation.cpp 80>rlof_localflow.cpp 80>rlofflow.cpp 77>LINK : warning LNK4098: 默认库“LIBCMT”与其他库的使用冲突;请使用 /NODEFAULTLIB:library 80>simpleflow.cpp 80>sparse_matching_gpc.cpp 80>sparsetodenseflow.cpp 80>tvl1flow.cpp 76> 正在创建库 E:/opencv-build/build/lib/Release/opencv_face4110.lib 和对象 E:/opencv-build/build/lib/Release/opencv_face4110.exp 74> 正在创建库 E:/opencv-build/build/lib/Release/opencv_wechat_qrcode4110.lib 和对象 E:/opencv-build/build/lib/Release/opencv_wechat_qrcode4110.exp 77>opencv_cudalegacy.vcxproj -> E:\opencv-build\build\bin\Release\opencv_cudalegacy4110.dll 77>已完成生成项目“opencv_cudalegacy.vcxproj”的操作。 82>------ 已启动生成: 项目: opencv_cudaobjdetect, 配置: Release x64 ------ 79>opencl_kernels_tracking.cpp 79>opencv_tracking_main.cpp 79>augmented_unscented_kalman.cpp 79>feature.cpp 79>featureColorName.cpp 79>gtrUtils.cpp 79>kuhn_munkres.cpp 79>mosseTracker.cpp 79>multiTracker.cpp 79>multiTracker_alt.cpp 79>onlineBoosting.cpp 79>tldDataset.cpp 79>tldDetector.cpp 79>tldEnsembleClassifier.cpp 79>tldModel.cpp 79>tldTracker.cpp 79>tldUtils.cpp 79>tracker.cpp 74>opencv_wechat_qrcode.vcxproj -> E:\opencv-build\build\bin\Release\opencv_wechat_qrcode4110.dll 76>opencv_face.vcxproj -> E:\opencv-build\build\bin\Release\opencv_face4110.dll 79>trackerBoosting.cpp 79>trackerBoostingModel.cpp 79>trackerCSRT.cpp 79>trackerCSRTScaleEstimation.cpp 79>trackerCSRTSegmentation.cpp 79>trackerCSRTUtils.cpp 79>trackerFeature.cpp 81>LINK : fatal error LNK1181: 无法打开输入文件“..\..\..\..\lib\Release\opencv_highgui4110.lib” 79>trackerFeatureSet.cpp 79>trackerKCF.cpp 79>trackerMIL_legacy.cpp 79>trackerMedianFlow.cpp 79>trackerSampler.cpp 81>已完成生成项目“opencv_waldboost_detector.vcxproj”的操作 - 失败。 79>trackerSamplerAlgorithm.cpp 79>trackerStateEstimator.cpp 79>tracking_by_matching.cpp 79>tracking_utils.cpp 79>twist.cpp 79>unscented_kalman.cpp 61> 正在创建库 E:/opencv-build/build/lib/Release/opencv_xfeatures2d4110.lib 和对象 E:/opencv-build/build/lib/Release/opencv_xfeatures2d4110.exp 61>LINK : warning LNK4098: 默认库“LIBCMT”与其他库的使用冲突;请使用 /NODEFAULTLIB:library 80>LINK : fatal error LNK1181: 无法打开输入文件“..\..\lib\Release\opencv_ximgproc4110.lib” 80>已完成生成项目“opencv_optflow.vcxproj”的操作 - 失败。 83>------ 已启动生成: 项目: opencv_cudaoptflow, 配置: Release x64 ------ 61>opencv_xfeatures2d.vcxproj -> E:\opencv-build\build\bin\Release\opencv_xfeatures2d4110.dll 61>已完成生成项目“opencv_xfeatures2d.vcxproj”的操作。 84>------ 已启动生成: 项目: opencv_stitching, 配置: Release x64 ------ 82>cmake_pch.cxx 83>cmake_pch.cxx 84>cmake_pch.cxx 79>LINK : fatal error LNK1181: 无法打开输入文件“..\..\lib\Release\opencv_datasets4110.lib” 79>已完成生成项目“opencv_tracking.vcxproj”的操作 - 失败。 85>------ 已启动生成: 项目: opencv_stereo, 配置: Release x64 ------ 85>cmake_pch.cxx 83>brox.cpp 83>farneback.cpp 83>nvidiaOpticalFlow.cpp 83>pyrlk.cpp 83>tvl1flow.cpp 83>opencv_cudaoptflow_main.cpp 83>E:\opencv-build\opencv_contrib\modules\cudaoptflow\src\nvidiaOpticalFlow.cpp(52,10): error C1083: 无法打开包括文件: “nvOpticalFlowCuda.h”: No such file or directory 83>(编译源文件“../../../opencv_contrib/modules/cudaoptflow/src/nvidiaOpticalFlow.cpp”) 82>opencv_cudaobjdetect_main.cpp 82>cascadeclassifier.cpp 82>hog.cpp 83>已完成生成项目“opencv_cudaoptflow.vcxproj”的操作 - 失败。 86>------ 已启动生成: 项目: opencv_videostab, 配置: Release x64 ------ 87>------ 已启动生成: 项目: opencv_superres, 配置: Release x64 ------ 85>opencv_stereo_main.cpp 85>descriptor.cpp 85>quasi_dense_stereo.cpp 85>stereo_binary_bm.cpp 85>stereo_binary_sgbm.cpp 86>cmake_pch.cxx 87>cmake_pch.cxx 84>opencl_kernels_stitching.cpp 84>opencv_stitching_main.cpp 84>autocalib.cpp 84>blenders.cpp 84>camera.cpp 84>exposure_compensate.cpp 84>matchers.cpp 84>motion_estimators.cpp 84>seam_finders.cpp 84>stitcher.cpp 84>timelapsers.cpp 84>util.cpp 84>warpers.cpp 84>warpers_cuda.cpp 85>LINK : fatal error LNK1181: 无法打开输入文件“..\..\lib\Release\opencv_tracking4110.lib” 85>已完成生成项目“opencv_stereo.vcxproj”的操作 - 失败。 82> 正在创建库 E:/opencv-build/build/lib/Release/opencv_cudaobjdetect4110.lib 和对象 E:/opencv-build/build/lib/Release/opencv_cudaobjdetect4110.exp 82>LINK : warning LNK4098: 默认库“LIBCMT”与其他库的使用冲突;请使用 /NODEFAULTLIB:library 82>opencv_cudaobjdetect.vcxproj -> E:\opencv-build\build\bin\Release\opencv_cudaobjdetect4110.dll 82>已完成生成项目“opencv_cudaobjdetect.vcxproj”的操作。 86>opencv_videostab_main.cpp 86>deblurring.cpp 86>fast_marching.cpp 86>frame_source.cpp 86>global_motion.cpp 86>inpainting.cpp 86>log.cpp 86>motion_stabilizing.cpp 86>optical_flow.cpp 86>outlier_rejection.cpp 86>stabilizer.cpp 86>wobble_suppression.cpp 84> 正在创建库 E:/opencv-build/build/lib/Release/opencv_stitching4110.lib 和对象 E:/opencv-build/build/lib/Release/opencv_stitching4110.exp 84>LINK : warning LNK4098: 默认库“LIBCMT”与其他库的使用冲突;请使用 /NODEFAULTLIB:library 87>opencl_kernels_superres.cpp 87>opencv_superres_main.cpp 87>btv_l1.cpp 87>btv_l1_cuda.cpp 87>frame_source.cpp 87>input_array_utility.cpp 87>optical_flow.cpp 87>super_resolution.cpp 84>opencv_stitching.vcxproj -> E:\opencv-build\build\bin\Release\opencv_stitching4110.dll 84>已完成生成项目“opencv_stitching.vcxproj”的操作。 87>LINK : fatal error LNK1181: 无法打开输入文件“..\..\lib\Release\opencv_cudacodec4110.lib” 87>已完成生成项目“opencv_superres.vcxproj”的操作 - 失败。 86>LINK : fatal error LNK1181: 无法打开输入文件“..\..\lib\Release\opencv_videoio4110.lib” 86>已完成生成项目“opencv_videostab.vcxproj”的操作 - 失败。 88>------ 已启动生成: 项目: opencv_python3, 配置: Release x64 ------ 88>LINK : fatal error LNK1181: 无法打开输入文件“..\..\lib\Release\opencv_xobjdetect4110.lib” 88>已完成生成项目“opencv_python3.vcxproj”的操作 - 失败。 89>------ 已启动生成: 项目: INSTALL, 配置: Release x64 ------ 89>1> 89>-- Install configuration: "Release" 89>CMake Error at cmake_install.cmake:36 (file): 89> file INSTALL cannot find 89> "E:/opencv-build/build/3rdparty/ippicv/ippicv_win/icv/readme.htm": No 89> error. 89> 89> 89>D:\Visual Studio\MSBuild\Microsoft\VC\v170\Microsoft.CppCommon.targets(166,5): error MSB3073: 命令“setlocal 89>D:\Visual Studio\MSBuild\Microsoft\VC\v170\Microsoft.CppCommon.targets(166,5): error MSB3073: D:\CMake\bin\cmake.exe -DBUILD_TYPE=Release -P cmake_install.cmake 89>D:\Visual Studio\MSBuild\Microsoft\VC\v170\Microsoft.CppCommon.targets(166,5): error MSB3073: if %errorlevel% neq 0 goto :cmEnd 89>D:\Visual Studio\MSBuild\Microsoft\VC\v170\Microsoft.CppCommon.targets(166,5): error MSB3073: :cmEnd 89>D:\Visual Studio\MSBuild\Microsoft\VC\v170\Microsoft.CppCommon.targets(166,5): error MSB3073: endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone 89>D:\Visual Studio\MSBuild\Microsoft\VC\v170\Microsoft.CppCommon.targets(166,5): error MSB3073: :cmErrorLevel 89>D:\Visual Studio\MSBuild\Microsoft\VC\v170\Microsoft.CppCommon.targets(166,5): error MSB3073: exit /b %1 89>D:\Visual Studio\MSBuild\Microsoft\VC\v170\Microsoft.CppCommon.targets(166,5): error MSB3073: :cmDone 89>D:\Visual Studio\MSBuild\Microsoft\VC\v170\Microsoft.CppCommon.targets(166,5): error MSB3073: if %errorlevel% neq 0 goto :VCEnd 89>D:\Visual Studio\MSBuild\Microsoft\VC\v170\Microsoft.CppCommon.targets(166,5): error MSB3073: :VCEnd”已退出,代码为 1。 89>已完成生成项目“INSTALL.vcxproj”的操作 - 失败。 ========== 生成: 67 成功,22 失败,15 最新,0 已跳过 ========== ========== 生成 于 22:55 完成,耗时 03:12.593 分钟 ==========
05-13
CONF_THRESH = 0.5 IOU_THRESHOLD = 0.4 POSE_NUM = 17 * 3 DET_NUM = 6 SEG_NUM = 32 OBB_NUM = 1 def get_img_path_batches(batch_size, img_dir): ret = [] batch = [] for root, dirs, files in os.walk(img_dir): for name in files: if len(batch) == batch_size: ret.append(batch) batch = [] batch.append(os.path.join(root, name)) if len(batch) > 0: ret.append(batch) return ret def plot_one_box(x, img, color=None, label=None, line_thickness=None): """ description: Plots one bounding box on image img, this function comes from YoLov8 project. param: x: a box likes [x1,y1,x2,y2] img: a opencv image object color: color to draw rectangle, such as (0,255,0) label: str line_thickness: int return: no return """ tl = ( line_thickness or round(0.002 * (img.shape[0] + img.shape[1]) / 2) + 1 ) # line/font thickness color = color or [random.randint(0, 255) for _ in range(3)] c1, c2 = (int(x[0]), int(x[1])), (int(x[2]), int(x[3])) cv2.rectangle(img, c1, c2, color, thickness=tl, lineType=cv2.LINE_AA) if label: tf = max(tl - 1, 1) # font thickness t_size = cv2.getTextSize(label, 0, fontScale=tl / 3, thickness=tf)[0] c2 = c1[0] + t_size[0], c1[1] - t_size[1] - 3 cv2.rectangle(img, c1, c2, color, -1, cv2.LINE_AA) # filled cv2.putText( img, label, (c1[0], c1[1] - 2), 0, tl / 3, [225, 255, 255], thickness=tf, lineType=cv2.LINE_AA, ) class YoLov8TRT(object): """ description: A YOLOv8 class that warps TensorRT ops, preprocess and postprocess ops. """ def __init__(self, engine_file_path): # Create a Context on this device, self.ctx = cuda.Device(0).make_context() stream = cuda.Stream() TRT_LOGGER = trt.Logger(trt.Logger.INFO) runtime = trt.Runtime(TRT_LOGGER) # Deserialize the engine from file with open(engine_file_path, "rb") as f: engine = runtime.deserialize_cuda_engine(f.read()) context = engine.create_execution_context() host_inputs = [] cuda_inputs = [] host_outputs = [] cuda_outputs = [] bindings = [] for binding in engine: print('bingding:', binding, engine.get_binding_shape(binding)) size = trt.volume(engine.get_binding_shape(binding)) * engine.max_batch_size dtype = trt.nptype(engine.get_binding_dtype(binding)) # Allocate host and device buffers host_mem = cuda.pagelocked_empty(size, dtype) cuda_mem = cuda.mem_alloc(host_mem.nbytes) # Append the device buffer to device bindings. bindings.append(int(cuda_mem)) # Append to the appropriate list. if engine.binding_is_input(binding): self.input_w = engine.get_binding_shape(binding)[-1] self.input_h = engine.get_binding_shape(binding)[-2] host_inputs.append(host_mem) cuda_inputs.append(cuda_mem) else: host_outputs.append(host_mem) cuda_outputs.append(cuda_mem) # Store self.stream = stream self.context = context self.engine = engine self.host_inputs = host_inputs self.cuda_inputs = cuda_inputs self.host_outputs = host_outputs self.cuda_outputs = cuda_outputs self.bindings = bindings self.batch_size = engine.max_batch_size self.det_output_length = host_outputs[0].shape[0] def infer(self, raw_image_generator): threading.Thread.__init__(self) # Make self the active context, pushing it on top of the context stack. self.ctx.push() # Restore stream = self.stream context = self.context host_inputs = self.host_inputs cuda_inputs = self.cuda_inputs host_outputs = self.host_outputs cuda_outputs = self.cuda_outputs bindings = self.bindings # Do image preprocess batch_image_raw = [] batch_origin_h = [] batch_origin_w = [] batch_input_image = np.empty(shape=[self.batch_size, 3, self.input_h, self.input_w]) for i, image_raw in enumerate(raw_image_generator): input_image, image_raw, origin_h, origin_w = self.preprocess_image(image_raw) batch_image_raw.append(image_raw) batch_origin_h.append(origin_h) batch_origin_w.append(origin_w) np.copyto(batch_input_image[i], input_image) batch_input_image = np.ascontiguousarray(batch_input_image) # Copy input image to host buffer np.copyto(host_inputs[0], batch_input_image.ravel()) start = time.time() # Transfer input data to the GPU. cuda.memcpy_htod_async(cuda_inputs[0], host_inputs[0], stream) # Run inference. context.execute_async(batch_size=self.batch_size, bindings=bindings, stream_handle=stream.handle) # Transfer predictions back from the GPU. cuda.memcpy_dtoh_async(host_outputs[0], cuda_outputs[0], stream) # Synchronize the stream stream.synchronize() end = time.time() # Remove any context from the top of the context stack, deactivating it. self.ctx.pop() # Here we use the first row of output in that batch_size = 1 output = host_outputs[0] # Do postprocess for i in range(self.batch_size): result_boxes, result_scores, result_classid = self.post_process( output[i * self.det_output_length: (i + 1) * self.det_output_length], batch_origin_h[i], batch_origin_w[i] ) # Draw rectangles and labels on the original image for j in range(len(result_boxes)): box = result_boxes[j] plot_one_box( box, batch_image_raw[i], label="{}:{:.2f}".format( categories[int(result_classid[j])], result_scores[j] ), ) return batch_image_raw, end - start def destroy(self): # Remove any context from the top of the context stack, deactivating it. self.ctx.pop() def get_raw_image(self, image_path_batch): """ description: Read an image from image path """ for img_path in image_path_batch: yield cv2.imread(img_path) def get_raw_image_zeros(self, image_path_batch=None): """ description: Ready data for warmup """ for _ in range(self.batch_size): yield np.zeros([self.input_h, self.input_w, 3], dtype=np.uint8) def preprocess_image(self, raw_bgr_image): """ description: Convert BGR image to RGB, resize and pad it to target size, normalize to [0,1], transform to NCHW format. param: input_image_path: str, image path return: image: the processed image image_raw: the original image h: original height w: original width """
最新发布
07-13
<think>我们正在使用一个基于TensorRT加速的YOLOv8推理代码,目前代码只支持检测一个类别(drone)。现在需要扩展为多类别检测。 从代码中可以看出,当前代码中定义了几个常量: POSE_NUM = 17 * 3 # 关键点检测的数量(每个点3个值) DET_NUM = 6 # 每个检测框的原始输出数量(x, y, w, h, conf, class_id)? 注意:实际上YOLOv8的输出格式可能不同 SEG_NUM = 32 # 分割掩码的参数数量 OBB_NUM = 1 # 定向边界框(OBB)的参数,这里可能是1个角度? 在`post_process`函数中,我们注意到: num_values_per_detection = DET_NUM + SEG_NUM + POSE_NUM + OBB_NUM 这个值表示每个检测结果的参数总数。 然而,在标准的YOLOv8目标检测中(不带分割和姿态估计),每个检测框的输出应该是:4个坐标(x,y,w,h) + 1个置信度 + (类别数)个类别分数。 但是,在代码中,DET_NUM被设置为6,这可能是用于一个类别的情况(4坐标+1置信度+1类别分数)?但多类别情况下,类别分数应该是多个。 实际上,YOLOv8的TensorRT输出格式取决于模型。在导出模型时,如果是检测模型,输出维度为[1, 84, 8400](84=4+80,80是COCO类别数)。 但是,我们当前代码中,每个检测框的参数数量是固定的(由DET_NUM+SEG_NUM+...等构成)。这暗示我们使用的可能是YOLOv8的集成输出(同时包含检测、分割、姿态等)? 然而,用户的问题中只提到目标检测,并且当前代码中只处理了检测框(没有分割和姿态)。因此,我们需要明确: 1. 我们使用的模型是什么?是纯检测模型,还是带有其他任务(如分割、姿态)的模型? 2. 当前代码中,DET_NUM=6,这显然只适用于单类别(4坐标+1置信度+1类别分数)或者多类别但只取最大类别分数的情况? 观察代码中的`post_process`函数: pred = np.reshape(output[1:], (-1, num_values_per_detection))[:num, :] 然后,在`non_max_suppression`函数中,我们只使用了前6个值(x,y,w,h,conf,class_id)? 因为boxes = prediction[prediction[:, 4] >= conf_thres] 中,第4个是置信度。 实际上,在代码中,每个检测框的参数包括: [x, y, w, h, conf, class_id, ... (其他参数,如分割、姿态等)] 因此,对于多类别检测,我们需要改变的是: - 模型输出中,每个检测框的类别分数部分应该是多个分数(每个类别一个分数),而不是一个类别id。 但是,在代码中,我们注意到在`post_process`函数中,我们只取每个检测框的前DET_NUM(6)个参数。这6个参数中,第5个(索引4)是置信度,第6个(索引5)是类别id吗? 然而,在标准的多类别YOLOv8中,每个检测框的输出应该是: [x, y, w, h, obj_conf, class_conf_0, class_conf_1, ... , class_conf_n] 然后,总的置信度 = obj_conf * max(class_conf) ?而类别id是argmax(class_conf)。 因此,当前代码中DET_NUM=6,只能处理5个类别(因为4坐标+1个obj_conf+5个类别分数=10,但这里DET_NUM=6)?这显然不对。 重新审视:在代码中,我们定义: DET_NUM = 6 但实际在YOLOv8的TensorRT输出中,每个检测框的向量长度应该是:4(坐标)+ 1(obj_conf) + 类别数(class_conf)。因此,DET_NUM应该等于5+类别数。 那么,为什么这里DET_NUM=6?因为当前模型是单类别(drone)?所以类别数=1,那么总长度=4+1+1=6。 所以,要支持多类别,我们需要: 1. 确保模型是多类别模型(在训练时指定了多个类别)。 2. 修改代码中的DET_NUM,使其等于5+类别数(因为4坐标+1个obj_conf+类别数个类别分数)。 3. 修改后处理部分,正确解析类别分数。 但是,在代码中,我们注意到: num_values_per_detection = DET_NUM + SEG_NUM + POSE_NUM + OBB_NUM 因此,如果我们修改了DET_NUM,那么整个向量长度就变了。但是,在代码中,我们只使用了每个检测框的前DET_NUM个值(在`non_max_suppression`函数中,我们只取prediction[:, :DET_NUM]?并不是,我们直接取了整个prediction,但在非极大值抑制中只用了前6个值(通过boxes = prediction[prediction[:,4]>=conf_thres]))。 实际上,在`non_max_suppression`函数中,我们传入的是整个预测数组(每个检测框有num_values_per_detection个值),但在函数内部,我们只使用了前6个(即x,y,w,h,conf,class_id)?但是,在单类别情况下,第5个(索引4)是置信度,第6个(索引5)是类别id(只有0,因为只有一个类别)。 对于多类别,我们需要改变的是:在`non_max_suppression`函数中,我们不应该直接使用第5个(索引5)作为类别id,而应该从第5个位置开始(索引4是obj_conf,然后后面是类别分数)计算每个类别的分数,然后取最大值作为类别置信度,并得到类别id。 因此,我们需要重构后处理部分。 步骤: 1. 修改DET_NUM:根据类别数,DET_NUM = 5 + num_classes(因为4坐标+1个obj_conf+num_classes个类别分数)。 但是,注意:在模型导出时,这个值已经固定了。所以,我们应该根据实际模型来设置这个值。 2. 在`post_process`函数中,我们得到每个检测框的向量(长度为num_values_per_detection),然后我们只取前DET_NUM个值(即检测部分),然后我们需要解析这个向量,得到每个类别的分数。 3. 修改`non_max_suppression`函数,使其能够处理多类别。 具体修改如下: 首先,我们需要知道类别数。可以在代码开头定义一个全局变量: NUM_CLASSES = 80 # 例如,COCO有80个类别 然后,修改: DET_NUM = 5 + NUM_CLASSES # 4坐标 + 1个obj_conf + NUM_CLASSES个类别分数 注意:在YOLOv8的原始输出中,每个检测框的格式是: [x, y, w, h, obj_conf, class_conf_0, class_conf_1, ... , class_conf_{NUM_CLASSES-1}] 然后,在`non_max_suppression`函数中,我们需要做如下修改: - 首先,从每个检测框的向量中取出前DET_NUM个值,然后分离出坐标(前4个)、obj_conf(第5个)和类别分数(后面的NUM_CLASSES个)。 - 计算每个类别的置信度:conf = obj_conf * class_conf_i - 然后,我们保留那些最大类别置信度超过阈值的框,并记录其类别id和置信度。 但是,当前代码中,我们直接使用了prediction[:,4]作为置信度,这实际上只是obj_conf(没有乘以类别分数)。而且,prediction[:,5]作为类别id,这只有在单类别情况下正确(因为只有一个类别分数,所以类别id总是0)。 因此,我们需要重写`non_max_suppression`函数,使其能够处理多类别。 另外,注意在原始代码中,我们传入`non_max_suppression`函数的prediction参数是每个检测框的完整向量(包括检测、分割、姿态等),但我们只使用前DET_NUM个值(即检测部分)。所以,在函数内部,我们只处理检测部分。 修改后的`non_max_suppression`函数(多类别版本): 步骤: 1. 提取每个检测框的检测部分(前DET_NUM个值) 2. 分离坐标(0:4)、obj_conf(4:5)、类别分数(5:5+NUM_CLASSES) 3. 计算每个类别的置信度 = obj_conf * 类别分数(每个类别分别乘) 4. 找到每个框的最大置信度以及对应的类别id 5. 根据最大置信度进行初步筛选(大于conf_thres) 6. 然后,对每个类别分别进行NMS(或者使用多类别NMS) 但是,为了简单和效率,我们通常采用: - 先对每个类别进行循环,然后分别做NMS,最后合并。 - 或者,使用单次多类别NMS(如cv2.dnn.NMSBoxes支持多类别)。 然而,由于我们使用的是自己的后处理,我们可以采用以下方法: 1. 先创建一个空列表,用于存放所有保留的框。 2. 遍历每个类别: - 取出当前类别的置信度 - 筛选出大于阈值的框 - 对这些框进行NMS(使用同一类别内的框) - 将保留的框加入列表 3. 或者,我们也可以使用另一种常见做法:先找出每个框最大分数对应的类别,然后按照这个类别分组,再对每个类别做NMS。 但是,这样效率较低。另一种高效做法是:先选出每个框的最大分数,然后按照这个最大分数进行排序,然后进行跨类别的NMS(即不同类别的框也参与抑制,但通常不同类别的框不互相抑制?)—— 实际上,不同类别的框即使重叠也不应该被抑制,所以应该按类别分别进行NMS。 然而,在目标检测中,通常NMS是每个类别独立进行的。因此,我们需要按类别处理。 但是,由于我们的检测框数量可能很大,且类别较多,循环处理可能较慢。我们可以使用矩阵操作来避免循环,但这里为了清晰,我们使用循环每个类别的方式。 修改`non_max_suppression`函数: 注意:这个函数现在需要额外的参数`num_classes`,并且需要知道DET_NUM(即检测框向量的长度)?实际上,我们已经在函数内部使用了全局的NUM_CLASSES和DET_NUM。 但是,为了减少全局变量,我们可以将类别数作为参数传入。 由于修改较大,我们重新设计`non_max_suppression`函数: 输入: prediction: 一个数组,形状为[N, DET_NUM+SEG_NUM+...],但我们现在只关心前DET_NUM个值。 origin_h, origin_w: 原始图像尺寸 conf_thres: 置信度阈值 iou_thres: IOU阈值 num_classes: 类别数 输出: 一个数组,每行是[x1, y1, x2, y2, conf, class_id] 步骤: 1. 提取检测部分(前DET_NUM列) -> dets: [N, DET_NUM] 2. 分离:boxes = dets[:, :4] # [N,4] obj_conf = dets[:, 4] # [N] cls_scores = dets[:, 5:5+num_classes] # [N, num_classes] 3. 计算类别置信度:class_conf = obj_conf.reshape(-1,1) * cls_scores [N, num_classes] 4. 找到每个框的最大类别置信度:max_conf = np.max(class_conf, axis=1) [N] class_id = np.argmax(class_conf, axis=1) [N] 5. 初步筛选:保留max_conf > conf_thres的框索引 mask = max_conf > conf_thres boxes = boxes[mask] class_id = class_id[mask] max_conf = max_conf[mask] 6. 将坐标转换到原始图像(使用xywh2xyxy函数,但注意这个函数原本是针对单框向量设计的,现在boxes是多个框) 7. 对每个类别进行循环,进行NMS: 总保留框列表:keep_boxes = [] 对每个类别id c: 从当前类别的框中,选出所有类别id等于c的框(注意:我们上面已经按最大类别筛选,所以每个框的类别就是class_id) 然后,对当前类别的框进行NMS(使用IOU阈值) 将保留的框加入keep_boxes 8. 如果keep_boxes不为空,则合并所有类别的框,然后返回。 但是,这样实现可能会比较慢。另一种方法是:先按类别分组,然后对每个组分别进行NMS,最后合并。 然而,在原始代码中,我们只进行了单类别的NMS(因为当时只有单类别)。现在需要支持多类别,所以必须按类别分组处理。 修改后的`non_max_suppression`函数(多类别版本)如下: 注意:由于原始代码中,这个函数是在类的方法中,所以我们需要修改为类的方法。 但是,由于代码较长,我们只给出关键部分。 然而,考虑到时间,我们也可以采用另一种方式:使用OpenCV的NMSBoxes,它支持多类别。但注意,OpenCV的NMSBoxes需要每个框的坐标和置信度,并且需要按类别提供。 我们可以这样做: 1. 将每个框的坐标转换为xyxy 2. 创建一个列表,存放所有框的坐标(xyxy)和对应的置信度、类别id 3. 调用cv2.dnn.NMSBoxes进行多类别NMS(注意:它要求传入所有框的坐标和每个框的得分,以及类别信息?) 但是,cv2.dnn.NMSBoxes只支持单类别NMS(即每个框只有一个分数),它不能直接处理多类别。所以,我们需要将每个框按照其最大类别分数作为该框的分数,然后使用NMSBoxes进行抑制(这样会抑制不同类别但重叠的框吗?不会,因为NMSBoxes在抑制时并不考虑类别,它只根据框的坐标和分数来抑制。所以,不同类别的框即使重叠也不会被抑制。因此,我们可以将所有框放在一起,然后调用一次NMSBoxes。 具体步骤: 1. 将每个框的坐标转换为xyxy(在原始图像坐标上) 2. 计算每个框的最大类别分数(已经在上面的步骤4中计算) 3. 将所有框(跨类别)的xyxy坐标、最大类别分数、类别id收集起来 4. 使用NMSBoxes进行非极大值抑制(指定score_threshold=conf_thres, nms_threshold=iou_thres) 这样,NMSBoxes会返回保留框的索引。 然后,我们根据这些索引,取出保留的框、分数和类别id。 因此,我们可以这样修改: 在`non_max_suppression`函数中: ... 步骤1-4(得到boxes, max_conf, class_id)... # 步骤5:筛选 mask = max_conf > conf_thres boxes = boxes[mask] max_conf = max_conf[mask] class_id = class_id[mask] # 步骤6:将boxes从xywh转换到xyxy(注意:这里boxes是[N,4]格式,每行是[x,y,w,h]) # 注意:原始代码中有一个xywh2xyxy函数,但它处理的是单个框?实际上,我们修改为可以处理多个框。 # 修改xywh2xyxy函数,使其支持批量处理(现在输入是[N,4]) # 由于原始xywh2xyxy函数是针对一个框(一行)的,现在我们需要一个批量版本 # 定义一个新函数:xywh2xyxy_batch(batch_boxes) # 或者,我们直接在函数内部转换: # x1 = boxes[:,0] - boxes[:,2]/2 # y1 = boxes[:,1] - boxes[:,3]/2 # x2 = boxes[:,0] + boxes[:,2]/2 # y2 = boxes[:,1] + boxes[:,3]/2 # 但是注意:原始代码中xywh2xyxy函数考虑了预处理时的填充和缩放,所以我们需要用原始图像的尺寸进行转换。因此,我们仍然需要使用类中的xywh2xyxy函数,但需要修改为批量处理。 因此,我们修改类中的`xywh2xyxy`函数,使其支持批量处理。 原函数: def xywh2xyxy(self, origin_h, origin_w, x): # x: [center_x, center_y, w, h] ... 修改为: def xywh2xyxy(self, origin_h, origin_w, x): """ x: 一个框或者多个框,形状为[N,4](每行是center_x, center_y, w, h) 返回:转换后的xyxy坐标,形状[N,4] """ # 复制原始方法,但改为批量计算 y = np.zeros_like(x) r_w = self.input_w / origin_w r_h = self.input_h / origin_h if r_h > r_w: # 批量处理 y[:, 0] = x[:, 0] # center_x y[:, 2] = x[:, 2] # w y[:, 1] = x[:, 1] - (self.input_h - r_w * origin_h) / 2 y[:, 3] = x[:, 3] - (self.input_h - r_w * origin_h) / 2 y /= r_w else: y[:, 0] = x[:, 0] - (self.input_w - r_h * origin_w) / 2 y[:, 2] = x[:, 2] - (self.input_w - r_h * origin_w) / 2 y[:, 1] = x[:, 1] y[:, 3] = x[:, 3] y /= r_h # 将center_x, center_y, w, h 转换为 x1,y1,x2,y2 # 注意:y现在每行是[center_x, center_y, w, h](已经转换到原始图像尺寸) # 然后,我们转换为xyxy x1 = y[:, 0] - y[:, 2] / 2 y1 = y[:, 1] - y[:, 3] / 2 x2 = y[:, 0] + y[:, 2] / 2 y2 = y[:, 1] + y[:, 3] / 2 return np.stack([x1, y1, x2, y2], axis=1) 但是,这样修改会破坏原来的单框处理?所以,我们重新写一个批量处理的函数,或者修改原函数使其同时支持单个框和多个框。 为了简单,我们直接修改为批量处理。 注意:原函数中x的输入是[4]或[N,4],输出对应。 修改后的`xywh2xyxy`函数: def xywh2xyxy(self, origin_h, origin_w, x): if len(x.shape) == 1: x = x[None, :] # 变成[1,4] y = np.zeros_like(x) r_w = self.input_w / origin_w r_h = self.input_h / origin_h if r_h > r_w: y[:, 0] = x[:, 0] y[:, 2] = x[:, 2] y[:, 1] = x[:, 1] - (self.input_h - r_w * origin_h) / 2 y[:, 3] = x[:, 3] - (self.input_h - r_w * origin_h) / 2 y /= r_w else: y[:, 0] = x[:, 0] - (self.input_w - r_h * origin_w) / 2 y[:, 2] = x[:, 2] - (self.input_w - r_h * origin_w) / 2 y[:, 1] = x[:, 1] y[:, 3] = x[:, 3] y /= r_h # 转换为xyxy xyxy_boxes = np.zeros_like(y) xyxy_boxes[:, 0] = y[:, 0] - y[:, 2] / 2 # x1 = center_x - w/2 xyxy_boxes[:, 1] = y[:, 1] - y[:, 3] / 2 # y1 xyxy_boxes[:, 2] = y[:, 0] + y[:, 2] / 2 # x2 xyxy_boxes[:, 3] = y[:, 1] + y[:, 3] / 2 # y2 return xyxy_boxes 这样,我们就可以批量处理了。 回到`non_max_suppression`函数: # 转换坐标 xyxy_boxes = self.xywh2xyxy(origin_h, origin_w, boxes) # [N,4] 每行是x1,y1,x2,y2 # 现在,xyxy_boxes是原始图像坐标下的边界框 # 然后,我们使用OpenCV的NMSBoxes indices = cv2.dnn.NMSBoxes( bboxes=xyxy_boxes.tolist(), scores=max_conf.tolist(), score_threshold=conf_thres, nms_threshold=iou_thres, eta=1.0, top_k=200 ) # indices是一个一维数组,表示保留的框的索引 if len(indices) > 0: indices = indices.flatten() result_boxes = xyxy_boxes[indices] result_scores = max_conf[indices] result_classid = class_id[indices] else: result_boxes = np.array([]) result_scores = np.array([]) result_classid = np.array([]) # 合并结果,返回一个数组,每行是[x1,y1,x2,y2, conf, class_id] if len(result_boxes) > 0: result = np.concatenate([ result_boxes, result_scores[:, None], result_classid[:, None] ], axis=1) else: result = np.zeros((0,6)) return result 这样,我们就完成了多类别的NMS。 但是,注意:在原始代码中,`non_max_suppression`函数返回的是三个独立的数组(result_boxes, result_scores, result_classid)。现在,为了保持接口一致,我们仍然返回三个独立的数组(因为调用方是这么使用的)。 因此,我们可以这样返回: return result_boxes, result_scores, result_classid 但是,注意:在调用`non_max_suppression`的地方(在`post_process`函数中): result_boxes, result_scores, result_classid = self.non_max_suppression(...) 所以,我们修改`non_max_suppression`函数,让它返回三个独立的数组(即使没有检测框,返回空数组)。 修改后的`non_max_suppression`函数(多类别版)如下: def non_max_suppression(self, prediction, origin_h, origin_w, conf_thres=0.5, iou_thres=0.4): # prediction: [N, num_values_per_detection] 其中N是检测框数量 # 我们只取前DET_NUM个值(检测部分) dets = prediction[:, :DET_NUM] # [N, DET_NUM] # 分离 boxes = dets[:, :4] # [N,4] (x,y,w,h) obj_conf = dets[:, 4] # [N] cls_scores = dets[:, 5:5+NUM_CLASSES] # [N, NUM_CLASSES] # 计算类别置信度 class_conf = obj_conf[:, None] * cls_scores # [N, NUM_CLASSES] # 找到每个框的最大类别置信度及其类别id max_conf = np.max(class_conf, axis=1) # [N] class_id = np.argmax(class_conf, axis=1) # [N] # 初步筛选:保留大于置信度阈值的框 mask = max_conf > conf_thres boxes = boxes[mask] max_conf = max_conf[mask] class_id = class_id[mask] if len(boxes) == 0: return np.array([]), np.array([]), np.array([]) # 转换坐标到原始图像(xywh to xyxy for batch) xyxy_boxes = self.xywh2xyxy(origin_h, origin_w, boxes) # [N,4] (x1,y1,x2,y2) # 使用OpenCV的NMSBoxes # 注意:需要将坐标转换为整数?不需要,NMSBoxes支持浮点数 indices = cv2.dnn.NMSBoxes( bboxes=xyxy_boxes.tolist(), scores=max_conf.tolist(), score_threshold=conf_thres, # 这个参数在OpenCV中实际上不起作用,因为我们已经筛选过了,所以设为0 nms_threshold=iou_thres, eta=1.0, top_k=200 ) if len(indices) > 0: indices = indices.flatten() result_boxes = xyxy_boxes[indices] result_scores = max_conf[indices] result_classid = class_id[indices] else: result_boxes = np.array([]) result_scores = np.array([]) result_classid = np.array([]) return result_boxes, result_scores, result_classid 注意:在调用NMSBoxes时,score_threshold参数可以设为0,因为我们已经在前面筛选过了。或者,我们可以不提前筛选,而是让NMSBoxes来筛选,但这样需要传入所有框(包括低置信度的),效率低。所以,我们提前筛选。 但是,在NMSBoxes中,score_threshold参数是用于筛选的,所以我们可以将score_threshold设为conf_thres,然后去掉我们自己的筛选步骤。这样,我们就不需要提前筛选了。 因此,我们可以不进行提前筛选,而是将所有框(包括低于阈值的)传入,然后让NMSBoxes根据score_threshold进行筛选。 修改: # 去掉提前筛选的步骤,直接传入所有框(但注意:框的数量可能很多,所以效率问题?) # 转换坐标 xyxy_boxes = self.xywh2xyxy(origin_h, origin_w, boxes) # 这里的boxes是原始的所有框(没有经过筛选) # 然后调用NMSBoxes,设置score_threshold=conf_thres indices = cv2.dnn.NMSBoxes( bboxes=xyxy_boxes.tolist(), scores=max_conf.tolist(), # 每个框的最大类别分数 score_threshold=conf_thres, # 这里会过滤掉低于阈值的框 nms_threshold=iou_thres ) 这样,我们就不需要提前筛选了。 但是,注意:max_conf和class_id是每个框的最大类别分数和类别id,即使这个最大分数低于阈值,我们也计算了。所以,我们可以先计算,然后传入NMSBoxes,它会根据score_threshold过滤。 因此,修改后的函数: def non_max_suppression(self, prediction, origin_h, origin_w, conf_thres=0.5, iou_thres=0.4): dets = prediction[:, :DET_NUM] # [N, DET_NUM] boxes = dets[:, :4] # [N,4] obj_conf = dets[:, 4] # [N] cls_scores = dets[:, 5:5+NUM_CLASSES] # [N, NUM_CLASSES] class_conf = obj_conf[:, None] * cls_scores # [N, NUM_CLASSES] max_conf = np.max(class_conf, axis=1) # [N] class_id = np.argmax(class_conf, axis=1) # [N] # 转换坐标 xyxy_boxes = self.xywh2xyxy(origin_h, origin_w, boxes) # [N,4] # 使用NMSBoxes indices = cv2.dnn.NMSBoxes( xyxy_boxes.tolist(), max_conf.tolist(), conf_thres, iou_thres ) if len(indices) > 0: indices = indices.flatten() result_boxes = xyxy_boxes[indices] result_scores = max_conf[indices] result_classid = class_id[indices] else: result_boxes = np.array([]) result_scores = np.array([]) result_classid = np.array([]) return result_boxes, result_scores, result_classid 注意:在调用NMSBoxes时,我们传入的bboxes是列表(每个元素是一个框的四个坐标),scores是每个框的分数(最大类别分数),score_threshold是conf_thres,nms_threshold是iou_thres。 这样,我们就完成了多类别的支持。 最后,我们需要修改几个全局变量: NUM_CLASSES = 80 # 根据你的模型修改 DET_NUM = 5 + NUM_CLASSES # 4坐标+1个obj_conf+类别数 注意:SEG_NUM, POSE_NUM, OBB_NUM 可能需要根据模型调整。如果你的模型是纯检测模型(没有分割、姿态等),那么SEG_NUM和POSE_NUM应该为0。但是,在原始代码中,这些值被加在num_values_per_detection中。所以,如果你的模型输出中包含了这些额外的参数,那么num_values_per_detection = DET_NUM + SEG_NUM + POSE_NUM + OBB_NUM 应该等于模型输出中每个检测框的向量长度。 因此,请根据实际模型设置这些常量。 总结修改步骤: 1. 在代码开头,根据模型设置类别数:NUM_CLASSES = 80(根据你的模型修改) 2. 修改DET_NUM:DET_NUM = 5 + NUM_CLASSES 3. 修改xywh2xyxy函数,使其支持批量处理(如上述) 4. 修改non_max_suppression函数,使用上述的多类别处理方法(使用OpenCV的NMSBoxes) 5. 在post_process函数中,确保num_values_per_detection的计算正确(DET_NUM+SEG_NUM+...) 注意:如果你的模型没有分割和姿态等任务,那么SEG_NUM, POSE_NUM, OBB_NUM都应该设为0。 这样,代码就应该可以支持多类别检测了。 另外,在绘制框时,我们使用: label="{}:{:.2f}".format(categories[int(result_classid[j])], result_scores[j]) 其中,categories是类别名称列表(现在应该是多类别的列表)。所以,你需要将categories修改为包含所有类别名称的列表。 例如: categories = ["class0", "class1", ...] # 你的类别名称 在代码的最后,我们初始化categories时,只定义了["drone"],现在需要修改为所有类别。 最后,请注意:模型本身必须是多类别模型。如果模型是单类别训练的,那么即使我们修改了代码,也无法检测多类别。 因此,确保你使用的TensorRT引擎文件是多类别模型导出的。 修改后的代码结构如下(仅显示修改部分):</think>要修改 YOLOv8 TensorRT 推理代码以支持多类别检测,需要调整以下几个关键部分。以下是详细的修改步骤和代码实现: ### 1. **修改类别定义和输出维度** ```python # 修改类别数量(根据实际模型调整) NUM_CLASSES = 80 # 例如 COCO 数据集有 80 个类别 DET_NUM = 5 + NUM_CLASSES # 4坐标 + 1置信度 + 类别数 POSE_NUM = 17 * 3 SEG_NUM = 32 OBB_NUM = 1 # 更新类别标签(示例使用 COCO 类别) categories = ["person", "bicycle", "car", ... , "toothbrush"] # 完整 80 个类别 ``` ### 2. **重构后处理函数** 修改 `post_process` 和 `non_max_suppression` 函数以支持多类别: ```python def post_process(self, output, origin_h, origin_w): num_values_per_detection = DET_NUM + SEG_NUM + POSE_NUM + OBB_NUM num = int(output[0]) pred = np.reshape(output[1:], (-1, num_values_per_detection))[:num, :] # 多类别处理 boxes = self.multi_class_nms(pred, origin_h, origin_w, conf_thres=CONF_THRESH, iou_thres=IOU_THRESHOLD) result_boxes = boxes[:, :4] if len(boxes) else np.array([]) result_scores = boxes[:, 4] if len(boxes) else np.array([]) result_classid = boxes[:, 5] if len(boxes) else np.array([]) return result_boxes, result_scores, result_classid def multi_class_nms(self, prediction, origin_h, origin_w, conf_thres=0.5, iou_thres=0.4): """ 多类别非极大值抑制处理 """ # 提取检测部分 [x, y, w, h, obj_conf, class_conf_0, ..., class_conf_n] dets = prediction[:, :DET_NUM] boxes = dets[:, :4] # [N, 4] obj_conf = dets[:, 4] # [N] cls_conf = dets[:, 5:5+NUM_CLASSES] # [N, NUM_CLASSES] # 计算类别置信度 = obj_conf * class_conf class_conf = obj_conf[:, None] * cls_conf # [N, NUM_CLASSES] # 找到每个框的最大类别分数和对应类别ID max_conf = np.max(class_conf, axis=1) # [N] class_id = np.argmax(class_conf, axis=1) # [N] # 转换坐标到原始图像尺寸 xyxy_boxes = self.xywh2xyxy(origin_h, origin_w, boxes) # [N, 4] # 使用 OpenCV 的多类别 NMS nms_boxes = [] for cls_idx in range(NUM_CLASSES): cls_mask = (class_id == cls_idx) & (max_conf > conf_thres) if not np.any(cls_mask): continue cls_boxes = xyxy_boxes[cls_mask] cls_scores = max_conf[cls_mask] # 执行 NMS indices = cv2.dnn.NMSBoxes( cls_boxes.tolist(), cls_scores.tolist(), conf_thres, iou_thres ) if len(indices) > 0: indices = indices.flatten() for idx in indices: box = cls_boxes[idx] score = cls_scores[idx] nms_boxes.append([*box, score, cls_idx]) return np.array(nms_boxes) if nms_boxes else np.zeros((0, 6)) ``` ### 3. **修改坐标转换函数** ```python def xywh2xyxy(self, origin_h, origin_w, x): """ 支持批量处理的坐标转换 x: [N, 4] 格式的数组,每行是 [center_x, center_y, w, h] 返回: [N, 4] 格式的 [x1, y1, x2, y2] """ if len(x.shape) == 1: x = x[None, :] # 单个框转为批量处理 y = np.zeros_like(x) r_w = self.input_w / origin_w r_h = self.input_h / origin_h if r_h > r_w: y[:, 0] = x[:, 0] y[:, 2] = x[:, 2] y[:, 1] = x[:, 1] - (self.input_h - r_w * origin_h) / 2 y[:, 3] = x[:, 3] - (self.input_h - r_w * origin_h) / 2 y /= r_w else: y[:, 0] = x[:, 0] - (self.input_w - r_h * origin_w) / 2 y[:, 2] = x[:, 2] - (self.input_w - r_h * origin_w) / 2 y[:, 1] = x[:, 1] y[:, 3] = y[:, 1] # 保持 y 坐标不变 y /= r_h # 转换为 xyxy 格式 xyxy_boxes = np.zeros_like(y) xyxy_boxes[:, 0] = y[:, 0] - y[:, 2] / 2 # x1 xyxy_boxes[:, 1] = y[:, 1] - y[:, 3] / 2 # y1 xyxy_boxes[:, 2] = y[:, 0] + y[:, 2] / 2 # x2 xyxy_boxes[:, 3] = y[:, 1] + y[:, 3] / 2 # y2 return xyxy_boxes ``` ### 4. **确保模型输出匹配** 在导出模型时,需要确认输出层包含多类别信息: ```bash # 导出 ONNX 模型时指定类别数 yolo mode=export model=yolov8n.pt format=onnx opset=12 ``` ### 5. **可视化多类别结果** 修改绘图函数以显示不同类别: ```python # 在 infer 方法中 for j in range(len(result_boxes)): box = result_boxes[j] cls_id = int(result_classid[j]) label = f"{categories[cls_id]}:{result_scores[j]:.2f}" # 为不同类别生成不同颜色 color = [int(c) for c in COLORS[cls_id % len(COLORS)]] plot_one_box(box, batch_image_raw[i], color=color, label=label) # 定义颜色常量 COLORS = [ (255, 0, 0), (0, 255, 0), (0, 0, 255), (255, 255, 0), (255, 0, 255), (0, 255, 255) ] ``` ### 关键修改说明: 1. **输出维度调整**: - `DET_NUM = 5 + NUM_CLASSES` 包含坐标、置信度和类别分数 - 解决了单类别检测中固定 `DET_NUM=6` 的限制 2. **多类别 NMS**: - 按类别分组处理,避免不同类别间的错误抑制 - 使用 `cv2.dnn.NMSBoxes` 替代原单类别实现 3. **批量坐标转换**: - 修改 `xywh2xyxy` 支持批量处理 - 正确处理不同长宽比的图像填充 4. **模型一致性**: - 确保导出的 ONNX/TensorRT 模型包含多类别输出 - 验证输出维度匹配 `(4 + 1 + NUM_CLASSES)` > **注意**:如果模型包含分割(SEG_NUM)或姿态估计(POSE_NUM)任务,需要相应调整 `num_values_per_detection` 的计算[^2]。 ### 性能优化建议: 1. **类别过滤优化**: ```python # 提前过滤低置信度框,减少 NMS 计算量 conf_mask = max_conf > conf_thres * 0.5 # 宽松阈值 boxes = boxes[conf_mask] cls_conf = cls_conf[conf_mask] ``` 2. **并行处理**: ```python # 使用多线程处理不同类别 from concurrent.futures import ThreadPoolExecutor with ThreadPoolExecutor() as executor: results = list(executor.map(process_class, range(NUM_CLASSES))) ``` 3. **INT8 量化**: ```bash # 导出时启用 INT8 量化 trtexec --onnx=yolov8n.onnx --saveEngine=yolov8n_int8.engine --int8 ``` ### 验证方法: 1. 检查输出张量形状: ```python print(output.shape) # 应为 [batch, 4+1+NUM_CLASSES, num_boxes] ``` 2. 测试不同类别的检测结果 3. 验证 mAP 指标是否与原始模型一致 > 修改后,模型可以同时检测多个类别,如 "car"、"person"、"drone" 等,并在图像中用不同颜色标注[^1][^5]。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值