Ruby-OpenCVを使って顔認識をしてみた
昨日から個人的に始めたあるプロジェクトのために、まずは顔認識をしてみた。 (プロジェクトに関しては、ネット上を漁ればどこかに見つかるはずです…笑)
はじめに
OpenCVというのはOpen Source Computer Vision Libraryの略称らしくて、 インテルが開発したものらしい。(via Wikipedia)
それをRubyで扱えるようにするのがRuby-OpenCV。
・(前半) インストール ・(後半) 顔認識 の二本立てで行きます。
(前半)インストール
下のページを参考にしながら顔認識していきます。 [参考]ruby-opencvをインストールして顔認識した
まずはOpenCVをインストールして、その後にRuby-Open
$ brew tap homebrew/science
$ brew info opencv
> opencv: stable 2.4.8.2
$ brew install opencv
# opencvのインストール完了
$ gem install ruby-opencv
ってやるだけなんだけど、 OpenCVのインストールでコケた。
$ brew install opencv
> ...
> undefined method `[]' for Formula:Class
解決方法
$ brew update
$ brew install opencv
イケた homebrewの問題だった。
(後半)顔認識
続いて顔認識の部分
画像を読み込んで、顔が見つかれば赤い四角で囲って出力するようにした。
分類器は
/usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_****.xml
にあるものを持ってきて使う。 ****の部分には ・default ・alt ・alt2 ・alt_tree の4種類があったので、それぞれ使ってみてどれが優秀なのか調べてみた。
それぞれがどういう特徴をもった分類器なのかわからないけど、 2種類の画像を使って性能を比較してみた。
※もちろん、モザイクは顔認識をした後にかけています。 ※画像はクリックで拡大できます
・default
かなりミスが多い。多く間違えてもいいけど、顔を逃したくない時に有効? (と思ったけど、左側の写真の右側の顔を捕らえてなかった。。)
・alt
・alt2
・alt_tree
左側の画像では顔を捕らえられていなかったり、右側の画像では余分な部分まで検知していたり。。。
結論&実装
ということで、とりあえずaltが良さそうだった。
画像サンプル3つでやったから、信頼できるかは別だけど… これから大量の画像に対して顔認識させる予定だから、 またその時にも、どの分類器が適しているのか実験してみよう。
以下コード。 コメントを書いてあるので、詳しい説明はいらないですね。
require 'opencv'
include OpenCV
if ARGV.size < 2
puts "Usage: ruby #{$0} input.jpg output.jpg"
exit 1
end
input_file = ARGV.shift #一つ目の引数がinput
output_file = ARGV.shift #二つ目の引数がoutput
image = nil
begin
image = IplImage.load input_file, 1 #インプットファイルを読み込む
rescue
puts 'Could not open or find the image.'
exit
end
#分類器の指定
detector = CvHaarClassifierCascade::load './detector/haarcascade_frontalface_alt.xml'
#検出された顔に対してどんな処理を行うか
detector.detect_objects(image).each do |region|
image.rectangle! region.top_left, region.bottom_right, :color => OpenCV::CvColor::Red
end
image.save output_file
ブログのために写真のサイズ変更したり、モザイクかけたり大変だったわ…