利用opencv的hog+svm实现细胞识别分类器
图像处理中的细胞识别和人脸识别可以这样来类比,图像中的一张张人脸就是一个个细胞。
模式识别的关键在于样本库的选取,识别率也只能在和样本库比较接近的环境下才能保证。主要工作是三部分一是特征提取,二是样本库的训练train,三是目标检测detect。
一.特征提取
特征提取采用的是HOG特征即HOG描述子,该特征在行人检测中效果非常好。而一般人脸识别采用的是haar特征,这在opencv中都有实现,并都给出了相应的分类器,效果都很不错。
首先采集了正样本6000多份,然后负样本90000多份,正样本就是手动从图像中把细胞截图保存下来,为了工作方便一般先大概截个正方形就好了,然后对得到的正样本依次做三次顺时针旋转,目的是为了满足旋转不变性。之后写个程序将这些正样本的尺寸统一缩放到64*64,这个尺寸决定了最终svm算法中的特征维数。负样本就是非细胞的图像,可以用程序截图得到,不需要人工了,最终也将尺寸统一缩放到64*64即可。
二.训练样本
利用HOGDescriptor.compute计算所有的样本特征值,存入svm算法中训练用的特征矩阵train_mat中,同时将每个样本的类别保存到标签向量label_mat中,正样本的标签为1,负样本为0;然后用svm.train函数训练得到分类器文件svm_data.xml。
三.目标检测
训练好的SVM分类器保存为XML文件,然后根据其中的支持向量和参数生成OpenCV中的HOG描述子可用的检测子参数,再调用OpenCV中的多尺度检测函数进行细胞检测。
检测子参数的计算过程就是svm算法中从一开始得到的阿尔法系数转变得到w系数的过程。
---------------------------------------------------------------------------------------------------------------------
难例(Hard Example)是指利用第一次训练的分类器在负样本原图(肯定没有人体)上进行行人检测时所有检测到的矩形框,这些矩形框区域很明显都是误报,把这些误报的矩形框保存为图片,加入到初始的负样本集合中,重新进行SVM的训练,可显著减少误报。