私は指紋リーダーsecugenを持っており、指紋をスキャンすることでアプリケーションに指紋デバイスを制御させることができ、それらをmysqlデータベースに保存することができました!
指紋をデータベースに保存した後、指紋を使用してユーザーを検索したいのですが、指紋がblob/imgとして保存されているため、新しい指紋を使用して検索できません。したがって、データベースでの検索に使用するには、指紋を一意のIDに変換する必要がありますか?
私は9,000,000ユーザーのmysqlデータベースを持っています。これで、ユーザー(ユーザー名)を使用して任意のユーザー情報を取得できます
SELECT USERS FROM members WHERE username=username_var
しかし、(username)
の代わりに指紋テンプレートがあり、指紋は毎回変更されるため、クエリでWHERE
を使用できなくなり、クエリで指紋を使用できなくなりました。クエリでWHERE
を使用する場合の(username)
のように。
すべての指紋SDKにはこれを支援する機能がありますが、それほど高速ではなく、検索に7分かかり、非常に長い時間がかかります。
どうしたらいいのかわからない。私の問題をご理解いただければ幸いです
SDKは、センサーから取得した指紋を、正規表現を使用したリラックス/近似パターンマッチングに適した文字列、またはバイナリマッチングに適した固定サイズのバイナリビットベクトルに変換する方法を提供します。 またはこの変換を自分で行うにはライブラリを見つける必要があります。他のすべてのケースは、理論的には実行可能ですが、単に実用的ではありません。
画像だけでは何もできません。
そしてこの場合、Secugen [〜#〜] sdk [〜#〜] 画像へのアクセスのみを許可します(診断目的で、私は想像します)そしてチェック自体を実行する必要があります(そのために1:Nキットが必要です。1:1キットでは実行できません)。それでもこれを追求したい場合は、下部に提案を含めます。 本当に提案されていません。
指紋は互いに非常に似ているため、標準の画像検索に対応できません。さらに悪いことに、同じ人物からの同じ指紋が2つの測定値で同じように見えることはありません。圧力、速度、方向、環境温度、センサー、皮膚の水分レベルが異なると、画像も異なります。基本的に、指紋を「特徴ベクトル」に変換するまでは、nothingを実行できます。
代わりに、指紋画像を特別な特徴点(交差点、渦巻きなど、minutiaeと呼ばれる)のリストに変換する関数があります(SDKにはそれらが必要です)。それらの相対的な位置と他のパラメータ。これが発生するレベルは、使用しているSDKとライブラリによって異なります。複数のメソッドがあります。非常に特定のセンサーをターゲットにすることは役立ちますが、その場合、方法は提供するものが異なります(たとえば、堅牢性、わずかな指紋の回転に対する不変性など)。例および他のメソッドへの参照については、 このペーパー を参照してください。
一部のキットはこれを許可せず(ユーザーに特徴ベクトルを提供しません)、2つの指紋画像を比較する手段のみを提供します。通常はPCAを使用してそれらを位置合わせし、直接細目マッチングを実行します。これはいくつかの画像で非常にうまく機能しますが、 データベースで画像を見つけるための実行時間は台無しになる可能性があります 、タスクに特化したハードウェアが存在するほどです(google '自動指紋識別システム')。
特徴ベクトルを取得したら、それをSQLの保存可能なオブジェクトに変換する必要があります。これは、タプル内の文字列または一連の列にすることができます。これを行う方法は、ベクトルの作成方法によって異なります。このオブジェクトの性質により、実行できる検索の種類が決まります。この翻訳は行うことができます いくつかの方法で そしてそれは間違いなくあなたが自分で試すべきものではありません。
これは、フィンガープリントをベクトル化した後でも、exactが一致しないためです。同じ人からの2つの指紋の間でさえ同じ分以内に撮られませんでした。代わりに、いくつかの正の一致といくつかの負の一致があり、両方の信頼しきい値を確立する必要があります(「それは彼です」、「それは彼ではありません」、「言えません」)。誤検知(「はい、それは彼です!」-しかしそうではありません)と誤検知(「いや、それは彼ではありません」-そしてそれはそうでした)を許容するかどうか、そしてどの程度まで許容するかを決定するだけでなく。ドアロックでは、誤検知は必要ありませんが、誤検知は許容できます(指をもう一度スライドさせるだけです)。犯罪捜査では、偽陰性で犯人を滑らせることはできません。また、12個の偽陽性(後でアリバイを確認します...)を受け入れることはできますが、100個(1つを確認することはできません)はできません。百人、そしてそれらのいくつかはアリバイを持っていません-あなたがそれらすべてを逮捕することはできません)。
また、大規模なデータベースの場合、常に最初のパスを実行する必要があります。これにより、検索を、妥当な不変機能の一致があるフィンガープリントに制限します(たとえば、「サンプルの75%から125%の間の渦巻きの絶対数。これは、さらに非不変分析の対象となるタプルの数を減らすために必要です。これは、はるかに高価で、間違いなくできません。標準のMySQL関数を使用して実行します。
別のアプローチは、指紋を コード化された文字列表現 に変換することです。これにより、主流のデータベースで利用可能な合理的な辞書式のアプローチ(正規表現とレーベンシュタイン距離など)を使用して検索を実行できます。 SDKはこの文字列変換をサポートしているか、サポートしていません。これには、特徴およびスペクトル領域での1つ、場合によっては複数の変換が含まれます。このメソッドの信頼性は、文字列に詰め込める機能の数によって異なります(署名が多いほど、一致が正確である必要があり、必要な機能が多いほど、文字列が長くなります)。
適切なアルゴリズム を使用して、エンコードとチェックを行う外部ライブラリを使用できる場合があります。
「最も近い一致を返すか、が一致するかどうかを定義する」などの単純なことでも。保存する前に指紋をどのように操作するかに大きく依存します。そのため、通常、SDKは指紋に一致する高レベルのインターフェイスを提供し、そして自分で手間のかかる作業を行います。時々、この重労働はデータベースにまったく翻訳できない(または途方もない困難がないわけではない)。たとえば、「登録」が実際にはニューラルネットワークのトレーニングであり、データベースへの特徴ベクトルの挿入ではない場合です。
あなたには900万人のユーザー(あなたは誰ですか、FBIですか?)と900万の指紋を取得する許可があります。そして、これは1つのSDKです。そして、900万枚の画像を一致させることは問題外です。 しかし上記の理由により、SDKに「このイメージはデータベースにありますか?」という質問しかできません。たとえば、「99%ではい、92%ではい、90%ではい」の3つの名前のリストを受け取ります。
おそらくこれを行うことができます:非常に巨視的なものに基づいて、画像上で非常に高レベルで非常にラフなビニングを実行します。わからない、多分尾根の特徴の数。画像を調べてこれを行う必要があります。おそらくOpenCVがあなたを助けるかもしれません。 1からNの範囲の数値が得られますが、この数値は信頼性が低く、たとえば2%の誤差があります。
ここで重要なのは、ブロックXに入る指紋がブロックYにビニングした指紋と一致するとSDKが決して言わないようにする必要があるということです。
次に、パラメータ分布が適度に平坦で、急なガウス分布ではないと仮定して、それぞれ50分の1のユーザーで50のデータベースを構築できます。フィンガープリントを分析する場合、50個のデータベースの1つをSDKデータベースディレクトリにコピーできます。このデータベースには、所有しているフィンガープリントのX値に対応し、同じX値を持つユーザーのみが保存されます。不確実性のため、一部のユーザーは2つのデータベースに登録されますが、この方法で問題を50分の1(または45分の1)に減らすことができます。
着信指紋を分類する他の方法がないため、SDKマッチング関数を呼び出す必要があります。ただし、実行時間を管理可能な比率に減らすことができます。
パスワードまたはパスワードのハッシュを比較できるのと同じ方法で比較できる一意のIDに指紋画像を変換する方法があるという一般的な誤解があります。実際、私が知っているすべての指紋アルゴリズムは、いくつかの基本原則に基づいて動作します。
抽出
指紋画像を処理する最初のステップは抽出です。これには通常、画像のクリーンな2値化バージョンを作成するための多数の画像処理アルゴリズムが含まれます。次に、これは、画像を比較するときに役立つ特徴点およびその他のデータ点に対して処理されます。これらのポイントは、テンプレートと呼ばれるデータ構造体に格納されます。指の2つの印象が完全に同じになることはないため、これらのテンプレートでさえハッシュして比較して同等にすることはできません。指紋を比較する唯一の方法は、マッチングアルゴリズムを使用することです。
マッチング
マッチングは2つのテンプレートを取り、それらを比較します。ほとんどの場合、これには、各画像内の同様の特徴点の相対的な位置を取得することが含まれます。ユーザーの指の配置の変化に対応するために、テンプレートを回転させる必要がある場合があります。次に、アルゴリズムはこれらすべての比較の結果を取得し、2つのテンプレートが一致するというアルゴリズムの信頼度を表すスコアを生成します。
スコアが生成されると、アプリケーションは、一致と見なすのに十分高いかどうかを確認できます。
完璧な生体認証アルゴリズムはありません。アルゴリズムの精度は、他人受入率(FAR)と他人受入率(FRR)の2つのメトリックによって測定されます。 FARを下げる作業を行うと、マッチングのしきい値が高くなるため、必然的にFRRが高くなります。
ユーザーを9,000,000と照合するには、AFISサーバーを使用する必要があります: https://en.wikipedia.org/wiki/Integrated_Automated_Fingerprint_Identification_System
ここにAFISソリューションのいくつかのプロバイダーがあります:
これがあなたに大いに役立つかどうかはわかりませんが、指紋テンプレートをデータベースに保存するために抽出されたテンプレートをANSIまたはISO形式に変換するときに、他のSDKで行ったことに基づいて答えます。 ANSIまたはISOテンプレート形式が必要かどうかに基づいて、次のいずれかを使用します。
m_FPM.SetTemplateFormat(SGFPMTemplateFormat.ANSI378);テンプレートをANSI378に設定し、データベースに保存します
または
m_FPM.SetTemplateFormat(SGFPMTemplateFormat.ISO19794);テンプレートをISO19794-2に設定し、データベースに保存します
次に、キャプチャした指紋テンプレートをデータベースに保存されているテンプレートと照合するときに、指紋画像をキャプチャして、[〜#〜] ansi [〜#〜]または[ 〜#〜] iso [〜#〜]テンプレートを保存するために選択したテンプレート形式タイプに応じてテンプレートを作成し、MatchAnsiTemplateまたはMatchIsoTemplate関数のいずれかを使用して照合を行いますデータベース内のアーカイブされた指紋テンプレート用に選択したテンプレート形式に従って、SDKで。
また、Secugenには独自の所有者テンプレート形式SG4があり、これを使用することもできます。ここでの主な懸念事項は、指紋テンプレートをANSI形式で保存した場合、キャプチャしたフィンガーピント画像をANSIテンプレートに変換し、データベース内の指紋テンプレートをループして、MatchAnsiTemplate関数を使用して正しい一致を見つけることです。 。指紋テンプレートを[〜#〜] iso [〜#〜]形式で保存した場合は、キャプチャした指紋画像を[〜#〜] iso [〜#〜]に変換します。テンプレートは、データベース内の指紋テンプレートをループし、MatchIsoTemplate関数を使用して正しい一致を見つけます。