OpenCVで人の顔とアニメの顔の機械学習データの違いを実験してみました
今回は画像処理で有名なOpenCVを使って、アニメのスナップショット画像と人物画像を使い、顔の検出の差がどうでるのか遊んでみたいと思いますw
OpenCV (Open Source Computer Vision Library) は、超〜有名なライブラリですから、簡単な紹介だけしますね。
OpenCVは、インテルが開発・公開したオープンソースのコンピュータビジョン向けのライブラリですので、これ単体で使用するのではなく、プログラムに組み込んで使います。
C/C++, Python, Java などでプログラミングし、LinuxやUNIXをはじめ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)
このあたりは勉強しておきたいところですね (^^♪
- 作者: 永田雅人,豊沢聡
- 出版社/メーカー: カットシステム
- 発売日: 2017/08/01
- メディア: 単行本
- この商品を含むブログ (1件) を見る
さらに進化した画像処理ライブラリの定番 OpenCV 3基本プログラミング
- 作者: 北山洋幸
- 出版社/メーカー: カットシステム
- 発売日: 2016/04/01
- メディア: 単行本
- この商品を含むブログ (1件) を見る
- 作者: 永田雅人,豊沢聡
- 出版社/メーカー: カットシステム
- 発売日: 2009/05
- メディア: 単行本
- クリック: 43回
- この商品を含むブログ (3件) を見る