使用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%