paddlepaddle detección simple de bordes en blanco y negro

Se ejecutó correctamente en Baidu AI Studio y luego informó un error localmente. Verifiqué la API y el resultado fue que faltaba un parámetro num_channels
(por qué se ejecutó correctamente en AI Studio, por desgracia).
Aquí haré una copia de seguridad para yo mismo, y se verá bien en el futuro.

Entorno operativo: 64win7 python3

Introducción desde la paleta:
Ejemplos
de aplicación del operador de convolución A continuación se presentan tres casos de aplicación del operador de convolución en imágenes y se observan los resultados del cálculo.

Caso 1: detección simple de bordes en blanco y negro

La siguiente es la tarea de usar el operador Conv2D para completar una detección de límites de imagen. La parte izquierda de la imagen es la parte brillante y la parte derecha es la parte oscura. Es necesario detectar el límite entre la luz y la oscuridad. El núcleo de convolución en la dirección de ancho se puede establecer en [1,0, −1] [1, 0, -1] [1,0, −1]. Este núcleo de convolución dividirá dos píxeles en la dirección de ancho con 1 Restar El valor de. Cuando el núcleo de convolución se desliza sobre la imagen, si los píxeles que cubre están ubicados en áreas con el mismo brillo, la diferencia entre los valores de los dos píxeles con un intervalo izquierdo y derecho de 1 es 0. Solo cuando algunos de los píxeles cubiertos por el núcleo de convolución están en un área brillante y otros en un área oscura, la diferencia entre los valores de píxeles de los dos puntos con un intervalo izquierdo y derecho de 1 no es 0. Cuando se aplica este núcleo de convolución a la imagen, solo el valor de píxel correspondiente a la línea divisoria en blanco y negro en el mapa de características de salida no es 0. El código específico se muestra a continuación y el resultado se muestra en el patrón a continuación.

El siguiente es el código. En Conv2D, num_channels = 1 se agrega, lo que significa que solo hay un canal. Cuando se enseña en paddle, no está disponible. Agregando al local se puede ejecutar.
Mirando el código fuente de la siguiente manera, puede ver que num_channels no tiene el valor predeterminado. De todos modos, cuando lo escribí, el funcionario no lo escribió, no sé si se agregará en el futuro.
También hay% matplotlib función en línea es% matplotlib inline se puede usar directamente en el compilador de Ipython, la función se puede incrustar en el dibujo y se puede omitir plt.show () en este paso.
Se puede eliminar o comentar aquí, después de todo, plt.show () está escrito en el código.

def __init__(self,
                 num_channels,
                 num_filters,
                 filter_size,
                 stride=1,
                 padding=0,
                 dilation=1,
                 groups=None,
                 param_attr=None,
                 bias_attr=None,
                 use_cudnn=True,
                 act=None,
                 dtype='float32'):

El siguiente es el código oficial

import matplotlib.pyplot as plt

import numpy as np
import paddle
import paddle.fluid as fluid
from paddle.fluid.dygraph.nn import Conv2D
from paddle.fluid.initializer import NumpyArrayInitializer
# % matplotlib
# inline

with fluid.dygraph.guard():
    # 创建初始化权重参数w
    w = np.array([1, 0, -1], dtype='float32')  # 卷积核
    # 将权重参数调整成维度为[cout, cin, kh, kw]的四维张量*(out in height width)
    w = w.reshape([1, 1, 1, 3])
    # 创建卷积算子,设置输出通道数,卷积核大小,和初始化权重参数
    # filter_size = [1, 3]表示kh = 1, kw=3
    # 创建卷积算子的时候,通过参数属性param_attr,指定参数初始化方式
    # 这里的初始化方式时,从numpy.ndarray初始化卷积参数
    conv = Conv2D('conv',num_channels = 1, num_filters=1, filter_size=[1, 3],
                  param_attr=fluid.ParamAttr(initializer=
                                             NumpyArrayInitializer(value=w) ))

    # 创建输入图片,图片左边的像素点取值为1,右边的像素点取值为0
    img = np.ones([50, 50], dtype='float32')
    img[:, 30:] = 0.
    # 将图片形状调整为[N, C, H, W]的形式
    x = img.reshape([1, 1, 50, 50])
    # 将numpy.ndarray转化成paddle中的tensor
    x = fluid.dygraph.to_variable(x)
    # 使用卷积算子作用在输入图片上
    y = conv(x)
    # 将输出tensor转化为numpy.ndarray
    out = y.numpy()

f = plt.subplot(121)
f.set_title('input image', fontsize=15)
plt.imshow(img, cmap='gray')

f = plt.subplot(122)
f.set_title('output featuremap', fontsize=15)
# 卷积算子Conv2D输出数据形状为[N, C, H, W]形式
# 此处N, C=1,输出数据形状为[1, 1, H, W],是4维数组
# 但是画图函数plt.imshow画灰度图时,只接受2维数组
# 通过numpy.squeeze函数将大小为1的维度消除
plt.imshow(out.squeeze(), cmap='gray')
plt.show()

Los diagramas de ejecución de jupyterlab y pycharm son los siguientes
Inserte la descripción de la imagen aquíInserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/weixin_43134049/article/details/105618113
Recomendado
Clasificación