retireSakiの日記

たぶん引退した?ソフトウエアエンジニアのブログ

OpenCVで人の顔とアニメの顔の機械学習データの違いを実験してみました

 今回は画像処理で有名なOpenCVを使って、アニメのスナップショット画像と人物画像を使い、顔の検出の差がどうでるのか遊んでみたいと思いますw


 OpenCV (Open Source Computer Vision Library) は、超〜有名なライブラリですから、簡単な紹介だけしますね。
OpenCVは、インテルが開発・公開したオープンソースのコンピュータビジョン向けのライブラリですので、これ単体で使用するのではなく、プログラムに組み込んで使います。
C/C++, Python, Java などでプログラミングし、LinuxUNIXをはじめWindows,MacOS,Android,iOSなどをサポートしています。
画像処理や画像解析、モーション解析と物体追跡、パターン認識、さらに機械学習機能を持っています。
機械学習人工知能における重要な機能です。

 さて本題に移ります。
今回は、Ubuntu 18.04 上で g++ と OpenCV (3.2) で開発・テストしています。
ソースコードは最後に載せます。


 今回のテストではOpenCVに入っている4種類の顔の正面識別向けのHaar Cascade識別器(分類器)とGithubで公開されているアニメ用作られた分類器を使います。
 haarcascade_frontalface_alt.xml
 haarcascade_frontalface_alt2.xml
 haarcascade_frontalface_alt_tree.xml
 haarcascade_frontalface_default.xml
 lbpcascade_animeface.xml
分類器は、学習させてオリジナルのものも作れますが、膨大なパターン画像を容易する必要があるので、ガマンしますw

このブログに貼ってある画像は縮小したものです。
検出されていれば、検出部分が黄緑の四角枠で囲われます。

まずは標準添付の分類器4種で...

人の顔でテスト


人物の元画像

 まずは人の顔でテストしてみます。


haarcascade_frontalface_alt で


haarcascade_frontalface_alt2 で


haarcascade_frontalface_alt_tree で


haarcascade_frontalface_default で

まずまずの検出結果です。


アニメの人の顔でテスト


アニメの元画像

 目的のアニメの人の顔で検出できるかどうかテストしてみます。


haarcascade_frontalface_alt で


haarcascade_frontalface_alt2 で


haarcascade_frontalface_alt_tree で


haarcascade_frontalface_default で

全滅でした (ToT)
人の顔で機械学習させた分類器なので、当然の結果と言えますが...多少は期待していたのでショックです。

ここはやはりアニメ用の分類器で...

 そこでネットで探したら Github にアニメ用の分類器が公開されていたので、これを使います。
アニメの顔をOpenCV 2 で機械学習された分類器です。


アニメの元画像を lbpcascade_animeface.xml

なかなかいいですね!
 さらに正面の顔だけの別の画像だと

アニメで全員の顔が正面の画像を lbpcascade_animeface.xml

わぉ!完璧です。
それもそのはず、どうやらアイドルマスターの顔を多く学習させたもののようです。

 最後に、この分類器で人物を


人物の元画像を lbpcascade_animeface.xml

精度が落ちますが、認識できているものもありました。

ある意味
   アニメの顔 > 人の顔
と言える結果です。
アニメの顔のベースは人なのですから、当然と言えば当然ですね w

 今回のOpenCVを使った遊びはここまでです。

いろんなアニメの顔を学習させたいけど、一人でデータを揃えるのは辛いですね (ToT)
どうしようかなぁ?!

今回使用したソースコード

makefile については、gtkmm や gladeのリンクなどが入っていますが、削除し忘れなだけです (^^ゞ


main.cc

/*
 getfacearea <param1> <param2>
   param1: 検出する画像ファイル
   param2: 分類器ファイル haarcascade_frontalface_default.xml など
*/

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;

Mat detectface(Mat &image, string &cascade_file)
{
	CascadeClassifier cascade;
	cascade.load(cascade_file);

	vector<Rect> faces;
	cascade.detectMultiScale(image, faces, 1.1,3,0,Size(20,20));

	for (int ni = 0; ni < faces.size(); ni++){
		rectangle(image, Point(faces[ni].x,faces[ni].y),
                         Point(faces[ni].x + faces[ni].width,faces[ni].y + faces[ni].height),
                         Scalar(0,200,0),3,CV_AA);
	}

	return image;
}

int main(int argc, char const *argv[])
{
	Mat image = imread(argv[1]);
	string filename = argv[2];

	Mat detectFaceImage = detectface(image, filename);

	imshow("detect face",detectFaceImage);
	waitKey(0);   // wait

	return 0;
}


maakefile

LDLIBS = -lpthread  `pkg-config gtkmm-3.0 opencv --cflags --libs`
INCLUDE = .
GTKFLAGS = `pkg-config gtkmm-3.0 --cflags`
PROG = getfacearea
NAME = getfacearea
SRCS = main.cc
OBJS = main.o

$(PROG): $(OBJS)
		$(CXX) -o $(PROG) $(OBJS) $(LDLIBS)

# How to make the object files:

-include deps.mak

deps:
		$(CXX) -MM $(SRCS) > deps.mak

# Cleaning target (only works with fileutils):

clean:
		$(RM) $(OBJS) $(PROG)

このあたりは勉強しておきたいところですね (^^♪

実践OpenCV 3 for C++画像映像情報処理

実践OpenCV 3 for C++画像映像情報処理

さらに進化した画像処理ライブラリの定番 OpenCV 3基本プログラミング

さらに進化した画像処理ライブラリの定番 OpenCV 3基本プログラミング

実践OpenCV―映像処理&解析

実践OpenCV―映像処理&解析

注目記事

「Amazon.co.jpアソシエイト」または「[乙の名称を挿入]は、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイトプログラムである、Amazonアソシエイト・プログラムの参加者です。