0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

UnitVでself learning classifier(〇×判定器を作る)

Last updated at Posted at 2023-12-10

背景

表題通りですが、UnitV AI CameraMaixPyself learning classifierで遊びます。
self learning classifier(自己学習分類器?)では、開発ボード上でオブジェクトを直接学習し、それを直接使用して分類を行います。

試しに、〇×判定器を作りました。
計算式につけられているのが〇なのか×なのか判定します。
IMB_sRogei.gif

環境

実装

  • 公式wikiの self learning classifierの使い方をもとに進めていきます。
    • More Usages > Neural Network Applications>Image Processing>self learning classifier
    • MaixPy3版もあり、こちらの説明のほうが充実しているため参考にはなります。

1. MaixPy IDEのインストール

MaixPy IDEは、k210マイコンでプログラミングするためのツールです。
こちらからインストールします。
MaixPy3もあるため、注意が必要です。

2. kflash_guiのインストール

kflash_guiは、いわゆるマイコンにbin等のファームウェアを書き込むツールです。

こちらからインストールします。
Windowsでしたので、kflash_gui_v1.8.1_windows.7zを選択。

3. モデルのダウンロード

学習済みモデルを入れ替えることによって、機能を入れ替えることができます。
Neural Network Applicationsサンプルには、他にも、顔認識や物体認識があります。

3.1 マシンコードの取得

self learning classifierのモデルは、暗号化モデルのため、使うハードウェアのマシンコードの登録が必要です。以下の記事を参考に、マシンコードを取得してください。

3.2 モデルのダウンロード

MaixHubから学習済みモデルをダウンロードします。

下载(ダウンロード)ボタンを押します。

以下の画面が出ますので、3.1で取得したマシンコードを入力してください。

Self_Learning_Classifier.zipがダウンロードできます。
中に、モデル2つと、サンプルコードが入っています。

4. モデルの書き込み

kflash_guiを起動し、先ほどダウンロードしたモデルをアドレス0x30000に書き込みます。
モデルは2つありますが、今回はsipeed_learn_model.smodelを使います。
image.png

self_learn_classifier_lite.smodelは軽いデータ量のモデルで、こちらを使う場合は分類器のインスタンス作成時に、fea_len=512を追加する必要があります。

self_learning_classifier.py
classifier = kpu.classifier(model, class_num, sample_num, fea_len=512)

5. MaixPy IDEでの書き込み

MaixPyを起動し、先ほどダウンロードしたzipファイルの中にあるself_learning_classifier.pyを呼び出します。
UnitV向け、〇×判定向けにself_learning_classifier.pyを書き換えます。

○か×かの判別のため、分類数を2、名前をmarubatsuとします。
また、サンプル数を20にします。

self_learning_classifier.py (12-16行目)
class_num = 2
sample_num = 20
THRESHOLD = 11
class_names = ['maru', 'batsu']
board_cube = 0

カメラの見え方を、UnitVのケーブルが下向き、対象物を正面に左右反転なく見えるよう調整します。

self_learning_classifier.py (36, 37行目)
    sensor.set_vflip(True)
    sensor.set_hmirror(True)

UnitVのボタンのGPIOは18番と19番です。
今回はこちらのボタンを使うため、操作ボタンのGPIOの設定をboard_info.BOOT_KEYから19に変更します。

self_learning_classifier.py (40, 41行目)
fm.register(19, fm.fpioa.GPIOHS0)
key = GPIO(GPIO.GPIOHS0, GPIO.PULL_UP)

学習終了後にモデルを保存するように書き換えます。

self_learning_classifier.py (96-98行目)
            print("train end")
            classifier.save("marubatsu.classifier")
            train_status = 1

学習済みの検出中のふるまいを書き換えます。

self_learning_classifier.py (106-114行目)
        if res_index >= 0 and min_dist < THRESHOLD :
            print("predict result:", class_names[res_index])
            if class_names[res_index] =="maru":
                img = draw_string(img, 2, 2, class_names[res_index], color=lcd.WHITE,scale=2, bg=lcd.RED)
            else:
                img = draw_string(img, 2, 2, class_names[res_index], color=lcd.WHITE,scale=2, bg=lcd.BLUE)
        else:
            print("unknown")
            img = draw_string(img, 2, 2, 'unknown', color=lcd.WHITE,scale=2, bg=lcd.BLACK)

UnitVとMaixPyを接続し、self_learning_classifier.pyを実行します。

ファームウェアの全体はgithubにあります。

遊び方

↓ 中国語ですがなんとなく内容の分かる動画。こちらを参考にやります。

1. 登録する分類クラスの代表画像を1枚ずつ撮る

UnitVサイドのボタンを押して撮影します。
撮れると次の指示が出ます。
maruとbatsuそれぞれ撮ります。

2. サンプルを撮る

サンプル数20、分類数2なら、10枚ずつサンプルを連続して撮ります。
サンプル数を分類数で割り、その枚数が各クラスのサンプル数となります。

0から始まっているため、サンプル10からはbatsuのサンプルを撮ります。

3. 完成、分類が始まる

学習が終わると、自動でカメラに映ったものを分類しはじめます。

青いマルはmaruとして判定していません。

赤いバツはbatsuと誤判定してますね。サンプルを増やすと変わるかもしれません。

おわりに

学習済みモデルをロードする際は、self_learning_classifier_load.pyを実行し、保存したモデルを呼び出すと実行できます。
UnitVやSipeed Maix等を買ったものの、サンプルを動かして終わりになってしまった方々が、何か作ってみる一助となれば幸いです。
(特にマシンコードの取得等でつまづく)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?