数値解析系

2021年1月 4日 (月)

高精度な手足、身体の姿勢推定API「MediaPipe」を使って体の姿勢を数値化させてみる

一年ほど前に紹介した「PoseNet」がありますが。


Googleの「PoseNet」を試してみた: EeePCの軌跡


あれがさらに高精度、高密度になった「MediaPipe」なるものが、いつの間にか登場してます。


少し前から気になってたんですが、休みに入り、ようやくそれを実験する機会を得ました。


で、参考にしたのは以下のサイト。


CPUだけで顔・手・ポーズのリアルタイム検出を行う | cedro-blog


ここで紹介されたコードで、一発で動きました。


やったことといえば、


(1) pipコマンドで「MediaPipe」をインストールする。


  > pip install mediapipe


  (ほかにも、numpy、OpenCV、PILLOWも必要です)


(2) Githubから、コードを一式ダウンロードしておく。


サイトはこちら:GitHub - cedro3/mediapipe: MediaPipeのPythonパッケージのサンプルです。2020/12/11時点でPython実装のある4機能(Hands、Pose、Face Mesh、Holistic)について用意しています。


(3) WebカメラのついたPCなら、そのままコマンドで実行。


  > python sample_face.py


  (コードは4種類で、「sample_face.py」「sample_hand.py」「sample_holistic.py」「sample_pose.py」から選択。大体、どれがどういうコードかは、名前からわかるかと思います。)


こんな感じの結果が出ます。


Mediapipe03


Mediapipe02


いやあ、なかなか高精度ですね。


これ、GPUを使ってないようですが、うちの環境(Ryzen 5 4600H 6コア)で20~30fpsは出ます。


さて、姿勢推定をさせたなら当然、各々の座標が抜き出したくなるものですが、上で入手したコードのうち、「sample_holistic.py」という、顔も手も身体もすべて出力させているコードを参考にします。


このコードの中の「landmark_x」「landmark_y」という配列があるんですが、これが座標情報だとわかります。


で、じーっとこのコードを解読すると、例えば191行目から始まる「draw_hands_landmarks()」という関数207行目あたりを見ると、この中ではどうやらlandmark_point.x[2]、landmark_point.y[2]が親指の座標なんだなぁと読めますね。[]野中の数字が0だと「手首1」、1だと「手首2」(右か左かは不明)、10だと「中指・第2関節」……という具合に、解読できそうです。


顔の座標を読み出したければ、299行目から始まる「draw_face_landmarks()」を見れば、目や鼻、口の座標を拾えそうです。


かなり地味で忍耐が必要な作業になりそうですが、このコードを流用すれば、姿勢の数値化はどうにかできそうです。


とまあ、かなりいい感じのMediaPipe。これでPoseNetとはおさらばか……と思いきや。


実は欠点が一つあります。それは、1体しか読みだせないということ。


PoseNetは10人まで同時に読み込めましたが、こちらは一番大きな人物のみ姿勢推定を行うことしかできません。


このため、複数の人の動きをトレースすることは不可能。あくまでも一人だけの詳細な動きを読み出すためのコードのようです。


ベテランの作業姿勢と新入社員の姿勢とを比べる、といったことくらいならできそうですね。


今すぐ試したい! 機械学習・深層学習(ディープラーニング) 画像認識プログラミングレシピ


2020年12月31日 (木)

2020年まとめ

今年も、いろいろありましたね……

何といっても今年は新型コロナ禍の年。コロナで始まり、コロナで終わる。いや未だに、先が見えておりません。だからというわけではありませんが、どちらかというと今年は、私にとってあまりいいことはなかったですね……

このブログにとっては、毎日更新をやめた年でもあります。

とはいえ、やはりまとめができるほどの出来事が満載。今年を振り返ってみます。

【1月】

画像異常検知のデモ機「AIビー玉選別機」を作ってみた: EeePCの軌跡

さて今年は、いきなりRaspberry Pi工作から始まりました。

昨年末に買ったRaspberry Pi 4を使ってますが、結局今年は、Raspberry Pi 3B+をよく使った年でした。

それはともかく、いわゆる画像異常検知にトライしたこの事例。社内でも、使われつつあります。

【2月】

プロジェクター買いました: EeePCの軌跡

2月はせいぜい、これくらいですかねぇ。プロジェクターを買いました。

結論から言うと、ほとんど使ってません。家ではまるで使い道がないですね、これ。

【3月】

このあたりからコロナ禍が猛威を振るい、学校が休みになったり、外出自粛が叫ばれたり、インフラもないのに在宅勤務が推奨されたり……などなど、ストレスマッハな時期がはじまります。

