作为一项自我发展练习,我想开发一种简单的分类算法,给定Dilbert漫画的特定单元格,能够识别出动画中存在哪些角色(Dilbert,PHB,Ratbert等)。
我认为最好的方法是(1)将一些算法应用于图像,将其转换为一组特征,以及(2)使用训练集和许多可能的机器学习算法之一进行关联某些特征的存在/不存在,特定字符存在于单元格中。
所以我的问题是 - (a)这是正确的方法,(b)因为有许多分类算法和ML算法要测试,什么是找到正确方法的好方法,以及(c)哪种算法考虑到我们基本上是在对卡通进行分类练习,你会先说。
答案 0 :(得分:25)
所以我认为你在第1步(将一些算法应用于图像,将其转换为一组功能)的正确轨道上。
这个项目比大多数ML问题更具挑战性,因为在这里你实际上必须从原始数据(包含漫画的各个帧)创建训练数据集。例如,抓住一个框架,识别该框架中的两个角色,Dilbert和带角的角色(我相信Dilbert的老板,不知道他的名字),从那个框架中提取这两个角色并附加到每个相应的类别标签上(例如,Dlibert为“1”。
第1步
为了从包含Dilbert漫画的每个帧中提取单个字符,我建议每帧的 频谱分解 。如果你不熟悉这种技术,那么它只是一个特征向量分解。
如果你喜欢python(或R,假设你可以使用像 RPy 这样的python-to-R绑定)那么我强烈建议你看看sklearn。特别是,这个优秀的库(最初是在 SciPy scikits 项目伞下开发,因此使用NumPy + SciPy进行矩阵计算)有几种图像分割算法,其中一种算法基于{{ 3}}。对于Project中的这一步,您很可能希望查看这两个scikits.learn模块
sklearn.feature_extraction (尤其是图片子模块)
<强> sklearn.cluster.spectral_clustering 强>
这两个模块包含两个很好的示例脚本,一个spectral clustering和segmenting a digital photograph分割图像,由三个部分叠加的圆圈组成,对比度最小w / r / t和w / r / t背景 - 我怀疑是你需要执行分解的更难的问题。换句话说, sklearn 在源代码分发中包含两个完整的,记录完备的示例脚本,这两个脚本都处理与您的类似的数据。这一步中的任何一个或两个都是一个很好的模板。
第2步
这是第一步;这是第二个:排序将分解后的图像的所有组件分组,每个Dilbert角色的一个组。接下来,为每个组分配一个类别标签,例如,如果您的分解步骤中有四个字符,那么类别标签的合适选择是“0”,“1”,“2”和“3”。将这些类标签附加到组件矩阵(步骤1中的分解产物),以便将每个字符矩阵映射到其对应的类(Dilbert字符)。
第3步
选择合适的ML技术。你有很多选择这个步骤;唯一的标准是该技术属于监督类别(因为您已为数据分配了类标签)并且它作为分类器运行(即,它返回一个类标签,而不是输出数值的回归量)。鉴于这是一个个人项目,我会选择一个对你来说最有趣的项目。满足我刚刚提到的标准的一些是:多层感知器(神经网络),支持向量机(SVM),以及 k-最近邻居< / em>(kNN)。
第4步
训练,验证和测试您的分类器
替代技术 :模板匹配
一旦完成第1步(每个图像被分解为一组对象,其中一些无疑将代表字符),您可以手动筛选这些分解产品并收集动画中每个角色的样本。这是 模板 。
接下来,将从图像分割的对象与这组唯一模板进行比较。在other,另一个scipy scikit中,您可以使用 match_template 方法,在其中传递模板图像和候选图像,此方法返回2D阵列显示逐像素相关(在-1和1之间)。
答案 1 :(得分:2)
我认为,一般来说,这是正确的方法,你可以看一下两种技巧。
答案 2 :(得分:0)
您可以尝试通过将您的训练数据(漫画图片)上传到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
}
]
}
答案 3 :(得分:0)
这个问题是在5年前提出的,因此上面提供的答案已经过时,因为深度学习改变了过去3 - 4年的计算机视觉。基于深度学习的解决方案将涉及训练卷积神经网络,该网络将学习特征并在端到端学习框架中执行分类。然而,由于在同一图像中可能存在多个漫画,因此在图像分类中使用的标准softmax交叉熵损失可能不合适。因此,独立逻辑回归应该用作损失函数。可以基于在保持的验证集上获得的准确度来获得每个类的阈值。即使对于漫画,最好使用使用imagenet初始化的预训练模型,而不是从头开始训练(https://arxiv.org/pdf/1611.05118v1.pdf,尽管本文的最后一项任务不同,但它们仍然在卡通上进行处理)。如果您拥有丰富的数据,那么预培训可能就不那么重要了。可以使用caffe / torch等标准库执行此任务。