yolov8训练滑块验证码识别模型:第三章:yolov8模型推理【libtorch,opencv】

现在进行yolov8模型调用推理,我用的语言是c++,因为c++没有yolo库,所以得代码进行前推理和后推理。

注意:此推理是c++实现,若是python进行推理,可以参考我第二章的模型验证部分。

yolov8训练滑块验证码识别模型:第二章:制作数据集+训练+验证-CSDN博客https://blog.csdn.net/xin_yao_xin/article/details/151356717?spm=1001.2014.3001.5502

1、libtorch、opencv下载

torch官网:Get Started

中文版速度快:入门 - PyTorch 深度学习库

在仓库中是以前版本只有pytorch,没有libtorch,所以不用找了。C++的libtorch是向下兼容的,下载最新的即可(根据需求选择对应的Release版本或者debug版本)。

如果真想下载以前版本,就看下方链接:

Libtorch各版本下载_libtorch下载-CSDN博客

opencv下载

参考链接:Windows下 OpenCV 的下载安装教程(详细)_opencv下载-CSDN博客

2、环境配置

使用Visual Studio:

(16 封私信 / 38 条消息) 在Windows C++环境下使用Pytorch——Libtorch使用教程(Debug和Release版本环境配置详解) - 知乎

使用CMake:

cmake_minimum_required(VERSION 3.10 FATAL_ERROR)
project(TorchExample VERSION 1.0 LANGUAGES CXX)

# 设置C++标准
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

# 设置项目根目录(如果未定义)
if(NOT DEFINED PROJECT_ROOT)
    set(PROJECT_ROOT ${CMAKE_CURRENT_SOURCE_DIR})
endif()

# 指定Torch的CMake配置路径
set(Torch_DIR ${PROJECT_ROOT}/lib/libtorch/share/cmake/Torch)

# 查找Torch库
find_package(Torch REQUIRED)

# 显示Torch相关信息
message(STATUS "Found Torch: ${Torch_DIR}")
message(STATUS "Torch version: ${Torch_VERSION}")
message(STATUS "TORCH_LIBRARIES: ${TORCH_LIBRARIES}")

# 添加源文件
set(SOURCES
    src/main.cpp  # 主程序文件
    # 可以添加其他源文件
)

# 添加可执行文件
add_executable(torch_example ${SOURCES})

# 链接Torch库
target_link_libraries(torch_example PRIVATE ${TORCH_LIBRARIES})

# 设置包含目录
target_include_directories(torch_example PRIVATE
    ${PROJECT_ROOT}/include
    # 其他需要的包含目录
)

