python中的图像分类

2024-04-28 05:58:53 发布

您现在位置:Python中文网/ 问答频道 /正文

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

以下是我问题的详细情况。我收集了大量扫描文件,需要检测这些文件中是否存在某些类型的页面。我计划将文档“突发”到它们的组成页面(每个页面都是一个单独的图像),并将每个图像分类为“A”或“B”。但我想不出最好的办法。

更多细节:

  • 我有很多“A”和“B”图像(页)的例子,所以我可以做监督学习。
  • 我不清楚如何从这些图像中提取出最适合训练的特征。E、 这些特征是什么?
  • 页面偶尔会稍微旋转,所以如果分类对旋转和缩放(在较小程度上)不太敏感,那就更好了。
  • 我想要一个跨平台的解决方案,最好是纯python或者使用公共库。
  • 我考虑过使用OpenCV,但这似乎是一个“重磅”的解决方案。

编辑:

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

Tags: 文件方法文档图像文本类型分类页面
3条回答

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

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

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


在处理第一步时,您肯定应该看看Hough transform。它是理想的识别线在图像中,并可能是有用的条码检测。例如,阅读这些two pages。这是带OpenCV的examples


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

  • k近邻
  • 逻辑回归
  • 随机林(在R中实现得很好,但我不知道Python)

首先,我想说,在我看来,OpenCV是一个非常好的工具,可以进行这种操作。此外,它还有一个很好描述的python接口here

OpenCV是高度优化的,你的问题并不简单。

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

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

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

  • 图像的矩在这里可能很有用,因为您有不同类型的全局结构。这可能足以区分A&B页面(请参见openCV函数的there)(您将通过以下方式获得不变的描述符:)

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

一旦拥有了自己的特性,就可以尝试进行supervised learning和测试泛化。你的问题只需要很少的false negative(因为你要扔掉一些页面),所以你应该用ROC曲线来评估你的性能,并仔细观察敏感度(应该很高)。 对于分类,你可以使用套索惩罚回归找到最好的特征。 whatnick的帖子也给出了商品的概念和其他描述(可能更一般)。

我将分三部分回答你的问题,因为你的问题显然是一个大问题,如果收集的页数不超过1000页,我强烈建议你用廉价劳动力手工解决。

第1部分: 特征提取-在“对象检测”字段中有大量特征可供选择。因为您的需求之一是旋转不变性,所以我建议使用SIFT/SURF类特性。你也可能觉得哈里斯角等合适。决定使用哪些特性需要专家知识,如果你有计算能力,我建议你创建一个很好的特性熔炉,并通过基于分类器训练的重要性估计。

第2部分: 分类器选择-我是Random Forest分类器的忠实粉丝。这个概念很容易掌握,并且具有高度的灵活性和非参数性。调整只需要很少的参数,您还可以在监督培训期间以参数选择模式运行它。

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

这个解决方案可能看起来过于复杂,但机器学习从来不是一个简单的任务,即使页面之间的区别只是它们是一本书的左手和右手页面。

相关问题 更多 >