当前位置: 首页 > news >正文

广东的网站建设9377霸主传奇网页版

广东的网站建设,9377霸主传奇网页版,静态网站建设要学什么,wordpress微博登陆插件文章目录 1从pytorch导出pt文件2下载并配置libtorch3推理4结果#xff1a;时间对比#xff1a;推理结果#xff1a; 参考 以deeplabv3plus为例讲解怎么利用libtorch部署在c上模型。关于libtorch和pt文件请参考我之前的博客。 1从pytorch导出pt文件 if __name__ __main__: … 文章目录 1从pytorch导出pt文件2下载并配置libtorch3推理4结果时间对比推理结果 参考 以deeplabv3plus为例讲解怎么利用libtorch部署在c上模型。关于libtorch和pt文件请参考我之前的博客。 1从pytorch导出pt文件 if __name__ __main__: # 读取模型pth文件model_path rF:\dataset\CoverSegData_train_result\deeplab-resnet-20250606\model_best.pth.tarif not os.path.exists(model_path):raise FileNotFoundError(fModel file {model_path} does not exist.)model DeepLab(num_classes2, backboneresnet, output_stride16, sync_bnFalse, freeze_bnFalse)checkpoint torch.load(model_path, weights_onlyFalse)model.load_state_dict(checkpoint[state_dict])# model.cuda() # 将模型移动到GPUmodel.eval() # 设置模型为评估模式# 导出为torchscript格式dumpy torch.randn(1, 3, 1024, 1024) # 假设输入是1张1024x1024的RGB图像# dumpy dumpy.cuda() # 将输入数据移动到GPU# 使用torch.jit.trace进行模型跟踪trace_model torch.jit.trace(model, dumpy) export_path rF:\dataset\CoverSegData_train_result\deeplab-resnet-20250606\deeplab_resnet_exported.pttrace_model.save(export_path)print(fModel exported to {export_path})这里使用了trace模式什么是trace和script模式参考之前的博客。注意一点无论是否需要在gpu上部署这里都不需要将模型和数据移动到gpu上我注释的内容我亲测过速度没有差异。2下载并配置libtorch 从官网下载getstart页面下载这里有些需要注意的地方 1、如果你想在cpu上推理选择cpu版本 2、选择gpu版本既可以在cpu上推理也可以在gpu上推理 3、选择的libtorchcuda版本要和训练时候的pytorchcuda版本相同.如果训练的时候是高版本的pytorch、cuda而部署的时候选择低版本的libtorch可能会有问题。 下载的时候选择release版本下载之后解压得到libtorch动态库。打开vs2022新建控制台文件切换到release-x64然后打开属性以下是如何在vs添加动态库并调用动态库的过程网上很多教程 配置属性–常规中修改c版本c17 在C±常规–包含目录中添加 libtorch_dir是解压之后的文件夹 libtorch_dir/include libtorch_dir/include/torch/csrc/api/include链接器–常规–库目录添加 libtorch_dir/lib链接器–输入–附加依赖项添加 libtorch_dir\lib\*.lib;调试–工作目录中添加 libtorch_dir/lib属性 -- 链接器 -- 命令行 -- 其他选项”中添加 /INCLUDE:?warp_sizecudaatYAHXZ3推理 下面就是cpu和gpu推理代码 #include torch/script.h #includetorch/cuda.h #include opencv2/opencv.hpp #include iostream #include chrono #include filesystemnamespace fs std::filesystem;// 图像预处理函数 torch::Tensor preprocess(cv::Mat image) {// 转换BGR到RGBcv::cvtColor(image, image, cv::COLOR_BGR2RGB);// 调整尺寸// cv::resize(image, image, cv::Size(resize_width, resize_height));// 转换为Tensorauto tensor torch::from_blob(image.data,{ image.rows, image.cols, 3 },torch::kByte);// 转换为CHW格式并归一化到[0,1]tensor tensor.permute({ 2, 0, 1 }) // HWC - CHW.to(torch::kFloat32) // 转换为float.div(255); // 归一化到[0,1]// 手动实现ImageNet标准化torch::Tensor mean torch::tensor({ 0.485, 0.456, 0.406 }).view({ 3, 1, 1 });torch::Tensor std torch::tensor({ 0.229, 0.224, 0.225 }).view({ 3, 1, 1 });tensor (tensor - mean) / std;return tensor.unsqueeze(0); // 添加batch维度 }// 创建PASCAL VOC颜色映射表 std::vectorcv::Vec3b get_pascal_voc_colormap() {std::vectorcv::Vec3b colormap(256);// PASCAL VOC标准21类颜色映射colormap[0] cv::Vec3b(0, 0, 0); // 背景 - 黑色colormap[1] cv::Vec3b(128, 0, 0); // 飞机colormap[2] cv::Vec3b(0, 128, 0); // 自行车colormap[3] cv::Vec3b(128, 128, 0); // 鸟colormap[4] cv::Vec3b(0, 0, 128); // 船colormap[5] cv::Vec3b(128, 0, 128); // 瓶子colormap[6] cv::Vec3b(0, 128, 128); // 公交车colormap[7] cv::Vec3b(128, 128, 128); // 汽车colormap[8] cv::Vec3b(64, 0, 0); // 猫colormap[9] cv::Vec3b(192, 0, 0); // 椅子colormap[10] cv::Vec3b(64, 128, 0); // 牛colormap[11] cv::Vec3b(192, 128, 0); // 餐桌colormap[12] cv::Vec3b(64, 0, 128); // 狗colormap[13] cv::Vec3b(192, 0, 128); // 马colormap[14] cv::Vec3b(64, 128, 128); // 摩托车colormap[15] cv::Vec3b(192, 128, 128); // 人colormap[16] cv::Vec3b(0, 64, 0); // 盆栽colormap[17] cv::Vec3b(128, 64, 0); // 羊colormap[18] cv::Vec3b(0, 192, 0); // 沙发colormap[19] cv::Vec3b(128, 192, 0); // 火车colormap[20] cv::Vec3b(0, 64, 128); // 显示器/电视// 为其他可能的类别生成随机颜色for (int i 21; i 256; i) {colormap[i] cv::Vec3b(rand() % 256, rand() % 256, rand() % 256);}return colormap; }// 应用颜色映射到分割结果 cv::Mat apply_colormap(const cv::Mat segmentation, const std::vectorcv::Vec3b colormap) {cv::Mat color_result(segmentation.size(), CV_8UC3);for (int y 0; y segmentation.rows; y) {for (int x 0; x segmentation.cols; x) {int class_idx segmentation.atuchar(y, x);color_result.atcv::Vec3b(y, x) colormap[class_idx];}}return color_result; }// 保存分割结果 void save_segmentation_results(const cv::Mat original_image,const cv::Mat segmentation,const std::vectorcv::Vec3b colormap,const fs::path output_dir,const std::string filename ) {// 确保输出目录存在fs::create_directories(output_dir);// 保存原始图像fs::path orig_path output_dir / original;fs::create_directories(orig_path);cv::imwrite((orig_path / filename).string(), original_image);// 保存原始分割结果类别索引fs::path seg_path output_dir / segmentation;fs::create_directories(seg_path);cv::imwrite((seg_path / filename).string(), segmentation);// 应用颜色映射并保存彩色分割结果cv::Mat color_seg apply_colormap(segmentation, colormap);fs::path color_path output_dir / color_segmentation;fs::create_directories(color_path);cv::imwrite((color_path / filename).string(), color_seg);// 创建并保存叠加在原始图像上的分割结果cv::Mat overlay;cv::addWeighted(original_image, 0.7, color_seg, 0.3, 0, overlay);fs::path overlay_path output_dir / overlay;fs::create_directories(overlay_path);cv::imwrite((overlay_path / filename).string(), overlay); }// 强制CUDA同步的通用方法 //void cuda_synchronize(torch::Device device) { // if (!device.is_cuda()) return; // // try { // // 方法1: 使用item()强制同步 // auto dummy torch::zeros({ 1 }, torch::TensorOptions().device(device)); // dummy.item(); // } // catch (...) { // try { // // 方法2: 使用CPU访问强制同步 // auto dummy torch::zeros({ 1 }, torch::TensorOptions().device(device)); // auto cpu_copy dummy.to(torch::kCPU); // } // catch (...) { // // 方法3: 使用简单计算 // auto dummy torch::ones({ 1 }, torch::TensorOptions().device(device)); // dummy dummy * 2; // dummy dummy.to(torch::kCPU); // } // } //}void run_inference(const std::string model_path,const std::string image_dir,const std::string output_dir,torch::Device device ) {// 加载模型torch::jit::script::Module module;try {module torch::jit::load(model_path);module.to(device);module.eval();std::cout Model loaded on: device std::endl;}catch (const c10::Error e) {std::cerr Error loading model: e.what() std::endl;return;}// 创建颜色映射表auto colormap get_pascal_voc_colormap();// 遍历目录中的图像for (const auto entry : fs::directory_iterator(image_dir)) {if (entry.path().extension() ! .jpg entry.path().extension() ! .jpeg entry.path().extension() ! .png) continue;// 读取原始图像用于保存cv::Mat original_image cv::imread(entry.path().string());if (original_image.empty()) {std::cerr Failed to load: entry.path() std::endl;continue;}// 复制用于预处理cv::Mat image original_image.clone();// 预处理auto input_tensor preprocess(image);input_tensor input_tensor.to(device);// 预热第一次运行可能较慢{torch::NoGradGuard no_grad;module.forward({ input_tensor });torch::cuda::synchronize();}// 计时开始auto start std::chrono::high_resolution_clock::now(); 推理torch::Tensor output;{torch::NoGradGuard no_grad;output module.forward({ input_tensor }).toTensor();torch::cuda::synchronize();}// 计时结束auto end std::chrono::high_resolution_clock::now();auto duration std::chrono::duration_caststd::chrono::milliseconds(end - start);std::cout entry.path().filename() inference time: duration.count() ms std::endl;// 处理分割结果 --------------------------------------------// 获取预测类别 (argmax)torch::Tensor preds output.argmax(1).squeeze(0); // [H, W]// 转换为CPUpreds preds.to(torch::kCPU).to(torch::kUInt8);// 转换为OpenCV Matcv::Mat segmentation(preds.size(0), preds.size(1), CV_8UC1);std::memcpy(segmentation.data, preds.data_ptr(), preds.numel() * sizeof(uchar));// 将分割结果调整回原始图像尺寸cv::Mat segmentation_resized;cv::resize(segmentation, segmentation_resized, original_image.size(),0, 0, cv::INTER_NEAREST);// 保存结果save_segmentation_results(original_image,segmentation_resized,colormap,fs::path(output_dir) / device.str(),entry.path().filename().string());} }int main() {输出 “cuda::is_available(): 0”显卡未调用起来std::cout cuda::is_available(): torch::cuda::is_available() std::endl;const std::string model_path F:\\dataset\\CoverSegData_train_result\\deeplab-resnet-20250606\\deeplab_resnet_exported.pt;const std::string image_dir F:\\dataset\\test;const std::string output_dir F:\\dataset\\test_results\\libtorch;// 创建主输出目录fs::create_directories(output_dir);// CPU推理测试std::cout \n CPU Inference std::endl;run_inference(model_path, image_dir, output_dir, torch::kCPU);// GPU推理测试 (如果可用)if (torch::cuda::is_available()) {std::cout \n GPU Inference std::endl;run_inference(model_path, image_dir, output_dir, torch::kCUDA);}else {std::cout CUDA not available. Skipping GPU inference. std::endl;}return 0; }4结果 时间对比 libtorch c推理用时 pytorchGPU推理时间 python版本onnxruntime推理时间 三者用时差不多 推理结果 libtorch c、pytorchGPU、onnxruntime libtorch c、pytorchGPU推理结果接近和onnxruntime推理结果差异有点大未找到原因。 参考 1 2 3
http://www.pierceye.com/news/580872/

