ArcFace-python icon indicating copy to clipboard operation
ArcFace-python copied to clipboard

循环调用虹软python接口会崩掉

Open AloveDL opened this issue 3 years ago • 0 comments

我目前在做一个实时的人脸对比程序,我用了两个线程,第一个线程实时显示结果,第二个线程做人脸对比,年龄预测等功能,但是第二个线程总是崩掉,有时候也会报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)

AloveDL avatar Jan 10 '22 06:01 AloveDL