16

我正在寻找一种对主要由文本组成的扫描页面进行分类的方法。

这是我的问题的详细信息。我有大量扫描文档,需要检测这些文档中是否存在某些类型的页面。我计划将文档“爆裂”到它们的组件页面中(每个页面都是一个单独的图像)并将这些图像中的每一个分类为“A”或“B”。但我想不出最好的方法来做到这一点。

更多细节:

  • 我有很多“A”和“B”图像(页面)的例子,所以我可以进行监督学习。
  • 我不清楚如何从这些图像中最好地提取特征以进行训练。例如,这些功能是什么?
  • 页面偶尔会轻微旋转,因此如果分类对旋转和(在较小程度上)缩放有点不敏感,那就太好了。
  • 我想要一个跨平台的解决方案,最好是纯 python 或使用通用库。
  • 我曾考虑过使用 OpenCV,但这似乎是一个“重量级”的解决方案。

编辑:

  • “A”页和“B”页的不同之处在于,“B”页上的表格具有相同的一般结构,包括存在条形码。“A”页是自由文本。
4

4 回答 4

9

我将分 3 部分回答,因为您的问题显然是一个大问题,如果页面的集合不超过 1000,我强烈推荐使用廉价劳动力的手动方法。

第 1 部分: 特征提取 - 在对象检测领域有大量特征可供选择。由于您的要求之一是旋转不变性,我会推荐SIFT /SURF 类功能。您可能还会发现哈里斯角等合适。决定使用哪些特征可能需要专业知识,如果你有计算能力,我建议创建一个很好的特征熔炉,并将其传递给基于分类器训练的重要性估计器。

第 2 部分: 分类器选择 - 我是随机森林分类器的忠实粉丝。这个概念非常容易掌握,并且非常灵活且非参数化。调优只需要很少的参数,您也可以在监督训练期间以参数选择模式运行它。

第 3 部分: 实现 - Python 本质上是一种胶水语言。用于图像处理的纯 python 实现永远不会很快。我建议将 OpenCV 用于特征检测,将 R 用于统计工作和分类器。

该解决方案可能看起来设计过度,但机器学习从来都不是一项简单的任务,即使页面之间的区别仅仅是它们是一本书的左手页和右手页。

于 2010-10-11T14:49:18.477 回答
4

首先,我想说的是,在我看来,OpenCV 是用于此类操作的非常好的工具。此外,它有一个在这里很好描述的python接口。

OpenCV 经过高度优化,您的问题并不容易。

[全球编辑:重组我的想法]

以下是一些可以使用的功能的想法:

  • 为了检测条形码,如果条形码被隔离,您可能应该尝试进行距离变换(OpenCV 中的 DistTransform)。也许您可以使用 match 或 matchShapes 轻松找到兴趣点。我认为这是可行的,因为条形码应该具有相同的形状(大小等)。兴趣点的得分可以用作特征。

  • 图像的时刻在这里可能很有用,因为你有不同类型的全局结构。这可能足以区分 A 和 B 页面(请参阅那里的 openCV 函数)(顺便说一下,您将获得不变的描述符:))

  • 您也许应该尝试计算vertical gradienthorizontal gradientvertical gradient条形码是==0 和horizontal gradient!=0的特定位置。这个主要优点是这些操作的成本低,因为您的目标只是检查您的页面上是否有这样的区域。您可以找到兴趣区并将其分数用作特征

一旦你有了你的特征,你就可以尝试做supervised learning和测试泛化。您的问题需要的很少false negative(因为您将丢弃一些页面),因此您应该使用 ROC 曲线评估您的性能并仔细查看灵敏度(应该很高)。对于分类,您可以使用带有套索惩罚的回归来找到最佳特征。whatnick 的帖子还给出了商品的想法和其他描述(也许更笼统)。

于 2010-10-11T14:18:53.180 回答
3

因此,您希望能够使用特定元素区分两种页面 - 基本上是条形码的存在。有两个步骤:

  1. 特征提取(计算机视觉):找到兴趣点或线条,它们是条形码的特定特征,而不是文本。

  2. 二元分类(统计学习):根据提取的特征判断是否有条码。


处理第一步,你一定要看看霍夫变换。它是识别图像中线条的理想选择,可用于条码检测。例如阅读这两页。以下是OpenCV 的示例


关于第二步,最有用的分类将基于:

  • k 最近邻
  • 逻辑回归
  • 随机森林(在 R 中实现得很好,但我不了解 Python)
于 2010-10-11T14:33:54.830 回答
1

您可以尝试通过将 A 和 B 的训练数据上传到demo.nanonets.ai来构建模型(免费使用)

1) 在此处上传您的训练数据:

演示.nanonets.ai

2)然后使用以下(Python代码)查询API:

import requests
import json
import urllib
model_name = "Enter-Your-Model-Name-Here"
url = "https://cdn.pixabay.com/photo/2012/04/24/12/13/letter-39694_960_720.png"
files = {'uploadfile': urllib.urlopen(url).read()}
url = "http://demo.nanonets.ai/classify/?appId="+model_name
r = requests.post(url, files=files)
print json.loads(r.content)

3)响应看起来像:

{
  "message": "Model trained",
  "result": [
    {
      "label": "A",
      "probability": 0.97
    },
    {
      "label": "B",
      "probability": 0.03
    }
  ]
}
于 2016-12-13T11:20:23.663 回答