しょ〜うぃん広場

おもにTech系なブログ、ときどき個人的なブログ

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

かなりミスが多い。多く間違えてもいいけど、顔を逃したくない時に有効? (と思ったけど、左側の写真の右側の顔を捕らえてなかった。。) test3_default test2_default 

 

・alt

これが一番精度が高かった。完全に捕らえられてる。 test3_alt test2_alt 

 

・alt2

左側の写真の左下に余分な"顔"が捕らえられてる。 test3_alt2 test2_alt 2 

 

・alt_tree

左側の画像では顔を捕らえられていなかったり、右側の画像では余分な部分まで検知していたり。。。 test3_tree test2_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

ブログのために写真のサイズ変更したり、モザイクかけたり大変だったわ…