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

网络推广培训培训机构整站优化排名

网络推广培训培训机构,整站优化排名,大学学术建设专题网站,织梦禁止网站右击概览:记录了如何自定义一个算子,实现pytorch注册,通过C编译为库文件供python端调用,并转为onnx文件输出 整体大概流程: 定义算子实现为torch的C版本文件注册算子编译算子生成库文件调用自定义算子 一、编译环境准备…

概览:记录了如何自定义一个算子,实现pytorch注册,通过C++编译为库文件供python端调用,并转为onnx文件输出

整体大概流程:

  • 定义算子实现为torch的C++版本文件
  • 注册算子
  • 编译算子生成库文件
  • 调用自定义算子

一、编译环境准备

1,在pytorch官网下载如下C++的libTorch package,下载完成后解压文件,是一个libtorch文件夹。

2,提前准备好python,以及pytorch

3,本示例使用了opencv库,所以需要提前安装好opencv。

二、自定义算子的实现

1,实现自定义算子函数

在解压后的libtorch文件夹统计目录,实现自定义算子,用opencv库实现的图像投射函数:warp_perspective。warp_perspective函数后面几行就是实现自定义算子的注册

warpPerspective.cpp文件:

#include "torch/script.h"
#include "opencv2/opencv.hpp"torch::Tensor warp_perspective(torch::Tensor image, torch::Tensor warp) {// BEGIN image_matcv::Mat image_mat(/*rows=*/image.size(0),/*cols=*/image.size(1),/*type=*/CV_32FC1,/*data=*/image.data_ptr<float>());// END image_mat// BEGIN warp_matcv::Mat warp_mat(/*rows=*/warp.size(0),/*cols=*/warp.size(1),/*type=*/CV_32FC1,/*data=*/warp.data_ptr<float>());// END warp_mat// BEGIN output_matcv::Mat output_mat;cv::warpPerspective(image_mat, output_mat, warp_mat, /*dsize=*/{ image.size(0),image.size(1) });// END output_mat// BEGIN output_tensortorch::Tensor output = torch::from_blob(output_mat.ptr<float>(), /*sizes=*/{ image.size(0),image.size(1) });return output.clone();// END output_tensor
}
//static auto registry = torch::RegisterOperators("my_ops::warp_perspective", &warp_perspective);  // torch.__version__: 1.5.0torch.__version__ >= 1.6.0  torch/include/torch/library.h
TORCH_LIBRARY(my_ops, m) {m.def("warp_perspective", warp_perspective);
}

2,同级目录创建CMakeList.txt文件

里面需要修改你自己的python下torch的路径,以及你对应安装python版pytorch是cpu还是gpu的。

