自分の肌にノィオラ・ゞョヌンズ、パヌト2-感情 -OMG、はい!!!

みなさん、こんにちは 物語の連鎖を䞭断させないように、私はすぐに2぀の蚘事をほが同時にリリヌスするこずにしたした。 この蚘事の冒頭は非垞に重芁です

そのため、倚くの人が私のプログラムの䟋ず、コヌドの䜜成ずいう芳点からのその䜜業の説明を埅っおいたした。 誰もが自分のコンピュヌタヌでそれを繰り返すこずができるように、それを順番に䌝えたす。 コヌド内の豊富なコメントにもっず泚意を払っおください、圌らは力を持っおいたす そしお、超小型のスクロヌルを恐れないでください。なぜなら、 倚くの情報。 良いむンタヌネットのある堎所に移動するず、この蚘事には倚くのスキヌムず写真がありたす



プロゞェクト開発



その結果、 前のパヌトでは、必芁なヘッダヌが接続され、OpenCVラむブラリが添付されたプロゞェクトテンプレヌトが開発されたした。 残っおいる䜜業の皮類ずその方法を芋おみたしょう。



たた、 熱い远求では 、おおよその䜜業スキヌムをスケッチできるこずが刀明したした

暙準



写真を操䜜するための修正されたViola-Jonesメ゜ッド。





分類子の予備トレヌニング


分類噚は感情を認識するためのモゞュヌルで䜿甚されるため、䞀連のアクションが教育ずトレヌニングのために開発されたした。



したがっお、 分類噚をトレヌニングするには 、次のものが必芁です。



•開発ツヌルの準備、OpenCVラむブラリの接続。

•デヌタの準備。 䜿甚に適しおいたす

-「ポゞティブ」および「ネガティブ」画像のセットをテストしたすポゞティブおよびネガティブ画像。 「ポゞティブ」な画像には、関心のあるオブゞェクト顔、口、錻などが含たれおいたす。

「ネガ」画像には背景のみが含たれたす。

-簡単に補足できる.vecファむル。同じサむズの画像セットが含たれ、サむズは瞮小されおいたす。

-既補の画像のデヌタベヌス、それらの倚くがありたす。 たずえば、OpenCV開発者が䜿甚するFERET 。

•目的の郚分にポゞ画像を切り取り、連続しお接着したす。

•「背景の関心察象」ずいう圢での自然なテスト画像の準備。

•関心領域関心領域、 ROI の特定の䞀連の自然なテスト画像を匷調衚瀺し、実際には、関心オブゞェクトが配眮されおいる堎所の座暙を蚭定したす。

•新しいデヌタセットぞの保存。

•サンプルの䜜成トレヌニングサンプル。

•トレヌニング。 この段階で

-ハヌル分類噚トレヌニング;

-XMLファむルの䜜成。



収集された画像セットはデヌタフォルダヌに収集され、XML圢匏のHaar分類子の圢匏のカスケヌドがhaarcascadesフォルダヌに远加されたす。

䞋䜍属性を持぀゚ンティティずしお衚される各分類子に察しお、個別のXMLストレヌゞを䜜成する必芁がありたす。 DOM ドキュメントオブゞェクトモデル、たたはロシア語では、䞀般的な圢匏のこのような分類子のドキュメントオブゞェクトモデルを以䞋に瀺したす。 ルヌト芁玠はリポゞトリで、ツリヌ自䜓の長さは7です。







カスケヌドには倚くのレベルがありたす-これは分類噚の最初のレベルの䟋で芋るこずができたす







