プログラミング知識ゼロからGoogleColaboratoryでAI始めてみた(4)
(前回記事の続きです)
こんにちは。IIUの鎌田です。
今回は前回の予告通り学習データの準備方法を説明していきます。
準備と言ってもやることは以下の3つだけです。
- 画像の用意
- 画像サイズの変更、統一
- 画像の水増し
画像は目的に応じて各自でご用意して頂きますが、画像サイズの変更(リサイズ)と水増しはコピペできるpythonコードを載せますので是非使ってみて下さい。
1.画像の用意
まずは画像が無ければ何も始まりません。
ここは写真を撮るなり検索するなりで頑張って集めましょう。
私の場合は机の散らかり具合を判定したかったので、「綺麗な机」「ちょっと散らかった机」「めちゃくちゃ散らかった机」の3パターンに分けて集めました。
集め方は実際に社内の机を撮影した分と、Google検索で適当な写真を集めただけですね。
各項目それぞれ同じ枚数ずつ画像を用意した方が良いですが、最低限30~50枚程度はあった方が良いと思います。
2.画像サイズの変更、統一
今回使うAI学習プログラムでは画像サイズを統一しないとできないものを使っているので、あらかじめ画像をリサイズしておきます。
高性能なGPUマシンであれば自由な画像サイズでも高速に処理してくれるのですが、GoogleCorabolatoryの無料環境となるとそうはいかないので、簡単に処理できる形にしておいた方がスピーディーです。
では実際にどうやってリサイズしたかというと以下のコードを使いました。
file_resize.py
- #フォルダ内の画像サイズを一括で変更する
- import os
- import glob
- from PIL import Image
- ##設定#################################################################################################
- input_image = ‘drive/My Drive/画像認識/初期画像/○/’ #サイズ変更したい画像フォルダを指定
- output_image = ‘drive/My Drive/画像認識/サイズ変更後画像/○/’ #サイズ変更後の出力先フォルダを指定
- width = 224 #画像の幅を指定
- height = 224 #画像の高さを指定
- #######################################################################################################
- files = glob.glob(input_image + ‘*’)
- print(‘画像サイズ変更中’)
- for f in files:
- img = Image.open(f)
- if img.mode == ‘RGBA’:
- img = img.convert(‘RGB’)
- img_resize = img.resize((width, height))
- basename = os.path.basename(f)
- img_resize.save(output_image + ‘resize’ + str(width) + str(height) + ‘_’ + basename)
- print(basename)
- print (‘画像のサイズを変更しました。’)
※ #内のフォルダの場所と画像のサイズを変更して使用してください
ファイル名の先頭に「resize○○○○○○_ 」と付いて出力されるようになってます。
※ ○○○○○○は画像の幅と高さを並べた数字です
画像のサイズは小さいほど学習が早くなりますが、画像が圧縮されて学習精度が落ちる可能性もあるので注意してください。
3.画像の水増し
画像をリサイズした後は水増しです。
AIの学習には画像データがあればあるほど有効なのですが、データが少ないときにとても助かる手法です。
水増しは、用意している画像を回転・反転させたり、明るさ・コントラスト変更、ノイズや歪みを発生させたりして適当な画像データを生成します。
今回は使ったコードはこちらです。
image_augment.py
- #画像を水増しする
- import Augmentor
- ##設定#################################################################################################
- images_dir = “drive/My Drive/画像認識/サイズ変更後画像/○” #水増しする画像のフォルダを指定
- images_num = 70 #水増し枚数を指定
- #######################################################################################################
- p = Augmentor.Pipeline(images_dir)
- p.random_distortion(probability=1, grid_width=4, grid_height=4, magnitude=5)
- p.random_contrast(probability=0.5, min_factor=0.4, max_factor=0.8)
- p.random_color(probability=0.5, min_factor=0.4, max_factor=0.8)
- p.rotate90(probability=0.5)
- p.rotate270(probability=0.5)
- p.shear(probability=0.5, max_shear_left=10, max_shear_right=10)
- p.flip_left_right(probability=0.8)
- p.flip_top_bottom(probability=0.3)
- p.sample(images_num)
- print (‘水増しが完了しました’)
このコードではAugmentorというライブラリを使うので、実行する前に下記のコードを実行してインストールしておいてください。
- pip install Augmentor
インストールの際にSuccessfully installed Augmentorという文が出たら成功です。
プログラムはgoogleドライブに保存されるのですが、ごちゃごちゃになりやすいので分かりやすくフォルダ名を設定しておいた方が絶対に良いです。
今回も先程のリサイズと同様に緑の#内さえ設定すれば使えるようになっています。
※image_numの部分は合計の水増し枚数を記入します。
今回の例でいうと、フォルダ内に30枚の画像があったら、プラス70で100枚になるという形です。
各写真を70枚ずつ増やして2100枚になるわけではないので注意してください。
出力先は指定したフォルダ内にoutputというフォルダが生成されてそこに出力されるようになっています。
これでデータの準備完了です!
今回準備したデータをクラスごと(私で言うと○×△)のフォルダに分けていよいよ学習に入ります。
また私が使っているコードと一緒に紹介するので待っていてください。
それでは!