スクリプトのお勉強 技術

顔画像のモザイク方法(python + OpenCV + face_recognition)

投稿日:2019年6月16日 更新日:

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

-スクリプトのお勉強, 技術

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

関連記事

WSL2にOpenCV + Pythonをインストールする

お手軽にやろうと思ってやってみました。作業手順自体を見ると、お手軽ではないかもしれません。 環境 インストールする/した環境は以下の通りです。 WSL2Ubuntu 20.04.2 LTSPython …

小ネタ: Ansible , with_itemsをloopに変える方法

とっても小さい小ネタです。 Ansible 2.4(今現在) -> Ansible 2.9に変えたい Ansibleを使用していますが、だいたい2.4ぐらいを使っています。流石にバージョンアップしない …

Pythonでの勘違い(if A:)

勘違い 小ネタです。 Pythonでは、以下のように書くことができます。 a = [] if a: print(“not empty!”) else: print(“empty!”) 結果は以下になり …

pipenv + Apache + Django起動設定

仕事でwebアプリケーションを作成しています。 Djangoで作成し、webサーバをApache、環境をpipenvで設定したpython3環境上で動かす予定です。 Apacheが起動するまでに、苦労 …

poetry installでJSONDecodeError

小ネタです。OSをアップデートしたので、その他もいろいろアップデートしようとしたらエラーになったので、メモとして書いておきます。 WSL2のUbuntuを 22.04 LTSにアップデート は、さほど …

google オプトアウト Click here to opt-out.