我有一个python
face recognition
,我在这里使用open-face
模型和SVM
来检测和识别人脸。我要识别图像的一般步骤如下:
训练:我使用SVM
来训练脸部嵌入并使用适当的标签,如下所示:
params = {"C": [0.001, 0.01, 0.1, 1.0, 10.0, 100.0, 1000.0], "gamma": [1e-1, 1e-2, 1e-3, 1e-4, 1e-5]}
model = GridSearchCV(SVC(kernel="rbf", gamma="auto", probability=True), params, cv=3, n_jobs=-1)
model.fit(data["embeddings"], labels)
测试:提取测试图像的面部嵌入,并预测如下结果:
model.predict_proba()
我有unknown
个人面部数据集和known
个人面部数据集。这里的问题是,如果我添加约30个已知人物图像,并且如果我具有约10个未知人物图像,则表示该已知人物很好,但是如果有任何未知人物出现,它也将该未知人物识别为已知人物具有很高的知名度。信心,实际上应该是未知的。
如果我在unknown
数据集中添加更多随机人物,则可以说约50张图像,如果我有30位已知人物图像。它可以识别已知人物的图像,但是可信度很低,如果有未知人物进来,则可以识别为未知
为了获得良好的面部识别结果,我们需要使known and unknown
个人图像的数量接近相同,这实际上是不可能的,因为已知人物图像可以增加到100个或更多,超过我们添加的每个已知人物。我在这里很困惑,不知道该怎么办。还有其他方法可以识别known/unknown
个人。请帮忙。谢谢
答案 0 :(得分:1)
正常的情况是,随着可能性的增加(可信度),置信度会下降。我想了解您的意思:您为每个人贴上标签,然后为未知标签贴上另一个标签?那不是走的路,因为未知被视为嵌入任何其他人。您应该使用截断概率,所有低于此概率的东西都被认为是未知的。
请记住,预测的大小(更多的人,更多的可能性)和准确性之间需要权衡
答案 1 :(得分:1)
我认为svm在这里不能很好地工作。它是本机的二进制分类器。它将尝试计算两个128D点集(已知类和未知类)之间的边界,但是这些类在内部没有任何关系。已知可能比未知更类似于嵌入空间中的另一个已知。这对于SVM的推广将是一个问题。 SVM可以用于封闭集,但是您可以为未知面孔设置开放集。
使用非参数方法,并使用贝叶斯方法,为嵌入空间中的已知数据计算似然率与距离的函数,更为实用。就像您上一个问题一样。