TinyMLとOpenMVを使用したマシンビジョン入門 - 第1部

組み込みシステムのエンジニアにとってのアプリケーション問題の多くは、機械学習やtinyMLによって解決できる可能性があります。ゼロからコーディングするのが非常に難しい独特の問題の1つが、画像内にある物体の検出と認識です。偶然にも、物体の検出や認識は、tinyMLにとって最適の適用分野です。しかし、tinyMLとマシンビジョン(MV)を使い始めるのは、なかなか困難です。これから何回かに分けて、OpenMVカメラを使用したMVの概要を説明していきます。

OpenMV Cam H7の紹介

マイクロコントローラを使用した低電力アプリケーションのために、MVを使用したいとします。その場合、カメラモジュールをカスタム設計するか、すでに市販されているものを見つける必要があります。モジュールをゼロから作るのは楽しいのですが、コストや時間がかかります。市販のソリューションとして興味深いのが、OpenMV Camです。

OpenMV Camは、Arduinoのような小型の開発ボードで、開発者がMVの使用を開始するために必要なものがすべて含まれています。まず、複数のハードウェアバージョンがあることを認識する必要があります。最新版は、OpenMV Cam H7です(図1)。Cam H7は、STMicroelectronicsSTM32H743VIマイクロコントローラをベースにしており、クロックスピード480MHzを備えたArm Cortex-M7アーキテクチャを採用しています。また、1MバイトのSRAMと2Mバイトのフラッシュも搭載しています。MVや学習アプリケーションを使用する場合は、メモリに余裕を持たせておくことが常に重要となります。Cam H7は、MT9M114カメラモジュールを使用して、640 × 320ピクセル(8ビットグレースケール、40fps)または320 × 240 ピクセル(QVGA。40~80fps)の画像をキャプチャできます。本カメラモジュールは、アプリケーションのニーズに応じて変更できます。

図1:OpenMV Cam H7モジュールには、MV設計を始めるために必要なものがすべて揃っています。(画像提供:OpenMV)

OpenMVの開発環境

図2に示すOpenMVの統合開発環境(IDE)は、開発者がCam H7を操作するためのものです。このIDEを使用して、開発者は、モジュール上で実行するPythonスクリプトを編集することができす。Cam H7では、マイクロコントローラベースのシステムで実行できるように特別に設計されたC Pythonの移植版であるMicroPythonが使用されています。これにより、開発者はCam H7に接続し、スクリプトをCam H7にロードして、アプリケーションを実行することができます。また、IDEを使用して、Cam H7のフレームバッファ画像をライブで取得することも可能です。

図2:OpenMVの開発環境には、テキストエディタ、ターミナル、イメージキャプチャディスプレイなど、開発者がCam H7をプログラムおよび操作するために必要なものがすべて含まれています。(画像提供:OpenMV)

マシンビジョン、また最終的には機械学習のためにこのモジュールを使用し始めようと考えている開発者には、OpenMV IDEだけで事足ります。システムの低電力モードへの設定から物体や顔の検出まで、さまざまなサンプルスクリプトが用意されているからです。また、Wi-Fiや慣性計測ユニット(IMU)といった外部の開発ボードと本モジュールをインターフェース接続するサンプルも用意されています。

画像から円を検出

OpenMV IDEには、開発者がカメラに接続し、フレームバッファに供給する写真を撮影するためのHelloWorldスクリプトが含まれています。今回は、画像内の円を検出する興味深いサンプルを見てみようと思います。

OpenMV IDEを開き、[ファイル] -> [例] -> [Feature-Detection(特徴検出)] -> find_circles.py(図3参照)の順にクリックすると、まさに円を検出するスクリプトが表示されます。このスクリプトをテストするのは、非常に簡単です。まず、紙か付箋を用意して、円を描いてください(私のひどい画力は気にしないでください)。次に、IDEの左下に接続ボタンがあります。それをクリックすると、Cam H7に接続されます。次に、接続ボタンのすぐ下にある青色の再生ボタンをクリックします。最後に、描いた円にCam H7を向け、OpenMV IDEでフレームバッファをモニタします。

