人脸识别标签不稳定问题及解决方案:特征提取优化
-
标签一直在变换的问题可能是因为每次识别人脸时,使用的训练数据都是随机抽取的,因此可能会导致标签的变化。可以尝试使用固定的训练数据集进行识别,或者对训练数据进行排序后再使用。
-
可以使用特征提取的方法,将训练数据和测试数据都转换为特征向量,然后计算它们之间的欧式距离。这样可以减少计算量,提高识别速度。具体实现可以参考以下代码:
# 在训练阶段将训练数据转换为特征向量
features = []
labels = []
for f in ds_train.create_dict_iterator(output_numpy=True):
feature = network(Tensor(f['data'], ms.float32)).asnumpy()
label = f['label']
features.append(feature)
labels.append(label)
# 在测试阶段将测试数据转换为特征向量,并计算与所有训练数据的欧式距离
for (x, y, w, h) in rect:
face = gray[y:y + w, x:x + h].astype(np.float32)
face = cv2.resize(face, (100, 100))
feature = network(Tensor(face, ms.float32)).asnumpy()
distances = [((feature - f) ** 2).sum() for f in features]
min_index = np.argmin(distances)
if distances[min_index] < threshold:
label = labels[min_index]
cv2.putText(img1, subjects[label], (x, y), cv2.FONT_HERSHEY_COMPLEX, 1, (128, 128, 0), 2)
else:
label = 'unknown'
cv2.putText(img1, label, (x, y), cv2.FONT_HERSHEY_COMPLEX, 1, (128, 128, 0), 2)
其中,features是训练数据的特征向量列表,labels是对应的标签列表。在测试阶段,将测试数据转换为特征向量feature,然后计算与所有训练数据的欧式距离distances,找到距离最小的训练数据的索引min_index,然后将对应的标签作为识别结果。threshold是一个阈值,用来判断是否为未知人脸。如果最小距离小于阈值,则认为是已知人脸,否则为未知人脸。
原文地址: https://www.cveoy.top/t/topic/jqvY 著作权归作者所有。请勿转载和采集!