そんな中でも、地道に活動しておりました。

 Raspberry Pi Camera V1.3の「互換カメラ」買ってみた: EeePCの軌跡

ブログが13年目に入る3月9日の記事がこれ。Raspberry Piカメラの互換品を安く手に入れたというお話。

このカメラ自体、今でも使っていて重宝してますが、そんな話題とは裏腹に、しれっとこの記事の最後に「毎日更新をやめます宣言」をしております。

ちょうど12年目のこの日を境に、自身の活動を中心とした記事のみを乗せようと心がけてます。

当ブログをhttps化しました: EeePCの軌跡

さて、このブログもう一つの大きな変化点は「https化」。

あまり意味があるような、ないような変化点ですが、ブラウザによってはかなりうっとおしい警告が出るため、切り替えてみました。

今ではほとんどセキュリティ警告が出なくなっているはずです。

 Ankerのロボット掃除機”Eufy”買ってみた: EeePCの軌跡

こんなものも買いました。

自動掃除機です。2万円以下で、わりと賢い掃除機を入手。週1で2階をせっせと掃除しております。これは良い買い物でした。

おかげさまで、コロナ太りが捗り過ぎて、夏の健康診断に引っかかるというおまけが付いてきましたが。

【4月】

子供の春休みが、終わりません。そんな4月には、こんなものを買ってます。

iPad用トラックパッド・キーボード付きケース買ってMacBookっぽく使えるか試してみた: EeePCの軌跡

結局、ほとんど使ってないのですが、iPad用キーボードです。トラックパッド付。

iPadOS 13がリリースされて、iPadがトラックパッド対応したため購入。

といってもうちにはMacBook Airがあるので、どうしてもそちらにいってしまいます。

使い勝手は、やはりクラムシェル端末には敵いませんね。

小説家になろう 第8回ネット小説大賞 一次選考に2作品が選ばれました: EeePCの軌跡

で、そんなMacBook Airの成果というべきものがこれ。

今年もなんとか1次通過しました。しかも、2作品。相変わらず、2次は全滅しましたが……

来年はもっと、飛躍できないかなぁ。

なお今年はブログ上のネームを、この「小説家になろう」にそろえて「ディープタイピング」としました。Twitterも同じく。ようやく発音可能な名前になりましたね。

特に記事にはしてませんが、この4月頃から会社でZoomをよく使うようになります。今ではすっかりZoom使いです。

【5月】

サーマルセンサー「AMG8833」とRaspberry Piで非接触体温計っぽいものを作ってみた: EeePCの軌跡

コロナ禍ということで、こういうものを作ってみました。

非接触体温計……っぽいもの。頑張れば使えそうなやつです。お値段も5000円ほどと、お手軽なセンサーです。

この記事ですが、このブログの今年のアクセス数トップ記事になっておりますね。

それにしても今年は、久しぶりにRaspberry Piをよく使った年です。

【6月】

6月は、あまり実りのない月でしたね。健康診断に引っかかったことくらいでしょうか?

が、こんな出来事がありました。

Apple ID詐欺……やられかけました……: EeePCの軌跡

Appleっぽい詐欺サイトに誘導されかけました。

特に実害はなさそうでしたが、警戒してすぐにApple IDのパスワードを変更してます。

そういえば周りにも、Facebookを乗っ取られた人がいました。世の中が乱れると、なぜかこういう輩が暗躍するようです。こういう時期、要注意ですね。

【7月】

コロナ禍がややおさまった名古屋 大須へ行って参りました: EeePCの軌跡

すごく久しぶりの大須探訪記です。長男と2人で、行ってきました。

コロナ禍でどうなっていることかと心配でしたが、ここは相変わらずでしたね。

といっても、細かい店がいくつか閉店(または閉店予告)しておりました。大須と言えども、やはり爪痕はあるようです。

長男と共に、大須の雰囲気を満喫した夏でした。

クラムシェル端末風に使えるタッチパッド付iPadキーボードケースを買ってみた: EeePCの軌跡

性懲りもなく、こんなものを購入。

最新版のiPad向けの商品を買ったため、サイズが合いませんが、何とか無理やり使ってレビュー。

使用感は、悪くありませんね。ただし、やはりMacBook Airには敵わず、結局これも使わずじまい。

【8月】

ミラー型ドライブレコーダー購入: EeePCの軌跡

ドライブレコーダーを買いました。

ルームミラーを電子ミラー化 & 後方カメラ付きというもので、今どきの煽り運転対策には最適。

夜でも後方を確認しやすくなりました。これは買いです。

【9月】

Surface Goがようやく実用形態に: EeePCの軌跡

今年はついに、Surfaceを買いました。

