作为一个自我开发练习,我想开发一个简单的分类算法,该算法给定Dilbert卡通的特定单元,能够识别卡通中存在的角色(Dilbert,PHB,Ratbert等)。
我认为最好的方法是(1)对图像应用某种算法,将其转换为一组特征,以及(2)使用训练集和许多可能的机器学习算法之一,将某些特征的存在/不存在与细胞中存在的特定字符关联起来。
所以我的问题是- (a)这是正确的方法吗,(b)由于有许多分类算法和ML算法需要测试,找到正确的算法的好方法是什么,以及(c)考虑到我们实际上是在对卡通进行分类练习,你会从哪些算法开始。
发布于 2011-11-13 23:51:32
因此,我认为您的步骤1(对图像应用某些算法,将其转换为一组特征)是正确的。
这个项目比大多数ML问题更具挑战性,因为在这里你实际上必须从原始数据(组成卡通的单个帧)创建训练数据集。例如,抓取一个帧,识别该帧中的两个字符,Dilbert和有角的字符(我相信Dilbert的老板,不知道他的名字),从该帧中提取这两个字符,并为每个字符附加适当的类标签(例如,Dlibert的"1“)。
步骤1
为了从组成呆板卡通的每个帧中提取单个字符,我建议对每个帧进行谱分解。如果你不熟悉这种技术,在它的核心,它只是一个特征向量分解。
如果您喜欢python (或者R,因为您可以使用像RPy这样的python- to -R绑定),那么我强烈建议您研究一下sklearn。特别是,这个优秀的库(最初是在SciPy scikits项目下开发的,因此使用NumPy + SciPy进行矩阵计算)有几种图像分割算法,其中一种是基于spectral clustering的。对于项目中的这一步,您很可能希望查看这两个scikits.learn模块
这两个模块包括两个很好的示例脚本,一个是segmenting a digital photograph,另一个是分割图像的other,该脚本分割由三个部分叠加的圆组成的图像,它们彼此之间的对比度最小,背景为w/r/t --我认为这两个都是需要执行分解的更困难的问题。换句话说,sklearn在源代码发行版中包含了两个完整的、文档化良好的示例脚本,它们处理的数据都与您的相似。其中一个或两个都是此步骤的极佳模板。
步骤2
这是第一步;这里是第二步:将分解图像的所有组件排序到组中,每个Dilbert角色对应一组。接下来,为每个Group分配一个类标签,例如,如果分解步骤中有四个字符,那么类标签的合适选择是"0“、"1”、"2“和”3“。将这些类别标签附加到组件矩阵(步骤1的分解产物),以便将每个字符矩阵映射到其对应的类别(Dilbert字符)。
步骤3
选择合适的ML技术。对于这一步,您有许多选择;唯一的标准是该技术属于受监督类别(因为您已经为数据分配了类标签),并且它充当分类器(即,它返回一个类标签,而回归器输出一个数值)。考虑到这是一个个人项目,我会选择对你来说最有趣的一个。满足我刚才提到的标准的有:多层感知器(神经网络)、支持向量机(SVM)和k近邻(kNN)。
步骤4
训练、验证和测试您的分类器
替代技术:模板匹配
一旦步骤1完成(每个图像被分解成一组对象,其中一些无疑将表示角色),您就可以手动筛选这些分解产品,并为卡通中的每个角色收集样本。这些是模板。
接下来,将从图像中分割的对象与这组独特的模板进行比较。在scikit-image中,您可以使用在模板图像和候选图像中传递的方法match_template,,该方法返回一个2D数组,显示逐个像素的相关性(在-1和1之间)。
发布于 2011-11-13 18:47:06
我认为,总的来说,这是正确的方法,有两种技术你可以看看。
发布于 2016-12-13 19:08:24
你可以尝试通过上传你的训练数据(漫画图片)到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
}
]
}https://stackoverflow.com/questions/8108550
复制相似问题