开发Dilbert漫画图像分类算法的一般方法

作为自我发展的练习,我想开发一个简单的分类算法,能够识别给定Dilbert漫画中的特定单元格内出现的角色(如Dilbert、PHB、Ratbert等)。

我认为最好的方法是(1)对图像应用某种算法,将其转换为一组特征,(2)使用训练集和众多可能的机器学习算法之一,将某些特征的存在与否与特定角色在单元格中的出现相关联。

所以我的问题是 – (a) 这种方法是否正确,(b) 由于有许多分类算法和机器学习算法需要测试,找到合适的算法有什么好的方法,(c) 考虑到我们本质上是在进行漫画的分类练习,你会从哪些算法开始?


回答:

所以我认为你关于第一步的思路是正确的(对图像应用某种算法,将其转换为一组特征)。

这个项目比大多数机器学习问题更具挑战性,因为你需要从原始数据(构成漫画的各个帧)中创建你的训练数据集。例如,抓取一个帧,识别出帧中的两个角色,Dilbert和那个有角的角色(我认为是Dilbert的老板,不知道他的名字),从该帧中提取这两个角色,并为每个角色附加适当的类别标签(例如,Dilbert用“1”表示)。

第一步

为了从构成Dilbert漫画的各个帧中提取单个角色,我建议对每个帧进行谱分解。如果你不熟悉这种技术,核心上,它只是一个特征向量分解。

如果你喜欢Python(或者R,考虑到你可以使用像RPy这样的Python到R的绑定),我强烈建议你查看sklearn。特别是,这个优秀的库(最初是在SciPy scikits项目伞下开发的,因此使用NumPy + SciPy进行矩阵计算)有几种图像分割算法,其中一种基于谱聚类。在你的项目这一步,你很可能会想要查看这两个scikits.learn模块

  • sklearn.feature_extraction(特别是image子模块)

  • sklearn.cluster.spectral_clustering

这两个模块中包含了两个很好的示例脚本,一个是分割数字照片,另一个是分割由三个部分重叠的圆圈组成的图像,这些圆圈与彼此和背景之间的对比度最小——我认为这两个问题都比你需要进行的分解更难。换句话说,sklearn在源代码分发中包含了两个完整的、文档齐全的示例脚本,这两个脚本都处理与你的数据相似的数据。这两个脚本中的任何一个或两个都将是这一步的优秀模板。

第二步

这就是第一步;这是第二步:将分解图像的所有组件排序成组,每组对应一个Dilbert角色。接下来,为每个组分配一个类别标签,例如,如果你的分解步骤中有四个角色,那么类别标签的合理选择是“0”、“1”、“2”和“3”。将这些类别标签附加到组件矩阵(第一步的分解产品)上,以便每个角色矩阵映射到其对应的类别(Dilbert角色)。

第三步

选择合适的机器学习技术。你有许多选择;唯一的标准是该技术属于监督类别(因为你已经为数据分配了类别标签),并且它作为一个分类器(即,它返回一个类别标签,而不是回归器,它输出一个数值)。考虑到这是一个个人项目,我会选择你觉得最有趣的一个。几个满足我刚刚提到的标准的算法是:多层感知器(神经网络)、支持向量机(SVM)和k最近邻(kNN)。

第四步

训练、验证和测试你的分类器

替代技术模板匹配

一旦完成第一步(每个图像被分解为一组对象,其中一些无疑代表角色),你可以手动筛选这些分解产品,并为漫画中的每个角色收集样本。这些是模板

接下来,你将从图像中分割出的对象与这组独特的模板进行比较。在scikit-image,另一个scipy scikit中,你可以使用方法match_template,你向其中传递一个模板图像和一个候选图像,该方法返回一个显示像素对像素相关性(介于-1和1之间)的二维数组。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注