NBISをビルドして指紋のマッチングをやってみる

概要

NBIS(NIST Biometric Image Software)は、NIST(National Institute of Standards and Technology/アメリカ国立標準技術研究所)がFBI(Federal Bureau of Investigation/連邦捜査局)とDHS(Department of Homeland Security/国土安全保障省)のために開発した生体認証画像処理ソフトウェアです。

NIST Biometric Image Software (NBIS)
https://www.nist.gov/services-resources/software/nist-biometric-image-software-nbis

現在、オープンソースとして公開されています。
今回はNBISをビルドして指紋のマッチングをしてみたいと思います。

環境

・MacBook Pro macOS Mojave 10.14.5
・NBIS Release 5.0.0

ビルド

以下のURLからNBIS Release 5.0.0をダウンロードします。

NIGOS – NIST Biometric Open Source Server
https://www.nist.gov/itl/iad/image-group/products-and-services/image-group-open-source-server-nigos#Releases

ダウンロード後、zipファイルを解凍します。
今回はデスクトップに解凍してビルドしました。

ターミナルを起動し、以下のコマンドを実行します。

cd ~/Desktop/Rel_5.0.0
mkdir build
./setup.sh ./build --without-X11

setup.shのオプションの一覧と使用方法はzipファイルを解凍してできたディレクトリのINSTALL_<OS>.txtファイルに書かれています。他のオプションを指定したい場合は参照してください。

次に以下のコマンドを実行します。

sudo make config
sudo make it
sudo make install LIBNBIS=yes
sudo make catalog

以上でビルドは終了です。
zipファイルを解凍してできたディレクトリ内のbuild/binディレクトリにバイナリが生成されます。

ビルドエラー

私の環境では、以下のエラーが発生しました。

/opt/local/bin/ar: internal ranlib command failed
/opt/local/bin/ranlib: object: libjpegb.a(jcapimin.o) malformed object (unknown load command 1)

とりあえず以下のコマンドを実行して、解消しました。

$ sudo mv /opt/local/bin/ranlib /opt/local/bin/ranlib-backup-2019-06-20
$ sudo mv /opt/local/bin/ar /opt/local/bin/ar-backup-2019-06-20

テスト用データ

テスト用の指紋画像は8bitグレースケールのpngがわかりやすくて面白いと思います。
今回は以下のURLの指紋画像をダウンロードして利用しました。

mhshams/jnbis
https://github.com/mhshams/jnbis/tree/develop/src/test/resources/samples/nist

特徴点抽出

指紋の特徴点の抽出は、MINDTCTを使用して行います。

コマンド:
mindtct <グレースケール画像ファイルのパス> <出力ファイルのファイルのパス>
例:
cd ~/Desktop/Rel_5.0.0/buld/bin
sudo mindtct ~/Desktop/samples/fp-1/fp-1.png ~/Desktop/samples/fp-1/fp-1
sudo mindtct ~/Desktop/samples/fp-2/fp-2.png ~/Desktop/samples/fp-2/fp-2

実行すると、8種類のファイル(.brw/.dm/.hcm/.lcm/.lfm/.min/.qm/.xyt)が生成されます。
このうち、指紋のマッチングに使用するのはxytファイルです。

それぞれのファイルの内容は以下の通りです。
(「」内はマニュアルのGoogle翻訳です。)

.xytファイル(X、Y、Theta)

特徴点を表すファイル。
第1カラム:X座標(0~)
第2カラム:Y座標(0~)
第3カラム:角度(0~359)
第4カラム:品質(0~100)
「このテキストファイルは、細目の検出結果を報告します。これは、イメージの最小点のx、y座標、シータ、および品質のみを報告します。このファイルの各行には、1つの細目ポイントのスペース区切り情報が含まれています。<oroot> .xytは、bozorth3マッチングアルゴリズムで使用される細目形式です。」

.minファイル(MINutiae)

特徴点を表すファイル。
フォーマットが異なるだけで.xytファイルと内容はほぼ同じ。
「このテキストファイルは、細目の検出結果を報告します。このテキストファイルにリストされている結果の大部分は、エンコードされ、出力ANSI / NISTファイルのType-9レコードに格納されます。テキストファイルの最初の空でない行には、指紋画像で検出された細部の数が表示されます。これに続いて、検出された各細目に関連付けられた属性が、細目ごとに1行のテキストとして記録されます。各細目ラインは同じフォーマットです。」

