京橋のバイオインフォマティシャンの日常

南国のビーチパラソルの下で、Rプログラムを打ってる日常を求めて、、Daily Life of Bioinformatician in Kyobashi of Osaka

【R言語と画像認識】学習済みAIモデルを使って、顔認識がサクサクできた話

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でも顔認識がサクッとできるみたいですね。便利になりましたね。

参考 - 顔認識

github.com

www.r-bloggers.com

cran.r-project.org

nagaremo.jp