こんにちは。とりりんです。
今回は機械学習に使えるデータを作ってみようと思います。
こんなことが知りたい方向けです。
- Python初心者の方
- 画像処理をしたい方
- データサイエンスに興味がある方
AIに実行させるタスク
まず、どんなことを想定しているかを作成する画像を見ながらイメージを深めていきましょう。
入力データ・正解データはこんな感じで出来上がります。
このペアを大量に作って学習させることで、見た事ない画像でも「ここを丸を白く塗りつぶせばいいんだな!と学ぶわけです。
今回は簡単のため丸だけのデータにしましたが、バラエティに富んだ画像を与えるとより複雑なタスクができるAIを作成できます。
スポンサーリンク
2枚の丸画像のペアを大量に作成するコード
まず一気にのっけます。こんな感じで実行してください。
python makeCircle.py {コマンドライン引数}
import argparse import csv import cv2 import random import numpy as np def main(): args = Parse() # 学習用 makeData(args.trainSaveDir, args.trainNum, args.size) # 評価用 makeData(args.evalSaveDir, args.evalNum, args.size) return def makeData(imgDir, dataNum, size): for i_num in range(dataNum): img = np.zeros((size, size)) corImg = np.zeros((size, size)) x, y = random.randint(0, size - 8), random.randint(0, size - 8) cclSize = random.randint(3, 8) cv2.circle(img, (x, y), cclSize, 255, thickness=1) cv2.circle(corImg, (x, y), cclSize, 255, thickness=-1) inputPath = imgDir + "/inputs/" + str(i_num).zfill(4) + ".png" correctPath = imgDir + "/corrects/" + str(i_num).zfill(4) + ".png" cv2.imwrite(inputPath, img) cv2.imwrite(correctPath, corImg) return def Parse(): parser = argparse.ArgumentParser() parser.add_argument('-tn', '--trainNum', type=int, default=500) parser.add_argument('-en', '--evalNum', type=int, default=100) parser.add_argument('-ts', '--trainSaveDir', type=str, default="./data/train") parser.add_argument('-es', '--evalSaveDir', type=str, default="./data/test") parser.add_argument('-s', '--size', type=int, default=32) args = parser.parse_args() return args if __name__ == "__main__": main()
実際に意味があるのはmakeData関数のみです。
一般的には機械学習をする時には学習用のデータと検証用のデータに分けます。
学んでない内容で評価させたい!という意図ですね。
そのため、main関数内で2回makeData関数を呼び出すことで、学習用と評価用のデータを作成しています。
コマンドライン引数では、以下の設定ができます(丸の大きさの範囲も設定できればよかったですね)。
設定しなければデフォルト値が反映されます。
- -tn: 学習用データの数
- -en: 評価用データの数
- -ts: 学習用画像を保存するディレクトリ
- -es: 評価用画像を保存するディレクトリ
- -s: 画像の大きさ
makeData関数内を簡単に説明しておきます(変数名ちょっと適当すぎた気がする)。
変数imgとcorimgはそれぞれ入力画像(塗りつぶされてない画像)と正解画像(塗りつぶされた画像)を示しています(25, 26行目)。
座標(x, y)と丸の大きさ(cclSize)をランダムで決めます(28, 29行目)。
その後、OpenCVで丸を描きます(31, 32行目)。
thicknessは線の太さを示しており、-1にした場合は塗りつぶされます。
まとめ
今回は機械学習で使えるデータを作成してみました!
機械学習は教師データを作るのが一番大変だと思っています。
近々簡単な形で実装したいですね。
最後までご覧いただき、ありがとうございました!
Python
↓とりりんを応援して頂けると嬉しいです!↓
にほんブログ村
コメント