#はじめに
現在多数の機械学習用のライブラリやフレームワークを用いた記事が公開されていますが、Tensorflowなどで実際に自分の画像を機械学習させるためには、pngやjpgの形式の画像ファイルをベクトル(つまりは配列)に変換して学習機に入力できる形に変換する必要があります。
本ページではその方法をOpenCVとnumpyを用いて説明します。
#OpenCVのインストール方法
結構簡単です。他にも記事はたくさんあります。
https://qiita.com/cointoss1973/items/92d82f9accb239a276a0
#環境
- Windows 10 64-bit
- Python 3.6
- OpenCV 3.3
#コード
実装してみたコードが以下になります。コードの説明として、
- pathsの各ディレクトリに、同じラベル付けをしたい画像ファイルをまとめておく
- すべての画像を一旦グレイスケールに変換する
- ベクトル化した後に標準化(or 正規化)を行う
- 各ベクトルをtrainにスタックしていく
- 同時にラベルも貼る
- 各データセットをnpz形式のファイルで保存
といった感じです。
make_traindata.py
# -*- coding: utf-8 -*-
import os
import sys
import numpy as np
import cv2
paths = ['./yout dir 1, ./your dir 2, ..'] #各フォルダに同じラベル付けをしたい画像を入れる
label = np.zeros(len(paths)-1)
for cnt_path, path in enumerate(paths):
files = os.listdir(path)
for cnt_file, f in enumerate(files):
file_path = path + '/' + str(f)
img = cv2.imread(file_path) #すべての画像の読み込み
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #グレイスケール変換
if cnt_path==0 and cnt_file==0:
size = img.shape
img = np.ravel(img) #画像のベクトル化
img = (img - np.mean(img)) / np.std(img) #ベクトルの標準化
#img = (img - np.min(img)) / (np.max(img) - np.min(img)) #ベクトルの正規化
if cnt_path==0 and cnt_file==0:
train = img
labels = np.insert(label, cnt_path, 1)
else:
train = np.vstack((train, img)) #trainにベクトル化した画像データをスタックしていく
labels = np.vstack((labels, np.insert(label, cnt_path, 1))) #学習ラベル付けを各ディレクトリごとに行う
np.savez('./filename.npz', trainimg=train, trainlabel=labels, imgsize=size) #データセットをnpz形式ファイルで保存
print("save done")
npz形式のファイルを読み込んで機械学習を行う方法
下記のGitHubで公開されているTensorflowのコードの
https://github.com/sjchoi86/Tensorflow-101
- mlp_customdata_basic
- cnn_customdata_basic
などが、先ほどのnpzファイルを流用できます。ただし、cnnの場合は画像の縦と横のサイズを同じにする必要があるので注意してください。