機械学習(SVM)で花とそれ以外の部分を自動分類してみた <その1>
こんにちは。らずべりーです。
Pythonで画像分類をしてみよう!ということで、無謀にも機械学習なるものにチャレンジしてみました。
目標
紅色の花の部分画像と、それ以外(葉や枝)の部分画像を自動で区別してくれる分類器を作成する
まだ難しい方法はハードルが高いので、上記のような単純な課題設定にしてみました。 紅色の花の画像として、自分で過去に撮影していたツバキとツツジの写真を使用しました。
実行環境
手順
- 一枚の画像から部分画像を作成
- 部分画像をフォルダ分け (花の部分かそれ以外か)
- 各フォルダからランダムに同数の画像を読み込んでラベルつけ
- 個々の画像データから、基本統計量を計算
- サポートベクターマシンで学習させ、分類器を作成
- 分類器の性能をテスト
今回は<その1>ということで、始めの2項目にトライしました。
1. 一枚の画像から部分画像を作成
一枚の画像を縦横それぞれ16分割し、合計256枚の部分画像を作成することにしました。
ツバキとツツジの花の写真をバルクで読み込みます。
以前作成していたpng_bulk_read
関数をOpenCV仕様に変更した関数img_bulk_read_cv2
を新たに作成しました。
plant-raspberrypi3.hatenablog.com
import cv2 import os folder_path1 = "/usr/local/working/20171105-tsubaki_tsutsuji" os.chdir(folder_path1) def img_bulk_read_cv2(path1,format=".png"): os.chdir(path1) all_files = os.listdir(path1) file_names = [i for i in all_files if i.endswith(format)] img_files = [cv2.imread(i) for i in file_names] return file_names, img_files fname1,imgs1 = img_bulk_read_cv2(folder_path1,format="jpg")
使用する画像の一例を表示。(春に撮影したツツジです。)
画像の解像度などを確認。
imgs1[0].shape #結果 #(3264, 2448, 3)
縦、横、チャンネル数の順にタプルで返ってきます。
縦、横それぞれ16で割ると、204、153になるので、取り込んだ画像のうち1枚imgs[0]
を(204,153,3)に分割していきます。
imgs00 = [] for i in range(0,3264,204): for j in range(0,2448,153): imgs00.append(imgs1[0][i:i+204,j:j+153,:])
imgs[0]
の画像が256枚の部分画像に分割されました。
これをtmp
フォルダに5桁の連番のファイル名で保存していきます。
folder_path2 = "/usr/local/working/20171105-tsubaki_tsutsuji/tmp" os.chdir(folder_path2) for num,i in enumerate(imgs00): cv2.imwrite("{0:05d}.jpg".format(num),i) #ファイル名は00000.jpgなど
enumerate
関数はループ回数を自動でカウントして返してくれるので便利です。
zip
関数とともによく使います。
詳細は以下参照です。
生成された部分画像の一部は以下。
同様の処理を読み込んだ全ての画像に適用していきます。
2. 部分画像をフォルダ分け (花の部分かそれ以外か)
1で作成した部分画像を、
- 半分以上が花の部分のもの (
flower
フォルダ) - 花の部分が少しだけ映っているもの (
patial
フォルダ) - 花以外の部分(葉や枝)のみのもの (
others
フォルダ)
の3つに目で見て分けていきます。
今日はここで力尽きたので、続きは後日、、、
2017/11/12 続きを作成しました! よかったら読んでみてください(^ ^)ノ
plant-raspberrypi3.hatenablog.com
2017/11/12 18:25
その3をアップしました!