.dmファイル(Direction Map)

隆線の流れの方向を表すマップファイル。
「方向マップは、指紋画像内の隆線の流れの方向を表す。マップには整数方向のグリッドが含まれています。グリッド内の各セルは、画像内の8×8ピクセルの近傍を表します。隆起流角は、半円上に等間隔で配置された16の整数の双方向単位に量子化されます。垂直方向0から出発して、方向単位は時計回りに増加し、11.25度の増分ジャンプを表し垂直方向の11.25度である方向15に停止する。
このスキームを使用すると、方向8は水平である。このマップの値-1は、有効な尾根流量が決定されなかった近隣を表します。」

.hcmファイル(High-Curvature Map)

曲率の高い点を表すマップファイル。
「高曲率マップは、曲率の高い隆起流を有する画像内の領域を表す。これは、特に、指紋画像におけるコア領域およびデルタ領域に当てはまるが、高曲率はこれらの場合に限定されない。これは、方向マップと同じ次元の2レベルマップです。セル値1は、高カーブ領域内に位置する指紋画像内の8×8画素近傍を表し、そうでない場合、セル値は0に設定される。」

.lcmファイル(Low-Contrast Map)

(一般的には)背景を表すマップファイル。
「低コントラストマップは、コントラストの低い画像内の領域を表します。コントラストの低い領域は、最も一般的には、指紋画像の背景を表す。これは、方向マップと同じ次元の2レベルマップです。1のセル値は、低コントラスト領域内に位置する指紋画像における8×8画素近傍を表し、そうでない場合、セル値は0に設定される。」

.lfmファイル(Low-Flow Map)

方向を決定できない(しにくい)点のマップファイル(?)
「低流量マップは、決定不能な隆起流を有する画像内の領域を表す。リッジフローは、所定の周波数範囲に対して計算された離散コサイン波形のセットを使用して決定される。これらの波形は、16のインクリメンタル方向に適用されます。
時には、配向のいずれにもない波形のいずれも、優勢な指向性周波数を満足に決定するために、画像内の領域内で十分に高く共振しない。これは、方向マップと同じ次元の2レベルマップです。1のセル値は、支配的な指向性周波数が決定できなかった領域内に位置する指紋画像における8×8画素近傍を表しそれ以外の場合はセル値は0に設定される。違いは、Low-Flow Mapは、非決定性のリッジフローを持つすべてのセルを記録するのに対してDirection Mapは、広範囲の補間および隣接するリッジフロー方向の平滑化の後では決定不可能なものだけを記録することです。」

.qmファイル(Quality Map)

品質を表すマップ。
「品質マップは、様々なレベルの品質を有する画像内の領域を表す。上記のマップはヒューリスティックに組み合わされ、5つの個別レベルの品質を形成します。このマップは方向マップと同じ次元を持ち、マップの各値は指紋画像の8×8ピクセルの近傍を表します。セル値4は最高品質を表し、セル値0は可能な最低品質を表します。」

.brwファイル(???)

「このファイルは、詳細点を検出する際にmindtctによって作成される2値化されたイメージの生のピクセルファイルです。デフォルトは、画像の左下にある画素原点に基づいて計算された細分点であり、方向は隆起端または分岐谷から指し示している。」

特徴点マッチング

特徴点のマッチングはBOZORTH3を使用して行います。

コマンド:
bozorth3 <probefile.xyt> <galleryfile.xyt>
例:
cd ~/Desktop/Rel_5.0.0/buld/bin
sudo bozorth3 ~/Desktop/samples/fp-1/fp-1.xyt ~/Desktop/samples/fp-2/fp-2.xyt

実行結果は非常にシンプルな数値です。
この数値はラフに言うと特徴点が一致する数のようです。
通常、40を超えると一致する指紋と判断できるようです。

まとめ

マニュアルを読むのに少し時間がかかりましたが、作業自体は数分で指紋のマッチングを行うことができました。
非常に面白かったので、他にも利用できるソフトウェアがあれば利用してみたいと思います。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です