しょ〜うぃん広場

おもに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

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

RubyGemでのインストール時に--no-ri --no-rdocをデフォルトで付ける

中国で開発をしているとネットの回線速度が遅くて、なにをするにもいろいろ時間がかかる。
(特に海外のサーバーを訪問する時にはGreatFireWallのお陰で500KB/sec以上はなかなか出ない。)

そこでgemをインストールする時とかは

$ gem install foobar --no-ri --no-rdoc

としたいんだけど、すぐに忘れてしまう。

だから、デフォルトでドキュメントをダウンロードしないようにしたい。

$ echo "gem: --no-ri --no-rdoc" >> ~/.gemrc

これだけで良いらしい。

便利になった。

さくらVPSでOpenSSLのアップデートをした

少し前にOpenSSLの脆弱性で大騒ぎになって、
最近は脆弱性を利用して情報を盗みだした人が逮捕されたとかよくニュースで見るようになりましたね。

個人的にさくらVPSを借りて、Webサービスを動かしているんですが
まぁ個人情報扱うようなサービスじゃないし、大した情報も入ってないからいいや。
って思って放置してました。

でも、やっぱり確認しておこうかなと、ふと思い立ったのでその作業過程をメモしておきます。

環境:CentOS 6.5

OpenSSLのバージョンを確認

$ rpm -q openssl
> openssl-1.0.1e-16.el6_5.4

openssl-1.0.1e-16.el6_5.7未満は脆弱性が存在するらしいので、 うちのサーバーは脆弱性が存在していたみたいです。 おぅ。。。 ということで

OpenSSLのアップデート

$ yum update openssl
> (アップデートログがダラダラダラダラ......)

途中で アップデート続行しますか?(y/n) みたいなことを聞かれた気がするから[y]を入力してEnter。

アップデートが終わって一応バージョンを確認

$ rpm -q openssl
> openssl-1.0.1e-16.el6_5.7

OK!

稼働しているWebサーバやFTPサーバは再起動させた方が良いそうですが、
いちいち再起動させるのは面倒だったので、サーバ本体を再起動させました。

これで心臓からの出血を止められたようです。

デロイトトーマツコンサルティングのインターンに挑む

9月になって暇になったから、夏休みの出来事を振り返ろう。

[6月中旬]

コンサルに興味があったから、夏休みインターンとか行ってみようかなーって思って軽い気持ちでインターン申し込みをした。
戦略コンサルってインターンやってるところはそんなに多くなくて、しかも対象が2014年度卒ばっかりだったから自分が申し込みできたのはデロイトトーマツコンサルティング1社だけだった。
5月ぐらいにコンサルの面接勉強会に行った時、周りの人達から3~5社ぐらいインターンの申し込みするって聞いてたから、1社だけじゃどうせ無理だろーとか思ってた(笑)

最初の申し込みフォームには1000字以内でインターンで学びたいことを表現しなさいという課題が付いていた。
インターン採用までの流れを何にも知らない自分は、この課題だけで採用が決まると思って結構本気で書いた。

[6月下旬]
デロイトさんからメールが来て、7月中旬までにWebテストを受けてくださいという旨だった。
「え、Webテストとかあんのかよ…
しかも申し込みした人全員受けるとか、これ絶対最初の1000字のレポート読まれないじゃん。。」
て思ってちょっとショックだった。

Webテストってどんなんかなー!?ってちょっとワクワクしながら「開始」のボタンを押した。
大問5個あって、それぞれ制限時間が15分だった気がする。

最初の大問は国語っぽい内容だった。
「上の文章はつまりどのようなことを言っているか」とか「上の文章の内容とそぐわない選択肢はどれか」
とかそんな感じの内容。
国語の出来が悪い自分は、わけがわからなくて焦った。
わけわからんまま15分が過ぎて絶望した。
敗因は「開始」ボタンを押してから、喉乾いたなーって思ってのんきにお茶を淹れに行った事だとおもう。
こくごりょくがたりないとかそんなんじゃないとおもう。
そんな感じで大問1が自分を本気にさせた。(本気で解いても大問1は出来が悪かっただろうから最初に国語の問題が来たのは幸運だった。)

大問2は、数学っぽい問題。
IQテストとかによく出てくるような空間図形の問題だったり、場合の数とか計算するような問題。
楽勝だった。正答率9割超えたんじゃないかと思うけど、分からん。

大問3は、英語の問題。
10行ぐらいの英文が書かれていて、その内容について設問が4,5個付いてる感じ。
最近英語なんて全く触れてなかったからアルファベットが目に入った瞬間「やってしまった…」と思ったけど、意外と読めた。
でもやっぱり単語力は結構落ちてて、単語は復習しないといかんなーと思った。(結構それ以降も単語の勉強はしていない)
英語は7割ぐらいできた感じ。

大問4,5は性格テスト(適性テスト)。
学校の保健室とかがたまに実施するアンケートみたいな感じのやつ。
全部で200問近くあって、疲れた。

そんな感じで75分かけてWebテスト終わった。
国語が散々な出来だったから落ちたと思った。

