pytorch使用sobel、laplace算子

在torch.nn.functional.conv2d()中使用自己构造的sobel卷积核,卷积核shape为(out_channels, in_channels, kernel_size, kernel_size)

import torch, cv2
import torch.nn.functional as F
import numpy as np
import matplotlib.pyplot as plt

sobel_x = torch.tensor([[-1, -2, -1],
                        [0, 0, 0],
                        [1, 2, 1]], dtype=torch.float, requires_grad=False).view(1, 1, 3, 3)
sobel_y = torch.tensor([[-1, 0, 1],
                        [-2, 0, 2],
                        [-1, 0, 1]], dtype=torch.float, requires_grad=False).view(1, 1, 3, 3)
laplace = torch.tensor([[0, 1, 0],
                        [1, -4, 1],
                        [0, 1, 0]], dtype=torch.float, requires_grad=False).view(1, 1, 3, 3)
avgpool = torch.tensor([[1/9, 1/9, 1/9],
                         [1/9, 1/9, 1/9],
                         [1/9, 1/9, 1/9]], dtype=torch.float, requires_grad=False).view(1, 1, 3, 3)

def conv_operator(filename, kernel, in_channels=1):
    if in_channels == 1:
        img = np.expand_dims(cv2.imread(filename, 0), 2)    # gray
    elif in_channels == 3:
        img = cv2.imread(filename, 1)                        # bgr
        img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    else:
        exit()

    x = torch.from_numpy(img.transpose([2, 0, 1])).unsqueeze(0).float()
    y = F.conv2d(x, kernel.repeat(1, in_channels, 1, 1), stride=1, padding=1,)
    y = y.squeeze(0).numpy().transpose(1, 2, 0)

    return img, y

def plt_show(windowsname, img, channels=1):
    plt.figure(windowsname)
    if channels ==1:
        plt.imshow(img, cmap='gray')
    elif channels == 3:
        plt.imshow(img, )
    else:
        exit()

    plt.axis('on')
    plt.show()

if __name__=="__main__":
    img_name = 'bg.bmp'

    img, y = conv_operator(img_name, sobel_x, 3)
    plt_show("input img", img, 3)
    plt_show("sobel_x", y)

    _, y = conv_operator(img_name, sobel_y, 1)
    plt_show("sobel_y", y)

    _, y = conv_operator(img_name, laplace, 3)
    plt_show("laplace", y)

    _, y = conv_operator(img_name, avgpool, 3)
    plt_show("avgpool", y)

show:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyTorch中,我们可以使用C++或CUDA编写自定义算子,并将其发布为PyTorch的扩展,以便在PyTorch使用。下面是发布自定义算子的一般步骤: 1. 编写C++或CUDA代码实现自定义算子。 2. 使用PyTorch提供的C++ API或CUDA API将算子封装为PyTorch扩展,生成动态链接库文件。可以使用setup.py或CMake来构建和安装扩展。 3. 在Python中导入扩展,并使用torch.ops.register_custom_op_symbolic()函数注册算子。 4. 在Python中使用自定义算子。 下面是一个简单的示例,演示了如何发布一个简单的自定义算子。 1. 编写C++代码实现自定义算子。假设我们要实现一个名为mymul的算子,它可以计算两个张量的乘积。以下是mymul的C++实现: ```c++ #include <torch/extension.h> torch::Tensor mymul(torch::Tensor x, torch::Tensor y) { return x * y; } PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) { m.def("mymul", &mymul, "My multiply operation"); } ``` 2. 使用PyTorch提供的API将算子封装为扩展。可以使用setup.py或CMake来构建和安装扩展。以下是使用setup.py构建和安装扩展的示例: ```python from setuptools import setup from torch.utils.cpp_extension import BuildExtension, CUDAExtension setup(name='mymul', ext_modules=[ CUDAExtension('mymul_cuda', [ 'mymul_cuda.cpp', 'mymul_cuda_kernel.cu', ]), CppExtension('mymul_cpp', ['mymul.cpp']), ], cmdclass={'build_ext': BuildExtension}) ``` 3. 在Python中导入扩展,并使用torch.ops.register_custom_op_symbolic()函数注册算子。以下是在Python中使用mymul的示例: ```python import torch from torch.utils.cpp_extension import load # 导入扩展 mymul_cpp = load('mymul_cpp', ['mymul.cpp']) # 注册算子 torch.ops.load_library(mymul_cpp.__file__) torch.ops.register_custom_op_symbolic('mymul_cpp::mymul', 2) # 创建输入张量 x = torch.tensor([1, 2, 3]) y = torch.tensor([4, 5, 6]) # 使用自定义算子 z = torch.ops.mymul_cpp.mymul(x, y) print(z) ``` 在上面的示例中,我们首先导入了扩展,并使用torch.ops.load_library()函数加载它。然后,我们使用torch.ops.register_custom_op_symbolic()函数注册算子,指定算子的名称和输入参数的数量。最后,我们创建了两个输入张量x和y,并使用torch.ops.mymul_cpp.mymul()函数调用自定义算子,计算x和y的乘积。 注意,以上仅为一般步骤示例,实际上发布自定义算子需要编写更多的代码和配置文件,具体实现需要根据具体需求和环境进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值