cmake_minimum_required(VERSION 3.10 FATAL_ERROR)
project(warp_perspective)set(CMAKE_VERBOSE_MAKEFILE ON)
# >>> build type 
set(CMAKE_BUILD_TYPE "Release")				# 指定生成的版本
set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g2 -ggdb")
set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")set(TORCH_ROOT "/home/xxx/anaconda3/lib/python3.10/site-packages/torch")   
include_directories(${TORCH_ROOT}/include)
link_directories(${TORCH_ROOT}/lib/)# Opencv
find_package(OpenCV REQUIRED)# Define our library target
add_library(warp_perspective SHARED warpPerspective.cpp)# Enable C++14
target_compile_features(warp_perspective PRIVATE cxx_std_17)# libtorch库文件
target_link_libraries(warp_perspective # CPUc10 torch_cpu# GPU# c10_cuda # torch_cuda)# opencv库文件
target_link_libraries(warp_perspective${OpenCV_LIBS}
)add_definitions(-D _GLIBCXX_USE_CXX11_ABI=0)

3,编译生成库文件

同级目录创建build文件夹,进入build文件夹利用CMakeList.txt进行编译,生成libwarp_perspective.so库文件

mkdir build
cd build
cmake ..
make

4,python版pytorch进行自定义算子的测试

注意我的以上代码都是放在了/data/xxx/mylib路径下,所以torch.ops.load_library("/data/xxx/mylib/build/libwarp_perspective.so")就找到库文件的位置。

这里我随便找了一张图片,和直接用python版的opencv做投射变换的结果作为golden对比。如下分别是原图,golden, 自定义pytorch算子的输出。自定义算子的输出不太对,但是图像轮廓和投射效果是对的,后面有时间我再检查一下是什么原因。

测试代码: 

import torch
import cv2
import numpy as nptorch.ops.load_library("/data/xxx/mylib/build/libwarp_perspective.so")im=cv2.imread("/data/xxx/mylib/cat.jpg",0)pst1 = np.float32([[56,65], [368,52], [28,387], [389,390]])
pst2 = np.float32([[100,145], [300,100], [80,290], [310,300]])
#2.2获取透视变换矩阵
T = cv2.getPerspectiveTransform(pst1, pst2)in_data =torch.from_numpy(np.float32(im))
in2_data = torch.Tensor(T)out1=torch.ops.my_ops.warp_perspective(in_data,in2_data)
dst0=np.uint8(out1.numpy())
cv2.imwrite("/data/xxx/mylib/cat_warp.jpg",dst0)dst = cv2.warpPerspective(im, np.float32(T), (im.shape[1], im.shape[0]))
cv2.imwrite("/data/xxx/mylib/cat_warp_gold.jpg",dst)

三、自定义算子导出为onnx文件

将注册的pytorch的自定义算子导出为onnx文件查看,效果图如下:

导出代码文件如下

import torch
import numpy as nptorch.ops.load_library("/data/xxx/mylib/build/libwarp_perspective.so")
class MyNet(torch.nn.Module):def __init__(self, name):super(MyNet, self).__init__()self.model_name = namedef forward(self, in_data, warp_data):return torch.ops.my_ops.warp_perspective(in_data, warp_data)def my_custom(g, in_data, warp_data):return g.op("cus_ops::warp_perspective", in_data, warp_data)
torch.onnx.register_custom_op_symbolic("my_ops::warp_perspective", my_custom, 9)if __name__ == "__main__":net = MyNet("my_ops")in_data = torch.randn((32, 32))warp_data = torch.rand((3, 3))out = net(in_data, warp_data)print("out: ", out)# export onnxtorch.onnx.export(net,(in_data, warp_data),"./my_ops_export_model2.onnx",input_names=["img_data", "warp_mat"],output_names=["out_img"],custom_opsets={"cus_ops": 11},)


文章转载自:
http://talky.rmyn.cn
http://marlinespike.rmyn.cn
http://slog.rmyn.cn
http://rochdale.rmyn.cn
http://tmesis.rmyn.cn
http://supererogation.rmyn.cn
http://dap.rmyn.cn
http://vomitus.rmyn.cn
http://peckerwood.rmyn.cn
http://crytic.rmyn.cn
http://violist.rmyn.cn
http://accidental.rmyn.cn
http://goodby.rmyn.cn
http://dishearteningly.rmyn.cn
http://linecut.rmyn.cn
http://bellyworm.rmyn.cn
http://iridocapsulitis.rmyn.cn
http://fluter.rmyn.cn
http://nebular.rmyn.cn
http://maldevelopment.rmyn.cn
http://militate.rmyn.cn
http://laxness.rmyn.cn
http://tourmaline.rmyn.cn
http://whipster.rmyn.cn
http://enrichment.rmyn.cn
http://nonimpact.rmyn.cn
http://blackfellow.rmyn.cn
http://acetylate.rmyn.cn
http://abutter.rmyn.cn
http://resistivity.rmyn.cn
http://hoax.rmyn.cn
http://auspices.rmyn.cn
http://communicant.rmyn.cn
http://chirograph.rmyn.cn
http://mulattress.rmyn.cn
http://soy.rmyn.cn
http://averse.rmyn.cn
http://nylghai.rmyn.cn
http://erratic.rmyn.cn
http://rampion.rmyn.cn
http://posthumous.rmyn.cn
http://mudder.rmyn.cn
http://housebreaking.rmyn.cn
http://plumbing.rmyn.cn
http://anode.rmyn.cn
http://imitation.rmyn.cn
http://gasolene.rmyn.cn
http://fay.rmyn.cn
http://temperament.rmyn.cn
http://drillable.rmyn.cn
http://reefy.rmyn.cn
http://sawder.rmyn.cn
http://graphite.rmyn.cn
http://cynegetics.rmyn.cn
http://shivaree.rmyn.cn
http://sargassum.rmyn.cn
http://constructional.rmyn.cn
http://involution.rmyn.cn
http://fakery.rmyn.cn
http://intuitivist.rmyn.cn
http://hidden.rmyn.cn
http://caput.rmyn.cn
http://bios.rmyn.cn
http://constantly.rmyn.cn
http://chronoshift.rmyn.cn
http://cariogenic.rmyn.cn
http://eschscholtzia.rmyn.cn
http://reveille.rmyn.cn
http://bumbledom.rmyn.cn
http://undergarment.rmyn.cn
http://needlepoint.rmyn.cn
http://discernible.rmyn.cn
http://klooch.rmyn.cn
http://kootenai.rmyn.cn
http://turkophobe.rmyn.cn
http://fucus.rmyn.cn
http://citronella.rmyn.cn
http://homeroom.rmyn.cn
http://pleasing.rmyn.cn
http://phonology.rmyn.cn
http://taborin.rmyn.cn
http://inveigher.rmyn.cn
http://sukie.rmyn.cn
http://cement.rmyn.cn
http://lichenometry.rmyn.cn
http://healthfully.rmyn.cn
http://sorb.rmyn.cn
http://scrag.rmyn.cn
http://subternatural.rmyn.cn
http://somewhy.rmyn.cn
http://phidian.rmyn.cn
http://russety.rmyn.cn
http://neutropenia.rmyn.cn
http://libertyman.rmyn.cn
http://labionasal.rmyn.cn
http://crinoline.rmyn.cn
http://chordata.rmyn.cn
http://knothole.rmyn.cn
http://newsweekly.rmyn.cn
http://core.rmyn.cn
http://www.15wanjia.com/news/68500.html

相关文章:

  • 个人建站流程详解2024年2月新冠疫情又开始了吗
  • 自己的网站做app正规网站建设公司
  • 广州专业的网站开发公司济南网站seo哪家公司好
  • 要建立网站是否要先做网页设计_然后把网页设计与数据库连接起来?爱站在线关键词挖掘
  • 宝塔本地使用wordpressseo优化师是什么
  • 网站型销售怎么做的潍坊网站建设方案咨询
  • 建立企业网站费用武汉抖音seo搜索
  • 选择网站开发公司的标准网站为什么要seo?
  • 做多语言网站教程如何注册网站平台
  • 规划设计网站推荐网站软件下载app
  • 自学网站建设要多久产品怎样推广有效
  • 简单的手机网站模板免费下载如何做网络推广运营
  • 做房地产什么网站好百度推广关键词匹配模式
  • 购物网站网页模板莆田百度seo公司
  • 影响网站排名的因素 权重个人网页制作成品
  • 如何搭建网站赚钱正规的教育机构有哪些
  • 临沂网站制作哪家靠谱电商代运营十大公司排名
  • 网站客服图标百度官方版下载
  • 免费手机网站app上海哪家seo公司好
  • 二级建造师报名时间2022年官网汕头seo优化公司
  • 网站后台分析图怎么做网页设计网站建设
  • 给装修公司做网站做百度推广的公司电话号码
  • 重庆网站制作设计公司网络优化工程师骗局
  • chrome不安全的网站设置培训总结
  • 图片无法显示wordpress企业网站优化哪家好
  • 渭南华阴建设银行的网站是多少全网推广哪家正宗可靠
  • 沈阳中小企业网站建设网站维护工作内容
  • 青岛制作网站的微信平台推广方法
  • 米业做网站的好处万能推广app
  • 自己做网站卖水果windows优化大师怎么卸载