相关文章:

  • 做导航网站有发展吗南京企业网站制作哪家好
  • 千万pv网站开发成本招聘网站数建设
  • 吐鲁番大型网站建设平台找客户去哪个平台
  • 权威网站有哪些给个网站可以在线
  • 优化网站专题北京海淀网站建设公司
  • 广州网站快速排名网站维护正常要多久
  • 建网站 选安全甘肃做网站价格
  • 微信公众管理平台有必要买优化大师会员吗
  • 家居网站建设素材腾讯adq广告平台
  • 响应式网站 图片居中门户网站样式
  • 潍坊网站排名推广北京建设高端网站的
  • 广东省住房和建设网站鹤壁市建设局网站
  • 北京网站建设报价明细手机网站网站开发流程
  • 三合一网站模板如何看网站是html几代做的
  • 如何设置自己的网站网站建设的常用词
  • 甘肃网站开发冷色调网站
  • 用cdr做网站设计尺寸要多少网站如何做实名验证码
  • 比较好的设计网站wordpress主题代码哪里
  • 专门学习网站建设读什么专业南山网站设计公司
  • 专业网站设计模板深圳最专业的高端网站建设
  • cc域名做网站怎么样无锡个人网站建设
  • 网站模板设计报价单小学网站建设设计方案
  • 二级域名网站怎么投广告wordpress自定义输入
  • su域名注册如何做360网站优化
  • 企业网站空间不足怎么办incapsula wordpress
  • 网站建设 镇江万达wordpress简
  • 做p2p理财网站开发公司销售人员竞聘演讲稿
  • 建设网站广州唯品会网站架构
  • 网站开发的国内外研究现状家庭装潢设计
  • 安卓从网站获取视频怎么做有没有做网站的公司