Monday, 11 November 2019

Luxand API for similarity on android

I'm going to use Luxand api for detect persons. Scenario:

1- At the first on register activity persons sit in front of the camera and take pictures and templates save on sqlite database. also personal information will be save;

2- After that On detect activity one of them sit in front of the camera and take Auto detection and find same temp and show person information.(similarity is 96%)

my problem:Unfortunately too times detection is wrong and two different people’s templates will be recognized as the same person. My Code:

1- Register activity for register form

  for (int i = 0; i < MAX_FACES; ++i) {
  if (rects[i] != null && rects[i].x1 <= x && x <= rects[i].x2 && rects[i].y1 <= y && y <= rects[i].y2 + 30) {
      mTouchedID = IDs[i];

      mTouchedIndex = i;
       temp = (byte[]) ImageFrameFaceIDTemps.get(mTouchedID);
        if (mPreview != null) {
             onTouchMode = true;
              try {
                    requesting name on tapping the face  
                     if (faceSelected != null) {                         
                      faceSelected.Selected(temp, data);
                     }
                  } finally {
                      onTouchMode = false;
                  }
        }
                        break;
  }

2- Detection activity for match form

    public int RetrievePersonDetection(byte[] template, float[] maxSimilarity_UnderAccepted, float[] maxSimilarityArray) {

    if (IDTemps == null || IDTemps.size() == 0) {
        return 0;
    }
    int person = 0;
    FSDK_FaceTemplate currentFaceTemp = new FSDK_FaceTemplate();
    currentFaceTemp.template = template;
    float[] similarityArray = new float[1];
    float maxSimilarity = 0;
    float MatchingThreshold[] = new float[1];
    FSDK.GetMatchingThresholdAtFRR(LocalSetting.MIN_ACCEPTED_SIMILAITY, MatchingThreshold);
    for (int i = 0; i < IDTemps.size(); i++) {
        long key = IDTemps.keyAt(i);
        FSDK_FaceTemplate faceTemp = (FSDK_FaceTemplate) IDTemps.get(key);
        int result = FSDK.MatchFaces(currentFaceTemp, faceTemp, similarityArray);
        if (result == 0) {
            if (maxSimilarity < similarityArray[0] && similarityArray[0] >= MatchingThreshold[0]) {
                maxSimilarity = similarityArray[0];
                person = (int) key;
                maxSimilarityArray[0] = similarityArray[0];
                FSDK_FaceTemplate currentFaceTemp2 = new FSDK_FaceTemplate();
            }
            else if (maxSimilarity_UnderAccepted[0] < similarityArray[0]) {
                maxSimilarity_UnderAccepted[0] = similarityArray[0];
            }
        }
    }

    return person;
}

I don't no what's my problem? why return wrong person and 2 person similarity is 96%



from Luxand API for similarity on android

No comments:

Post a Comment