やはり、Zoomやらを使っていると、この手の軽くて起動が速い端末が欲しくなります。

スマホ世代には、ピッタリなWindows端末ですね。おすすめです。

ららぽーと東郷へ行ってきました: EeePCの軌跡

一方、うちの近所に馬鹿でかいショッピングモールが誕生です。

50km圏内をカバーする目的で作られたこのショッピングモール、SIMフリーiPhoneが調達できる店が、まさか徒歩圏内にできようとは思ってもいませんでした。

が、私にとってのこのショッピングモール最大のインパクトはヴィレッジヴァンガードが入っていること。

福袋入手は、ここで決まりです。

【10月】

久しぶりにEeePC 1000H-Xを起動してみた: EeePCの軌跡

ふと見つけた32ビットOSの話題につられて、久しぶりにEeePC 1000H-Xを起動してみました。

バッテリーは完全に死んでますが、本体はまだ生きてます。

とはいえ、さすがにもう遅いですね……12年前の、しかも最底辺のPCですからね。

Tensorflow.js + WebGLで顔検出してくれるWebアプリ: EeePCの軌跡

顔検出のWebアプリの紹介です。マスク顔でもこの通り、検出可能。

何気に、私の顔が出ております(ただしマスク付き)。

【11月】

Raspberry Pi + 磁気センサーで ドアの開閉をセンシングしてみた: EeePCの軌跡

ドアセンサー、作ってみました。会社のトイレIoTの要望に応えての工作です。

いかにもRaspberry Piらしい(?)電子工作ですね。

3COINSのBluetoothイヤホン買ってみた: EeePCの軌跡

瞬発的なアクセス数としては、今年一番バズった記事です。

3COINSで買ったBluetoothイヤホン。

1500円という金額にしては、とても使いやすく音質も悪くないです。

もっとも、ノイズキャンセリングがあるわけではないので、外ではそれなりの音質。

おまけに、よく途切れることがあります。室内でも時々、ぶちぶちと切れますね。安定性はいまいち。

でもまあ、1500円ですから、これ。そう思えば妥当かと。

ゲーム&ウォッチ型スーパーマリオ復刻版ゲーム: EeePCの軌跡

ところで、11月はいろいろなものを買った月です。その一つがこれ。スーパーマリオ35周年記念で、ゲーム&ウォッチ型のゲーム機。

ちなみに、スーパーマリオ1の方はクリアしました。

3年ぶりにiPhoneを購入!iPhone 12 グリーンをららぽーと東郷で入手!: EeePCの軌跡

で、今年最高額の買い物は、これ。

iPhone 12です。128GBで、色はグリーン。

これまでiPhone 5c以降、様々なカラバリモデルが出ましたけど、白・黒以外を買ったのはこれが初めてです。

画面サイズも6.1インチと、我が家では最大サイズのiPhone。おかげでとても見やすいです。

【12月】

11月はガジェット購入祭り的な月でしたが、その余波は12月にも残ります。

Amazon Echo Show 5買ってみた: EeePCの軌跡

とうとう買ってしまいました、Amazon Echo show 5。家電リモコンなどはつけてませんが、音楽再生に使ってます。

音声認識は高いですが、Googleに比べると、あまり遊び心がないですね。真面目です。はい。

と、本年のガジェットな買い物はこれで終わるはずだったんですが……

 ドスパラのゲーミングノート「GALLERIA GR1650TGF-T」を購入!: EeePCの軌跡

やっぱり、無理でした。

フィニッシュは、こいつが飾りました。これが今年2番目の買い物(ちなみに3番目はSurface Go)。

ゲーミングノートPCではコスパ最高と謳われたドスパラのGALLERIA GR1650TGF-Tを、メインPCとして購入。

スマホやSurface Goのおかげで起動時間の速さに慣れすぎてしまい、HDDオンリーのデスクトップ機ではやはり使い物にならないことがしばしば。とうとう勢い余って購入。

おかげさまで、すごく快適です。起動も使い勝手もよくなり、机の上も広くなっていいことづくめ。

Ryzenの6コアも、なかなかいいです。

もっと早くこうするべきだったかと。

ただ、その副産物として、Surface Goを使わなくなりましたが……

しかし、これで快適なら、プロセッサ性能の向上ぶりが段違いといわれるM1チップ搭載のMacBookなど手に入れようものなら、どうなることか……次は、Apple Siliconかな?よだれが止まりません。

久しぶりに、PC界隈が活気づいた年ですね。振り返ればiPhoneよりも、こっちの方がインパクト大きいです。

◇◇◇

とまあ、コロナ禍で外出も控えめなこの年でしたが、それでも振り返ると案外、いろいろとありましたね。

