用于指纹验证的C#框架

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mzl87/article/details/85949169

目录

介绍

在使用框架之前

运行指纹验证实验

可视化特征

从本框架中匹配指纹

向框架添加新算法

将现有算法集成到框架中

实验结果

结论

参考


在本文中,我们在C#中引入了一个用于指纹验证的框架,我们简要介绍了如何执行指纹验证实验以及如何将算法集成到框架中。

介绍

指纹识别[1]是当今活跃的研究领域。指纹识别系统的一个重要组成部分是指纹匹配算法。根据问题域,指纹匹配算法分为两类:指纹验证算法和指纹识别算法。指纹验证算法的目的是确定两个指纹是否来自同一个手指。另一方面,指纹识别算法搜索数据库中的查询指纹,寻找来自同一手指的指纹。

有数百篇关于指纹验证的论文,但据我们所知,网上没有任何指纹验证框架。因此,您必须实现自己的工具才能测试指纹验证算法的性能。此外,您必须花费大量时间来实现其他作者的算法以与您的算法进行比较。这是我们为每个人提供指纹验证框架的动力。

与我们的框架最密切相关的工作是FVC-onGoing网络系统。该系统具有以下限制:

  • 除了你的算法,你无法访问任何算法。
  • 它不是一个框架所以,你不能重用任何软件组件。
  • 它不能用于教育目的,因为学生无法看到算法如何工作。
  • 使用数据库(标准或硬件)执行实验后,您必须等待30天才能使用同一数据库执行另一个实验。
  • 您无法控制指纹数据库。因此,您不能使用自己的数据库也不能修改现有数据库。
  • 您无法访问算法无法匹配的指纹。因此,您无法分析算法失败的原因以修复代码。
  • 您无法使用自定义协议创建实验以进行性能评估。

如果上述任何限制对您构成问题,那么您应该使用我们的框架。

我们的框架是使用.NET FrameworkC#中实现的,主要有两个原因。首先,C#已成为最流行的编程语言之一。其次,.NET Framework上提供的技术,工具和类库为我们节省了大量的编码时间。

我们的框架允许对FVC2000FVC2002FVC2004的数据库BFVC2002FVC2004的数据库A进行指纹验证实验在这些实验中,我们使用指纹验证竞赛的性能指标[2]EER(%),FMR100(%),FMR1000(%),ZeroFMR(%),时间(ms)和ROC曲线)。此外,您可以包含自定义评估协议或不同数据库的实验。

我们实现了TicoKuosmanen [3]JiangYau [4]Medina-Pérez et al. [5,6,8,12] Qi et al. [9]等人提出的指纹验证算法。重要的是要强调,尽管Qi等人的算法是细节匹配算法与基于方向的算法的组合,我们只实现了细节匹配算法。我们还实现了Ratha[10]等人提出的特征提取算法和Sherlock[11]等人提出的定向图像提取器。此框架允许您以最少的工作量包含新的指纹匹配算法以及新的特征提取算法,而无需重新编译框架。

在开发此框架时我们牢记的目标之一是尽可能简化类接口。这样,添加新算法非常简单。

我们希望这项工作能激励您和更多人与我们合作,以实施更多算法。

在本文中,我们将简要解释如何:

  • 进行指纹验证实验,
  • 在使用基于细节的算法进行实验后查看匹配的细节,
  • 从某些指纹计算和显示特征,
  • 将您的算法集成到框架中。

在使用框架之前

此框架的扩展仅用于研究目的,在如下链接中https://sites.google.com/site/miguelmedinaperez/software/fprframework

通过本文,我们提供以下文件:

您可以实现自定义评估协议,并且可以使用自己的数据库。然而,我们实施了评估协议以使用以下数据库:

运行指纹验证实验

解压缩文件“ FingerprintRecognition.zip ”并构建解决方案。然后,您可以调试项目“ FR.FVCExperimenter,或者您可以执行此目录中的“ FR.FVCExperimenter.exe ”,其包含了生成的程序集。打开以下窗口:

https://www.codeproject.com/KB/library/MatchingFramework/fingerprintrecognition1.jpg

Resources文本框中,指定要使用的数据库的路径,例如:D:\PR Databases\Fingerprints\FVC2004\DB1_B。在组合框中选择具有标签Experiment的正确实验类型。使用组合框Minutia ExtractorOrientation Image ExtractorSkeleton Image Extractor选择将用于计算基本特征(细节,方向图像和骨架图像)的算法。

使用带有标签Matcher” 的组合框选择指纹验证算法,使用带有标签Feature Provider的组合框选择将用于存储和检索所选匹配器的功能的算法。尽管我们为每个匹配器只实现了一个功能提供程序,但是在某些情况下,每个匹配器可能有多个功能提供程序。

标签为Properties” 的网格允许更改任何所选算法的参数。

单击Execute Experiment按钮以运行实验。该实验使用指纹验证竞赛的评估协议[2]。在该实验中计算的性能指标是:EER(%),FMR100(%),FMR1000(%),ZeroFMR(%),时间(ms)和ROC曲线。这些指示符保存在一个文件中,该文件的名称由与.Summary.csv连接的匹配算法的名称组成。此文件以Results的名称保存在文件夹中,该文件夹位于存储指纹的同一文件夹中。保存另外两个文件,一个文件包含错误的匹配指纹,另一个文件包含错误的非匹配指纹。

如果要匹配两个指纹并验证重合的细节,请单击Visual Match按钮,这将打开Visual Fingerprint Matching窗口。加载要比较的指纹,然后单击Match按钮。在此FVC Experimenter中选择的特征提取器和匹配器也用于执行指纹匹配。以下是匹配两个指纹的示例:

https://www.codeproject.com/KB/library/MatchingFramework/fingerprintrecognition2.jpg

可视化特征

如果要显示特定指纹的特征,则可以使用FR.FeatureDisplay项目。在Fingerprint Feature Display窗体中,您可以更改特征提取器和特征显示。在框架中,我们包括可视化细节,方向图像和骨架图像的类。

以下是可视化指纹方向图像的示例:

https://www.codeproject.com/KB/library/MatchingFramework/FingerprintRecognition3.jpg

从本框架中匹配指纹

本节介绍使用框架匹配自定义用户应用程序中的两个指纹图像的示例。它包括比较两个指纹图像的三个步骤:图像加载,特征提取和特征比较。在这种情况下,用户需要将其应用程序中的引用添加到程序集FR.CoreFR.Medina2012。程序集SHullDelaunayTriangulationImageProcessingTools必须包含在二进制文件出现的输出文件夹中。

// Loading fingerprints
var fingerprintImg1 = ImageLoader.LoadImage(fileName1);
var fingerprintImg2 = ImageLoader.LoadImage(fileName2);

// Building feature extractor and extracting features
var featExtractor = new MTripletsExtractor(){ MtiaExtractor = new Ratha1995MinutiaeExtractor()};
var features1  =  featExtractor.ExtractFeatures(fingerprintImg1);
var features2  =  featExtractor.ExtractFeatures(fingerprintImg2);

// Building matcher and matching
var matcher = new M3gl();
double similarity = matcher.Match(features1, features2); 

使用M3gl匹配器的示例显示了使用框架是多么容易,以及用户代码的简洁性和自解释性。在框架中应用的良好设计规则允许用户以最小的努力替换或更改任何组件。例如,为了在上面的代码中使用PN匹配器,用户只需要用PNFeatureExtractor替换MTripletsExtractor,用PN替换M3gl,和用FR.Parziale2004替换FR.Medina2012

向框架添加新算法

您需要知道的第一件事是您不需要修改框架的应用程序以识别您的算法,因为我们使用反射在执行时动态加载所有算法。

您可以在包含框架的目录中创建任意数量的程序集。对于每个新程序集,转到属性并使用值..\bin\Release\” 设置输出路径。

要添加新的特征提取器,必须从泛型类继承FeatureExtractor<T>并实现ExtractFeatures(Bitmap image)方法。例如,假设您要为MyFeature类型的特征创建一个提取器,那么您可以实现如下所示的类:

public class MyFeatureExtractor : FeatureExtractor<MyFeature>
{
    public override MyFeature ExtractFeatures(Bitmap image)
    {
        // Place here your code to extract features
    }
} 

如果您的新功能是基于某些现有功能构建的,那么您可以执行以下操作:

public class MyFeatureExtractor : FeatureExtractor<MyFeature>
{     
    public FeatureExtractor<List<Minutia>> MtiaExtractor { set; get; }

    public FeatureExtractor<OrientationImage> OrImgExtractor { set; get; }

