スクリプトのお勉強 技術

顔画像のモザイク方法(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 を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

関連記事

神奈川県横浜市神奈川区のワクチン接種地図作った

作ってみた。東白楽駅を真ん中にしてみました。なんとなく真ん中な感じなので。 データ元 以下のテキストデータからゴニョゴニョしてます。 https://www.city.yokohama.lg.jp/k …

Pythonでの勘違い(if A:)

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

Pythonでコマンド非同期起動

はじめに 小ネタです。 作成するプログラムの要件で、コマンドを起動して、そのコマンドが「継続」している/していないことを確認する、という要件があります。 具体的には、pingコマンドを普通に打つと、コ …

Pythonのmock.patchを使ってみる

単体テストによく使われるMockライブラリ Pythonで単体テストを行う際、実際のライブラリを使用してしまうと、実際の環境を用意しなければいけません。 例えば、データベースのテストをする際に、データ …

seaborn + Pandas + Python によるグラフ描画(その1: 準備編)

グラフ描画してみよう 今現在の仕事で、グラフ描画する可能性があるので、少し練習してみようと思います。 題材について 突然ですが、私は確定拠出型年金に加入しています。証券会社はSBI証券 にしています。 …