高橋かずひとのプログラミング、その他、備忘録。

日々調べてたことや、作ってみたものをメモしているブログ。 お決まりの断り文句ですが、このブログに書かれている内容は個人の見解であり、所属する組織の公式見解ではありません。チラ裏。

MOVERIO BT-30E 紹介

最近、ちょいちょい勉強会等で遊んでいるため、ご紹介。

前モデルの「MOVERIO BT-200」はビックカメラ等の店頭で買えたため、知っている方も結構いるのですが、BT-30EやBT-30Cはネット購入が主な入手方法のため、知らない方も、そこそこいらっしゃいます🐤


BT-30Eは「モニター機能に特化したスマートグラス」とされていて、BT-200のようにAndroid搭載のコントロールボックスはありません。

以下のようなボックスで、左から、「スマートグラス接続端子」「USB Type-C(入力)」「HDMI端子(入力)」「USB Type-B(充電端子)」があります。

スマートグラスとHDMI or USB Type-Cを繋げば、スマートグラス上に画面が表示されます。

f:id:Kazuhito00:20190905233134j:plain

 

以下のような構成になります。USB Type-Cを用いれば給電も同時に出来るため、非常にすっきりしたケーブル構成となります。

f:id:Kazuhito00:20190905233554p:plain

(C) EPSON MOVERIO BT-30E

 

MOVERIO BT-30Eはディスプレイの他に、カメラ/地磁気センサー/加速度センサー/ジャイロセンサー/照度センサーが搭載されています。

カメラ以外へのセンサーのアクセスには、SDKの導入が必要ですが、

カメラだけであれば、Microsoft Media Foundationを利用しているため、普通のWebカメラへアクセスするようにアクセスできます。

 

つまり、サッと繋いでカメラアクセスができ、HDMIでディスプレイ出力するだけでグラス上に表示できるため、

見た物の名前を表示するスマートグラスが簡単に作れます🐤

 

 

ちなみに、ディープラーニングガジェット品評会では、MOVERIO BT-30Eで笑い男を表示しました。

 

ちなみに、1個目の動画はkerasのMobileNet V2を利用して、80行くらいで実現できます。簡単です🐤

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import
 copy
import time
import cv2 as cv
import tensorflow as tf
from tensorflow.keras.applications.mobilenet_v2 import preprocess_input, decode_predictions
from tensorflow.keras.preprocessing import image
import numpy as np


def
 main():
    print("Image Classification Start...\n")

    
# カメラ準備 ##############################################################
    cap = cv.VideoCapture(1)
    cap.set(cv.CAP_PROP_FRAME_WIDTH, 1280)
    cap.set(cv.CAP_PROP_FRAME_HEIGHT, 720)

    
# 全画面表示 ##############################################################
    cv.namedWindow(' ', cv.WINDOW_NORMAL)
    cv.setWindowProperty(' ', cv.WND_PROP_FULLSCREEN, cv.WINDOW_FULLSCREEN)

    
# モデルロード ############################################################
    model = tf.keras.applications.MobileNetV2(
        input_shape=None,
        alpha=1.0,
        include_top=True,
        weights='imagenet',
        input_tensor=None,
        pooling=None,
        classes=1000)

    model._make_predict_function()

    
while True:
        start_time = time.time()

        
# カメラキャプチャ ####################################################
        ret, frame = cap.read()
        if not ret:
            continue

        
# 検出実施 ############################################################
        inp = cv.resize(frame, (224224))
        inp = inp[:, :, [210]]  # BGR2RGB
        inp = image.img_to_array(inp).reshape(12242243)

        predict_result = model.predict(preprocess_input(inp))

        result_num 
= 1
        top_result = decode_predictions(predict_result, top=result_num)

        
# 黒画背景準備 ########################################################
        # ※Moverio BT-30Eでは黒画像はシースルーとなる
        debug_image = np.zeros( (72012803), np.uint8)

        
デバッグ情報描画 ####################################################
        for i in range(result_num):
            result_string = top_result[0][i][1+ ":" + str('{:.1f}'.format(
                top_result[0][i][2* 100)) + "%"
            cv.putText(debug_image, result_string, (30130 + (60 * i)),
                       cv.FONT_HERSHEY_COMPLEX, 2.0, (02550))

        
# 処理時間描画 ########################################################
        elapsed_time = time.time() - start_time
        time_string = u"elapsed time:" + '{:.3g}'.format(elapsed_time)
        cv.putText(debug_image, time_string, (3050), cv.FONT_HERSHEY_COMPLEX,
                   1.5, (02550))

        
# 画面反映 ############################################################
        cv.imshow(' ', debug_image)

        key 
= cv.waitKey(1)
        if key == 27:  # ESC
            break

if __name__ == '__main__':
    main()

 

以上。