図3:OpenMV IDEでサンプルスクリプトfind_circles.pyにアクセスしたところ。(画像提供:Beningo Embedded Group)

図4のように、自分が描いた円と重なるようにして、フレームバッファに赤い円が周期的に描画されることに気づくはずです。私の芸術的才能が不足しているにもかかわらず、Cam H7がキャプチャされた画像内に円のようなものがあることを検出できたことに注目してください。円はこのブログシリーズの最初の検出項目ですが、最後ではありません。何が行われているかを理解するために、サンプルスクリプトを見てみましょう。

図4: サンプルスクリプトfind_circles.pyは、円を検出するとフレームバッファに赤い円を追加し、強調表示します。(画像提供:Beningo Embedded Group)

サンプルスクリプトfind_circles.pyを分析

OpenMV IDEが提供する円検出のこのスクリプトはシンプルです。まず、リスト1に示すように、本スクリプトは必要なPythonライブラリをインポートし、カメラセンサおよびクロックを初期化します。

コピーimport sensor, image, time

sensor.reset()
sensor.set_pixformat(sensor.RGB565) # grayscale is faster
sensor.set_framesize(sensor.QQVGA)
sensor.skip_frames(time = 2000)
clock = time.clock()

リスト1:カメラセンサを初期化するサンプルコード。(コード提供:OpenMV)

次に、標準的な組み込みアプリケーションと同様に、無限ループがこのアプリケーションを連続的に実行します。そして最後に、検出を実現するマジックがあります。少し時間を取って、リスト2をご覧ください。

コピーwhile(True):
  clock.tick()
  img = sensor.snapshot().lens_corr(1.8)

  for c in img.find_circles(threshold = 2000, x_margin = 10, y_margin = 10, r_margin = 10,
      r_min = 2, r_max = 100, r_step = 2):
    img.draw_circle(c.x(), c.y(), c.r(), color = (255, 0, 0))
    print(c)

  print("FPS %f" % clock.fps())

リスト2:カメラセンサの値を読み取り、画像内の円を探すサンプルコード。(コード提供:OpenMV)

リスト2のコードでは、まずスナップショット画像を撮影します。次に、OpenMVライブラリに含まれるfind_circlesというメソッドを使用して、画像から円を探します。パラメータの詳細については、ソースコードサンプル自体にあるコメントを読んでいただくとして、ここでは パラメータr_min、r_max、r_stepにのみ注目します。r_minパラメータは、検出対象となる円の最小半径を指定します。r_maxパラメータは、最大半径を設定します。このサンプルのプログラムは、2~100ピクセルの円を識別します。

円を検出すると、draw_circleメソッドと円のx、y、半径の値を使用して、検出した円の上に円を描画します。色は(R、G、B)表記で指定されており、今回の場合は赤色の円を描画しています。

まとめ

開発者がマシンビジョンとTinyMLを活用すれば、ほぼ無限のユースケースに適用できます。今回は、OpenMV Cam H7とOpenMV IDEを導入して、円を検出できるようになりました。しかし、円の検出に必要なのはtinyMLではなく、いくつかのライブラリ関数だけでした。次回の記事では、組み込まれている機械学習のサンプルを説明してから、より複雑なサンプルに進み、検出プロジェクトに学習させた上で、展開する予定です。

著者について

Image of Jacob Beningo

Jacob Beningo氏は組み込みソフトウェアコンサルタントで、現在、製品の品質、コスト、市場投入までの時間を改善することで、ビジネスを劇的に変革するために数十か国以上のお客様と作業しています。同氏は、組み込みソフトウェア開発技術に関する200以上の記事を発表しており、引っ張りだこのスピーカーでありテクニカルトレーナです。ミシガン大学のエンジニアリングマスターを含む3つの学位を取得しています。気楽にjacob@beningo.comにメールするか、彼のウェブサイトwww.beningo.comから連絡してみてください。そして毎月のEmbedded Bytes Newsletterにサインアップしましょう。

More posts by Jacob Beningo
 TechForum

Have questions or comments? Continue the conversation on TechForum, Digi-Key's online community and technical resource.

Visit TechForum