最終話:私は好きなジブリの絵から面白い傾向を学びました(Ep22)
こんにちわ。画像処理についても結構記載をしてきましたね。そろそろ収束していきたいと思います!笑
前回の下記の記事で、
ことを学ぶことができましたね。
顔検出技術はそもそもの特徴抽出の部分が、画像に対して適しているかによって結果は大きく異なると思います。
私は、特徴抽出のアルゴリズムまで設計できる自信が無いため、今回はこのCascade の原理を活用することでの画像検出は終了したいと思います。
それでは、
最終話を投稿させて頂きます!宜しくお願い致します。
画像すべてに調整したパラメータで実行
今まで、パラメータを変更し画像の傾向を確認しました。その結果、私としては下記のパラメータで実施することが良いと考えました。
scaleFactor = 1.01
minNeighbors = 7
minSize = 100 , 100
この理由については、下記の記事でも記載をさせて頂いた観点となります。
検出粒度を高く
一致頻度数が高い場合に検出
サイズが小さいのは無視
それでは実行した結果を確認しましょう。
準備1:前回までの処理情報を入手
前回までのデータフレームをCSVで保存をしていましたので、それを読み込みましょう。こちらのサイトで記載したCSVで保管した内容を読み込みましょう。
#requests ライブラリの使用宣言
import requests
import time
#ライブラリのインポート
import pandas as pd
import numpy as np
# osモジュールをインポート
import os
#画像表示モジュールをインポート
import seaborn as sns
#画像処理CVモジュールをインポート
import cv2 as cv
import re
#画像プロット用
import matplotlib.pyplot as plt
# original_photoのフォルダからリストを抽出
path = "./original_photo"
files = os.listdir(path)
#csvファイルの読み込み
df= pd.read_csv('output_pd_modi_1.csv',index_col=0)
これでOKです。
では設定したパラメータを用いて実行したいと思います。
なお、今回はエピソード19で述べていた時の結果と比較を行いました。
<データを深く見る前>
<データを深く見た後>
では、続いては、データを深くみた場合の検出傾向を分析ましょう。
出力されたデータの傾向について
今回の傾向を確認するために、
抽出された顔の面積の大きさ
抽出した顔の件数
抽出した顔の画像当たりの割合
を実施致しました。コードとしては下記となります。
#映画名のリスト
mo_names=["howl","kazetachinu","mononoke"]
# カスケード型識別器の読み込み
cascade = cv.CascadeClassifier("./lbpcascade_animeface-master/lbpcascade_animeface.xml")
#顔の抽出した個数は何個か
pick_num =[]
pick_num_all =[]
#顔の面積はどれくらいか
face_area = pd.Series(0)
face_area_all = pd.Series(files)
pick_area_all = []
face_area_per = pd.Series(files)
pick_area_per = []
face_count =pd.Series(files)
face_count_all =[]
#検出したすべてのリスト
pick_name_all =[]
#映画名毎に実施
for name in mo_names:
for num in range(1,51):
#活用するリンク先の確保
pick_file = "original_photo/{}{}.jpg".format(name,str(num).zfill(3))
#活用する画像の読み込み
pick_img = cv.imread('./{}'.format(pick_file))
#画像をグレーに変換
#読み込んだときの画像をグレーに変換
gray_t = cv.cvtColor(pick_img, cv.COLOR_BGR2GRAY)
# 顔領域の探索
face = cascade.detectMultiScale(gray_t, scaleFactor=1.01, minNeighbors=7, minSize=(100, 100))
#顔検出されていない場合
if len(face)==0:
face_area_all[num]=0
face_area_per[num]=0
face_count[num]=0
#顔検出されている場合
else:
# 顔領域を赤色の矩形で囲む
for (x, y, w, h) in face:
cv.rectangle(pick_img, (x, y), (x + w, y+h), (0, 0, 200), 3)
# 結果を出力
cv.imwrite('mod_photo/found_face_pa3/face_{}{}.jpg'.format(name,num), pick_img)
#顔検出領域の面積算出
for i in range(len(face)):
area=face[i,2]*face[i,3]
face_area[i]=area
#顔面積の総和
face_area_all[num] = face_area.sum()
face_area_per[num] = face_area.sum()/(1920*1038)
#顔検出の有無
face_count[num]=1
#何のファイルにどの数だけの検出ができているのか
pick_num = "{}{}_pick{}".format(name,num,len(face))
#ピックアップした顔の数をリスト化
pick_num_all.append(len(face))
#検出した名前をリスト化
pick_name_all.append(pick_num)
#検出有無をリスト化
face_count_all.append(face_count[num])
#検出した面積をリスト化
pick_area_all.append(face_area_all[num])
#検出した割合をリスト化
pick_area_per.append(face_area_per[num])
#検出顔の追加
df['pick_face_num']=pick_num_all
#検出した名前を追加
df['pick_file_name']=pick_name_all
#検出の有無を追加
df['face_judge']=face_count_all
#検出した面積を追加
df['pick_face_area']=pick_area_all
#検出した割合を追加
df['pick_face_per']=pick_area_per
このコードにおいて、下記の様なデータフレームの状態が構築されます。
それでは、前回同様に、グラフ化を行い、傾向を確認したいと思います。
結果発表:私の好きなジブリ絵は顔が中心か?
前回と同様なグラフ化をしました。
以上より、
覆すことができませんでしたね・・・。けど、ちょっと視点を変えてみました。
means = df.groupby('my_judge').mean()
これから以下の事が分かります。
私が良いと判定した方が、画素数あたりの顔の割合が高い
私が良いと判定した方が、顔検出される確率が高い
私が良いと判定した方が、動員数・売上が高い
以上より、
私が好きなジブリ絵からおもしろい傾向が見える!!
とても面白い結果になりましたね。
それではこれで、シーズン2のpython学習は終了致します。
シーズン2としてのまとめ記事は明日、発行致します。
そして、シーズン3の次回は、なんと!!!!ついに・・・。
に手を出してみたいと思います。宜しくお願い致します。
この記事が参加している募集
よろしければサポート頂けると幸いです!子供へのパパ時間提供の御礼(お菓子)に活用させて頂きます☆