SourceAFIS/教程
本教程將指導您瞭解SourceAFIS的基礎知識。它不提供完整的原始碼列表 - 請檢視分發包中的示例應用程式以獲取完整的可編譯原始碼。這裡重點關注SourceAFIS特定的主題。關於指紋匹配的常規資訊可以在本教程中連結的外部資源中找到。
要使用指紋影像,需要以某種方式獲得它們。SourceAFIS沒有內建的指紋採集方法。採集通常使用專門的活體指紋指紋讀取器進行。指紋讀取器透過影像採集SDK訪問,該SDK可以從裝置製造商處獲得。請確保您的指紋讀取器允許您檢索指紋影像,而不是某些供應商專有的模板。其他採集方法也是可能的,例如掃描墨跡指紋或從犯罪現場獲取潛指紋。無論採用哪種方法,最終都會得到某種標準格式(例如 BMP、JPEG)的指紋影像或原始灰度影像。SourceAFIS可以使用所有常見的影像格式。
在使用SourceAFIS功能之前,您需要執行一些簡單的設定步驟。首先,從SourceForge 下載區下載最新版本的SourceAFIS並安裝它。在您首選的開發環境(Visual Studio 或 MonoDevelop)中開啟您的應用程式,並將SourceAFIS.dll新增到您的應用程式的引用。開啟您要呼叫SourceAFIS方法的原始檔,並新增使用指令,用於SourceAFIS.Simple 名稱空間。
using SourceAFIS.Simple;
建立新的AfisEngine 物件並將其儲存在某個位置,以便應用程式中的所有程式碼都可以訪問它。建立多個AfisEngine 物件是可以的,但是為了簡單起見並提高效能,建議在靜態變數中只保留一個AfisEngine,如下所示
static AfisEngine Afis = new AfisEngine();
一旦您擁有了SourceAFIS的工作設定和一些採集到的指紋,就可以將它們匯入SourceAFIS。以下示例使用屬性AsBitmapSource、AsBitmap 和Image 建立了三個Fingerprint 物件,以處理不同的影像格式。
// using .NET 3.0 (WPF) bitmap
Fingerprint fp1 = new Fingerprint();
fp1.AsBitmapSource = new BitmapImage(new Uri(pathToImage, UriKind.RelativeOrAbsolute));
// using .NET 2.0 (WinForms) bitmap
Fingerprint fp2 = new Fingerprint();
fp2.AsBitmap = new Bitmap(Bitmap.FromFile(pathToImage));
// using raw grayscale image (see API docs for format description)
Fingerprint fp3 = new Fingerprint();
fp3.Image = myRawImage;
SourceAFIS 支援每個人有多個指紋。如果您現在只需要一個指紋,只需將其包裹在Person 物件中,如下所示
Person person = new Person();
person.Fingerprints.Add(fp);
SourceAFIS 不會直接匹配指紋影像。它會提取 指紋影像中的細節特徵,並將它們儲存在指紋模板 中,該模板比原始影像小得多,匹配速度也快得多。以下是執行提取過程的方法
Afis.Extract(person);
提取的模板保留在Fingerprint 物件的Template 屬性中。模板提取非常耗時,每個指紋大約需要 150 毫秒。因此,明智的做法是在指紋採集後只執行一次提取,並將模板或整個Fingerprint/Person 物件與指紋影像一起儲存在資料庫中。
到目前為止,您已經採集了指紋影像,提取了指紋模板,並建立了包含單個Fingerprint 的Person 物件。此過程會針對所有傳入的指紋重複執行。現在我們擁有了所有模板,如何進行匹配?很簡單,只需將兩個Person 物件傳遞給AfisEngine.Verify,如下所示
float score = Afis.Verify(person1, person2);
bool match = (score > 0);
此方法執行一對一(或 1:1,也稱為驗證)匹配,並返回兩個指紋之間的相似度得分。如果返回的相似度得分是零,則指紋是不同的。如果得分高於零,則兩個指紋匹配,相似度得分反映匹配的準確性。
與任何其他分類 系統一樣,SourceAFIS 會產生分類錯誤,從而降低其準確性。準確性進一步細分為
SourceAFIS 允許您透過設定AfisEngine.Threshold 為適當的匹配閾值,來選擇特定於應用程式的 FAR 和 FRR 之間的平衡。這會指示AfisEngine.Verify 在相似度得分低於AfisEngine.Threshold 時返回零。較高的閾值可以保持 FAR 較低。較低的閾值可以保持 FRR 較低。
在某個平衡閾值下,FAR 和 FRR 相等,它們構成 EER(等誤差率)。近似 EER 的最簡單方法是使用匹配和非匹配指紋對進行一些測試,觀察典型的匹配得分和典型的非匹配得分,並將閾值設定在兩者之間。然後,您可以根據對 FAR 或 FRR 的偏好,將閾值向上或向下調整。
請注意,SourceAFIS 無法提供標準閾值,因為 EER 在不同的閾值下會發生變化,具體取決於指紋特徵,例如指紋讀取器型別、取樣人群和使用的註冊策略。更一般地說,ROC 曲線(FAR 和 FRR 作為閾值函式的曲線圖)對於用於對 SourceAFIS 進行基準測試的每個測試資料庫來說都是不同的。然而,SourceAFIS 確實為 AfisEngine.Threshold 設定了預設值,該值應該適用於原型以及您應用程式的初始測試。
既然您已經完成了一些簡單的 一對一驗證,現在是時候嘗試進行 一對多 (1:N) 識別了。為了搜尋整個指紋資料庫,請將所有 Person 物件(候選物件)放入一個 可列舉 集合中,並將該集合傳遞給 AfisEngine.Identify,以及要查詢的探測 Person。
Person matchingCandidate = Afis.Identify(probePerson, allCandidates).FirstOrDefault();
bool match = (matchingCandidate != null);
從功能上來說,這等同於以下 LINQ 查詢,只是 AfisEngine.Identify 的速度要快得多
Person matchingCandidate = (from candidate in allCandidates
let score = Afis.Verify(probePerson, candidate)
where score >= Afis.Threshold
orderby score descending
select candidate).FirstOrDefault();
bool match = (matchingCandidate != null);
AfisEngine.Identify 返回陣列中與探測指紋匹配的候選物件。如果所有候選物件的匹配分數都低於 AfisEngine.Threshold,則 AfisEngine.Identify 返回 null。如果有多個候選物件的匹配分數高於閾值,則 AfisEngine.Identify 返回相似度分數最高的候選物件。
為了部署使用 SourceAFIS 的應用程式,您只需要分發一個檔案:SourceAFIS.dll。將 SourceAFIS.dll 安裝在您安裝應用程式可執行檔案的同一資料夾中。SourceAFIS 除了 .NET Framework 之外沒有其他依賴項。SourceAFIS 不使用任何系統功能或不安全的程式碼。因此,它應該在 ASP.NET 或 Silverlight 等安全環境中執行。
儘管在本教程中我們使用的是每人一個指紋,但 SourceAFIS 支援多指匹配,以提高準確性。只需在每個 Person 物件中新增更多 Fingerprint 物件,並將這些 Person 物件傳遞給 Verify 或 Identify。您可以使用 Fingerprint.Finger 屬性來限制匹配到相容的指紋對。您還可以設定 AfisEngine.MinMatches 來控制從單個指紋組合分數的過程。
SourceAFIS 允許您透過設定 AfisEngine.Dpi 來使用不同 DPI 的感測器。
Person 和 Fingerprint 類支援在二進位制流和 XML 中序列化。您還可以透過訪問屬性 Fingerprint.Template 和 Fingerprint.AsXmlTemplate 來序列化單個模板,分別用於二進位制和 XML 編碼。這兩個類都支援繼承,因此您可以新增(並序列化)自己的欄位/屬性。SourceAFIS 支援使用 Fingerprint.AsIsoTemplate 屬性匯出/匯入 ISO/IEC 19794-2:2005 模板。
請參閱 SourceAFIS 分發包中包含的示例,瞭解使用 SourceAFIS 的可執行應用程式。有關 SourceAFIS 功能的詳細資訊,請參閱 API 參考。如果您還有其他問題,請在 SourceAFIS 論壇 中提問。