Wait a moment...

機械学習ログ③:フォルダ内の画像ファイル全てに顔検出を実行

nem11.20xem (2)
352
2
2019-09-11 22:38:56
機械学習ログ③:フォルダ内の画像ファイル全てに顔検出を実行

◆筆者

 

 

かわいい赤ちゃんだよ。

 

かわいいね。

 

 

 

◆あらすじ

 

人の顔写真を入れると、かいあおりポケモンかどうかを教えてくれる『ポケモンけんしゅつマシン』をつくりました。

マシンの詳細については、他プラットフォームで恐縮ですがALISの記事をご参照ください。

 

リンクも記事も面倒だという方は下記ツイートの動画を見るとおおよそ雰囲気がつかめます。

 

 

本記事は、マシンのブラッシュアップログです。

バックナンバー( その① / その② )

 

======

 

 

◆OpenCVで顔検出をしてみる

 

素材も集まったので、次は顔の検出と切出しを行います。

 

これまで使用していた検出器は「ファイル名+4桁の整数+.jpg」のファイルを1から順に検索して画像を読み込んでいくタイプのものだったのですが、今回動画からキャプチャした元画像たちは、「動画名+4桁の整数+.png」という形式のファイル群が同一フォルダに複数セット存在しているため、上記の使用だとちょっと手間がかかります。

全選択して連番化しても良いのですが、どうせなら元のプログラムを書き換えたほうが勉強になるかなと考え、以下のような仕様にアレンジすることにしました。

 

・ファイル名や連番数字に関わらず、フォルダ内のすべてのファイルを読み込む

・jpg形式の読み書きをpng形式に変える

・といいつつ出力データはきっちりリネームし連番化したい

 

ということで、主にこちらの記事を参考に、フォルダ内の画像をすべて検出対象とする検出器を作成しました。

 

 

face_detect_ver2.py (github)

# -*- coding:utf-8 -*-

import cv2
import glob

# 画像データのパス
input_data_path = './data/new_capture/scammer_tube/'
# 切出し後画像の保存先
save_path = './data/cutgazo/new_capture/scammer_tube/'
# OpenCVの顔分類器。直下に置きました
cascade_path = 'haarcascade_frontalface_default.xml'
faceCascade = cv2.CascadeClassifier(cascade_path)

files =glob.glob('./data/new_capture/scammer_tube/*')
face_detect_count = 0
rabel = "scammer"

# 検出した顔画像を切出して保存
for fname in files:
  img = cv2.imread(fname, cv2.IMREAD_COLOR)
  gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  face = faceCascade.detectMultiScale(gray, 1.1, 3)
  
  # 1つでも顔を検出したら保存するよ
  if len(face) > 0:
    for rect in face:
      x = rect[0]
      y = rect[1]
      w = rect[2]
      h = rect[3]
      
      # save_pathに名前をつけて画像を保存する。ここかなり力技なので見た目きたないです
      cv2.imwrite(save_path + 'cut' + str(rabel) + str(face_detect_count) + '.png', img[y:y+h, x:x+w])
      face_detect_count = face_detect_count + 1

# 顔がなければコンソールにNoFaceと返す
  else:
    print(fname + ':NoFace')

 

globでglob.globすると良いことがあるようです。

cv2を読み込まず2時間ほどハマりましたが、Day1で環境を再構築した際に、OpenCVとAnaconda3と使用IDEの各種紐づきが取れちゃったのかなと考え、Anaconda3をclean後をOpenCVを再インストールしPATHを通すなどしてとりあえず完成しました。

 

 

 

◆スクリーニングふたたび

 

検出器にええいままよとpng形式の画像を突っ込んだのですが、有り難いことにちゃんと読み込んでくれました。

というよりは、やや読み込みすぎてしまいました

 

 

仕方ないのですが、人の顔ではないものも多数検出してしまっています。

面倒なのが、数字や文字や服の影などを顔として認識している関係上、素材1枚につき複数の顔検出が発生してしまうことで、上記画像のラベルでは、最初に集めた画像700枚に対し、検出した顔画像が1900枚と、ボリュームが2倍以上に膨れ上がってしまいました。

 

仕方がないので、ここでも淡々と人力でスクリーニングします。

 

 

 

◆やっぱり素材が足りない

 

ということで検出を終え、各ラベルごと以下の枚数の素材が集まりました。

 

ラベル1(XP)

 キャプチャ素材768枚→顔検出2860枚→間引き後431枚

 

ラベル2(Wowbit)

 キャプチャ素材396枚→顔検出3420枚→間引き後280枚

 

ラベル3(NOAH)

 キャプチャ素材746枚→顔検出1940枚→間引き後681枚

 

 

そもそも顔を検出しすぎていた感もありますが、検出画像と比して、かなりボリュームダウンしてしまいました。

このうちラベル2については、キャプチャした動画に常時テロップが出ていたのですが、そのテロップに人間の顔が使われており、余分な検出をしてしまう裾野があったように思います。

事前にわかったはずですが見落としていました。反省。

 

というわけで、素材は集まったものの絶対量としてはまだまだ少し心もとないので、次回は素材画像を回転させて学習データを水増しするマンを作っていこうと思います。

 

 

前後の記事:

その①:【ご挨拶】Youtube動画を自動でスクショし学習素材を取得

その②:【前処理】大量の不要素材を人力で間引く

その③:【顔検出】フォルダ内の画像ファイル全てに顔検出を実行 ←★イマココ!

その④:【お休み】次の手を考えながら焼肉を堪能しました

その⑤:【ハマり】TensorFlowのインストールに8時間を費やす

 

Comment
仮想通貨の赤ちゃん
仮想通貨の赤ちゃん
2019-09-12 22:57:06ID:147006

>>目指せ北海道::さん
ありがとうございます!globの便利さはなんとなく理解しましたが、リストの意味はまだあまり掴めてなかったりします!

目指せ北海道
目指せ北海道
2019-09-12 06:30:07ID:146861

glob.glob便利ですねー。夏休み中にPythonの基礎を少し勉強して、[]にずらずらーっとリストを並べる意味がようやく分かりました。機械学習は素材集めが一番重要で、一番たいへんですね。頑張ってください。

この記事を書いた人
2017年12月に仮想通貨取引をスタートした、ちいさなちいさな赤ちゃん。 小さなお手手で、投げ銭をたくさん集めているよ。かわいいね。