忘れそうな内容をメモしています

忘れっぽいのでメモ帳がわりに色々書いてます

M5StickVでセグメンテーションモデルを動かしてみた

前回、tensorflowのチュートリアルの「Image segmentation」をもとに作ったモデルをM5StickVに載せようとしたところ、モデルサイズが大きすぎて断念しましたが、どうしてもM5StickVで動かしたくて仕方がないのでモデルに手を入れてみました。

shintarof.hatenablog.com

手を入れたと言っても「Define the model」のエンコーダとデコーダの層を以下のように減らしただけです。

  • エンコーダ
# Use the activations of these layers
layer_names = [
    'block_1_expand_relu',   # 32x32
    'block_3_expand_relu',   # 16x16
    'block_6_expand_relu',   # 8x8
    'block_13_expand_relu',  # 4x4 
    'block_16_project',      # 2x2
]
↓
# Use the activations of these layers
layer_names = [
    'block_1_expand_relu',   # 32x32
    'block_3_expand_relu',   # 16x16
    #'block_6_expand_relu',   # 8x8
    #'block_13_expand_relu',  # 4x4
    #'block_16_project',      # 2x2
]
up_stack = [
    pix2pix.upsample(512, 3),  # 2x2 ->4x14
    pix2pix.upsample(256, 3),  # 16x16 4x4->8x8
    pix2pix.upsample(128, 3),  # 8x8->16x16
    pix2pix.upsample(64, 3),    # 16x16->32x32
]
↓
up_stack = [
#    pix2pix.upsample(512, 3),  # 2x2 ->4x14
#    pix2pix.upsample(256, 3),  # 4x4->8x8
#    pix2pix.upsample(128, 3),  # 8x8->16x16
    pix2pix.upsample(64, 3),      # 16x16->32x32
]

前回作成したモデルと比べるとこのような感じになります。

f:id:shintarof:20200613011345p:plainf:id:shintarof:20200613011330p:plain
左:今回作成モデル、右:前回作成モデル

モデルのサイズですがh5形式で2.2MB、kmodel形式で696KBとかなり軽くなりました。 これをM5StickVに書き込んで動かしてみました。

M5StickV側のコードは以下です。

import sensor,lcd,image,math,uos
import KPU as kpu
lcd.init()
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.set_vflip(1)
sensor.set_hmirror(1)
sensor.run(1)
task = kpu.load(0x300000)
a=kpu.set_outputs(task, 0,32,32,2)
while True:
    #camera image
    img1 = sensor.snapshot()
    img1 = img1.resize(32,32)
    a=img1.pix_to_ai();             #generate data for ai

    img2 = image.Image()
    img2 = img2.resize(32, 32)

    fmap=kpu.forward(task,img1)
    x = 0
    y = 0
    size = int(len(fmap[:])/2)
    for i in range(size):
        color = image.grayscale_to_rgb(int((fmap[:][i])))
        img2.set_pixel(x,y,color)
        x = x + 1
        if x > 32-1:
            x = 0
            y = y+1

    img1=img1.resize(112,112)
    lcd.display(img1,oft=(4,11))  

    img2=img2.resize(112,112)
    lcd.display(img2,oft=(116,11))