首先,我对这个领域很陌生。也许我的问题有点太天真了,甚至是微不足道的..
我目前正在尝试了解如何识别不同的面孔。这是我到目前为止尝试的方法以及每种方法的主要问题:
1) Haar Cascade -> HOG -> SVM:主要问题是当训练超过 4 个人时,算法变得非常优柔寡断。当我们将 Haar Cascade 更改为预训练的 CNN 以检测人脸时,也会发生同样的情况。
2) dlib 面部标志 -> 点之间的距离 -> SVM 或简单神经网络分类:这是当前的方法,当训练 4 个人时它表现得非常好。当训练更多人时,它变得非常混乱,从决策中跳出来做出决定,从不下定决心做出选择。
我在网上读到 Triplet loss 是要走的路。但我很困惑 id 如何实现它。我可以使用使用 Dlib 找到的当前距离向量,还是应该放弃所有内容并训练我自己的 CNN?
如果我可以使用距离向量,我将如何将数据传递给算法?Triplet loss 是一个简单的神经网络,只是改变了它的损失函数?
我冒昧地展示了如何计算距离向量:
绿线表示正在计算的距离返回一个 33 浮点列表,然后将其馈送到分类器
这是分类器(Keras)的相关代码:
def fit_classifier(self):
x_train, y_train = self._get_data(self.train_data_path)
x_test, y_test = self._get_data(self.test_data_path)
encoding_train_y = np_utils.to_categorical(y_train)
encoding_test_y = np_utils.to_categorical(y_test)
model = Sequential()
model.add(Dense(10, input_dim=33, activation='relu'))
model.add(Dense(20, activation='relu'))
model.add(Dense(30, activation='relu'))
model.add(Dense(40, activation='relu'))
model.add(Dense(30, activation='relu'))
model.add(Dense(20, activation='relu'))
model.add(Dense(10, activation='relu'))
model.add(Dense(max(y_train)+1, activation='softmax'))
model.compile(loss='mse', optimizer='adam', metrics=['accuracy'])
model.fit(x_train, encoding_train_y, epochs=100, batch_size=10)
我认为这是一个比其他任何问题都更具理论性的问题。如果在该领域有丰富经验的人可以帮助我,我会非常高兴!