Python3での顔画像モザイク方法
python3での顔画像モザイクの方法を調べてみました。
仕事とは関係なく、単なる趣味だったりしますが。。
この内容で、Djangoと統合する予定です。
OpenCV
OpenCV(Open Source Computer Vision Library)とは、画像処理ライブラリです。むしろ画像解析ライブラリといった方がいいかもしれません。
よくpythonと一緒に使われることが多いことと、顔画像の検出に使用しようと思いました。
インストール方法
まずは、OpenCV(4.1)をインストールしようと思います。
OSはubuntu18.04を使用しています。
### 前準備 $ sudo apt install libjpeg-dev libpng-dev libtiff-dev $ sudo apt-get install build-essential cmake unzip pkg-config $ sudo apt install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev $ sudo apt install libxvidcore-dev libx264-dev $ sudo apt install libgtk-3-dev $ sudo apt install python3-dev ### OpenCVのインストール $ wget https://github.com/opencv/opencv/archive/4.1.0.zip $ wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.1.0.zip $ unzip unzip 4.1.0.zip $ cd opencv $ mkdir build $ cd build $ cmake -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=/usr/local \ -D INSTALL_PYTHON_EXAMPLES=ON \ -D INSTALL_C_EXAMPLES=OFF \ -D OPENCV_ENABLE_NONFREE=ON \ -D BUILD_EXAMPLES=ON .. $ make $ make install
上記で、/usr/local/share/opencv4/などにインストールされます。
また、あらかじめpython3をインストールしてあると、コンパイル時に認識してくれるようです。
そして、できなかった。。
いろいろなサンプルを見て実装しようとしたのですが、、
どうしても能力不足で顔の部分を認識してくれませんでした。
ということで、あっさりあきらめ(はやい)、別の方法にすることにしました。
まぁ趣味だからね。。(いいわけ)
face_recognition ライブラリ
opencv単体では、顔検出が出来ませんでした。
ので、顔検出はface_recognitionを使用します。
face_recognition ライブラリとは
face_recognitionライブラリとは、
顔画像の検知及び操作を簡単に行うためのpythonライブラリだそうです。
face_recognitionのサンプルでは、顔全体だけでなく、目だけとか、目と口とかの検知も可能なようです。
インストールは以下で行います。
$ pipenv install face_recognition
サンプルコード
以下のようなサンプルコードを書いてみました。
juypiter上で動作させています。
import cv2 import face_recognition import matplotlib.pyplot as plt # matplotlib(描画用) def mosaic(img, scale=0.05): # 画像を scale (0 < scale <= 1) 倍にリサイズする。 mosaiced = cv2.resize(img, dsize=None, fx=scale, fy=scale, interpolation=cv2.INTER_NEAREST) # 元の大きさにリサイズする。 h, w = img.shape[:2] mosaiced = cv2.resize(mosaiced, dsize=(w, h), interpolation=cv2.INTER_NEAREST) return mosaiced # 画像を読み込む。 img = cv2.imread("AKANE20160312012313_TP_V.jpg") # 顔検出する。 locations = face_recognition.face_locations(img) print(locations) # 検出された顔領域に対して、モザイク処理を行う。 for top, right, bottom, left in locations: img[top:bottom, left:right] = mosaic(img[top:bottom, left:right]) red = (0, 0, 255) cv2.rectangle(img, (left, top), (right, bottom), red, thickness=3) # 可視化する。 plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) plt.show()
元画像(AKANE20160312012313_TP_V.jpg)は以下です。

juypiter上で動作させた際には以下になります。
赤で、どこを「顔」として認識しているか、表示してみました。確かに認識されています。
あと、「167, 1157, 390, 935」はtop, right, bottom, left、のようです。デバッグ用に出力してみました。

おわりに
まぁできたのでいいことにしよう。。
参考
https://avinton.com/academy/opencv3-4-3-python3-6-ubuntu18-04-install/
http://pynote.hatenablog.com/entry/opencv-mosaic
http://pynote.hatenablog.com/entry/face-recognition_1