- Rで顔認識をやってみた話
- 顔認識の関連パッケージをセットアップする
- 男性画像に対する顔認識の検証
- 顔認識後に、顔部分をクロップ(切り出す)する
- 女性の画像を用いた顔認識の検証実験
- まとめ
- 参考 - 顔認識
Rで顔認識をやってみた話
ふと思い立って調べてみたところ、R環境で、顔認識ができる深層学習の学習済みモデルがパッケージとして提供されているらしい。 早速、Rを使った顔認識の実施例についての記事を書くことにしました。 フリーソフトウェアでも、ヒトの顔認識が高い精度できてしまうって、すごい時世ですね。
ここでいう、「顔認識」とは、デジタル画像から、ヒトの顔部分を自動的に識別するAI技術を指します。 今回、デジタル画像内の顔と思われる部分を検出して、それを抜き出しするところまでRでやってみます。
顔認識の関連パッケージをセットアップする
今回、imageプロジェクトのパッケージの1つである、image.libfacedetectionを用います。 GitHubにある、このimageリポジトリでは、Rユーザーのためのコンピュータビジョンと画像認識アルゴリズムを提供しています。
また特徴として、magick, imager, EBImageなどの他のR パッケージでは実装されていない画像アルゴリズムを実行できます。 それぞれの画像認識のアルゴリズムは、ライセンスの違いにより、異なるパッケージとして提供されています。
それでは、image.libfacedetectionパッケージと、画像処理用でmagickパッケージをインストールしていきます。
#magickのインストール install.packages("magick") library(magick) #image.libfacedetectionのインストール: CNN for Face Detection install.packages("image.libfacedetection", repos = "https://bnosac.github.io/drat") library(image.libfacedetection)
男性画像に対する顔認識の検証
image.libfacedetectionパッケージでは、デジタル画像から顔を検出する畳み込みニューラルネットワーク(CNN)を提供しています。 この深層学習のAIモデルは、事前に学習された、顔検出のモデルとなっていて、手元で学習をする必要はもはやありません。
それでは、テスト画像を読み込み、実行してみます。
#画像の読み込み image <- image_resize(magick::image_read("http://bnosac.be/images/bnosac/blog/wikipedia-25930827182-kerry-michel.jpg"),"512x") #画像表示 image
このような、3名の男性が写った、jpgのデジタル画像を使用します。 オリジナル画像がやや大きかったので、事前にリサイズをやっています。 続いて、この画像に対して、image.libfacedetectionの顔認識を実行します。
#顔認識の実行 faces <- image.libfacedetection::image_detect_faces(image) #結果の重ね合わせ plot(faces, image, border = "red", cex=1.5, lwd = 5, col = "white")
出力結果を見たところ、男性の顔部分がうまく認識されていることが分かります。 一緒にスコアが表示されていますが、98-99と高い値を示しています。
顔認識後に、顔部分をクロップ(切り出す)する
次に、magick::image_crop関数を使って、顔部分のみを切り出してみます。 切り抜いた画像はリストになっていますが、それぞれの要素を指定して、横方向に画像結合させます。
#顔の位置情報など x = faces$detections$x y = faces$detections$y width = faces$detections$width height = faces$detections$height #クロップ実行 f <- function(x, y, width, height){ magick::image_crop(image, geometry_area(x = x, y = y, width = width, height = height)) } facesM <- Map(f, x, y, width, height) #横方向に画像結合 magick::image_resize(magick::image_append(c(facesM[[1]], facesM[[2]], facesM[[3]]), stack = F), geometry = "x200")
その結果、顔部分だけを切り出して、並べれました。若干キミ悪いですが。。
女性の画像を用いた顔認識の検証実験
女性が写ったpng画像でも検証してみました。 画像内の女性はやや下向きで、文字とかが挿し絵とかが入っているのでやや難しいと思われます。。
それではやってみましょう。
#画像の読み込み image <- magick::image_resize(magick::image_read("https://cdn-ak.f.st-hatena.com/images/fotolife/s/skume/20220828/20220828015940.png"),"512x") #画像表示 image #顔認識の実行 faces <- image.libfacedetection::image_detect_faces(image) #検出結果の重ね合わせ plot(faces, image, border = "red", cex=1.5, lwd = 5, col = "white")
文字とか、色々ありましたが、女性の顔だけがうまく認識できています。 スコアは、83とやや低いですが、得られた結果は素晴らしいです!!
まとめ
Rでも顔認識がサクッとできるみたいですね。便利になりましたね。