ビッグ・データ環境でマルチメディア分析フレームワークを使用すると、ビデオおよびイメージで顔認識を実行できます。
Oracle Big Data Spatial and Graphのマルチメディア分析機能は、Apache Hadoopでビデオおよびイメージ・データを処理するためのフレームワークを提供します。このフレームワークにより、ビデオおよびイメージ・データの分散処理が可能になります。このフレームワークには、次のような機能があります。
Apache Hadoopでビデオおよびイメージ・データを処理および分析するためのAPI
Apache Hadoopの並列性を活用した、スケーラブルな高速処理
OpenCVを使用した組込みの顔認識
カスタム・ビデオ/イメージ処理(ライセンス・プレート認識など)をインストールおよび実装して、Apache Hadoopでこのフレームワークを使用して実行できる機能
ビデオ分析フレームワークは、Oracle Spatial and Graphのライセンスが付与されている場合にOracle Big Data Applianceにインストールされ、他のHadoopクラスタにインストールできます。
マルチメディア分析機能には、ビルド済の顔認識が備わっています。顔認識では、製品で使用可能なOpenCVライブラリが使用されます。この章では、顔認識機能の使用方法について説明します。
顔認識には次の2つのステップがあります。
顔のイメージを使用してモデルをトレーニングします。このステップは、任意のHadoopクライアントまたはノードで実行できます。
トレーニング・モデルを使用して、入力ビデオまたはイメージから顔を認識します。このステップは、Hadoopクラスタで実行するMapReduceジョブです。
トレーニング・プロセスにより、ファイルに格納されるモデルが作成されます。このファイルは、ビデオまたはイメージからの顔認識の入力として使用されます。
トピック:
トレーニングは、ordhadoop_multimedia_analytics.jar
の一部であるJavaプログラムOrdFaceTrainer
を使用して行われます。このプログラムへの入力は、イメージと、イメージをラベルにマッピングするラベル・マッピング・ファイルのセットです。出力は、ファイルに書き込まれるトレーニング・モデルです。(このファイルは編集しないでください。)
顔を検出(認識)するためにマルチメディア分析機能をトレーニングするには、次の手順に従います。
認識の対象となるイメージを格納する、親ディレクトリとサブディレクトリを作成します。
各サブディレクトリには、1人の人物のイメージが1つ以上含まれている必要があります。1人の人物のイメージを複数のサブディレクトリに格納することはできますが、1つのサブディレクトリに含めることができるのは1人の人物のイメージのみです。たとえば、images
という名前の親ディレクトリが存在し、1つのサブディレクトリ(d1
)にはAndrewという名前の人物のイメージが含まれ、2つのサブディレクトリ(d2
およびd3
)にはBettyという名前の人物のイメージ(2つの異なる場所で2つの異なる時間に撮影された写真など)が含まれているとします。この例では、ディレクトリとその内容は次のようになる可能性があります。
images/d1
には、 Andrewのイメージが5つ含まれています。
images/d2
には、Bettyのイメージが2つ含まれています。
images/d3
には、Bettyのイメージが4つ含まれています。
イメージのサブディレクトリをラベルにマップするマッピング・ファイルを作成します。
ラベルとは、認識されるイメージの人物に関連付けられる数値IDです。たとえば、Andrewはラベル値100に関連付けられ、Bettyはラベル値101に関連付けられる、というようになります。マッピング・ファイル内の各レコード(行)には、次の構造が含まれている必要があります。
<subdirectory>,<label-id>,<label-text>
次に例を示します。
d1,100,Andrew d2,101,Betty d3,101,Betty
必須の構成プロパティを設定します。
oracle.ord.hadoop.ordfacemodel oracle.ord.hadoop.ordfacereader oracle.ord.hadoop.ordsimplefacereader.dirmap oracle.ord.hadoop.ordsimplefacereader.imagedir
使用可能なプロパティの詳細は、「マルチメディア分析の構成プロパティ」を参照してください。
CLASSPATHを設定します。Java CLASSPATH定義に次を含めます。各アスタリスク(*)は、実際のバージョン番号に置き換えてください。
$MMA_HOME/lib/ordhadoop-multimedia-analytics.jar $MMA_HOME/opencv_3.0.0/opencv-300.jar $HADOOP_HOME/hadoop-common-*.jar $HADOOP_HOME/hadoop-auth-*.jar $HADOOP_HOME/commons-lang*.jar $HADOOP_HOME/commons-logging-*.jar $HADOOP_HOME/commons-configuration-*.jar $HADOOP_HOME/commons-collections-*.jar $HADOOP_HOME/guava-*.jar $HADOOP_HOME/slf4j-api-*.jar $HADOOP_HOME/slf4j-log4j12-*.jar $HADOOP_HOME/log4j-*.jar $HADOOP_HOME/commons-cli-*.jar $HADOOP_HOME/protobuf-java-*.jar $HADOOP_HOME/avro-*.jar $HADOOP_HOME/hadoop-hdfs-*.jar $HADOOP_HOME/hadoop-mapreduce-client-core-*.jar
トレーニング・モデルを作成します。次の一般的な形式でコマンドを入力します。
java -classpath <…> oracle.ord.hadoop.recognizer.OrdFaceTrainer <training_config_file.xml>
注意:
$MMA_HOME/example
には、サンプル・ファイルのセットがあります。これには、Java CLASSPATH
を設定するためのスクリプトが含まれています。トレーニング・モデルを作成するために、必要に応じて例を編集できます。 トレーニング・モデルの作成に使用するイメージは、顔のみを含み、できるかぎり顔の周囲に細かいものが写っていないようにする必要があります。次のいくつかの例は、同じ男性がそれぞれ異なる表情をした4つのイメージを示しています。
トレーニングのためのイメージの選択は、正確なマッチングのために重要です。次のガイドラインが適用されます。
イメージのセットには、目を閉じたり笑ったりするなど、考え得るあらゆる構えや表情の顔を含める必要があります。
非常に似ているイメージを含めることは避けてください。
人物をいくつかの異なる背景や照明条件の下で認識する必要がある場合は、それらの背景を持つイメージを含めます。
含めるイメージの数は、入力データで予想される動きや背景の多様さによって異なります。
ビデオ内の顔を検出(認識)するには、ビデオ処理ソフトウェアでビデオ・データをトランスコードするために、次のオプションがあります。
OpenCVで使用可能な任意の正面顔のカスケード分類器とともに、フレーム・プロセッサとしてOrdOpenCVFaceRecognizerMulti
を使用します。
手始めにHaarcascade_frontalface_alt2.xml
を使用すると便利です。様々なカスケード分類器を試して、要件に合ったものを特定できます。
サードパーティの顔認識ソフトウェアを使用します。
認識を実行するには、次の手順に従います。
(顔を認識するビデオを含む)ビデオ・ファイルをHDFSにコピーします。
これらの必要なファイルを、クラスタのすべてのノードがアクセス可能な共有の場所にコピーします。
生成したトレーニング・モデル
イメージ・サブディレクトリをラベルにマップするマッピング・ファイル
カスケード分類器XMLファイル
構成ファイルを作成します。
必須構成パラメータ:
oracle.ord.hadoop.inputtype
: 入力データのタイプ(video
またはimage
)。
oracle.ord.hadoop.outputtypes
: 生成された結果の形式(JSON/テキスト/イメージ
)。
oracle.ord.hadoop.ordframegrabber
: ビデオ・データからビデオ・フレームを取得します。製品で使用可能なJavaクラスを使用するか、または抽象の実装を提供できます。
OrdJCodecFrameGrabberは製品で使用できます。このクラスは、追加のステップなしで使用できます。JCodecの詳細は、www.jcodec.orgを参照してください。
OrdFFMPEGFrameGrabberは製品で使用できます。このクラスは、FFMPEGライブラリのインストールを必要とします。詳細は、www.ffmpeg.orgを参照してください
oracle.ord.hadoop.ordframeprocessor
: ビデオ・フレームで顔を認識するために使用するプロセッサ。製品で使用可能なJavaクラスを使用するか、または抽象の実装を提供できます。
oracle.ord.hadoop.recognizer.classifier
: カスケード分類器XMLファイル。
oracle.ord.hadoop.recognizer.labelnamefile
: イメージ・サブディレクトリをラベルにマップするマッピング・ファイル。
オプションの構成パラメータ:
oracle.ord.hadoop.frameinterval
: 処理されるフレーム間の時間間隔(秒数)。デフォルト: 1。
oracle.ord.hadoop.numofsplits
: Hadoopクラスタ上のビデオ・ファイルの分割の数で、Hadoopクラスタの各ノードで1つの分割が分析されます。デフォルト: 1。
oracle.ord.hadoop.recognizer.cascadeclassifier.scalefactor
: トレーニングで使用されたイメージと、ビデオ・フレームまたはイメージで認識された顔をマッチングするために使用されるスケール係数。デフォルト: 1.1 (スケーリングなし)
oracle.ord.hadoop.recognizer.cascadeclassifier.minneighbor
: ビデオ・フレームまたはイメージで顔を検出するためのスライディング・ウィンドウのサイズを決定します。デフォルト: 1。
oracle.ord.hadoop.recognizer.cascadeclassifier.flags
: 顔検出のタイプを決定します。
oracle.ord.hadoop.recognizer.cascadeclassifier.minsize
: 顔の検出に使用される最小の境界ボックス。
oracle.ord.hadoop.recognizer.cascadeclassifier.maxsize
: 顔の検出に使用される最大の境界ボックス。
oracle.ord.hadoop.recognizer.cascadeclassifier.maxconfidence
: 検出される顔とモデルの顔の間の最大許容距離。
oracle.ord.hadoop.ordframeprocessor.k2
: OrdFrameProcessor
の実装クラスのキー・クラス。
oracle.ord.hadoop.ordframeprocessor.v2
: OrdFrameProcessor
の実装クラスの値クラス。
HADOOP_CLASSPATHを設定します。
HADOOP_CLASSPATHに、「顔を検出するためのトレーニング」にリストされているファイルが含まれていることを確認します
顔を認識するHadoopジョブを実行します。次の形式でコマンドを入力します。
$ hadoop jar $MMA_HOME/lib/orhadoop-multimedia-analytics.jar -conf <conf file> <hdfs_input_directory_containing_video_data> <hdfs_output_directory_to_write_results>
顔の検出の正確さは、照明、明度、顔の向き、カメラから顔までの距離、ビデオまたはイメージの鮮明さなど、様々な要因によって決まります。複数の構成プロパティを試して、ユースケースに最も適した値のセットを特定する必要があります。偽陽性(顔が異なるオブジェクトの識別)と誤認(顔のラベル付けの誤り)は、常に発生する可能性があることに注意してください。
注意:
$MMA_HOME/example
には、サンプル・ファイルのセットがあります。これには、Java CLASSPATHを設定するスクリプトも含まれています。顔を検出するジョブを発行するために、必要に応じて編集できます。イメージ上の顔を検出するには、イメージをHDFSにコピーします。次のプロパティを指定します。
<property> <name>oracle.ord.hadoop.inputtype</name> <value>image</value> </property>
顔の検出を始める際に役立つように、いくつかの例とトレーニング資料が提供されています。
$MMA_HOMEには次のディレクトリがあります。
video/ (contains a sample video file in mp4 and avi formats) facetrain/ analytics/
facetrain/
にはトレーニングの例が含まれています。facetrain/config/
にはサンプル構成ファイルが含まれており、facetrain/faces/
には、トレーニング・モデルを作成するためのイメージと、イメージにラベルをマップするマッピング・ファイルが含まれています。
Makefile
およびtrainface.sh
は、トレーニング・ステップを実行するためにMakefileを使用するか、またはバッチ・スクリプトを使用するかの選択肢を提供します。
次のようにして、トレーニング・モデルを作成できます。
$ ./trainface.sh
トレーニング・モデルはordfacemodel_bigdata.dat
に書き込まれます。
ビデオでの顔の検出について、analytics/には、入力ビデオ・ファイルで顔を検出するためのHadoopジョブの実行例が含まれています。このディレクトリには、構成ファイルの例を含むconf/が含まれています。
Makefile
およびtrainface.sh
は、Hadoopジョブを発行するためにMakefileを使用するか、またはバッチ・スクリプトを使用するかの選択肢を提供します。
次のようにして、ジョブを実行できます(HDFSディレクトリvinput
へのビデオ・ファイルのコピーも含みます)
$ ./runjob.sh
ジョブの出力はHDFSディレクトリvoutput
に含められます。
マルチメディア分析フレームワークでは、hadooop
コマンドで構成プロパティを指定するために標準メソッドを使用します。構成ファイルを指定する場合は–conf
オプションを使用し、個別のプロパティを指定する場合は-D
オプションを使用します。このトピックでは、構成プロパティに関する参照情報を示します。
いくつかのプロパティは、特定のタスクのために使用されます。たとえば、トレーニング・プロパティには次のものがあります。
oracle.ord.hadoop.ordfacereader
oracle.ord.hadoop.ordsimplefacereader.imagedir
oracle.ord.hadoop.ordsimplefacereader.dirmap
oracle.ord.hadoop.ordfacemodel
oracle.ord.hadoop.ordfacereaderconfig
次に、使用可能な構成プロパティをアルファベット順にリストします。(すべての名前はoracle.ord.hadoop.
で始まります)。各パラメータについて、パラメータ名をリストし、その次にそのパラメータに関する情報を示します。
文字列。処理のためにフレームを抽出するタイムスタンプ間隔(秒)。許容値: 正の整数および浮動小数点数。デフォルト値: 1。例:
<property> <name>oracle.ord.hadoop.frameinterval</name> <value>1</value> </property>
文字列。フレームワーク内の入力ファイル・タイプを表す、フレームワーク内のInputFormat
クラス名。デフォルト値: oracle.ord.hadoop.OrdVideoInputFormat
。例:
<property> <name>oracle.ord.hadoop.inputformat</name> <value>oracle.ord.hadoop.OrdVideoInputFormat</value> </property>
文字列。入力データのタイプ: video
またはimage
。例:
<property> <name>oracle.ord.hadoop.inputtype</name> <value>video</value> </property>
正の整数。Hadoopクラスタ上のビデオ・ファイルの分割の数で、Hadoopクラスタの各ノードで1つの分割を分析できます。推奨値: クラスタのノード/プロセッサの数。デフォルト値: 1。例:
<property> <name>oracle.ord.hadoop.numofsplits</name> <value>1</value> </property>
文字列。トレーニングによって作成されたモデルを格納するファイルの名前。例:
<property> <name> oracle.ord.hadoop.ordfacemodel </name> <value>ordfacemodel_bigdata.dat</value> </property>
文字列。顔認識モデルのトレーニングに使用されるイメージを読み込むJavaクラスの名前。例:
<property> <name> oracle.ord.hadoop.ordfacereader </name> <value> oracle.ord.hadoop.OrdSimpleFaceReader </value> </property>
文字列。特定のアプリケーション用の追加の構成プロパティを含むファイル。例:
<property> <name> oracle.ord.hadoop.ordfacereaderconfig </name> <value>config/ordsimplefacereader_bigdata.xml</value> </property>
文字列。ビデオ・ファイルをデコードするJavaクラスの名前。これはOrdFrameGrabber
の実装済クラスで、ビデオ・ファイルをデコードするためにマッパーによって使用されます。製品で使用可能なインストール済の実装: oracle.ord.hadoop.OrdJCodecFrameGrabber
(デフォルト)およびoracle.ord.hadoop.OrdFFMPEGFrameGrabber
(ユーザーによってFFMPEGがインストールされている場合)。カスタム実装を追加できます。例:
<property> <name>oracle.ord.hadoop.ordframegrabber</name> <value>oracle.ord.hadoop.OrdJCodecFrameGrabber</value> </property>
文字列。フレームの処理および対象オブジェクトの認識のためにマッパーによって使用される、インタフェースOrdFrameProcessorの実装済Javaクラスの名前。デフォルト値: oracle.ord.hadoop.mapreduce.OrdOpenCVFaceRecognizerMulti。例:
<property> <name>oracle.ord.hadoop.ordframeprocessor </name> <value>oracle.ord.hadoop.mapreduce.OrdOpenCVFaceRecognizerMulti</value> </property>
文字列。Javaクラス名、インタフェースOrdFrameProcessor
の実装済クラスの出力キー・クラス。デフォルト値: org.apache.hadoop.io.Text
。例:
<property> <name>oracle.ord.hadoop.ordframeprocessor.k2</name> <value>org.apache.hadoop.io.Text</value> </property>
文字列。Javaクラス名、インタフェースOrdFrameProcessor
の実装済クラスの出力値クラス。デフォルト値: oracle.ord.hadoop.mapreduce.OrdImageWritable
。例:
<property> <name>oracle.ord.hadoop.ordframeprocessor.v2 </name> <value>oracle.ord.hadoop.mapreduce.OrdImageWritable</value> </property>
文字列。カスタム(ユーザー指定)プラグインにのみ関連します。Reduceフェーズでマップ出力からのキー値ペアを処理する、インタフェースOrdOutputProcessor
の実装済Javaクラスの名前です。例:
<property> <name>oracle.ord.hadoop.ordframeprocessor</name> <value>mypackage.MyOutputProcessorClass</value> </property>
文字列。顔ラベルをディレクトリ名と顔イメージにマップするマッピング・ファイル。例:
<property> <name> oracle.ord.hadoop.ordsimplefacereader.dirmap </name> <value>faces/bigdata/dirmap.txt</value> </property>
文字列。モデルの作成に使用される顔を含む、ファイル・システム・ディレクトリ。これは通常、ローカルのファイル・システムです。例:
<property> <name> oracle.ord.hadoop.ordsimplefacereader.imagedir </name> <value>faces/bigdata</value> </property>
文字列。フレームワーク内の出力ファイル・タイプを表すOutputFormatクラスの名前。デフォルト値: org.apache.hadoop.mapreduce.lib.output.TextOutputFormat
。例:
<property> <name>oracle.ord.hadoop.outputformat</name> <value> org.apache.hadoop.mapreduce.lib.output.TextOutputFormat; </value> </property>
文字列。識別される顔の顔ラベルとタイムスタンプ、場所および一致の信頼度を含む出力の形式は、json
、image
またはtext
である必要があります。例:
<property> <name>oracle.ord.hadoop.outputtype</name> <value>json</value> </property>
文字列。特定のジョブ用の追加の構成プロパティを含むファイル。例:
<property> <name>oracle.ord.hadoop.parameterfile </name> <value>oracle_multimedia_face_recognition.xml</value> </property>
文字列。このプロパティは、オブジェクト検出のタイプを選択するために使用します。CASCADE_DO_CANNY_PRUNING
、CASCADE_SCALE_IMAGE
、CASCADE_FIND_BIGGEST_OBJECT
(最も大きい顔のみを調べます)またはCASCADE_DO_ROUGH_SEARCH
である必要があります。デフォルト: CASCADE_SCALE_IMAGE | CASCADE_DO_ROUGH_SEARCH
。例:
<property> <name> oracle.ord.hadoop.recognizer.cascadeclassifier.flags</name> <value>CASCADE_SCALE_IMAGE</value> </property>
浮動小数点値。モデルの顔と入力データの顔の間に許容される距離(差異)を指定します。値が大きいと一致率は高くなりますが、精度が低くなります(偽陽性が多くなります)。値が小さいと一致率は低くなりますが、精度が高くなります。例:
<property> <name> oracle.ord.hadoop.recognizer.cascadeclassifier.maxconfidence</name> <value>200.0</value> </property
文字列(具体的には値のペア)。検出されるオブジェクトの境界ボックスの最大サイズを指定します。オブジェクトが近いと境界ボックスが大きくなり、海辺での顔のようにオブジェクトが遠いと、境界ボックスが小さくなります。境界ボックスが最大サイズよりも大きいオブジェクトは無視されます。例:
<property> <name> oracle.ord.hadoop.recognizer.cascadeclassifier.maxsize</name> <value>(500,500)</value> </property>
整数。入力データでオブジェクトを検出するために使用される、スライディング・ウィンドウのサイズを決定します。値が高いほど、検出されるオブジェクトは少なくなりますが、品質は高くなります。デフォルト値: 1。例:
<property> <name> oracle.ord.hadoop.recognizer.cascadeclassifier.minneighbor</name> <value>1</value> </property>
文字列(具体的には値のペア)。検出されるオブジェクトの境界ボックスの最小サイズを指定します。オブジェクトが近いと境界ボックスが大きくなり、海辺での顔のようにオブジェクトが遠いと、境界ボックスが小さくなります。境界ボックスが最小サイズよりも小さいオブジェクトは無視されます。例:
<property> <name> oracle.ord.hadoop.recognizer.cascadeclassifier.minsize</name> <value>(100,100)</value> </property>
浮動小数点数。顔ラベルをディレクトリ名と顔イメージにマップするマッピング・ファイルとともに使用される、スケーリング係数。値1.1は、ランタイム入力の顔とトレーニング・プロセス中にサブディレクトリに格納されたイメージを比較する前に、スケーリングされないことを意味します。例:
<property> <name> oracle.ord.hadoop.recognizer.cascadeclassifier.scalefactor</name> <value>1.1</value> </property>
文字列。顔の分類器を含むXMLファイル。この機能は、OpenCVで使用可能な任意の正面顔のトレーニング前の分類器とともに使用できます。例:
<property> <name> oracle.ord.hadoop.recognizer.classifier</name> <value>haarcascade_frontalface_alt2.xml</value> </property>
文字列。顔ラベルをディレクトリ名と顔イメージにマップするマッピング・ファイル。例:
<property> <name> oracle.ord.hadoop.recognizer.labelnamefiler</name> <value>haarcascade_frontalface_alt2.xml</value> </property>
文字列。トレーニング・ステップで生成されたモデルを含むファイル。このファイルは、すべてのクラスタ・ノードがアクセスできる共有の場所に格納する必要があります。例:
<property> <name> oracle.ord.hadoop.recognizer.modelfile</name> <value>myface_model.dat</value> </property>
マルチメディアのデコードおよび処理のために、カスタム・モジュールを実装およびインストールできます。
抽出クラスoracle.ord.hadoop.decoder.OrdFrameGrabber
を実装することにより、フレームワークでカスタム・ビデオ・デコーダを使用できます。詳細は、Javadocを参照してください。製品には、JCodecおよびFFMPEG用にOrdFrameGrabber
を拡張するビデオ・デコーダの実装が2つ含まれています(FFMPEGは別途インストールする必要があります)。
2つの抽出クラスを実装することにより、フレームワークでカスタム・マルチメディア分析を使用できます。
oracle.ord.hadoop.mapreduce.OrdFrameProcessor<K1,V1,K2,V2>
。OrdFrameProcessor
の拡張クラスは、ビデオ・フレームまたはイメージを処理するMapReduceジョブのMapフェーズで使用されます。(K1, V1)は入力キー値ペア・タイプで、(K2, V2)は出力キー値ペア・タイプです。詳細は、Javadocを参照してください。製品には、OpenCVを使用した実装が含まれています。
oracle.ord.hadoop.mapreduce.OrdOutputProcessor<K1,V1,K2,V2>
。OrdFrameProcessor
の拡張クラスは、ビデオ・フレームまたはイメージを処理するMapReduceジョブのReducerフェーズで使用されます。(K1, V1)は入力キー値ペア・タイプで、(K2, V2)は出力キー値ペア・タイプです。詳細は、Javadocを参照してください。ほとんどの実装は、このクラスの実装を必要としません。
フレームワーク構成パラメータの例は、$MMA_HOME/example/analytics/conf/oracle_multimedia_analysis_framework.xml
にあります。