カスケード 分類 器。 OpenCVで顔認証を行いトリミングして保存する

Python3.6 AIで物体検出をやってみた!人をカウントする!

カスケード 分類 器

OpenCVで顔認証を行い、顔の画像のみをトリミングして保存する OpenCVでは画像の変換に関するライブラリが非常に揃っています。 このライブラリを使用することで、画像編集が苦手な方でも比較的容易に画像を編集することができます。 また、画像認証のみならず、画像ファイルから顔認証や瞳検出を行うことができます。 OpenCVにて画像ファイルから顔認証や瞳検出を行う場合には、カスケード型分類器を使用します。 カスケード型分類器はOpenCVのインストールに合わせてインストールされるため、特別な環境の設定は必要としません。 カスケード型分類器を使用することで非常に簡単に顔の検出や笑顔の検出、目の部分のみの検出を行えるようになります。 これらで検出した結果を用いて、顔の周りを枠で囲ったり、顔の画像のみをトリミングして機械学習を行うなど、いろいろ応用することが出来るようになります。 オリジナルの画像(フリー画像) こちらのフリー画像を元に顔認証を行っていきます。 白枠で顔を囲んだ画像 顔認証で検出した部分について白枠で囲っています。 顔の画像のみをトリミングした画像 顔の部分だけトリミングして切り取った結果です。 xmlを指定します。 他にも以下のようなデータが存在します。 xml・・・笑顔検出• xml・・・目検出• xml・・・顔検出 分類器のデータはOpenCVをインストールしたディレクトリのライブラリ配下にあります。 見当たらない場合は、以下のGIT-Hubのリポジトリからダウンロード可能です。 画像ファイルの読み込み.

次の

OpenCV 物体検出、分類器作成と検出テスト その2

カスケード 分類 器

その1で分類器によって物体検出ができることがわかりましたので、その分類器を作成してみます。 分類器作成にはポジティブ画像(正解画像)とネガティブ画像(不正解画像)が必要です。 実用的な精度にはポジティブ画像7000枚、ネガティブ画像3000枚が必要とか言われていますが、実際その枚数揃えるのは結構大変です。 特にポジティブ画像。 そこで、OpenCVでは1枚の正解画像から複数枚の画像を生成する機能ががあります(角度や大きさを変えて生成してくれます)。 これを使えば、例えば50枚の正解画像を用意してそれぞれから128枚を自動生成それば6400枚に増やすことができますね。 ではさっそく、家紋の分類器を作成してみます。 家紋は非常にたくさんの種類があります。 全部集めるのは大変なので適当に60種類ほど正解画像を作成してみました。 輪郭より外側は白で塗りつぶしています。 自動生成で枚数を増やす時にネガティブ画像上に貼り合わせるのですが、その時にこの白色が透過色となります。 ネガティブ画像はなんでも良いのですが、正解画像が含まれていない画像を用意します。 風景、室内、建物、PC、動物など適当な画像です。 白黒画像になっていますがカラーで良いです。 これを3000枚用意しました。 フォルダを3つ用意し「OpenCV」フォルダにOpenCVのコマンド、「Positives」フォルダにポジティブ画像、「Negatives」フォルダにネガティブ画像を格納しました。 全部同一の階層に作成しています。 OpenCVTest + OpenCV + Positives + Negatives ネガティブ画像は画像リストが必要となるので事前に作成しておきます。 コマンドプロンプト画面を表示し、Negativesフォルダに移動して次のコマンドで画像リストを作成します。 txt これでネガティブ画像のリストができました。 つづいてポジティブ画像を増やしていきます。 OpenCVフォルダに移動して、コマンドプロンプトで次のコマンドを入力します。 ポジティブ画像はPositive001. jpgからPositive060. jpgまで連番で用意しました。 exe -img.. jpg -bg.. txt -info.. txt -num 128 -maxxangle 0. 5 -maxyangle 0. 5 -maxzangle 0. 3 -bgcolor 255 -bgthresh 8 -w 48 -h 48 -imgには用意したポジティブ画像を。 -infoには生成した画像の一覧の出力先ファイル名を。 -bgはネガティブ画像のリストファイル。 -numは生成する画像の枚数。 -maxxangleと-maxyangleと-maxzangle生成時にどの程度回転させるかを。 -bgcolorはポジティブ画像の背景色で、255が白、0が黒。 -bgthreshは透過度です。 成功すると、ネガティブ画像上にポジティブ画像の角度や大きさを変えた画像が生成されます。 また、その画像の一覧のファイルも作成されます。 生成されたポジティブ画像の一覧ファイルはネガティブ画像のと違い、スペース区切りのCSVファイルとなります。 ファイル名の後ろは正解画像部分の数、その開始位置X、開始位置Y、幅、高さ、です。 この部分は自動で生成されるので特に修正などする必要はないです。 用意したポジティブ画像ぶん、-imgと-infoのファイル名部分を変えながら全て行います。 たまにですが、ポジティブ画像の自動生成を行うと次のエラーが出る場合があります。 cpp, line 1275 その際は、このコマンドを実行するときだけネガティブ画像のリスト件数を作成する画像数(ここでは128)に減らして実行するとエラーが出にくくなります。 全てのポジティブ画像を増やし終わったら、作成されたポジティブ画像の一覧ファイルを結合します。 この手順ではcropp001. txt からcropp060. txtまで作成されているので、コマンドプロンプトでポジティブ画像のフォルダ(Positives)に移動して次のコマンドで結合します。 txt 結合されたpositives. 続いて、ベクトルファイルを生成します。 が、その前に作成するベクトルファイルと分類器を格納するフォルダを作成しておきます。 OpenCVフォルダに「vector」フォルダと「cascade」フォルダを作成します。 コマンドプロンプトからOpenCVのフォルダに戻って次のコマンドを入力します。 exe -info.. txt -bg.. txt -vec. vec -num 7680 -w 48 -h 48 -numにはポジティブ画像の枚数を指定しますので、Positives. txtのデータ数を設定します。 成功すると次が表示されます。 このコマンドは数分でおわります。 Done. Created 7680 samples 最後に分類器の作成です。 ここまでの手順が長かったですが、このコマンドは実行時間はさらに長いです。 exe -data. vec -bg.. txt -numPos 6500 -numNeg 3019 -numStages 20 -precalcValBufSize 1024 -precalcIdxBufSize 1024 -featureType LBP -minHitRate 0. 995 -maxFalseAlarmRate 0. ポジティブ画像として妥当ではないと判断された時に除外されるようです。 -numNegはネガティブ画像の枚数です。 -featureTypeはHAARかLBPかHOGを指定します。 それぞれ特徴の抽出の仕方が異なります。 実行した際に次のエラーが出てしまった場合、 Train dataset for temp stage can not be filled. Branch training terminated. Check the used training parameters. ネガティブ画像のリストを修正します。 いまはファイル名だけのリストになっていますので、これを全てフルパスにします。 正しくコマンドが開始されると、次のような感じで学習が始まります。 PARAMETERS: cascadeDirName:. vec bgFileName:.. txt numPos: 6500 numNeg: 3019 numStages: 20 precalcValBufSize[Mb] : 1024 precalcIdxBufSize[Mb] : 1024 acceptanceRatioBreakValue : -1 stageType: BOOST featureType: LBP sampleWidth: 48 sampleHeight: 48 boostType: GAB minHitRate: 0. 995 maxFalseAlarmRate: 0. 5 weightTrimRate: 0. 14時間30分ほどかかりました。。 次回は作成された家紋のカスケード分類器を使用して検出確認をしてみます。 カテゴリー.