# MSVC特定配置
if(MSVC)
    # 设置MSVC运行时库
    set_property(TARGET torch_example PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
    # 禁用一些警告
    target_compile_definitions(torch_example PRIVATE _CRT_SECURE_NO_WARNINGS)
    # 添加编译选项
    target_compile_options(torch_example PRIVATE /W4)
else()
    # GCC/Clang编译选项
    target_compile_options(torch_example PRIVATE -Wall -Wextra -Wpedantic)
endif()

# 如果使用CUDA,显示相关信息
if(TORCH_CUDA_ARCH_LIST)
    message(STATUS "CUDA architecture list: ${TORCH_CUDA_ARCH_LIST}")
endif()

# 安装配置
install(TARGETS torch_example
    RUNTIME DESTINATION ${PROJECT_ROOT}/bin
    LIBRARY DESTINATION ${PROJECT_ROOT}/lib
    ARCHIVE DESTINATION ${PROJECT_ROOT}/lib
)
    

3、模型转换

libtorch调用模型需要torchscript格式,所以要转换一下。
yolov8根目录下创建文件pt_torchscript.py文件。

from ultralytics import YOLO

model = YOLO("./best.pt")
model.export(format="torchscript") #CPU,以torchscript导出,模型为:best.torchscript
#model.export(format="torchscript", device=0) #GPU

默认是cpu导出的,若在gpu上运行需device=0参数,具体去官网看:

YOLO11 模型导出为 TorchScript 以实现快速部署

导出参数

参数类型默认值描述
formatstr'torchscript'导出模型的目标格式,定义与各种部署环境的兼容性。
imgszint 或 tuple640模型输入的所需图像大小。 可以是正方形图像的整数或元组 (height, width) 用于指定特定维度。
dynamicboolFalse允许动态输入大小,从而增强了处理不同图像尺寸的灵活性。
optimizeboolFalse应用针对移动设备的优化,可能会减小模型大小并提高性能。
nmsboolFalse添加非极大值抑制 (NMS),这对于准确高效的检测后处理至关重要。
batchint1指定导出模型批处理推理大小或导出模型将并发处理的最大图像数量,在 predict 模式下。
devicestrNone指定导出设备:GPU (device=0),CPU(device=cpu),适用于 Apple 芯片的 MPS(device=mps)。

有关导出过程的更多详细信息,请访问Ultralytics 文档页面上的导出

4、推理代码

参考:ncdhz/Yolo-LibTorch: 一个 LibTorch 版本的 Yolo 封装库

这个项目是可以直接使用的,但比较繁琐。可以只要前后推理,写一个图像输入,然后调用其中api,其中Yolo.hYolo.cpp是前后推理代码,其中很多方法。

#include "Yolo.h"
#include <opencv2/opencv.hpp>
#include <iostream>
#include <windows.h>

int main() {
	// 新增:设置控制台为UTF-8编码
	SetConsoleOutputCP(CP_UTF8);  // 设置输出编码
	SetConsoleCP(CP_UTF8);        // 设置输入编码(可选)

	// -------------------------- 1. 初始化参数 --------------------------
	std::string modelPath = "yolov8n.torchscript";  // 你的Torch模型路径(.pt文件)
	std::string version = "v8";            // 模型版本("V6"或"V8",根据你的模型填写)
	//std::string device = "cuda:0";  
	std::string device = "cpu";  // 运行设备("cpu"或"cuda:0",GPU需配置CUDA)
	bool isHalf = false;                   // 是否使用半精度推理(GPU推荐true,CPU建议false)
	int inputHeight = 640;                 // 模型输入高度(YOLO通常为640)
	int inputWidth = 640;                  // 模型输入宽度(YOLO通常为640)
	float confThres = 0.25f;               // 置信度阈值(过滤低置信度框,如0.25)
	float iouThres = 0.45f;                // NMS的IOU阈值(过滤重叠框,如0.45)

	// -------------------------- 2. 加载YOLO模型 --------------------------
	try {
		// 创建Yolo对象,加载模型并初始化参数
		Yolo yolo(modelPath, version, device, isHalf, inputHeight, inputWidth, confThres, iouThres);


		// -------------------------- 3. 读取测试图片 --------------------------
		std::string imgPath = "bus.jpg";  // 你的测试图片路径
		cv::Mat img = cv::imread(imgPath);
		if (img.empty()) {
			std::cerr << "错误:无法读取图片 " << imgPath << std::endl;
			return -1;
		}

		// -------------------------- 4. 执行推理 --------------------------
		// 调用prediction方法,输入cv::Mat图片,返回检测结果(边界框+类别+置信度)
		std::vector<torch::Tensor> results = yolo.prediction(img);

		// 若有多张图片,可使用vector<cv::Mat>批量推理:
		// std::vector<cv::Mat> imgs = {img1, img2};
		// std::vector<torch::Tensor> results = yolo.prediction(imgs);

		// -------------------------- 5. 解析检测结果 --------------------------
		// results是一个vector,每个元素对应一张图片的检测结果
		// 单图推理时取results[0]
		torch::Tensor result = results[0];
		std::cout << "目标数: " << result.size(0) << std::endl;

		// 遍历每个检测框(result的每行对应一个目标)
		for (int i = 0; i < result.size(0); i++)
		{
			// 检测框坐标(x1, y1, x2, y2,左上角和右下角)
			float x1 = result[i][0].item().toFloat();
			float y1 = result[i][1].item().toFloat();
			float x2 = result[i][2].item().toFloat();
			float y2 = result[i][3].item().toFloat();

			// 置信度和类别ID
			float conf = result[i][4].item().toFloat();
			int classId = result[i][5].item().toInt();

			// 打印结果(可根据需要替换为你的类别名称映射)
			std::cout << "目标 " << i + 1 << ": "
				<< "坐标=(" << x1 << "," << y1 << "," << x2 << "," << y2 << "), "
				<< "置信度=" << conf << ", "
				<< "类别ID=" << classId << std::endl;
		}

		// -------------------------- 6. 可视化检测结果(可选) --------------------------
		// 绘制边界框和标签到原图
		cv::Mat resultImg = yolo.drawRectangle(img, result);  // 单图绘制

		// 显示结果(需OpenCV窗口支持)
		cv::imshow("YOLO Detection Result", resultImg);
		cv::waitKey(0);  // 按任意键关闭窗口

		// 保存结果图片
		cv::imwrite("result.jpg", resultImg);
		std::cout << "检测结果已保存至 result.jpg" << std::endl;

	}
	catch (const c10::Error& e) {
		// 捕获LibTorch相关错误(如模型加载失败、设备不支持)
		std::cerr << "libtorch error!!" << e.what() << std::endl;
		return -1;
	}
	catch (const std::exception& e) {
		// 捕获其他错误(如图片路径错误)
		std::cerr << "error: " << e.what() << std::endl;
		return -1;
	}

	return 0;
}

效果:

总结:

除了libtorch之外,还有很多部署方法;
例如:onnx、TensorRT、rknn、Ascend

参考链接:

总结|yolov5从训练到部署(2),yolov5部署看这一篇文章就够了_rknn yolov5-cls 部署-CSDN博客https://blog.csdn.net/qq_29676069/article/details/145625403?spm=1001.2014.3001.5502

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xin_yao_xin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值