14

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

这里是我的问题的细节。我有大量的扫描文档,需要检测这些文档中是否存在特定类型的页面。我打算将文档“爆裂”到他们的组件页面中(每个页面都是一个单独的图像),并将这些图像分类为“A”或“B”。但我无法弄清楚这样做的最佳方法。

更多细节:

  • 我有 “A” 和 “B” 的图像(页)的例子不胜枚举,所以我可以做监督学习。
  • 目前还不清楚如何从这些图像中为训练提供最好的特征。例如。这些功能是什么?
  • 页面偶尔略微旋转,所以如果分类对旋转和(较小程度上)缩放比较不敏感,那将会很好。
  • 我想要一个跨平台的解决方案,理想情况下使用纯Python或使用通用库。
  • 我想过使用OpenCV,但这看起来像一个“重量级”解决方案。

编辑:

  • 的“A”和“B”的网页的区别在于“B”的页面具有相同的一般结构上他们的形式,包括条形码的存在。 “A”页面是自由文本。
+0

它们有什么不同?字体?尺寸?你可以只是OCR的一部分(标题或作者在头?) – 2010-10-11 13:42:09

+0

尼克,我添加了一个编辑澄清。其实,我的目标是在B页之后扔掉所有东西,因为我不必OCR它们。所以,我真的需要在做任何OCR之前检测它们。 – Kyle 2010-10-11 13:51:30

+3

这是一个相当困难的问题 - 除非你的集合确实是巨大的,岂不是更容易只是人工分类的网页为'A'或'B'?您可以编写一个小GUI应用程序来轮流显示它们,这样您就可以每页按一个键。 – katrielalex 2010-10-11 13:53:45

回答

4

首先,我想说的是,在我看来,OpenCV是用于这些操作的非常好的工具。而且,它有一个很好描述的Python界面here

OpenCV经过高度优化,您的问题不是一件容易的事情。

[GLOBAL编辑:我的想法重组]

下面是可以使用的功能的几个想法:

  • 为了检测条形码,你也许应该尝试做一个距离变换(DistTransform在OpenCV中)如果条形码是孤立的。也许你可以通过match或matchShapes找到兴趣点。我认为这是可行的,因为条形码shoudl具有相同的形状(大小等)。兴趣点的分数可以用作特征。

  • 由于您拥有不同种类的全局结构,图像的时刻在这里可能很有用。这将是用于制造&页数b之间的区别(见there为OpenCV的功能)(你会得到的方式不变描述:))

  • 你也许应该尝试计算vertical gradienthorizontal gradient也许足够了。条形码是vertical gradient == 0和horizontal gradient!= 0的特定位置。这一主要优势是这些操作的成本较低,因为您的目标只是检查页面上是否存在这样的区域。你可以找到目标区域,并使用其得分为特征

一旦你有你的特点,你可以尝试做supervised learning和试验推广。你的问题需要很少false negative(因为你要扔掉一些页面),所以你应该用ROC曲线评估你的表现,仔细看看敏感度(应该很高)。 对于分类,您可以使用套索惩罚的回归来找到最佳特征。 Whatnick的帖子也给出了商品的想法和其他描述符(可能更一般)。

2

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

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

  2. 二元分类(统计学习):根据提取的特征确定是否存在条形码。


与第一步打交道,你一定要看看在Hough transform。识别图像中的线条非常理想,并且可能对条形码检测有用。例如,阅读这些two pages。这里有examples与OpenCV。


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

  • k个最近邻
  • 回归
  • 随机森林(真的很好R中实现,但我做的不知道Python)
+0

橙色学习套件具有我用之前,我发现在河的一个 – whatnick 2010-10-13 07:46:33

9

我会回答3部分,因为你的问题显然是一个大的问题,我会强烈建议手动方法与廉价的劳动力,如果页面集合不超过1000

第1部分: 特征提取 - 你有一个非常大的特色从物体检测场进行选择。由于您的要求之一是旋转不变性,因此我会推荐SIFT/SURF类功能。你也可以找到哈里斯的角落等。决定使用哪些功能可能需要专业知识,如果您具有计算能力,我会建议创建一大堆功能并通过基于分类器训练的重要性评估程序。

第2部分: 分类选择 - 我是Random Forest分类的忠实球迷。这个概念非常简单易懂,非常灵活且非参数化。调谐只需要很少的参数,您也可以在监督培训期间以参数选择模式运行。

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

的解决方案似乎是过度设计,但机器学习从来就不是一个简单的任务,即使页面之间的区别很简单,他们是一本书的左侧和右侧页面。

+0

SIFT肯定是一个好主意,但在这种情况下,我们也许可以定义,因为我们事先知道(存在更直接定制功能一个很好的随机森林的实现条形码或明文等)...(参见我的文章)。使用分类器培训来发现如何结合我们的功能来给出答案是一个不错的选择。 (一般为+1后) – ThR37 2010-10-11 15:00:33

+0

@wok:我认为whatnick想提出这个问题的更一般的(干净)的方式,而不是在“我应该使用什么功能?”的问题直接去更深。我们必须记住,条形码不是解决这个问题的唯一方法,而是尝试将不同的方式结合起来。在所有情况下,您的链接都非常有趣。 – ThR37 2010-10-11 15:44:36

+0

优秀的答案。我看到SIFT&SURF,但是,唉,我的应用程序是商业应用程序,SIFT已获得专利。 – Kyle 2010-10-11 17:56:42

0

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

1)在这里上传你的训练数据:

demo.nanonets.ai

2)然后

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)的响应看起来像:

使用以下(Python代码)查询API
{ 
    "message": "Model trained", 
    "result": [ 
    { 
     "label": "A", 
     "probability": 0.97 
    }, 
    { 
     "label": "B", 
     "probability": 0.03 
    } 
    ] 
}