次の

OpenCV

カスケード 分類 器

私は今、 という、未経験者が3か月で機械学習、ディープラーニング、データ分析、AIアプリ開発まで最先端技術を幅広く学べるオンライン学習サービスで勉強しています。 そして、AIアプリ開発コースにおいて、AIアプリの自主制作に取り組んでいます。 私が製作しているアプリは、『嵐のメンバーでいうと誰?』というアプリです。 顔画像をアップロードすると、嵐のメンバーで最も似ているメンバーを教えてくれるというアプリです。 製作の大きな流れはこんな感じ。 学習用の画像の収集• 嵐メンバーの学習• アプリに実装 学習用の画像の収集については、Bing Image Search APIを使いました。 こちらの記事()にまとめております。 学習用の画像を収集しましたが、これをそのまま学習に使うべきではありません。 なぜなら、収集した画像には顔部分以外も含んでいるので、純粋に顔の学習ができないからです。 そこで、顔部分の画像にしてやる必要があります。 例えば、このように全身の画像を、顔部分の画像にする処理を行います。 今回は、OpenCVというライブラリを使って顔検出をして、顔部分だけの画像を生成します。 OpenCVには顔や目を検出できるカスケード分類器の学習済みファイルがあるので、それを使います。 OpenCVのカスケード分類器の使い方 Github()から、Clone or downloadをクリックして、Download zipをクリックしてダウンロードします。 xmlというファイルを使います。 まず、こちらの画像を顔検出して四角で囲んでみます。 face. pyにコードを書きます。 face. xmlファイルを置いときます。 face. pyのコードは以下。 参考にした記事はこちら()。 import cv2 import matplotlib. imread "image. cvtColor img, cv2. imshow cv2. cvtColor img, cv2. show 顔検出画像出力 cv2. imwrite "out. jpg", img cv2. imwrite "out. jpg" , img 顔認識をする場合は、グレースケールへ変換するのが一般的のようです。 顔認識cascade. detectMultiScaleでは、パラメータ(scaleFactor, minNeighbors, minSize)を設定できます。 パラメータについてはこちらの記事()を参考にしてください。 結果はこちら。 見事に顔が検出されています。 顔検出して画像を保存 上記のOpenCVのカスケード分類器を使って、嵐のメンバー(ここでは二宮和也)の顔検出をして画像を保存します。 xml、二宮君の画像が入ったninomiyaフォルダを置きます。 arashiの構造• xml• ninomiya• 二宮画像1• 二宮画像2• 二宮画像3• py)です。 path. path. jpg' and ext! jpeg' and ext! path. exists dirname : os. path. path. exists dirname : os. path.

次の