アメティス検出いち

(ふわふわするお米のジュースを1瓶ほど空けたあとに書いてます。)

はじめまして、あふてぃーと申します。
初投稿でこんなことを言うのもあれですが、最近推しているものがありまして・・・
プロダクション体育館のアメティスくんっていう子なんですが
可愛くないです?
↓の右の子

同じくプロダクション体育館所属のリオンくんオタクなのにも惹かれます。
ほんと狂人(下記ツイート参照)大好き。

そんな最近推してるアメティスくんなんですが、「もっと供給を受けたい・・・!」「プロダクション体育館から上がっている動画じゃ足りねぇ・・・!」となりまして様々な画像を収集したいと思った所存です。


そこで、最近話題の人工知能(*1)を使用しましてアメティスくんが写っている画像のみを抽出できるのであればより効率よくアメティス成分を摂取できるのではないかと思いまして、なんか作ってみました。
*1 この言葉は好きではないのですが受けが良いので使ってます。厳密には人工知能じゃないと思っています。専門家の方々ごめんなさい。

手順

  1. アメティスの画像を集める

  2. 画像内からアメティスの顔の場所を指定する(プログラムにアメティスの顔を教えるため)

  3. 画像+「アメティスの顔の場所データ」をプログラムに突っ込む

  4. アメティスの顔を検出するためのデータが完成!

  5. データを使って思う存分アメティスを探す

詳しめな手順

難しいのが苦手な人はあとがきまで飛ばしても大丈夫です。

1. アメティスの画像を集める

幸いアメティスは踊ってみた動画にたくさん出演しているのでYoutube動画からアメティスの画像を取ってきます。Youtube動画をそのままダウンロードするとYoutubeの規約のあのへんに引っかかりそうなのでスクショして用意します。ダンス動画なので動きが激しいと考え、今回は0.2秒毎にスクショすることにしました。

集めた画像たち

以下のようなプログラムを用意しました。

import os
import pyautogui
import time

if __name__ == '__main__':
    start = time.time()

    for i in range(1315):
        im = pyautogui.screenshot('./test/' + str(14) + '_' + str(i) + '.png', region=(99, 151, 1280, 719))
        time.sleep(0.2)

    end = time.time()

2. 画像内からアメティスの顔の位置を指定する

アメティスの横顔とか後頭とか全部検知するのはちょっと大変なので、今回はアメティスの正面顔を検知できることを目標にします。
そのため、アメティスの正面顔の位置をプログラムに教えてあげます。
今回は下記のツールに手を加えて使用しました。(Windowsだとちょっと使いにくかったので)
(正解画像のリストをinfo.dat、不正解画像のリストをng.txtとする)

学習に使用した動画は以下の3つです。(場所指定大変だったけど楽しかった・・・)

こんな感じにアメティスの正面顔を指定します


3. 画像+「アメティスの顔の場所データ」をプログラムに突っ込む

こんな感じのコマンドを使うとアメティスの正面顔の学習が始まります。
(今回はカスケード分類器を作成しようとしています。)

opencv_createsamples -info info.dat -vec info.vec -num 900
opencv_traincascade -data cascade -vec info.vec -bg ng.txt -numPos 900 -numNeg 800

4. アメティスの顔を検出するためのデータが完成!

突っ込んでしばらく待つと、謎のXMLファイルを吐き出すので取っておきます。

5. データを使って思う存分アメティスを探す

吐き出されたXMLファイルをこんな感じのスクリプトに読み込んで使用するとこんな感じにアメティスの顔を検出できるようになります。

import os
import cv2

if __name__ == '__main__':
    images = [
        "images/三原色/3_16.png",  # 後ろ頭
        "images/三原色/3_22.png",  # 正面顔
        "images/三原色/3_33.png",  # 正面やや左下むき
        "images/三原色/3_57.png",  # タイトルロゴ
        "images/三原色/3_91.png",  # 右向き
        "images/三原色/3_136.png",  # やや左向き+手で少し顔隠れる
        "images/三原色/3_193.png",  # ポちゃんのみ
        "images/三原色/3_224.png",  # 上から
        "images/三原色/3_278.png",  # 正面顔
        "images/三原色/3_320.png",  # ややボケ
        "images/三原色/3_353.png",  # クレジット
    ]
    result_dir = "result"

    if not os.path.exists(result_dir):
        os.makedirs(result_dir)

    # さっき生成された謎のXMLファイルを指定
    cascade = cv2.CascadeClassifier("cascade/cascade.xml")

    for image_path in images:
        # 入力画像の読み込み(テスト用画像ファイル)
        img = cv2.imread(image_path)

        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

        # face→ballに変更(そのままでもいいですけど)
        ball = cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=3, minSize=(30, 30))

        # 顔領域を赤色の矩形で囲む
        for (x, y, w, h) in ball:
            cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 200), 3)

        # 結果画像を保存
        cv2.imwrite(os.path.join(result_dir, os.path.basename(image_path)), img)

今回の性能テストでは三原色の動画内のアメティスに対して顔検出ができるか試しました。
今回使用した動画↓

後ろ頭
正面顔
正面やや左下むき
タイトルロゴ
右向き
やや左向き+手で少し顔隠れる
ポちゃんのみ
上から
正面顔
ややボケ
クレジット

赤枠で囲われた箇所がアメティスの顔だと検出されたところです。
ちょっと余計に検出している感はありますが、アメティスの顔の検出漏れはありませんね。

例えばこれをTwitterのTLを取得するようなプログラムと組み合わせることで、アメティスの顔(*2)が写った画像のみを取得することができるようになりますね。喜ばしい限りです。
*2 ここでのアメティスの顔とはアメティスが我々のいる世界に現界したときの姿の顔を指します。イラストの顔等はこの方法では検出は難しいと思ってます。

次は別の方法で検出を試みてみようかなと考えています。

あとがき

イラストのアメティスはこの方法では検出できないのでどうにかしたい
初投稿からこんなテンションで頭おかしい人だと思われないかしら?
普段は別の名義でTwitterやってるんですが、リア友や職場の方々がFF内にいるおかげで、ここまで暴れられないです。


この記事が気に入ったらサポートをしてみませんか?