我目前在做一个实时的人脸对比程序,我用了两个线程,第一个线程实时显示结果,第二个线程做人脸对比,年龄预测等功能,但是第二个线程总是崩掉,有时候也会报Fatal Python error: GC object already tracked这个错误,不知道什么原因
下面是我第二个线程循环调用的函数
defcompare_face(self, ):
try:
ifself.tmp_frameisnotNone:
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)
)
ifdetect_face_ret!=0:
print("检测人脸失败:%s"% (detect_face_ret))
return0# self.lock.release()ifdetect_faces.faceNum==0:
return0else:
single_face.faceRect.left=detect_faces.faceRect[0].leftsingle_face.faceRect.top=detect_faces.faceRect[0].topsingle_face.faceRect.right=detect_faces.faceRect[0].rightsingle_face.faceRect.bottom=detect_faces.faceRect[0].bottomsingle_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]
ifget_feature_ret!=0:
print("人脸特征提取失败:%s"% (get_feature_ret))
forid, feature_datainenumerate(self.feature_set):
confidenceLevel=c_float()
feature1=asf_struct.ASF_FaceFeature()
feature1.featureSize=feature.featureSizefeatureptr=np.array(feature_data).ctypes.data_as(POINTER(c_ubyte))
foriinrange(feature.featureSize):
featureptr[i] =feature_data[i]
feature1.feature=featureptrcompare_ret=asf_func.compare(
self.image_engine,
byref(feature),
byref(feature1),
byref(confidenceLevel),
asf_common.ASF_CompareModel.ASF_LIFE_PHOTO.value[0]
)
feature1=Noneifcompare_ret!=0:
print("人脸对比失败:%s"% (get_feature_ret))
ifconfidenceLevel.value>=0.8:
self.result_id=id+1breakprocess_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
)
ifprocess_ret!=0:
print("初始化人脸属性失败:%s"% (process_ret))
live_info=asf_struct.ASF_LivenessInfo()
live_ret=asf_func.get_livescore(
self.image_engine,
byref(live_info)
)
iflive_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)
)
ifgender_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)
)
ifage_ret!=0:
print("年龄检测失败:%s"% (age_ret))
else:
self.age=age_info.ageArray[0]
else:
cv2.waitKey(30)
exceptExceptionase:
print(e)
我目前在做一个实时的人脸对比程序,我用了两个线程,第一个线程实时显示结果,第二个线程做人脸对比,年龄预测等功能,但是第二个线程总是崩掉,有时候也会报Fatal Python error: GC object already tracked这个错误,不知道什么原因
下面是我第二个线程循环调用的函数