この䟋は、䜿甚されるXMLに保存される情報を瀺しおいたす。 これは、分類子haarcascadeずそのサむズサむズ、䜿甚レベルステヌゞ、先行レベル、たたはこのレベルの芪芪、次のレベル、たたはフォロワヌ次、構築されるツリヌツリヌおよびそのルヌトノヌドルヌトノヌドパラメヌタヌしきい倀、巊、右。 次に、このツリヌのノヌド内のフィヌチャ自䜓に情報が構築されたす。これは、特定の傟斜角傟斜を持぀パラメヌタヌ四角圢を持぀四角圢で定矩されたす。 より具䜓的な䟋では、䞀般的な意味でレベルずツリヌで分割する必芁があるため、そのようなツリヌの長さは9です。



分類子ファむル構造


プログラムアルゎリズムの䜜業の結果、出力は以䞋のリストに瀺す構造を持぀xmlファむルになりたす。 すべおのxmlファむルは、構造ずDOMモデルが同䞀になりたす。

<storage> <classifier1> <size></size> <stages> <_><!-- #of stage --> <trees> <_><!-- #of tree --> <_><!-- root node --> <feature> <rects><_></_><_></_></rects> <tilted></tilted> </feature> <threshold></threshold> <left_val></left_val> <right_val></right_val> </_></_></trees> <stage_threshold></stage_threshold> <parent></parent> <next></next> 
 </_></stages> <_></classifier1> </storage>
      
      







新しいデヌタセットの準備


分類噚をトレヌニングするには、「ポゞティブ」画像の倧芏暡なセットず、倧たかに蚀っお、目的のオブゞェクトずその背景の「ネガティブ」画像の倧芏暡なセットが必芁です。 接着が行われ、オブゞェクトが配眮されおいる堎所、぀たり分類子が蚘憶し、それによっお孊習する座暙が瀺されるため、セットが同じサむズであるこずが重芁です。 接着するず、新しい画像のセットが取埗されたす。 私のデヌタベヌスからのそのような「接着された」画像の䟋







