如何训练svm分类英文字母图像?

时间:2015-03-19 06:17:25

标签: c++ opencv ocr svm

我的目标是检测图像中的文本并识别它们。 我已经使用笔画宽度变换实现了检测字符。 如何识别它们? 据我所知,我想通过检测特征点并从每个图像中提取特征向量,用我的不同字体[图像]字母数据集来训练svm。[我使用了SIFT特征向量,用kmean构建了字典clusetering和所有]。

之前我检测过一个角色,我会为这个角色提取筛选特征向量。我想把它喂给svm预测函数。

我不知道如何识别使用svm。我很迷惑!帮助我纠正我在哪里出错概念...

我跟着这个细节来识别部分。这种turotial可以适用于识别字符。 http://www.codeproject.com/Articles/619039/Bag-of-Features-Descriptor-on-SIFT-Features-with-O

1 个答案:

答案 0 :(得分:2)

SVM是受监督的分类器。要使用它,您需要具有您尝试识别的对象类型的训练数据。

第1步 - 准备培训数据

训练数据由特征向量对及其对应的类标签组成。在您的情况下,您似乎已为您检测到的字符提取了基于SIFT的“Bag-of-word”(BOW)特征向量。因此,对于您的训练数据,您需要找到不同角色的许多示例,为每个角色提取此特征向量,并将它们与标签相关联(有时称为类标签,通常您可能会映射到文本描述的整数)(例如,数字0可以映射到字符'a',依此类推。)

第2步 - 训练分类器

SVM分类器接收特征向量的数组/ Mat(每行一个)及其相关标签作为输入。在单独的验证集上调整SVM的参数(即正则化参数C,以及适用于内核的任何其他参数)。

第3步 - 预测未见数据

在测试时,如果在训练期间SVM看不到 的样本,则计算样本的特征向量(基于SIFT的BOW向量)。将此特征向量传递给SVM的预测函数,它将返回一个整数。请记住,在准备训练数据时,您是否已将每个标签与整数相关联?这是SVM为此样本预测的标签。然后,您可以将此标签映射到角色。例如,如果你将0与'a',1与'b'等关联起来,你可以使用vector / hashmap将整数映射到它的文本对应物。

附加说明

您可以查看OpenCV的SVM教程here了解详情。

注意:通常,对于初学者来说,最困难的部分(获取数据之后)是调整分类器。我的建议是首先尝试一个简单的分类器(例如,线性 SVM),它只有很少的参数可供调整。一个不错的选择是线性 SVM,它只需要你调整一个参数 C 。一旦你设法得到一些不错的结果(这可以保证你的其余代码正常工作),你可以转向更“复杂”的分类器。

最后,您提取的训练数据和特征向量非常重要。训练数据必须与您尝试预测的测试数据“相似”。例如,如果您要预测道路标志中出现的字符,这些字符带有不同的字体,光照条件和姿势差异,那么使用由报纸/书籍存档中的字符组成的训练数据可能不能给出你效果很好。这是机器学习中域适应的问题。