LoginSignup
5
0

More than 3 years have passed since last update.

これは写真なのかアニメなのか?

Last updated at Posted at 2019-12-15

はじめに

遊び(Python&機械学習の勉強)で人物の画像を入れるとそれがアニメか写真かを判断するようなことをやってみたかった:writing_hand:
顔を基準にしているので、リアルな絵を入れると写真だと判断することがあるが

準備

python3.x
pythonのバージョンに対応したOpenCV(参考: https://www.sejuku.net/blog/54272)
写真用アニメ用のカスケード分類器(後述)

実装

(フォルダ)img-画像置き場
(フォルダ)haarcascade-カスケード分類器置き場
(ファイル)auto_anime_classifier.py

これらを同一ディレクトリ内に配置

haarcascadeフォルダに置くファイルは
- haarcascade_frontalface_alt.xml
- lbpcascade_animeface.xml
この2つ
前者はOpenCVにデフォルトで入っている
後者はhttps://github.com/nagadomi/lbpcascade_animeface

auto_anime_classifier.py
import cv2
import numpy as np

if __name__ == '__main__':

    CASCADE_PATH = 'haarcascade/'
    face_count = []

    print('Plz input filename')
    img_name = input('>> ')
    img = cv2.imread('img/'+str(img_name), cv2.IMREAD_COLOR)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    photo = cv2.CascadeClassifier(CASCADE_PATH + 'haarcascade_frontalface_alt.xml')
    anime = cv2.CascadeClassifier(CASCADE_PATH + 'lbpcascade_animeface.xml')

    face_count.append(len(photo.detectMultiScale(gray, 1.1, 3)))
    face_count.append(len(anime.detectMultiScale(gray, 1.1, 3)))

    if face_count[0] > face_count[1]:
        print('Maybe photo.')
    elif face_count[1] > face_count[0]:
        print('Maybe anime.')
        elif face_count[0] >= 1 and face_count[1] >= 1:
        print('Both attributes.')
    elif face_count[0] == 0 and face_count[1] == 0:
        print('Undeciable.')

解説

OpenCVについては解説ブログ等が山ほどある為割愛。
imgフォルダ内の画像を入力、それをimread()で読み込み。その後グレー加工する

print('Plz input filename')
img_name = input('>> ')
img = cv2.imread('img/'+str(img_name), cv2.IMREAD_COLOR)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

写真、アニメそれぞれのカスケード分類ファイルを読み込んだ分類器を作成

photo = cv2.CascadeClassifier(CASCADE_PATH + 'haarcascade_frontalface_alt.xml')
anime = cv2.CascadeClassifier(CASCADE_PATH + 'lbpcascade_animeface.xml')

face_count内にそれぞれの分類器で読み取れた数を格納、これの有無が判断基準となる

face_count.append(len(photo.detectMultiScale(gray, 1.1, 3)))
face_count.append(len(anime.detectMultiScale(gray, 1.1, 3)))

最後に判断部分、シンプルに認識できているかそうでないかで比較

if face_count[0] > face_count[1]:
   print('Maybe photo.')
elif face_count[1] > face_count[0]:
   print('Maybe anime.')
elif face_count[0] >= 1 and face_count[1] >= 1:
   print('Both attributes.')
elif face_count[0] == 0 and face_count[1] == 0:
   print('Undeciable.')

現実の近さ
Maybe photo(多分実写っす) → Both attributes(どっちでもイケる) → Maybe anime(多分絵っす) → Undeciable(わからん)

Schermafbeelding 2019-12-15 om 17.57.39.png

King Of Pop Michael Jacksonです:cd:

Plz input filename
>> mj.jpeg
Maybe photo.

最後に

今回はただそれぞれの判断器が顔を認識できるかどうかの物だった。改良するとすれば各判断器から細かい判断要素について出力させ数値としてパラメータをつくってやる必要がありそう。
今度は画像を修正、加工しているかどうか判断するのとか作ってみたい(インスタにあげてる画像の加工の有無を暴く:cop_tone1:

5
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0