TensorFlowで日向坂46の顔識別をしてみた -TFRecord作成編-
ここでは学習用データの準備を行います.
CSVファイルからデータ情報を読み込む方法もあり,1度試したのですがTFRecordで実装した場合の方が楽で使用するGPUメモリの量も少ないです.(これは実感ですが)
手順1. 顔画像の振り分けを行う
切り取った顔画像が「誰」なのかという振り分けを行います.人力でやらないと行けない分ここがおそらく一番苦行でした...
こんな感じで一人あたり200~400枚くらいの顔画像を振り分けました.人によってバラつきがあるのはブログ更新頻度によって全く画像枚数が異なるので顔画像データに多い少ないの差があるためです.
手順2. 学習データとテストデータに分ける
3つ目のセルで全部の画像をtrainフォルダに移動させ,4つ目のセルで2割の画像をランダムにテストデータに振り分けてtestフォルダに移動させています.初期段階では画像数が少なかったので9割を学習データ,1割をテストデータにしていました.(testRateで変更できます)
trainフォルダへの移動
learningPath = "images/learning/" learningMemberPath = glob.glob(learningPath + "*") for index, memberPath in enumerate(learningMemberPath): learningMemberPath[index] = memberPath.replace("\\", '/') # それぞれのメンバーの学習用画像を全部取得 fileList = glob.glob(memberPath + "/" + "*") for imageFile in fileList: os.makedirs(memberPath + "/train/", exist_ok=True) shutil.move(imageFile, memberPath + "/train/" + imageFile.split("\\")[-1])
testデータの振り分け
# move test folder for memberPath in learningMemberPath: fileList = glob.glob(memberPath + "/train/*") testRate = 0.2 testNum = math.floor(len(fileList) * testRate) testFileList = random.sample(fileList, testNum) for imageFile in testFileList: os.makedirs(memberPath + "/test/", exist_ok=True) shutil.move(imageFile, memberPath + "/test/" + imageFile.split("\\")[-1])
例:matsudaフォルダ
train 241枚
test 60枚
手順3. TFRecordファイルを作成する
関数CreateTensorflowReadFile()では引数に「画像リスト」と「出力するTFRecordファイルの名前」を持っています.それぞれの画像を作成するモデルの入力画像のサイズ(ここではまだ挙げていませんが128x128x3を入力としています)にリサイズしバイト列として書き込んでいきます.他の情報として,「縦サイズ」「横サイズ」「ラベル(0 ~ 20)」「画像のパス」も記録するようにしています.
TFRecordを作成するにあたり以下のサイトを参考にしました.
output_tfrecords.ipnybの一番最後のセルは正常にTFRecordファイルが作成できているかを確認する用です.実行するとTFRecordファイル内に記録した画像を checkTFrecords フォルダに出力します.
これでようやく準備が整いましたので次は学習にうつっていきます.
次の記事