【问题标题】:General approach to developing an image classification algorithm for Dilbert cartoons为呆伯特卡通开发图像分类算法的一般方法
【发布时间】:2011-12-27 20:33:33
【问题描述】:

作为一项自我开发练习,我想开发一个简单的分类算法,给定呆伯特卡通的特定单元格,它能够识别卡通中存在哪些角色(呆伯特、PHB、Ratbert 等)。

我认为最好的方法是 (1) 对图像应用一些算法,将其转换为一组特征,以及 (2) 使用训练集和许多可能的机器学习算法之一来关联单元格中存在/不存在具有特定字符的某些特征。

所以我的问题是 - (a) 这是正确的方法吗,(b) 因为有许多分类算法和 ML 算法要测试,什么是找到正确方法的好方法,以及 (c) 哪些算法考虑到我们实际上是在对卡通进行分类练习,你会先开始吗?

【问题讨论】:

  • 有趣的是,我刚刚找到了 M.Weber 的this thesis,它处理星座(视觉文字)模型,最后还包含处理呆伯特漫画的实验。

标签: python machine-learning computer-vision classification feature-detection


【解决方案1】:

您可以尝试通过将训练数据(漫画图片)上传到demo.nanonets.ai(免费使用)来构建模型

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

import requests
import json
import urllib
model_name = "Enter-Your-Model-Name-Here"
url = "http://static5.businessinsider.com/image/525464f969bedd0b0422cfb6/dilbert-creator-scott-adams-presents-his-10-favorite-comics-of-all-time.jpg"
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)

响应如下:

{
  "message": "Model trained",
  "result": [
    {
      "label": "Dilbert",
      "probability": 0.97
    },
    {
      "label": "PHB",
      "probability": 0.025
    },
    {
      "label": "Ratbert",
      "probability": 0.005
    }
  ]
}

【讨论】:

    【解决方案2】:

    这个问题是 5 年前提出的,因此鉴于深度学习在过去 3 到 4 年改变了计算机视觉的面貌,因此上面提供的答案已经过时。基于深度学习的解决方案将涉及训练卷积神经网络,该网络将学习特征并在端到端学习框架中执行分类。但是,由于同一图像中可能存在多个卡通,因此图像分类中使用的标准 softmax 交叉熵损失可能不合适。因此,应该使用独立的逻辑回归作为损失函数。每个类别的阈值可以基于在保留的验证集上获得的准确度来获得。即使对于卡通,最好使用使用 imagenet 初始化的预训练模型,而不是从头开始训练(https://arxiv.org/pdf/1611.05118v1.pdf,虽然本文的最终任务不同,但他们仍然对卡通进行处理)。如果你有丰富的数据,预训练可能没那么重要。可以使用标准库(如 caffe/torch 等)执行此任务。

    【讨论】:

      【解决方案3】:

      所以我认为您在第 1 步中走在正确的轨道上(对图像应用一些算法,将其转换为一组特征)

      这个项目比大多数机器学习问题更具挑战性,因为在这里您实际上必须从原始数据(组成卡通的各个帧)创建训练数据集。例如,抓取一个帧,识别该帧中的两个字符,呆伯特和有角的字符(我相信呆伯特的老板,不知道他的名字),从该帧中提取这两个字符并附加到每个适当的类标签(例如,“1”代表 Dlibert)。

      第 1 步

      要从构成呆伯特卡通的每一帧中提取单个字符,我建议对每一帧进行光谱分解。如果您不熟悉这种技术,那么它的核心就是一个特征向量分解。

      如果你喜欢 python(或 R,因为你可以使用像 RPy 这样的 python-to-R 绑定),那么我强烈建议你查看sklearn。特别是这个优秀的库(最初是在 SciPy scikits 项目伞下开发的,因此使用 NumPy + SciPy 进行矩阵计算)具有多种图像分割算法,其中一种基于@987654322 @。对于您项目中的这一步,您很可能希望查看这两个 scikits.learn 模块

      • sklearn.feature_extraction(尤其是图像子模块)

      • sklearn.cluster.spectral_clustering

      这两个模块包含两个很好的示例脚本,一个 segmenting a digital photographother 分割由三个部分叠加的圆圈组成的图像,彼此之间的对比度最小,而 w/r/t背景-我怀疑两者都是您需要执行的分解的更困难的问题。换句话说,sklearn 在源代码分发中包含两个完整的、有据可查的示例脚本,它们都处理与您的数据相似的数据。任何一个或两者都将是此步骤的绝佳模板。

      第 2 步

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

      第 3 步

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

      第 4 步

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

      替代技术模板匹配

      一旦步骤 1 完成(每个图像被分解成一组对象,其中一些无疑将代表角色),您可以手动筛选这些分解产物并为卡通中的每个角色收集样本。这些是模板

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

      【讨论】:

      • 感谢您的详细解答!我是一个 python 人,所以 sklearn 看起来是一个很好的起点。我会跟进我所学到的。
      • 嗨,我想做类似的事情。你有没有在任何地方写下你的发现?
      【解决方案4】:

      我认为,总的来说,这是正确的方法,您可以看看两种技术。

      【讨论】:

        猜你喜欢
        • 2020-05-18
        • 2019-04-17
        • 2012-01-17
        • 1970-01-01
        • 2013-07-19
        • 2010-09-24
        • 1970-01-01
        • 1970-01-01
        • 2011-09-30
        相关资源
        最近更新 更多