LoginSignup
17
21

More than 5 years have passed since last update.

画像ファイルからの機械学習用データセット作成を、OpenCVとnumpyを用いて行う方法

Last updated at Posted at 2017-11-02

はじめに

現在多数の機械学習用のライブラリやフレームワークを用いた記事が公開されていますが、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の場合は画像の縦と横のサイズを同じにする必要があるので注意してください。

17
21
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
21