個人的には、あまり良い年ではありませんでしたね。ブログにはほとんど書いてませんが、裏ではいろいろトライしては、成果を残せずという事柄が多いです。

うーん、どうしてこうなった……振り返れば、今年はブログ開設以来初めてヴィレッジヴァンガードの福袋を買わなかったからでしょうか?あんなもの(?)にジンクスがあるとは思いたくないのですが……

その反動で、来年はもうちょっと、羽ばたきたいところです。叶うでしょうか、そんな願望。

と、まずは、ヴィレヴァン福袋を買うところからスタートですね。

今年の更新は、これでおしまいとなります。

来年も、よろしくお願いいたします。皆様、よいお年を。

エンスカイ 鬼滅の刃 2021年 カレンダー壁掛け B3サイズ

2020年12月27日 (日)

VGG16のファインチューニングコード

このブログでも2016年以降、ディープラーニングネタをいくつか投入しておりますが。

そういえば、最近は基本となりつつある「ファインチューニング」ってやつを紹介してませんね。

てことで、VGG16を用いたファインチューニングのコードを、載せておきますね。

【学習用コード】(vgg16_ft_train.py)


#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import sys
import cv2
import numpy as np
import tensorflow as tf
import tensorflow.python.platform
import keras
from keras.utils import np_utils
from keras.models import Sequential,Model
from keras.layers import Dense,Dropout,Flatten
from keras.layers import Conv2D,MaxPooling2D,GlobalAveragePooling2D,Input
from keras.preprocessing.image import array_to_img,img_to_array,load_img
from keras import backend as K
from sklearn.model_selection import train_test_split
from keras.models import load_model
from keras.callbacks import ModelCheckpoint
from keras.applications.vgg16 import VGG16

path=os.getcwd()+'/data/'
checkDir=os.getcwd()+'/checkpoints/'
if not os.path.exists(checkDir):
os.mkdir(checkDir)
class_count = 0
folder_list=os.listdir(path)

for folder in folder_list:
class_count = class_count+1

label_filenm = './label.txt'
NUM_CLASSES = class_count
IMAGE_SIZE = 224
batch_size = 64
epochs = 200
count=0
folder_list = sorted(os.listdir(path))

train_image = []
train_label = []
test_image = []
test_label = []
X = []
Y = []
f = open(label_filenm, 'w')
for folder in folder_list:
subfolder = os.path.join(path,folder)
file_list = sorted(os.listdir(subfolder))
filemax = 0
i = 0
for file in file_list:
i = i + 1
img = img_to_array(load_img('./data/' + folder + '/'
+ file,target_size=(224,224)))
X.append(img)
Y.append(count)
label_name = folder + ' ' + str(count) + '\n'
f.write(label_name)
count +=1

X = np.asarray(X)
Y = np.asarray(Y)
X = X.astype('float32')
X = X / 255.0
Y = np_utils.to_categorical(Y, NUM_CLASSES)

train_image, test_image, train_label, test_label = train_test_split(X,Y,test_size=0.10)
f.close()
print(u'画像読み込み終了')

input_tensor = Input(shape=(IMAGE_SIZE, IMAGE_SIZE, 3))

base_model = VGG16(weights='imagenet', include_top=False, input_tensor = input_tensor)

x = base_model.output
x = GlobalAveragePooling2D()(x)
x = Dense(1024, activation='relu')(x)
x = Dropout(0.5)(x)
predictions = Dense(NUM_CLASSES, activation='softmax')(x)
model = Model(inputs=base_model.input,outputs=predictions)

for layer in base_model.layers:
layer.trainable = False

model.compile(loss='categorical_crossentropy',
optimizer=keras.optimizers.Adagrad(lr=0.01, epsilon=None, decay=0.0),
metrics=['accuracy']
)
chkpt = os.path.join(checkDir, 'model_.{epoch:02d}-{val_loss:.2f}.h5')
cp_cb = ModelCheckpoint(filepath = chkpt, monitor='val_loss', verbose=1,
save_best_only=True, mode='auto')

model.fit(train_image, train_label,
batch_size=batch_size,
epochs=epochs,
verbose=1,
validation_data=(test_image, test_label),
callbacks=[cp_cb],
)
model.summary()
score = model.evaluate(test_image, test_label, verbose=0)

【推論用コード】(vgg16_ft_app.py)


