plant-raspberrypi3のブログ

ラズベリーパイ3とPythonに挑戦して、植物を愛でたり画像を加工したりします。最近はscikit-imageの勉強してます。

機械学習(SVM)で花とそれ以外の部分を自動分類してみた <その1>

こんにちは。らずべりーです。

Pythonで画像分類をしてみよう!ということで、無謀にも機械学習なるものにチャレンジしてみました。

目標

紅色の花の部分画像と、それ以外(葉や枝)の部分画像を自動で区別してくれる分類器を作成する

まだ難しい方法はハードルが高いので、上記のような単純な課題設定にしてみました。 紅色の花の画像として、自分で過去に撮影していたツバキとツツジの写真を使用しました。

実行環境

手順

  1. 一枚の画像から部分画像を作成
  2. 部分画像をフォルダ分け (花の部分かそれ以外か)
  3. 各フォルダからランダムに同数の画像を読み込んでラベルつけ
  4. 個々の画像データから、基本統計量を計算
  5. サポートベクターマシンで学習させ、分類器を作成
  6. 分類器の性能をテスト

今回は<その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")

使用する画像の一例を表示。(春に撮影したツツジです。)

f:id:plant-raspberrypi3:20171105183355j:plain

画像の解像度などを確認。

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関数とともによく使います。 詳細は以下参照です。

qiita.com

生成された部分画像の一部は以下。

f:id:plant-raspberrypi3:20171105184720j:plain f:id:plant-raspberrypi3:20171105184742j:plain f:id:plant-raspberrypi3:20171105184817j:plain f:id:plant-raspberrypi3:20171105184836j:plain

同様の処理を読み込んだ全ての画像に適用していきます。

2. 部分画像をフォルダ分け (花の部分かそれ以外か)

1で作成した部分画像を、

  • 半分以上が花の部分のもの (flowerフォルダ)
  • 花の部分が少しだけ映っているもの (patialフォルダ)
  • 花以外の部分(葉や枝)のみのもの (othersフォルダ)

の3つに目で見て分けていきます。

今日はここで力尽きたので、続きは後日、、、


2017/11/12 続きを作成しました! よかったら読んでみてください(^ ^)ノ

plant-raspberrypi3.hatenablog.com


2017/11/12 18:25

その3をアップしました!

plant-raspberrypi3.hatenablog.com