【问题标题】:Can one hardcode convolutional filters to detect characters in a CNN?可以用硬编码卷积过滤器来检测 CNN 中的字符吗?
【发布时间】:2020-02-03 16:58:59
【问题描述】:

在 Pytorch 中,您可以将过滤器硬编码为您喜欢的任何内容。

目前,我正在做文本检测,我需要识别某些信息的位置。此信息始终以字母“X”开头。 如果我对“X”过滤器进行硬编码,这是否会从根本上提高检测性能?

这是我目前所拥有的:

import torch
import torch.nn as nn
import matplotlib.pyplot as plt

kernel = (torch.zeros((9, 9)) + \
          torch.eye(9) + \
          torch.rot90(torch.eye(9))).type(torch.bool)*1

print(kernel)
tensor([[1, 0, 0, 0, 0, 0, 0, 0, 1],
        [0, 1, 0, 0, 0, 0, 0, 1, 0],
        [0, 0, 1, 0, 0, 0, 1, 0, 0],
        [0, 0, 0, 1, 0, 1, 0, 0, 0],
        [0, 0, 0, 0, 1, 0, 0, 0, 0],
        [0, 0, 0, 1, 0, 1, 0, 0, 0],
        [0, 0, 1, 0, 0, 0, 1, 0, 0],
        [0, 1, 0, 0, 0, 0, 0, 1, 0],
        [1, 0, 0, 0, 0, 0, 0, 0, 1]])

我们可以像这样可视化它:

plt.imshow(kernel)
plt.show()

然后,我们可以这样设置过滤器权重:

conv = nn.Conv2d(in_channels=1, 
                 out_channels=1, 
                 kernel_size=3, 
                 stride=3, 
                 bias=None)

conv.weight.data = kernel

【问题讨论】:

  • 想要硬编码所有字母的过滤器吗?模型泛化不是很困难吗,还有不止一层卷积
  • x 是否总是具有完全相同的像素对齐的精确形状?如果是这样,那么您可能一开始就不应该使用数据驱动的方法进行检测。
  • 它可以是垂直/水平的,也可以是轻微旋转的。它总是同一个字母。
  • 一般而言,相关过滤器不会对此类变化具有鲁棒性。
  • 没有理由对过滤器进行硬编码。我非常怀疑这个过滤器是否真的会匹配您输入中的字母 X。与此过滤器没有任何差异。你可以试试。获取一些输入并对其使用过滤器并可视化输出。

标签: python localization pytorch conv-neural-network object-detection


【解决方案1】:

不,我认为这不会提高检测性能。

检测性能通常称为“推理”,即在训练标签未知的新数据上运行网络的过程。对权重进行硬编码不会对网络的测试性能产生任何影响,因为您仍然需要计算卷积。

我们还可以询问它是否会提高训练性能。在这里,我也希望答案是否定的。神经网络实现高精度的原因之一是它们能够识别训练数据中的细微模式。真实页面上的真实 x 不太可能与您在示例中设置为 1 的像素对齐。字母的轻微旋转或亚像素偏移甚至不同的纵横比都会改变最佳滤镜的外观。

确实,随着我们进入深度学习时代,机器学习的主要变化之一是神经网络在挑选低级特征方面比人类工程师做得更好。

但是谢谢你的问题——只是关于如何硬编码层值的代码 sn-p 对我很有用!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-24
    • 1970-01-01
    • 2019-11-28
    • 2018-06-21
    • 1970-01-01
    • 2018-08-16
    • 2023-04-08
    相关资源
    最近更新 更多