一か月のご無沙汰です。雑草認識の仕組みを色々と試行錯誤していたら一月経ってしまいました。。。ということでブログの更新を再開したいと思います。
現在開発中の草刈ロボットは5メガピクセルの解像度を持った単眼カメラを搭載しています。カメラはCSIでRaspberry Pi Zero WHに繋がっています。まず、雑草かどうかを判別するための大まかな処理手順ですが、以下のようになります(ここでは雑草までの距離推定までは扱いませんので、念のため)。
- 取得した画像から緑色がdominantな四角形領域を選択する
- 選択した領域のスーパーピクセルを計算し、緑色がdominantなセグメントを選択し、他セグメントを黒色で塗りつぶす
- カスケード分類器で緑色がdominantなセグメントが葉脈を含むかどうか判別する
1.の緑色がdominantかどうかは、四角形領域のRGB値のヒストグラム(16分割)を求め、緑色のピークが赤色、青色のピークより右側に来ていることで判別しています。2.ではOpenCVに含まれるスーパーピクセル計算関数を利用しました。また、緑色がdominantかどうかは1.と同じロジックを流用しています。3.のカスケード分類器はOpenCVに含まれるものを利用させていただきました。
緑色がdominantな領域の選択
写真は実家の庭をスマホで撮影したものの内の一つです。元々の写真の大きさは1108 x 1478ピクセルの大きさのものを1/4にリサイズしています。Raspberry Pi Zero WHは、ハードウェアリソースが限られており、画像処理以外にもやらなければならないタスクがあるため、なるべく画素数を絞って処理するようにしています。
この画像データをさらに4つの長方形領域(左上、右上、左下、右下)に等分割し、緑色がdominantな四角形領域をひとつ選択します。選択後の画像データ(左下が選択されている)は下図のようになります。
スーパーピクセルの計算
この画像データに対してスーパーピクセルを計算し、再度緑色がdominantなセグメント以外を黒く塗りつぶしたのが下の写真です。雑草なのに黒くなっている部分がありますが、誤って刈り込まないように厳しめに判定を行っています。
カスケード分類器による仕分け
次にカスケード分類器で緑色部分に葉脈の画像パターンが含まれるかどうかを判別します。学習には正解、背景画像共に700枚用意しました。正解画像のサンプルの内の一つを取り上げると下の写真のようになります。
学習後の分類器を使ってROIを重ねたものが下の写真です。当初は誤って正解とする箇所が散見されたのですが、スーパーピクセルを使って対象領域を絞り込んだのが奏功しています。
いかがでしたでしょうか?なお、今回の手順にたどり着くまでには色々と紆余曲折がありましたが、次のステップは実際にロボットに搭載されたカメラでリアルタイムに雑草認識をおこなう処理を追加していきます。現在鋭意コンテンツ準備中です。