#!/usr/bin/env python
import os
import sys
import numpy as np
import tensorflow as tf
import keras
from keras.utils import np_utils
from keras.layers import Dense,Dropout,Flatten
from keras.layers import Conv2D,MaxPooling2D
from keras.preprocessing.image import array_to_img,img_to_array,load_img
from keras import backend as K
from sklearn.model_selection import train_test_split
from keras.models import load_model
import cv2
import math
from PIL import Image
path=os.getcwd()+'/analysis/'
file_list=os.listdir(path)
i = 0
label_name = []
label_filenm = './label.txt'
f = open(label_filenm,'r')
for line in f:
line = line.rstrip()
l = line.rstrip()
label_name.append(l)
i = i + 1
NUM_CLASSES = i
IMAGE_SIZE = 224
test_image = []
path=os.getcwd()+'/analysis/'
outpath = os.getcwd() + '/visible/'
if not os.path.exists(outpath):
os.mkdir(outpath)
file_list=os.listdir(path)
def Grad_Cam(input_model, x, layer_name):
    X = np.expand_dims(x, axis=0)
X = X.astype('float32')
preprocessed_input = X / 255.0
    predictions = model.predict(preprocessed_input)
class_idx = np.argmax(predictions[0])
class_output = model.output[:, class_idx]
    conv_output = model.get_layer(layer_name).output
grads = K.gradients(class_output, conv_output)[0]
gradient_function = K.function([model.input], [conv_output, grads])
    output, grads_val = gradient_function([preprocessed_input])
output, grads_val = output[0], grads_val[0]
    weights = np.mean(grads_val, axis=(0, 1))
cam = np.dot(output, weights)
    cam = cv2.resize(cam, (224, 224), cv2.INTER_LINEAR)
cam = np.maximum(cam, 0)
cam = cam / cam.max()
    jetcam = cv2.applyColorMap(np.uint8(255 * cam), cv2.COLORMAP_JET)
jetcam = cv2.cvtColor(jetcam, cv2.COLOR_BGR2RGB)
jetcam = (np.float32(jetcam) + x / 2)
    return jetcam
model = load_model('model.h5')
model.summary()
for file in file_list:
img = img_to_array(load_img('./analysis/' + file, target_size=(224,224)))
test_image = np.asarray(img)
test_image = test_image.astype('float32')
test_image = test_image / 255.0
test_image = test_image.reshape((1,) + test_image.shape)
    y_prob = model.predict(test_image) 
pred = y_prob.argmax(axis=-1)
value_pred = max(model.predict(test_image)[0])
    gdst = Grad_Cam(model, img, 'block5_pool')
gcnt_filenm = outpath + 'gradcam_' + label_name[pred[0]] + '_' + file
cv2.imwrite(gcnt_filenm, gdst)

 

    print(u'ファイル : ', file, u'は ', label_name[pred[0]], u'です。 ' , value_pred)

コードの行間が妙に空いてるところがありますが、いくら直してもココログが勝手に空けちゃうんです。

なんかこのブログ、どんどんと使いにくくなって……申し訳ありません、あらかじめ、ご了承願います。

使い方ですが、

【準備】

(1) Windows版Pythonをインストール (おすすめはpython 3.7.9の64ビット版)

    このサイトが便利 : 非公式Pythonダウンロードリンク - Python downloads

   パスを通すオプションがあるので、それをチェックしてインストールしてください。

(2) Windows PowerShellを開く。(以下、コマンドはすべてWindows PowerShellで実行)

(3) pipコマンドで、tensorflow 1.14.0、keras 2.2.4、OpenCV (最新版)、PILLOWを入れておく。

【学習】

(1)「data」フォルダを作り、その中にラベルごとのフォルダを複数作って、画像を入れる

      (inu、neko、……のように、半角英数で名前を付けてください)

(2) 上の学習用コードをテキストエディタなどで張り付けて保存(以下、ファイル名は「vgg16_ft_train.py」)。

(3) コマンドで、「python vgg16_ft_train.py」を実行。

(4) 終了したら、「checkpoints」フォルダ内にある一番最後のファイルを上のフォルダに移動し、「model.h5」と名前を変えておく。

【推論】

(1) 上の推論用コードをテキストエディタなどで張り付けて保存(以下、ファイル名は「vgg16_ft_app.py」)。

(2)  コマンドで「python vgg16_ft_app.py」を実行。

こんな感じの結果が出れば、OK。

Vgg16_01

ちなみに、Grad Camを入れてるので、「visible」フォルダにヒートマップが出力されます。

Vgg16_02

注目部位が赤くなるってやつです。

いつも使うお城のデータセットでやってみたんですが……なんかちょっと妙な感じ。なぜだか、お城そのものよりも周囲に色がついてますね。

それはともかく、一応動きました。

会社では、かなり使ってますね、VGG16。ResNet50だの、InceptionV3だのとより深層のモデルもあるんですが、VGG16ベースの方がなぜか精度、汎用性が高い印象。

