ArcFace-python
ArcFace-python copied to clipboard
循环调用虹软python接口会崩掉
我目前在做一个实时的人脸对比程序,我用了两个线程,第一个线程实时显示结果,第二个线程做人脸对比,年龄预测等功能,但是第二个线程总是崩掉,有时候也会报Fatal Python error: GC object already tracked这个错误,不知道什么原因 下面是我第二个线程循环调用的函数
def compare_face(self, ):
try:
if self.tmp_frame is not None:
new_img = self.tmp_frame.copy()
new_img = load_image(new_img)
image_ubytes = new_img.imageData.ctypes.data_as(POINTER(c_ubyte))
detect_faces = asf_struct.ASFMultiFaceInfo()
single_face = asf_struct.ASFSingleFaceInfo()
feature = asf_struct.ASF_FaceFeature()
detect_face_ret = asf_func.detect_face(
self.image_engine,
new_img.width,
new_img.height,
asf_common.ASVL_PAF_RGB24_B8G8R8,
image_ubytes,
byref(detect_faces)
)
if detect_face_ret != 0:
print("检测人脸失败:%s" % (detect_face_ret))
return 0
# self.lock.release()
if detect_faces.faceNum == 0:
return 0
else:
single_face.faceRect.left = detect_faces.faceRect[0].left
single_face.faceRect.top = detect_faces.faceRect[0].top
single_face.faceRect.right = detect_faces.faceRect[0].right
single_face.faceRect.bottom = detect_faces.faceRect[0].bottom
single_face.faceOrient = detect_faces.faceOrient[0]
single_face.faceDataInfo = detect_faces.faceDataInfoList[0]
get_feature_ret = asf_func.get_feature(
self.image_engine,
new_img.width,
new_img.height,
asf_common.ASVL_PAF_RGB24_B8G8R8,
image_ubytes,
byref(single_face),
asf_common.ASF_RegisterOrNot.ASF_RECOGNITION.value[0],
0,
byref(feature)
)
self.pos = [single_face.faceRect.left, single_face.faceRect.top, single_face.faceRect.right,
single_face.faceRect.bottom]
if get_feature_ret != 0:
print("人脸特征提取失败:%s" % (get_feature_ret))
for id, feature_data in enumerate(self.feature_set):
confidenceLevel = c_float()
feature1 = asf_struct.ASF_FaceFeature()
feature1.featureSize = feature.featureSize
featureptr = np.array(feature_data).ctypes.data_as(POINTER(c_ubyte))
for i in range(feature.featureSize):
featureptr[i] = feature_data[i]
feature1.feature = featureptr
compare_ret = asf_func.compare(
self.image_engine,
byref(feature),
byref(feature1),
byref(confidenceLevel),
asf_common.ASF_CompareModel.ASF_LIFE_PHOTO.value[0]
)
feature1 = None
if compare_ret != 0:
print("人脸对比失败:%s" % (get_feature_ret))
if confidenceLevel.value >= 0.8:
self.result_id = id + 1
break
process_ret = asf_func.process(
self.image_engine,
new_img.width,
new_img.height,
asf_common.ASVL_PAF_RGB24_B8G8R8,
image_ubytes,
byref(detect_faces),
self.process_mask
)
if process_ret != 0:
print("初始化人脸属性失败:%s" % (process_ret))
live_info = asf_struct.ASF_LivenessInfo()
live_ret = asf_func.get_livescore(
self.image_engine,
byref(live_info)
)
if live_ret != 0:
print("活体检测失败:%s" % (live_ret))
else:
self.is_live = live_info.isLive[0]
gender_info = asf_struct.ASFGenderInfo()
gender_ret = asf_func.get_gender(
self.image_engine,
byref(gender_info)
)
if gender_ret != 0:
print("性别检测失败:%s" % (gender_ret))
else:
self.gender = gender_info.genderArray[0]
# 年龄检测
age_info = asf_struct.ASFAgeInfo()
age_ret = asf_func.get_age(
self.image_engine,
byref(age_info)
)
if age_ret != 0:
print("年龄检测失败:%s" % (age_ret))
else:
self.age = age_info.ageArray[0]
else:
cv2.waitKey(30)
except Exception as e:
print(e)