[7月末]
デロイトさんからメールが来て、Webテスト合格したから一次面接に来いって言われた。
「おいおい、Webテストで採用決まるかと思ったら面接までするんかい。
しかも"一次"面接ってことは二次面接もあるんだよね…?」
インターンってそんなにオオゴトなのかと思った。

一次面接の日程はWebで都合のいい日を選ぶ方式だったんだけど、ほとんどが大学の期末試験と被ってる。。。
オワッタ…
と思ったけど、面接最終日は大学の試験が終わる次の日だったから、なんとか行けるっぽい。
試験後に出さなきゃいけないレポートがあったけど適当に終わらせた。
結局面接当日の朝に京都から東京まで新幹線で行くしか選択肢がなくて、金かかった。
インターンの面接のために往復3万の交通費とか…おとうさん、おかあさん交通費出してくれてありがとう。

そんな感じで、一次面接で落ちるわけにはいかなかったのでがんばった。
みんなスーツのジャケット着ててネクタイも締めてた中、ぼくは半袖ワイシャツ ノーネクタイでがんばった。
面接の控え室を間違えて思いっきりミーティングしてる部屋に入っちゃったけど、がんばった。

これはパスしただろうと思ったら、案の定4時間後ぐらいに一次面接の合格通知(メール)が届いた。

[8月上旬]
二次面接行ってきた。
今回はケース面接らしい。コンサルっぽいねぇ。
最初の60分で筆記試験で、そのあと30分は回答した内容についての面接がある。
設問の内容とか書いたらマズそうなので一応秘密に…

空き時間に周りの人と話したけど、みんなガチ就活生だからケース面接の対策とかかなりしてるっぽい。
「今回ちょっと特殊だったからいつものケース面接の定石使えなかったよね」みたいな話してて ほえ〜 ってなった。
自分は明らかに対策不足というか、、、
周りの人たちは「銅の剣」とかもってるのに、自分は「ひのきのぼう」で戦ってる気分になった。

完敗

二次面接落ちました…笑

敗因としては
・ケース面接対策不足
ロジカルシンキングができてない
・デロイトさんと相性がよくなかった
・そもそも自分の考え方がアホ
辺りがあげられるんだけど、どれかわからない。
敗因がハッキリしないのが一番悪いパターン。。。
来年の就活でコンサル受けるんだったら上2つをやれば大丈夫かなぁと思ってるけど…

やっぱりコンサルは倍率的にも能力的にも厳しいなぁと感じました。

 

大変だ大変だ!! もう人生の半分終わってる…!!!

20歳のみなさん、もう人生半分終わってますよ。ええ。

いや、みんな40歳で死ぬとかそういうことではありません。
85歳で死ぬことを仮定して計算しましたから。

「なんか昔に比べて最近1年が早く感じるなぁ…」

とか思ったことありませんか?
ありますよね!?
小学校の時の1年間は長く感じたのに、最近はすぐに次の年になっちゃう…とか。

…なんでですかね?

ぼくの考えでは
「今まで生きてきた期間に対して、その1年がどのぐらいの比率を占めるか」が重要だと思うんですよ。

つまり5歳の子にとっては最近1年間は今までの人生の20%を占めるわけです。
でも80歳のおじいちゃんおばあちゃんにとっては、最近の1年間って今までの人生の1.25%にしかならない訳ですよ。
この違いが時間の体感速度の違いを生み出してるのではないかなぁと思うわけです。

って事で、(ひまな)大学生の立場を利用して簡単(雑)に計算してみました。
物心つくのが4歳だとして、そこから20歳まで、Σ(5→20)1/nを計算すると1.47
20歳から85歳までΣ(21→85)1/nを計算すると1.44
(計算は大雑把なので有効数字2桁が妥当だと思います…)
20歳でちょうど半分ですよ…!!

人生まだあと3/4ぐらいあるぜー!!!
って思ってたらあと半分だった。。。

もちろん絶対的時間は3/4あるんですが、ぼくの体感速度理論だとあと半分みたいですね。

って事で20歳になったー!!合法的に酒飲めるー!!!タバコ吸えるー!!!!!
とかウカウカしてたらすぐに30歳、40歳になっちゃいますよ。

別に焦る必要ないけど、そろそろ将来設計も… って感じですかねぇ。

うー、気付いたらあと4ヶ月で20歳だ。
この調子だと、気付いたら死んでるかも。
いや、死んだら気付かないから、気付かないうちに死んでるな…


(成人式で話す機会あったらこの話しよう…笑)


追記:
この記事書いた後に気付いたんだけど…
なにも1年毎に離散的に考えなくても、連続的に考えればもっと簡単だった…笑
1/nを5→20まで積分して(log20)-(log5)=log4=1.38629
1/nを20→85まで積分して(log85)-(log20)=4.44265-2.99573=1.44692
あれ、結構差がある…苦笑
さっきの計算適当すぎました…笑
まぁだいたい半分って事で!ははは

80歳までと仮定すると(log80)-(log20)=log4=1.38629
となってちょうど半分になるんだけどね!