opencv实践之SVM

使用opencv中的SVM训练人脸眼镜分类器

1 环境

ubantu 16.04
Python 3.7
opencv3.4.3
在Python环境下,sklearn包里的SVM更好用,但是因为项目需要,之后要将我的成果部署到C++中,所以选用了opencv来实现SVM。

2 SVM

3 Python实战

3.1 任务准备

我的目标是训练一个识别人脸是否戴眼镜的SVM分类器。
这里我借助于facenet获取人脸图片的512维特征,然后对这512维特征进行SVM分类。
数据集,感谢MeGlass发布的人脸-眼镜数据,MeGlass数据来自于MegaFace Dataset,项目作者将每一张图中人是否戴眼镜进行了标注。
meta.txt中,每一行包括图片路径和label,1表示戴眼镜,0表示没带眼睛。路径的**第二个@**前表示每个人的ID,这个取名和MegaFace一致。下面给出部分例子

10032527@N08_identity_4@2582182573_0.jpg 0
10032527@N08_identity_4@2582191559_0.jpg 0
10032527@N08_identity_4@2582274191_0.jpg 0
10032527@N08_identity_4@2583119706_0.jpg 0
10032527@N08_identity_4@2589966003_0.jpg 1
10032527@N08_identity_4@2590796978_0.jpg 0

我仅从所有图片中选取了前5000张用作train,5001-10000用作eval。
为了方便起见,先得到所有图片的特征文件,存到相应的txt中。

3.2 训练

# 创建一个SVM 设置超参数
svm = cv2.ml.SVM_create()
svm.setType(cv2.ml.SVM_C_SVC)
svm.setKernel(Kernel)
svm.setC(C)
svm.setGamma(Gamma)
traindata = cv2.ml.TrainData_create(trainingData, cv2.ml.ROW_SAMPLE, labels)
svm.train(traindata)

可以通过设置setKernel、setC、 setGamma三个属性/超参数来微调,最终发现选择RBF核,其他参数默认时,验证集准确率为95.9%

你可能感兴趣的:(人脸识别,opencv,svm)