最近は、新規ネットワークで学習させるより、既存のモデルをベースにファインチューニングする方が増えましたね。

あ、ところで、モデルを流用して学習させる方法には「転移学習」と「ファインチューニング」という言葉があって、それぞれちょっと意味が異なります。

ものの本によれば、

・転移学習とは、ベースモデル部分をそのまま使い、結合層以降を学習すること。

・ファインチューニングとは、ベースモデル部分の一部も再学習すること。

という意味のようです。

で、ここに載せたコードは、厳密には「転移学習」と呼ぶのがふさわしいみたいなのですが、そういうのも含めてファインチューニングと呼んでいる節があるので、いつの間にか私もまとめてファインチューニングと呼んでますね。

まあ、いずれにせよ、この数年でディープラーニングも随分と簡単、一般化したものだと感じます。様々な分野の製品検査や効率化に、使われ始めてますね。

で、このコードが、うちの新メインPCであるGALLERIAで動いてます。

これを使ってなにか、やらかしたいですねぇ……できれば、Raspberry Piも使って。現在、思案中です。


人気ブロガーからあげ先生のとにかく楽しいAI自作教室

2020年11月 3日 (火)

運転診断をしてくれるサービス「DRIVE CHART」

最近社内で、ドライブレコーダーの映像を使って運転診断できないか?という相談を持ち掛けられました。

で、調べたら出てきたのがこの記事。

危険運転を可視化するAIドラレコサービス「DRIVE CHART」帝都自動車交通グループのタクシー737台に導入へ | ロボスタ

すでにそういう運転診断サービスがありました。昨年の6月に始まったようですが、それを今年、帝都自動車交通グループが自社のタクシー737台の運転診断に用いているという話です。

ちなみにこのDRIVE CHARTというサービスは、初期投資に5万円(ドラレコ含む)、月額3千円ほどで導入できるようです。

外だけでなく、運転手の状態監視もできるみたいですね。

まあ、正直言うと、自社の車に導入したくないシステムではありますね。なんだか窮屈です。

本当なら、危険を察知してその場で回避してくれる仕組みの方がありがたいですよね。とても5万じゃ導入できないでしょうけど。


【令和最新型】ドライブレコーダー 前後カメラ 高画質 32Gカード付き 1080PフルHD 2カメラ 170度広角 LED信号機対策 スーパーナイトビジョン 操作簡単 上書き機能 WDR技術 防犯カメラ Gセンサー搭載/駐車監視/動体検知/ループ録画/高速起動/緊急録画/高温保護/ドラレコ 車載カメラ 暗視機能 日本語説明書付き

2020年11月 2日 (月)

くら寿司でのRaspberry Pi + Coralによるエッジ端末活用事例

英文のサイトですが、翻訳などを用いてお読みください。

Kura Sushi | Coral

くら寿司では皿のカウントなどをするエッジAI端末として、Raspberry Pi + Coralを用いているようです。

回転ずしって、会計の際には店員さんが皿を数えて、それで金額を確定しますが、それをリアルタイムにカウントしているようですね。

Raspberry Piにつけられたカメラにより画像認識でその商品のカウントを行っているようですが、特徴は、その処理を端末内で行っているということ。

通常なら、オンプレのサーバーかクラウドを使うところですが、すべての店舗のデータを処理しようものなら、回線やサーバーに相当な負荷がかかります。

回線に負荷かけちゃいけませんよね、海鮮物を扱うだけに。

冗談はともかく、その解決策として、このエッジ端末にたどり着いたようです。

私も、エッジ端末としてのRaspberry Piにかなり期待してます。今まさに、Raspberry Piを使った取り組みを仕掛けようとしてますけど、お手軽でそこそこの処理能力のあるこの端末、なかなか侮れません。

そういえば私、くら寿司にまだ行ったことがないんですよね……ちょうどいい場所になくて、行く機会がないだけなんですけど。せっかくなので、今度探して行ってみましょうかね。

I-O DATA Raspberry Pi メインボード Bluetooth(R) Wi-Fi対応モデル Raspberry Pi 3 model B 安心の1年間ハードウェア保証 UD-RP3

2020年10月25日 (日)

Tensorflow.js + WebGLで顔検出してくれるWebアプリ

結構たくさんの顔をdetectしてくれるやつです。

https://terryky.github.io/tfjs_webgl_app/dbface/

物体検出なので、結構重いです。が、さほど速いとは思えないSurface Go 1で動かしても、2、3 fpsはいけます。

Facedetect01

こんな感じに、マスク付きでもOK。こいつ、なかなかヤバイです。

本気を出せば、これくらいの顔検出をさせることも可能。ええ……やっぱり、ヤバイです。

ほかにも、以下のリンクからHand PoseなどのWebアプリを試すことができます。

tfjs_webgl_app

お手軽に物体検出、姿勢検出をさせてみたい方は、ぜひ。

TensorFlowはじめました3 Object Detection ─ 物体検出 (NextPublishing)

2020年8月16日 (日)

”ScratchでAIを学ぼう”を買ってみた

以下の記事を見まして、

「ScratchでAIを学ぼう」はScratchで動かしながら強化学習を理解できる凄い本 - karaage. [からあげ]

つい買ってしまったのがこちら。

Img_4159

はい、タイトルの通り、ScratchでAIを学ぶという本です。

といっても、PythonにScikit-learn、Kerasなどで機械学習系はある程度組める私が、何故Scratchなどという微妙な言語によるAI解説本に手を出したのか?

実はこの本で扱うAIというのが、「強化学習」なんです。

教師あり、なし学習というのはいろいろとやってきましたけど、強化学習って、使う機会がなかったんですよね。

てことで、これに飛びついたというわけです。

Img_4160

いわゆるQ学習のアルゴリズムが書かれてます。ああ、こういう原理なわけねぇ……思わず納得です。

中学生向けの数学で理解できるレベルと書かれてますが、確かにそうですね。中学レベルの数学です。

が、そこはやはり”機械学習”の一種ですから、パラメータチューニングやらの大変さはあります。

なによりも、強化学習の題材が一番の課題。

ところがこの本から3つのサンプルコードにアクセスでき、あらかじめ組まれた強化学習コードを読み込むところからスタートできます。動かしつつ体感でき、理屈を後付けで覚えるという私のスタイルにピッタリな本です。

で、最初のプログラムコードは、2択のゲームです。

Qst04

穴が二つあって、「左」「右」のボタンをクリックすると、ある確率でダイヤが出ます。

ところがその左右の確率が不均質で、20回クリックするうちに当りをつけて、なるべく多くのダイヤを出すというのがこのゲームのルール。

それを、人間、強化学習で交互に行います。

Qst05

で、まずは人間の結果。

20回中、ダイヤは7個でした。案外、ムズイ。

Qst07

で、今度はAIの出番。

Qst06

結果はこちら。倍近い大差をつけられました。あーあ……

この強化学習というのが、学習しながらゲームを解いているわけですが、これが意外と、人間が勝つことが困難なほど上手く学習してくれます。

しばらく、パラメータをいじりながら遊んでみました。

Qst02

このコードの解説と動作原理は、本の中に書かれてます。詳しくは、本をお買い上げください。お値段、2090円。

今のところ、あまり使い道が思いつかない強化学習ですが、いずれはモノにしたいですね。

ScratchでAIを学ぼう ゲームプログラミングで強化学習を体験

2020年5月25日 (月)

ゲームを作り出すAI!?NVIDIAが「GameGAN」でパックマンを再現!

パックマンって、誕生から40年を迎えるんですね。

それはともかく、そのパックマンをエピソードのみから再現するというAIをNVIDAが作り出したと宣伝しております。

誕生 40 周年を迎えるパックマンを、NVIDIA の研究者たちが AI で再現 | NVIDIA

そのAIはずばり「GameGAN」というそうです。GAN(Generative Adversarial Network、敵対的生成ネットワーク)のゲーム版といったところのようです。

そのGameGANにパックマンの5万エピソードを放り込んで学習させて、ゲームエンジン無しにパックマンを再現したんだそうです。

ええ、もう、何言ってるのかわかりませんね……

で、できたものはこちらの動画。

これを見る限り、ゲームを作った、というより、ゲーム動画を作ったというところでしょうかね……

どちらにしても、たいしたものです。

いずれスペースハリアーやアフターバーナーなんかも作り出しちゃうんでしょうかね?

レトロアーケード <パックマン>

2020年5月 3日 (日)

ゲームセンターあらしの作者 すがやみつる氏によるPython解説本「こんにちはPython」買ってみた

長らくPython解説本を探していたんですが、こいつが出るという話を聞いて、予約注文してました。

Img_3984

で、5月1日に到着。

この絵柄に懐かしさを覚える人も多いんじゃないでしょうか。そうです、1980年代に一世を風靡した、あの「ゲームセンターあらし」です。

その作者、すがやみつる氏は、実は「こんにちはマイコン」という本を書いていたことも、知る人ぞ知る話。

そんなすがやみつる氏の最新作がこちら、「こんにちはPython」です。

いわゆる入門書ですが、ちょっとかいつまんで紹介します。

Img_2357

この本、全部で190ページほどですが、そのうち56ページまでを使って、単純な四則演算とprint表示、変数、そして”Hello World”の解説にあてています。

一見すると随分と回りくどい感じがしますが、実はその解説の中で、Pythonの導入から基本的な構成、そしてエラーの読み方など、Pythonの基礎となるべく知識を分かりやすく漫画で描いております。

Img_2358

それが終わると、いきなりゲームの製作です。ゲームセンターあらしらしい展開……と思いきや、実に単純なゲームです。

数字を言いながら、3の倍数なら「フィズ」、5の倍数なら「バズ」、両方で割り切れる数字なら「フィズバズ」と言い換えるというゲーム。

Img_2359

当然、繰り返し文に条件文が登場します。このため、Python特有のこれが登場です。

そう、「インデント」です。

このPythonにおけるインデントの概念を、分かりやすく説明しています。漫画の力ですね。

ところでこの本、分かりやすいのは漫画の力だけではないです。

なんていうんでしょうか……トライアンドエラーをきちんと書いているというか、とにかく、こうするとこうなる、というのを手順を追って書いているんですよね。

例えば、これ。

Img_2360

1~6までの数字の乱数を発生させたいとき、単純にrandom関数を使うとこうなっちゃう(小数点以下何桁もの表示が出てくる)というのを示したうえで、それの修正方法(int等)を順を追って説明。

プログラムって、こうした「やっちまった」ことの繰り返しで覚えていくことが多いので、トライアンドエラーをきちんと書いてくれるのはユーザー体験的には分かりやすいことじゃないかと思います。

とまあ、こんな調子で話は進みますが。

Img_2361

最後は、こういうゲームを作ります。

後半ほどコードの解説が多いですが、わりと何とかなりそうです。

さて、私も社内でAI/機械学習系の普及活動をやってますが、そもそもこのPythonが分からないという声が多いのは事実です。

VBAやHTML、Javascriptなどの言語に触れたことがある人なら何とかなるんですが、そういう人ばかりではないのがこの日本という国の現状。

一方でPythonという言語は、そのままでは使われない言語でもあります。

大抵は「pip」コマンドで機能を実装して、importでそれを読み込んで使用する。まあ、それがPythonの良さでもあるんですが、一方で初心者を混乱させている元凶でもあります。

この入門書では、pipだのimportだのに頼ったプログラムは、ほとんどありません(とはいえ、乱数を使うときには「import random」等、多少はあります。まったく使っていないわけではないですが)。

本当の基礎を学ぶには、良書ではないかと感じました。

てことで、早速こいつを会社にもっていき、紹介して回ろうかと思ってます。さほど高い本でもないですし、やはり漫画ということもあって読みやすい。そこからあとは他の本なり、ネット検索なりで上達していけるきっかけとなればと思ってます。


ゲームセンターあらしと学ぶ プログラミング入門 まんが版こんにちはPython

2020年5月 1日 (金)

最大20人の体温を同時測定するアイリスオーヤマのAIサーマルカメラ

いやあ、アイリスオーヤマさん、なかなかいいものを発売しました。

最大20人の体温を同時測定 アイリスオーヤマ、「AIサーマルカメラ」を発売 - ITmedia NEWS

アイリスオーヤマが4月15日に、最大20人の人の顔検出と、その体温を測定するというAIサーマルカメラ「ドーム型AIサーマルカメラ」を発売しました。

ごらんの通り、複数の人の顔を検出し、その上に体温を表示するというもの。注文が殺到しているようです。そりゃあそうでしょうね。

凄いのは、マスクをつけていても顔検出できるというところ。実は実験してみましたが、よくあるOpenCVに付属の顔検出器ではマスク付きの顔を検出できません。ちゃんと作ったようですね。

まさに今、コロナ禍の真っただ中。その疑いのある人をチェックしたいという需要はあるものの、非接触で同時に何人もの人を測定できる機器って、ほとんどありませんね。

しかしこれ、お値段90万円とのことで、結構な値段です。とても個人レベルで同行できるものではありませんね。

1人だけ測れる携帯版の「ハンディ型」というサーマルカメラもあります。こっちはお値段25万円。ごく普通のサーマルカメラです。

これを見ていると、なんだか自分でも作れないかなぁ……なんて思ってしまいますが、さすがにマスク顔をどう検出するかを解決しないと、だめそうですよね。

FLIR(フリアー)【国内正規品】iPhone/iPad用 FLIR ONE Pro 19200画素 1年保証 赤外線サーモグラフィ メーカー品番:435-0006-03

より以前の記事一覧

当ブログ内検索

スポンサード リンク

ブログ村

無料ブログはココログ