最近、ちょいちょい勉強会等で遊んでいるため、ご紹介。
前モデルの「MOVERIO BT-200」はビックカメラ等の店頭で買えたため、知っている方も結構いるのですが、BT-30EやBT-30Cはネット購入が主な入手方法のため、知らない方も、そこそこいらっしゃいます🐤
BT-30Eは「モニター機能に特化したスマートグラス」とされていて、BT-200のようにAndroid搭載のコントロールボックスはありません。
以下のようなボックスで、左から、「スマートグラス接続端子」「USB Type-C(入力)」「HDMI端子(入力)」「USB Type-B(充電端子)」があります。
スマートグラスとHDMI or USB Type-Cを繋げば、スマートグラス上に画面が表示されます。
以下のような構成になります。USB Type-Cを用いれば給電も同時に出来るため、非常にすっきりしたケーブル構成となります。
(C) EPSON MOVERIO BT-30E
MOVERIO BT-30Eはディスプレイの他に、カメラ/地磁気センサー/加速度センサー/ジャイロセンサー/照度センサーが搭載されています。
カメラ以外へのセンサーのアクセスには、SDKの導入が必要ですが、
カメラだけであれば、Microsoft Media Foundationを利用しているため、普通のWebカメラへアクセスするようにアクセスできます。
つまり、サッと繋いでカメラアクセスができ、HDMIでディスプレイ出力するだけでグラス上に表示できるため、
見た物の名前を表示するスマートグラスが簡単に作れます🐤
ちなみに、ディープラーニングガジェット品評会では、MOVERIO BT-30Eで笑い男を表示しました。
ディープラーニングガジェット品評会のデモ動画(MOVERIO BT-30E)です。
— 高橋かずひと@リベロ拝命🐤 (@KzhtTkhs) July 15, 2019
「右目だけで見れば…なるほどなるほどー……」
「両目でも結構見える」
「Hololensには敵わないが、この値段でこの見え方なら意外と他の使い道も……」
みたいな感想がをいただけました🐤
#スマートグラス #モベリオ #MOVERIO pic.twitter.com/NhdaTseFT2
ちなみに、1個目の動画はkerasのMobileNet V2を利用して、80行くらいで実現できます。簡単です🐤
# -*- 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, (224, 224))
inp = inp[:, :, [2, 1, 0]] # BGR2RGB
inp = image.img_to_array(inp).reshape(1, 224, 224, 3)
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( (720, 1280, 3), 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, (30, 130 + (60 * i)),
cv.FONT_HERSHEY_COMPLEX, 2.0, (0, 255, 0))
# 処理時間描画 ########################################################
elapsed_time = time.time() - start_time
time_string = u"elapsed time:" + '{:.3g}'.format(elapsed_time)
cv.putText(debug_image, time_string, (30, 50), cv.FONT_HERSHEY_COMPLEX,
1.5, (0, 255, 0))
# 画面反映 ############################################################
cv.imshow(' ', debug_image)
key = cv.waitKey(1)
if key == 27: # ESC
break
main()
以上。