見出し画像

前編:私の好きなジブリ絵は顔が中心なのか。python初心者(Ep18)

おはようございます!前回に顔検出が出来た事の喜びで、燃え尽きかけていました。笑。

今回から、タイトルで今回の記事が何か。を分かる様に記載しようと思います。 というのが、自分で書く記事に対しての友好的な使い方としては、

記事を振り返り、どの様なプロセスで実施できたか振り返ること

を目標にしていました。しかし、何という事でしょう。タイトルがすべて一緒で結局中身を見ないと気づかない と気づきました。笑。その為、これからはタイトルと表紙画像は変更を使用と思いますので、宜しくお願い致します。それでは本日も行ってきましょう!

準備1:画像の連続読み出し

今回、私が保存している映画の種類は、「ハウルの動く城」「風立ちぬ」「もののけ姫」の三本になります。それぞれの画像が50個ありまして、それぞれの画像を読み込みができる状態にしたいと思います。
※注意:下のプログラムでは、3種類x1枚ずつでトライをしているコードですので、実際に活用する時は画像枚数に合わせて記載下さい。

#映画名のリスト
mo_names=["howl","kazetachinu","mononoke"]
#映画名毎に実施
for name in mo_names:
   for num in range(1,2):
       #活用するリンク先の確保
       pick_file = "original_photo/{}{}.jpg".format(name,str(num).zfill(3))
       print (pick_file)
       #活用する画像の読み込み
       pick_img = cv.imread('./{}'.format(pick_file))
       #画像をグレーに変換
       #読み込んだときの画像をグレーに変換
       gray_t = cv.cvtColor(pick_img, cv.COLOR_BGR2GRAY)
       #閾値処理を実施
       #type:しきい値threshより大きい値がmaxvalに、それ以外の値が0に置き換えられる
       # cv.threshold(img, thresh , maxval , type)
       ret, thresh = cv.threshold(gray_t,80,255,cv.THRESH_BINARY)
       
   #画像表示
   thresh_display = cv.cvtColor(thresh,cv.COLOR_BGR2RGB)
   fig = plt.figure(1,(10,10))
   plt.imshow(thresh_display)

※出力結果

結果出力1

お~~~。いい感じ!

これで、リンク先の画像を抽出し、抽出した画像に対して、今回ではグレーに画像変換。を行う事はできましたね。
※最後のピックアップした画像に対してのみ、画像表示がされていますので、ご注意ください!これでループする文章の中で、画像の抽出、画像の変換ができましたので、輪郭抽出を行っていきたいと思います。

準備2:検出した輪郭座標をリストで検出(ステップ1)

前回の記事で記載した様に、輪郭を検出した場合は、座標情報が入手できることが分かりました。その為、

その輪郭画像情報をリスト化して保存

することを考えたいと思います。しかし、やりながらである事もあり、ステップを踏みます。ご了承下さい。まずは下記をトライしました。

#映画名のリスト
mo_names=["howl","kazetachinu","mononoke"]

# カスケード型識別器の読み込み
cascade = cv.CascadeClassifier("./lbpcascade_animeface-master/lbpcascade_animeface.xml")

#映画名毎に実施
for name in mo_names:
   for num in range(1,2):
       #活用するリンク先の確保
       pick_file = "original_photo/{}{}.jpg".format(name,str(num).zfill(3))
       print (pick_file)
       #活用する画像の読み込み
       pick_img = cv.imread('./{}'.format(pick_file))
       #画像をグレーに変換
       #読み込んだときの画像をグレーに変換
       gray_t = cv.cvtColor(pick_img, cv.COLOR_BGR2GRAY)
       
       # 顔領域の探索
       face = cascade.detectMultiScale(gray_t, scaleFactor=1.1, minNeighbors=3, minSize=(30, 30))
       print(face)
       print(type(face))
       # 顔領域を赤色の矩形で囲む
       for (x, y, w, h) in face:
           cv.rectangle(pick_img, (x, y), (x + w, y+h), (0, 0, 200), 3)

#画像表示
img_face_display = cv.cvtColor(pick_img,cv.COLOR_BGR2RGB)
fig = plt.figure(1,(10,10))
plt.imshow(img_face_display)

出力結果はこちら。(レンジを映画毎に1枚のみでトライにしていますので、活用時は修正下さい)

結果出力2

ここで、二つの事を理解することができました。

①輪郭を抽出できていない場合は、タプル型(要素無し)になっている
②輪郭は複数抽出されることがある

これは大きな1歩です。その為、要素が何個あるか。によって、判断を分ける必要がありそうですね。また、変なところに顔認証が!笑。これまた、発見ですね。

準備3:輪郭を何個検出されるのか抽出

輪郭の個数が何個検出されたのか。この情報をファイル名に合わせて追加したいと思います。

#映画名のリスト
mo_names=["howl","kazetachinu","mononoke"]

# カスケード型識別器の読み込み
cascade = cv.CascadeClassifier("./lbpcascade_animeface-master/lbpcascade_animeface.xml")

#顔の抽出した個数は何個か
pick_num =[]
#検出したすべてのリスト
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))
       print (pick_file)
       #活用する画像の読み込み
       pick_img = cv.imread('./{}'.format(pick_file))
       #画像をグレーに変換
       #読み込んだときの画像をグレーに変換
       gray_t = cv.cvtColor(pick_img, cv.COLOR_BGR2GRAY)
       
       # 顔領域の探索
       face = cascade.detectMultiScale(gray_t, scaleFactor=1.1, minNeighbors=3, minSize=(30, 30))
       
       # 顔領域を赤色の矩形で囲む
       for (x, y, w, h) in face:
           cv.rectangle(pick_img, (x, y), (x + w, y+h), (0, 0, 200), 3)
       
       #案1
       #何のファイルにどの数だけの検出ができているのか
       pick_num = "{}{}_pick{}".format(name,num,len(face))
       #検出した名前をリスト化
       pick_name_all.append(pick_num)
       
       #案2
       #検出した名前をリスト化
       #pick_name_all.append(len(face))
       
#画像表示
img_face_display = cv.cvtColor(pick_img,cv.COLOR_BGR2RGB)
fig = plt.figure(1,(10,10))
plt.imshow(img_face_display)
print(pick_name_all)

出力結果(一部抜粋):

結果出力3

思ったよりも検出が少ない・・。

コードの補足:
案1は、抽出したファイル名に合わせて、記録をとる方法と、案2はピックアップした輪郭件数のみ を集める方法にしています。のちのち、データセットの中に追加することも考えて、案1を私は選択して活用します。
※のちのち「本当に抽出したファイルに対してできているのか。」を確認することを考えると、よいかと思いますので。

これで輪郭の検出数は分かりましたね。それでは次回は、

後編:私の好きなジブリ絵は顔が中心なのか。python初心者

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

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