Skip to content

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

Open

Description

@AloveDL

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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions