指纹识别是现今一个较为活跃的研究领域。 在指纹识别中一个重要的组件是指纹匹配算法。指纹匹配算法根据问题领域可分为两类:指纹验证算法与指纹识别算法。指纹验证算法用以检测两个指纹是否来自于相同的手指。另一方面, 指纹识别算法从数据库中搜索查询指纹以查找来自相同手指的指纹。
正如我们所知道的,有很多关于指纹验证的文章,但在网络上却没有一个指纹验证的框架。所以你不得不实现自己的工具来测试你的指纹验证算法的性能。另外你必须花费大量时间实现其他人的算法来与你的算法做比较。这是我们把我们的指纹验证框架提供给每个人的动机。
FVC-onGoing web系统是一个与我们的框架密切相关的项目。 这个系统有如下的限制:
你只能访问自己的算法。
它不是一个框架,所以你不能复用任何软件组件。
它不能用于教育用途,因为学生不能了解算法是怎样运行的。
当用一个数据库进行了一次实验(标准的或困难的),你必须等30天后才能用这个数据库进行另一个实验。
你不能访问与你的算法匹配失败的指纹。因此你不能分析算法失败的原因来修正你的代码。
你不能为了评估效果用自定义的协议来创建实验。
如果以上限制中的任一条给你带来了麻烦,那你应该用下我们的框架。
我们的框架采用.Net框架的C#语言实现有两个主要原因。首先,C#已经成为了最流行的编程语言之一。另外,.Net框架下的技术,工具和类库能节省我们大量的编码时间。
我们的框架允许指纹识别算法运行在FVC2000、FVC2002、FVC2004的数据库B;和FVC2002和FVC2004的数据库A上的实验。在这个实验中,我们在指纹识别竞赛中使用这些性能指标 (EER(%), FMR100(%), FMR1000(%), ZeroFMR(%), Time(ms) and ROC curves)。此外,你可以添加自定义的评估协议或使用不同的数据库来进行实验。
我们是在Tico , Kuosmanen [3], Jiang ,Yau [4], Medina-Pérez et al. [5, 6, 8, 12], Qi et al. [9]的提议下来实现指纹验证算法.所以高亮显示他们很重要,虽然Qi et al.的这个用定向细节的算法整合的匹配算法,我们实现的也只是匹配算法的细节。我们也在Ratha et al. [10]的提议下实现了算法的特征提取和在Sherlock et al. [11]的提议下实现了定向图像提取器。这个框架允许你添加新的指纹匹配算法就像在不重编译框架的基础上使用新的特征提取带来最小的影响。
我们在开发这个框架时牢记的目标之一是尽可能简单地实现类接口。因此,要添加新的算法非常简单。
我们希望这项工作能激励你和更多的人与我们合作以实现更多的算法。
在这篇文章中,我们简要说明如何做这些事:
进行指纹验证实验;
进行基于细节的算法实验后看到一个匹配的细节;
计算和显示某些指纹的特征;
整合你的算法到框架中。
在这篇文章中,我们提供以下文件:
FingerprintRecognition_v2.2.zip :这是我们框架的源码。
Help.zip :源码的说明文档。
你可以实现自定义的评估协议,可以使用自己的数据库进行工作。但必不可少的,我们实现了与以下数据库工作的评估协议:
FVC2000
FVC2002
DB1A
DB2A
DB3A
DB4A
FVC2004
DB1_A
DB2_A
DB3_A
DB4_A
解压文件 “FingerprintRecognition.zip” ,构建解决方案。然后你可以调试项目 “FR.FVCExperimenter” ,或在包含通用组件的目录中执行 “FR.FVCExperimenter.exe”。下面的窗口将被打开:
在 “Resources” 文本框中,指定你要使用的数据库的路径,例如 “D:PR DatabasesFingerprintsFVC2004DB1_B” 。在有 “Experiment” 标签的组合下拉框中选择适当的实验类型。用组合下拉框 “Minutia Extractor”, “Orientation Image Extractor” 和 “Skeleton Image Extractor“ 来选择用于计算三种基本特征的算法(细节,定位图像,骨架图像)。
用组合下拉框“Matcher”选择指纹验证算法,组合下拉框“Feature Provider”选择用于为所选Matcher进行存储和检索特征的算法。尽管我们为每个Matcher只实现了一个特征提供器,在有可能的情况下,你可以有多个特征提供器。
标签为“Properties”的表格可以改变任意所选算法的参数。
点击 “Execute Experiment” 按钮运行实验。本实验采用指纹识别竞赛[2]的评估协议。这个实验计算的性能指标有:能效比(%),指纹匹配率100(%),指纹匹配率1000(%),零指纹匹配率(%),时间(毫秒)和ROC曲线。这些指标都保存在一个文件中,名称是由匹配算法级联".Summary.csv"形成的名称。这个文件保存在指纹所在文件夹的一个名为"Results"的子文件夹中。另外还有两个文件被保存,一个文件含有匹配错误的指纹,另一个含有匹配无误的指纹。
如果你想匹配两个指纹并验证一致的细节,那么单击“Visual Match”按钮将打开“Visual Fingerprint Matching”窗体。载入你想比较的指纹并单击“Match”按钮。在“FVC Experimenter”窗体中选择的特征提取器和匹配器也用在这里来执行指纹匹配。下面是匹配两个指纹的一个例子:
如果你想让某些指纹的特征能够可视化,那么你可以使用“FR.FeatureDisplay”项目。在“Fingerprint Feature Display”窗体中,你可以改变特征提取器和特征显示类型。在这个框架中,我们包括了对细节、定位图像和骨架图像的可视化的类。
下面是一个指纹的定位图像的可视化例子:
本节介绍了在一个自定义的用户应用程序中使用框架匹配两个指纹图像的例子。它包括用于比较两个指纹图像的三个步骤:图像加载,特征提取,特征比较。在这种情况下,用户需要从他们的应用程序添加对组件 FR.Core 和 FR.Medina2012 的引用。组件 SHullDelaunayTriangulation 和 ImageProcessingTools 必须包含在二进制文件出现的输出文件夹中。
// 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。
你需要知道的第一件事是,你不需要为识别你的算法而去修改框架的应用程序,因为我们使用反射来在执行时动态加载所有算法。
您可以在含有框架的目录中创建任意多个组件。对每一个新的组件,到“属性”中设置输出路径为“..inRelease”。
为了添加一个新的特征提取器,你必须从泛型类 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 SDK(http://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(); }本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。 2KB翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
2KB项目(www.2kb.com,源码交易平台),提供担保交易、源码交易、虚拟商品、在家创业、在线创业、任务交易、网站设计、软件设计、网络兼职、站长交易、域名交易、链接买卖、网站交易、广告买卖、站长培训、建站美工等服务