見出し画像

マルクスの変身・表情は顔検出技術に勝る理由。python初心者(Ep21)

こんにちわ。
前回は、「顔以外にも検出している件」について、パラメータを調整することで可能性を感じることができたと思います。下記の記事です☆

今回は、

顔を抽出出来ていなかった写真の傾向を分析する

を実施したいと思います。宜しくお願い致します!

パターン2:顔を抽出出来ていなかった件


まずは今回のパターンにおいて、使用する画像はこちらです。

歓喜するマルクル★
検出場所は・・・。花?

まずは、これについて、前回色々と触って分かった様にパラメータを変更して抽出してみたいと思います。

マルクルの顔にフォーカスが合う数字があるか

個別最適の検討

調整してみた結果

まさかの結果となりました・・・。

minNeighbors = 1
検出ポイントは増加
scalefactor = 1.01
検出ポイントは増加


マルクルの笑顔は検出できませんでした!!

これは、参りましたね。しかし、事実は事実である為、受け止める必要があります。これからわかる事は、

Cascade.detectMultiScaleの中で格納されている画像の特徴では検出が難しい顔の形もある

という事ですかね。それを実証するために他の画像を用いて検証をしてみました。

顔を検出しない画像の傾向

調整を色々と触っても検出されなかった画像は下記の様なものでした。

マルクル変身!
特徴:口が隠れている
マルクル久々の温かい朝ごはん食べる
特徴:顔の位置を見つけれていない
minNeighbors = 1 、scalefactor = 1.01

やはりこれは、

顔の一部(口かな?)が隠れているまたは、顔の輪郭特徴が分からない

ことに伴って抽出出来ていないのではないかと思います。
それでは、

次はパラメータを変更し、すべての画像に実施してみて、前回の結果と比較したい

と思います!
今回の分析に活用したコードを下記に記載致しますねー☆

コード内容

#モジュールの設定
import cv2 as cv
import matplotlib.pyplot as plt
import numpy as np
#ライブラリのインポート
import pandas as pd
# osモジュールをインポート
import os
# 画像を読み込み
img = cv.imread('original_photo/howl013.jpg')
#画像のoepnCVで読み込んだRGB画像はBGRの順番であるため変換
img_kai = cv.cvtColor(img,cv.COLOR_BGR2RGB)
fig = plt.figure(1,(10,10))
plt.imshow(img_kai)
#画像をグレーに変換
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
#画像表示
gray_display = cv.cvtColor(gray,cv.COLOR_BGR2RGB)
fig = plt.figure(1,(10,10))
plt.imshow(gray_display)
# カスケード型識別器の読み込み
cascade = cv.CascadeClassifier("./lbpcascade_animeface-master/lbpcascade_animeface.xml")

# 顔領域の探索
face_st1 = cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=3, minSize=(30, 30))

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

#画像表示
img_face_display = cv.cvtColor(img,cv.COLOR_BGR2RGB)
fig = plt.figure(1,(10,10))
plt.imshow(img_face_display)
print("検出ポイント:{}".format(face_st1))
#画像を書込み
cv.imwrite('analysis/pattern1/minNeighbors9_how037.jpg', img)
#データフレームにして、保存
df_ana_st1 = pd.DataFrame(face_st1,columns=['x','y','w','h'])
#CSVファイルとして保存
df_ana_st1.to_csv("analysis/pattern1/minNeighbors9_how037.csv",encoding ="shift_jis")
df_pick= pd.read_csv('analysis/pattern1/pick_minNe.csv',index_col=0)
df_pick.plot.bar()

それではまた、次回!

よろしければサポート頂けると幸いです!子供へのパパ時間提供の御礼(お菓子)に活用させて頂きます☆