Menu

Multi-finger Matching

Dunsin O
2019-06-28
2019-06-28
  • Dunsin O

    Dunsin O - 2019-06-28

    The SourceAFIS projects is a very great library to start with on Fingerprint Recognition.

    I have implemented (using java) the 1:1 matching and it works fine.

    Nonetheless, a use case came up - capturing up to 3 images of per finger for three fingers - thumb, index and middle finger for both hands. So this implies that when I’m performing a match test for a particular user, I’m verifying the probe image against 3 fingerprint images * (3 fingers * 2 hands) which is a total of18 candidate fingerprint images. If have to probe per image, that would be quite expensive as explained in the documentation.

    I'm looking for the most efficient way to go about it.

    Your suggestions would be well appreciated. Thanks

     
  • Robert Važan

    Robert Važan - 2019-06-28

    Okay, so you enroll 3 impressions for each one of 6 fingers (3 per hand). Then you scan a single impression of a probe fingerprint.

    Do you know the finger position of the probe fingerprint? If so, you only need to compare against the 3 views of this finger in the candidate person.

    How many candidate persons do you have? Matching single candidate fingerprint is very cheap compared to feature extraction. Even if you have over a thousand persons, you can still parallelize over several cores to match all those fingerprints quickly.

    Why are you collecting 3 impressions of each finger? Is the sensor small? If so, can you use a sensor that is large enough? If some of the impressions are of lower quality, it is better to enroll the best one instead of enrolling and matching all three.

     
  • Dunsin O

    Dunsin O - 2019-06-28

    "Why are you collecting 3 impressions of each finger? Is the sensor small? If so, can you use a sensor that is large enough? If some of the impressions are of lower quality, it is better to enroll the best one instead of enrolling and matching all three."

    Hmm.. good question. Well I got this concept from the type of enrollment used by Digital Persona 4500 SDK - they capture up to 3 or 4 times I guess to ensure different possible positions,angles, and finger placements matches

    "Do you know the finger position of the probe fingerprint? " No I dont, it could be any finger position

    "How many candidate persons do you have? " For now less than 1000 users but we plan to scale to at least 50000 in the next 18 months

     

    Last edit: Dunsin O 2019-06-28
  • Robert Važan

    Robert Važan - 2019-06-28

    I haven't seen fingerprints from Digital Persona 4500, but it seems to be a large enough sensor. Multiple impressions are usually taken from very small sensors like those on phones.

    If you want to keep the 3 views, perhaps you should only check the 2nd and 3rd view only if the first view matches with some minimum score (maybe 10+). The reasoning is that if it is a matching fingerprint, then score above 10 is highly likely even if there's only a small overlap between the probe and the candidate. This should give you matching speed close to single-impression matching.

    50,000 persons times 6 fingers would take some serious hardware even with single impression unless you are willing to wait more than a second for the match results.

     
  • Robert Važan

    Robert Važan - 2019-06-28

    BTW, it is possible to perform template fusion, i.e. produce single unified template from multiple fingerprint scans. SourceAFIS doesn't support it yet, but I can develop it if someone is willing to sponsor the work. But in your case, I think the multiple impressions are an overkill and you can just drop them or use the 10+ score trick described above.

     

    Last edit: Robert Važan 2019-06-28
  • Dunsin O

    Dunsin O - 2019-06-28

    Great suggestion there @robert-vazan I think this is what I'd do. I store just A SINGLE impression as you explained here - "If you want to keep the 3 views, perhaps you should only check the 2nd and 3rd view only if the first view matches with some minimum score (maybe 10+). "

    But I would ensure I capture 2 or 3 times and ensure a good similarity score before saving just one. Thus matching would be way faster

     
  • Dunsin O

    Dunsin O - 2019-06-28

    But then one more thing, you talked about wait time.

    I observe (using Netbeans) an average run time of 6-7 secs for 1:1 matching

     
  • Robert Važan

    Robert Važan - 2019-06-28

    The benchmark you posted includes a lot of Maven and JVM overhead. The JVM didn't get a chance to warm up. SourceAFIS can match single probe against a database of candidates at the speed of 16,000 fingerprints per second per core on decent processor according to my tests.

     
  • Dunsin O

    Dunsin O - 2019-06-28

    " SourceAFIS can match single probe against a database of candidates at the speed of 16,000 fingerprints per second per core on decent processor according to my tests."

    Wow. what I did was clone the project from Bitbucket, import as a project to NetBeans and write a Java APP with a main class. See my code:

    /*
     * To change this license header, choose License Headers in Project Properties.
     * To change this template file, choose Tools | Templates
     * and open the template in the editor.
     */
    
    package com.machinezoo.sourceafis;
    
    //import java.nio.file.Path;
    import java.nio.file.Files;
    import java.nio.file.Paths;
    import java.io.IOException;
    
    /**
     *
     * @author dunsin
     */
    public class FingerPrintRun {
    
        public static void main(String [] parms)
        {
            try
            {
                System.out.println("Starting Test..");
    //            System.exit(0);
    
                byte[] probeImage = Files.readAllBytes(Paths.get("/Users/dunsin/desktop/test4.png"));
                byte[] candidateImage = Files.readAllBytes(Paths.get("/Users/dunsin/desktop/test3.png"));
    
                FingerprintTemplate probe = new FingerprintTemplate()
                    .dpi(500)
                    .create(probeImage);
    
                FingerprintTemplate candidate = new FingerprintTemplate()
                    .dpi(500)
                    .create(candidateImage);
    
                double score = new FingerprintMatcher()
            .index(probe)
            .match(candidate);
    
                double threshold = 40;
                boolean matches = score >= threshold;
    
            /*
                FMR is the frequency with which the system incorrectly
                recognizes non-matching fingerprints as matching.
                Threshold 40 corresponds to FMR 0.01%.
                Applications can increase the threshold to get exponentially lower
                FMR at the cost of slightly higher FNMR: false non-match rate.
                In the end, choice of threshold is application-dependent, 
                but 40 is a good starting point.
    
                Returned similarity score is a non-negative number that increases with similarity
                between probe and candidate fingerprints. 
                Application should compare the score to a threshold with expression (score >= threshold)
                to arrive at boolean match/non-match decision. 
                Threshold 10 corresponds to FMR (false match rate) of 10%,
                threshold 20 to FMR 1%,
                threshold 30 to FMR 0.1%,
                and so on.
                using 40, my FMR is 0.01%
                */
    
                System.out.println("Result of Fingerprint verification - Similarity score is "+score+" and match is "+matches);
           }
           catch(IOException exception)
           {
               System.out.println("Exception is "+exception);
           }
    
        }
    
    }
    
     
  • Robert Važan

    Robert Važan - 2019-06-28

    That's alright, but everything I said about the poor benchmark setup still holds. If you would like to discuss performance further, please create a separate thread for it.

     
  • Dunsin O

    Dunsin O - 2019-06-28

    ok thanks

     

Log in to post a comment.