これは、コピペか、プログラミングか。
機械学習につよくて、トレンディな言語であるらしいPythonを学んで、各所からコピペをして、
「アニメ画像からキャラクターの髪の色を抽出する」プログラムを作りました
流れを説明したい。
1、勉強
大学の図書館で入門書を探して読む。(入門書詐欺には気を付けよう!)
僕はこれにしました。
これでPythonは完全に理解した(?)ので実践します。
2、偉大な先人を調査
大体思いつくことならだれかやってるのでやるべきことを調べます。
今回は、「アニメ顔の検出」、「画像の任意位置の色抽出」が必要だと考えて調べました。
神はネットにいらっしゃいました。以下リンク
(これ見たほうがわかりやすいし、この記事の存在価値とは?)
3、コピペ + オリジナル要素
まずソースコードがこちら
#必要物をインポート
import os
import cv2
import time
#https://qiita.com/mczkzk/items/fda37ac4f9ddab2d7f45に圧倒的感謝
# 特徴量ファイルをもとに分類器を作成
classifier = cv2.CascadeClassifier('lbpcascade_animeface.xml')
# 顔の検出
image = cv2.imread('任意の画像.jpg')
# グレースケールで処理を高速化
gray_image = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
faces = classifier.detectMultiScale(gray_image)
for i in range(len(faces)):
#https://qiita.com/Zumwalt/items/4d9bc15608483fa77476に圧倒的感謝
boxFromX = faces[i][0] #対象範囲開始位置 X座標をfacesから取得
boxFromY = faces[i][1] #対象範囲開始位置 Y座標をfacesから取得
boxToX = boxFromX + faces[i][2] // 4 #対象範囲終了位置 X座標をfacesで取得した顔の大きさをもとに設定
boxToY = boxFromY + faces[i][3] // 4 #対象範囲終了位置 Y座標facesで取得した顔の大きさをもとに設定
# y:y+h, x:x+w の順で設定
imgBox = image[boxFromY: boxToY, boxFromX: boxToX]
b = imgBox.T[0].flatten().mean()
g = imgBox.T[1].flatten().mean()
r = imgBox.T[2].flatten().mean()
print(str(i+1) + "人目")
print("B: %.2f" % (b))
print("G: %.2f" % (g))
print("R: %.2f" % (r))
time.sleep(300)
PythonやOpenCVの説明は上のリンクなどに譲るとして概要を説明する
一、顔検出
「あらかじめ機械学習をさせたものがこちらになります。」的なxmlを読み込ませて、顔の位置と大きさを出力してるらしい。(理論がわからない)
この程度の理解で使えるOpenCVは神
二、色抽出
上で求めた顔の位置を基準に周辺の色の平均をとる。すなわち、このプログラムは髪の色を抽出するというよりも、顔の上部の色を抽出すると表現したほうが正しい。実際、たまに失敗する。
二をforでぶん回して、(きちんと顔検出されていれば)任意の人数の髪色を出力する。
3、実例
まずは一人(夢見りあむ)
ちなみに(B,G,R)=(212,194,248)とは
この色である やったぜ
三人でもいける(ごちうさ)
ちなみに、この三色は
これと
これと
これである
まあおk
最後に多人数
やるやん!
4、反省と課題
・きちんと髪を認識して色を抽出したい。
・多人数になると誰がどの色かわからなくなるので、きちんとキャラと色を紐づけしたい。
・きちんと理論を理解して学習させたい。
・(このプログラムの使い道を見つけたい)
なんもわからん