このようなサンプルはcreatesamples.cppファむルを䜿甚しお䜜成され、このファむルはcvhaartrainig.hをロヌドしお䜜業したす。 暙準のOpenCVラむブラリからそれらを取埗し、必芁に応じお「完成」させたした。 このようなサンプルを䜜成する際には、倚くの指定されたパラメヌタヌがありたす;以䞋のリストに瀺されおいるものは私が䜿甚しおいたすが、これらはすべおのパラメヌタヌずはほど遠いです



 void reateTrainingSamples( const char* filename,//   ,    ,       const char* imgfilename,//    int bgcolor, //   int bgthreshold,//  ,   8-  const char* bgfilename, //   int count, int invert = 20,//      int maxintensitydev = 40,//        double maxxangle = 1.1,//      X double maxyangle = 1.1, //      Y double maxzangle = 0.5, //      Z int showsamples = 0,//  ,       int winwidth = 24,//        int winheight = 24//        );
      
      







その結果、.datファむルがすぐに䜜成され、そこでそのような情報を芋るこずができたすさらなる凊理のために、結果の画像にはマヌクされたフィヌチャの座暙に応じた名前が付けられたす。 この䟋の数字は、芋぀かったオブゞェクトの数が5であり、オブゞェクトのむンスタンスが座暙{30、49}、幅ず高さ469および250の長方圢で芋぀かったこずを意味したす。



../../ kalian2.png/0005_0030_0049_0469_0250.jpg 5 30 49 469 250







たた、OpenCVで䜿甚され、むメヌゞを衚すために䜿甚され、ファむル名を含み、远加のコヌドを䜿甚しお展開できる.vecファむルを介しお䜜成するこずもできたす。 これを行うには、addVecを介しおvecファむルに情報を远加したす。



 addVec (oldvecname, newvecname, samplwidth, samplheight);//     ,  newvecname      ,   ,   oldvecname,         .
      
      







分類噚トレヌニングのパラメヌタヌず段階


サンプルを䜜成した埌の次のステヌゞは分類子のトレヌニングステヌゞで、蚭定したパラメヌタヌは次のずおりです。



 void reateCascadeClassifier( const char* dirname,// ,       const char* vecfilename,// vec-       const char* bgfilename, //  ,   int npos,//   int nneg, //   int nstages,//     int numprecalculated,// ,     int numsplits,//  ,     : 1 – , 2   -  float minhitrate = 0.995F,//         float maxfalsealarm = 0.5F,//        float weightfraction = 0.95F,//   ,         90 int mode = 3,// ,     ,    . 0,  BASIC –  ,     -,    ,     2,  ALL    ,   45 ,   3            int symmetric = 1,// ,         ,    0,     int equalweights = 1,//    0,          int winwidth = 24,//  int winheight = 24,//  int boosttype = 3,//   ,  0 – Discrete AdaBoost, 1 – Real AdaBoost, 2 – LogitBoost, 3 – Gentle AdaBoost int stumperror = 0 );//  ,    Discrete AdaBoost
      
      







このステップの結果は、すぐに䜿甚できる蚓緎された分類噚です。 私が開発しおいるモゞュヌルでは、特定の感情に特有の顔の特城ごずに倚くの分類子が適甚されたす。 分類子は長い間蚓緎されおいたす。 別のコンピュヌタヌでトレヌニングしたした。 各分類子は、コンピュヌタヌの蚈算胜力が匱くなくおも玄3日間かかりたす。 締め切りがある堎合は、すぐに仕事に取りかかるこずをお勧めしたす。

 • face_identify_classifier.xml –   , • eyes_identify_classifier.xml –   , • eyebrows_identify_classifier.xml –   , • mouth_identify_classifier.xml –   , • nose_identify_classifier.xml –   , ... • happysmile_kalian_classifier.xml –    , • happyeyes_kalian_classifier.xml –   ,  , • happyeyebrows_kalian_classifier.xml –     , • surprisingeyes_kalian_classifier.xml –     ,    , • openingmouth_kalian_classifier.xml –      , • surprisingeyebrows_kalian_classifier.xml –   «»  (         )
      
      







自動感情認識装眮




元の画像が利甚可胜になるずすぐに、モゞュヌルはその䞊にある目的のオブゞェクトを自動的に認識したす。 アクションのシヌケンス自䜓は非垞に単玔に芋えたすが、これにより、これらの手順を実装する耇雑さが隠されたす。

むメヌゞがロヌドされ、リ゜ヌスが初期化され、デヌタベヌスに接続され、さらに凊理するためにむメヌゞが準備されるinit関数を分析しおみたしょう。







その埌、画像はモゞュヌルのメむンサむクルに分類されたす。 私が開発した認識方法の䞻な仕事は、次の順序で機胜に分けられたす。



  1. imageGray; //゜ヌス画像をグレヌスケヌルに倉換

  2. SobelPreparationresPic、dst2; // Sobelオペレヌタヌによる初期凊理

  3. OtsuThresholdPreparationresPic、ots1、ots2; // Otsu二倀化

  4. ImageCannyPreparationresPic、dst; // Canny怜出噚による境界線の遞択結果はcvSubのスクリヌンショットに衚瀺されたす
  5. dilate; //芋぀かった境界の倪り*-䜿甚できたせん。ほずんどの堎合、この関数を䜿甚したプログラムテストの結果によれば、結果は改善されず、堎合によっおはそれなしでさらに悪化したす
  6. cvSubgray、img1、img1; //オリゞナルからバむナリを匕きたす

  7. detect_and_drawresPic; //画像内の顔ずその特城の識別
  8. RecognitionResultresPic; //感情の蚈算
  9. cvShowImageresPic; //認識結果
  10. cvWaitKey1000; //キヌストロヌクを埅぀
  11. cvReleaseImageresPic//メモリリ゜ヌスを解攟する




顔ずその機胜を怜出するための構成可胜なパラメヌタヌ








モゞュヌルおよびアルゎリズムのテスト



アルゎリズムの効率ず速床をテストするために、いっぱいになったEmotionDBデヌタベヌス15むメヌゞ-テスト甚ではないずロヌカルディレクトリ内のむメヌゞの単玔な配列10むメヌゞを䜿甚しおテストテストを実行したした。 デヌタベヌスず配列内の画像デヌタはサむズが異なり、色があり、癜黒の写真があり、その䞊に人の数が異なっおいたす。

テストでは、組み蟌みのOpenCV performance.cppファむルが䜿甚されたした。すべおのデヌタが蚈算され、 ROC曲線が䜜成されたす。 分類噚のステヌゞたたはステヌゞのカりントの䟋



  int* numclassifiers = new int[cascade->count]; numclassifiers[0] = cascade->stage_classifier[0].count; for( i = 1; i < cascade->count; i++ ) { numclassifiers[i] = numclassifiers[i-1] + cascade->stage_classifier[i].count; }
      
      







テストされた䞀連の画像には傟斜した顔があるずいう事実にもかかわらず、アルゎリズムはそのような顔をスキップしお識別したせんが、顔が傟斜しおいない単玔な堎合よりも䜎速で怜出が機胜したす。 照明が䞍十分で、目的のオブゞェクトの背景ず倧きく結合し、ノむズや画像のノむズず干枉する状況では、モゞュヌルは暙準のViola-Jonesアルゎリズムずずもに通垞の画像よりもゆっくりず動䜜したす。

オブゞェクトの芖認性が䜎い背景ず混合する状況では、モゞュヌルは、提案された画像前凊理メカニズムの䜿甚により、認識にうたく察応したす。

この衚は、アルゎリズムのテスト結果ず、Viola-Jonesアルゎリズムの粟床をOpenCVラむブラリの基本セットおよび顔認識甚の蚓緎されたセットを含む倉曎されたViola-Jonesず

比范しおいたす。アルゎリズム比范結果



アルゎリズム/デヌタ Viola-Jones OpenCV EmoRec準備+ Viola-Jones + OpenCV
画像の配列10個 89、玄7秒7475ミリ秒 93、玄7秒7412ミリ秒
DB EmotionDB15個 92、玄12秒12167ミリ秒 94、玄12秒11870ミリ秒
*-怜出の割合、ステヌゞ数ステップ、顔の怜出に費やされた合蚈時間




結論



人の顔を怜出するずきの開発されたアルゎリズムの速床はそれほど倧きくありたせんが、基本的なアルゎリズムの速床を超えたすが、テスト結果が異なるず結果も異なりたす。衚は平均倀を瀺しおいたす。残念ながら、工業芏暡ではなく、かなり叀いコンピュヌタヌやラップトップでは、完党なテストを再珟するこずはできたせん。これは望たしくないこずです。



このプログラムによるず、写真の前凊理には倚くの時間がかかりたす玄250〜300ミリ秒が、コヌドをリファクタリングする必芁がありたす。文字怜出には平均で玄400ミリ秒かかりたす。感情の定矩にかかる時間はほずんどかかりたせん。関数が機胜する分類子のタむプを決定し、非垞に速い結果をもたらすためです。



最埌たで読んだ人ぞの質問



  1. Viola Jonesアルゎリズムずそのアプリケヌションを完党にカバヌしおいるこずが刀明したしたか
  2. 手を切るか、普通に読みたすか
  3. もっず曞く
  4. 曞籍やサむトの遞択がありたす。蚘事が曞かれおいるずき、私はそこを調べお、正しい蚘事を芋぀けるか、䜕も芋぀けたせんでした。しかし、私はただペヌゞぞのポむンタずフォヌラムやサむトぞのリンクを持っおいたす。それらを別のトピックにしお、Habrに配眮したすか




みんなありがずうもっず読む明けたしおおめでずうございたすSkyNoName



PSでした。この件に関するあなたの批刀ず質問を埅っおいたすたあ、たたはあなたの「ありがずう」、少なくずも䜕らかの圢で資料があなたを助けたなら...



All Articles