    public override MyFeature ExtractFeatures(Bitmap image)
    {
    try
        {
             var mtiae = MtiaExtractor.ExtractFeatures(image);
             var orImg = OrImgExtractor.ExtractFeatures(image);
             return ExtractFeatures(mtiae, orImg);
        }
        catch (Exception e)
        {
             if (MtiaExtractor == null)
                throw new InvalidOperationException("Cannot extract MyFeature: 
                                               Unassigned minutia list extractor!", e);
             if (OrImgExtractor == null)
                throw new InvalidOperationException("Cannot extract MyFeature: 
                                               Unassigned orientation image extractor!", e);
             throw;
        }
    }

    public MyFeature ExtractFeatures(List<Minutia> mtiae, OrientationImage orImg)
    {
        // Place here your code to extract features
    }       
}

对于每个特征提取器,您必须创建资源提供者。资源提供程序允许将与指纹关联的资源保存(检索)到(从)文件。该框架包括用于细节(MinutiaListProvider)的提取器,方向图像(OrientationImageProvider)和骨架图像(SkeletonImageProvider)的资源提供者。以下是上面定义的特征提取器的资源提供程序的示例。

public class MyFeatureProvider : ResourceProvider<MyFeature>
{
    public MinutiaListProvider MtiaListProvider { get; set; }

    public OrientationImageProvider OrImgProvider { get; set; }

    public override string GetSignature()
    {
        return "myf";        
    }

    public override bool IsResourcePersistent()
    {
        return true;
    }

    protected override MyFeature Extract(string fingerprint, ResourceRepository repository)
    {
        try
        {
            var mtiae = MtiaListProvider.GetResource(fingerprint, repository);
            var orImg = OrImgProvider.GetResource(fingerprint, repository);
            return featureExtractor.ExtractFeatures(mtiae, orImg);
        }
        catch (Exception e)
        {
            if (MtiaListProvider == null)
                throw new InvalidOperationException
                     ("Unable to extract MyFeature: Unassigned minutia list provider!", e);
            if (OrImgProvider == null)
                throw new InvalidOperationException
                     ("Unable to extract MyFeature: Unassigned orientation image provider!", e);
            throw;
        }
    }

    private MyFeatureExtractor featureExtractor = new MyFeatureExtractor();
}

现在,是时候创建一个新的指纹匹配算法了。假设您要匹配MyFeature类型的特征,那么您必须创建如下的匹配器:

public class MyMatcher : Matcher<MyFeature>
{        
    public override double Match(MyFeature query, MyFeature template)
    {
        // Place here your code to match fingerprints
    }
}

如果您正在实现细节匹配算法,那么您应该修改上面的代码,如下所示:

public class MyMatcher : Matcher<MyFeature>, IMinutiaMatcher
{
    public override double Match(MyFeature query, MyFeature template)
    {
        List<MinutiaPair> matchingMtiae;
        return Match(query, template, out matchingMtiae);
    }

    public double Match(object query, object template, out List<MinutiaPair> matchingMtiae)
    {
        // Place here your code to match fingerprints
    }
}

将现有算法集成到框架中

用户不需要修改框架以集成自定义算法,因为反射用于在执行时动态加载所有算法。这样,用户应该将新算法添加到他们自己的自定义程序集中。

为了在框架内使用现有的匹配算法,用户需要做的第一件事就是创建资源提供者。资源提供程序允许将与指纹关联的资源保存(检索)到(从)文件。例如,假设用户想要将SourceAFIS SDKhttp://www.sourceafis.org/)集成到框架中,则可以使用以下特征提供者:

public class SourceAFISFeatureProvider : ResourceProvider<Person>
{
  protected  override  Person  Extract(string  fingerprint, ResourceRepository repository)
  {
    Fingerprint fp = new  Fingerprint();
    fp.AsBitmap = imageProvider.GetResource(fingerprint, repository); 
    Person person = new Person(); 
    person.Fingerprints.Add(fp); 
    Afis.Extract(person);
    return person;
  }

  public override string GetSignature()
  {
    return string.Format("sAFIS");
  }

  public  override  bool  IsResourcePersistent()
  {
    return true;
  }
  
  private static AfisEngine Afis = new AfisEngine();
} 

现在,指纹匹配算法可以封装在以下类中:

public class SourceAFISMatcher : Matcher<Person>
{
  public override double Match(Person query, Person template)
  {
    return Afis.Verify(query, template);
  }
  
  private static AfisEngine Afis = new AfisEngine();
} 

实验结果

我们使用此框架中包含的指纹匹配算法进行了大量实验。实验设置以及结果的统计分析可以在[13]中查看。

结论

在本文中,我们在C#中引入了一个用于指纹验证的框架。我们简要介绍了如何执行指纹验证实验以及如何将算法集成到框架中。我们提供了几种匹配算法和特征提取算法,您不仅可以将其用于实验目的,还可以创建自己的应用程序。我们提供了所有算法的源代码,以便用户可以重用代码的任何部分以及任何软件组件。

参考

  1. D. Maltoni, D. Maio, A. K. Jain, and S. Prabhakar, "Handbook of fingerprint recognition," Second ed. London: Springer-Verlag, 2009.
  2. R. Cappelli, D. Maio, D. Maltoni, J. L. Wayman, and A. K. Jain, "Performance evaluation of fingerprint verification systems," IEEE Transactions on Pattern Analysis and Machine Intelligence, vol. 28, pp. 3-18, 2006.
  3. M. Tico and P. Kuosmanen, "Fingerprint matching using an orientation-based minutia descriptor," IEEE Transactions on Pattern Analysis and Machine Intelligence, vol. 25, pp. 1009-1014, 2003.
  4. X. Jiang and W. Y. Yau, "Fingerprint minutiae matching based on the local and global structures," in 15thInternational Conference on Pattern Recognition, Barcelona, Spain, 2000, pp. 1038-1041.
  5. M. A. Medina-Pérez, A. Gutiérrez-Rodríguez, and M. García-Borroto, "Improving fingerprint matching using an orientation-based minutia descriptor," in 14th Iberoamerican Congress on Pattern Recognition, CIARP 2009, Guadalajara, México, 2009, pp. 121-128.
  6. M. A. Medina-Pérez, M. García-Borroto, A. E. Gutierrez-Rodriguez, L. Altamirano-Robles, "Robust fingerprint verification using m-triplets," in: International Conference on Hand-Based Biometrics (ICHB 2011), Hong Kong, 2011, pp. 1-5. (DOI: 10.1109/ICHB.2011.6094348. E-ISBN: 978-1-4577-0489-5. Print ISBN: 978-1-4577-0491-8).
  7. W. Wang, J. Li, and W. Chen, "Fingerprint minutiae matching based on coordinate system bank and global optimum alignment," in 18th International Conference on Pattern Recognition, 2006, vol. 4, pp. 401-404.
  8. M. A. Medina-Pérez, M. García-Borroto, A. E. Gutierrez-Rodriguez, L. Altamirano-Robles, "Improving the multiple alignments strategy for fingerprint verification," Lecture Notes in Computer Science, vol. 7329, 2012. (Accepted for publication)
  9. J. Qi, S. Yang, and Y. Wang, "Fingerprint matching combining the global orientation field with minutia," Pattern Recognition Letters, vol. 26, pp. 2424-2430, 2005.
  10. N. Ratha, S. Chen, and A. K. Jain, "Adaptive flow orientation-based feature extraction in fingerprint images," Pattern Recognition, vol. 28, pp. 1657-1672, 1995.
  11. B. G. Sherlock, D. M. Monro, and K. Millard, "Fingerprint enhancement by directional Fourier filtering," IEE Proceedings Vision Image and Signal Processing, vol. 141, no. 2, pp. 87-94, 1994.
  12. M. A. Medina-Pérez, M. García-Borroto, A. E. Gutierrez-Rodríguez, and L. Altamirano-Robles, “Improving Fingerprint Verification Using Minutiae Triplets,” Sensors, vol. 12, pp. 3418–3437, 2012.
  13. M. A. Medina-Pérez, O. Loyola-González, A. E. Gutierrez-Rodríguez, M. García-Borroto, and L. Altamirano-Robles, “Introducing an experimental framework in C # for fingerprint recognition,” Lecture Notes in Computer Science, vol. 8495, pp. 132–141, 2014.

 

原文地址:https://www.codeproject.com/Articles/97590/A-Framework-in-C-for-Fingerprint-Verification-2

猜你喜欢

转载自blog.csdn.net/mzl87/article/details/85949169
今日推荐