低コストで導入可能な最新リテールテック!(前半)+Jetson Nanoの紹介

アドバンスドテクノロジーラボの塩澤繁です。

世界中でキャッシュレス化が急速に進みつつある昨今では、Amazon Goを代表とした、小売店でイノベーションを起こすリテールテック(Retail Tech)技術が注目されています。
現在のリテールテックでは、主に顧客属性、行動履歴、顧客導線や商品判別といった、店舗内の情報の分析が行われています。

これらの処理、分析には通常、高額なGPUを活用した画像解析、AIが使われます。Amazonや大手メーカー様等、潤沢な資金、リソースを保有している企業が先行していますが、小規模店舗にとっては、敷居が高いのが現実です。

 私のチームでは以前より、いかにコストをかけずにリテールテックを実現させるかを研究してきました。例えば、NVIDIA Jetson nano(※)(販売価格1万円強程度)とカメラモジュール、ディープラーニング技術を組み合わせた分析手法などです。
※NVIDIA Jetson nanoの紹介記事は本ページの下部にて

 本ブログでは、2回に分けて取り組み内容の一部をご紹介します。小売り業界でのIT導入や、キャッシュレス化に向け少しでも貢献できればと考えています。
 また、後述の実証実験の実施場所は、弊社のオフィス内としております点をご了承ください。

■属性推定
Jetson Nano を利用して、カメラ画像からの属性推定を実施してみました。
ここでは、写った人の写真から「性別」と「年齢」を推定します。

 性別や年齢の判定に関しては多くのWebサービス(Web-API)が存在し、有名なものとしてはMicrosoft Azureの「Face API」などがあります。精度も比較的高く、Web連携もしやすいため、多くの場所で利用されていると思います。

 今回の検証でも、当初はWeb-APIによる属性推定を利用することを検討しました。外部のAPIを利用する場合、顔の画像のみを撮影し、その画像をAPIに投げることができれば処理が完結し、Raspberry Piなどでも比較的容易に実現することが可能です。しかし今回は Jetson Nanoのパフォーマンスを活かしてみたいという思いもあり、単体での属性推定を試みました。

【検証の流れ】

・顔の検出(独自プログラム)
  ↓
・属性推定の実行(DeepLearningによる属性推定:モデル変更なしで利用)

顔検出のプログラムは、別の用途で開発したOpenCVをベースとした仕組みを利用し、属性推定には、age-gender-estimationを利用しました。age-gender-estimationはDLを用いたモデルを使用し属性推定を行っていますが、検証の結果Jetson Nanoで動作させることができたため、インターネット接続が不要であるという利点も活かすことにしました。

【使用技術とデバイス】
・性別・年齢推定ライブラリ:age-gender-estimation(https://github.com/yu4u/age-gender-estimation)(v0.5 release)
・カメラ:Buffalo BSWHD06M

以下が実際に設置した様子です。

ATL受付

《ATL受付にカメラを設置》

 まずUSBのWebカメラを、あまり目立たない状態で受付台のタブレット下に設置。Jetson Nanoは受付カウンターの裏側に設置しました。入口から入ってくる訪問者(主に社員)や受付タブレットを利用する人の顔を検知し、属性推定できるかを検証します。

取得した顔画と年齢・性別判定の結果

face_detect_2

《年齢・性別の推定の結果》

2枚目の画像はブレが発生していますが、年齢も性別も認識することができています。
ここでの工夫ポイントとしては、
・顔検出の機能にてスコアリングを行い、より良い顔を取得するようにした点
・より良い顔画像の上位(最大2枚)を利用して属性推定し、平均化することで誤差を削減できるようにした点
などです。

 検証の範囲内では、個人差と光の当たり方での影響が大きいものの、年齢としては概ね3~5歳前後の誤差となりました。今回の検証では幅広い年齢層での検証が行えていませんが、コンビニのレジの年齢層以上の精度は出せる可能性があります。
 Microsoft の Face APIと比較すると、属性、年齢ともに精度が低いように見受けられましたが、DLのモデルの影響もあると考えています。デフォルトで利用したモデル(age-gender-estimationで利用しているデータ)は、日本人の顔が少ないことも考えられるため、精度向上を目指すのであれば、学習データに日本人画像も多く追加しモデルに反映する必要があると考えています。
 ここまでご説明した方法では、常時インターネットに接続する必要もなく、APIの利用制限もありません。1万数千円の機材を置くだけでこのような集計が単体でできるのは、小売り業界でのデータ分析に役立つかもしれないと考えています。

■視線検知機能
 お客様が商品棚の前でどの商品に興味を持ったのかを把握し、商品陳列最適化を行うためのデータを取得する機能です。
 今回の実験は、オフィス用のドリンク販売冷蔵庫で行いました。購入時に棚のどこに目線があるかを、カメラで捕捉し数値化させます。取得した視線データのログはグラフィカルに表示させて、分析ができるようにしています。

【使用技術とデバイス】
・視線トラッキング用ライブラリ:OpenFace(https://github.com/TadasBaltrusaitis/OpenFace)(OpenFace 2.1.0)
・カメラ:ELECOM UCAM-DLE300T

【OpenFaceの利用】
 今回は、視線検知機能を持つOpenFace を利用することにしました。Jetson Nanoで利用するためにはソースからのビルドが必要ですが、ビルド用のスクリプト(install.sh)が含まれているため、比較的容易にビルドすることができます。
 今回は未導入だったOpenCVの導入も内包されているため、install.shを利用してセットアップを進めました。
 (※ OpenFace を商用利用するためにはライセンスが必要となります)

ここでのスクリプトの変更点は以下の通りです。
 OpenCVのバージョン変更:3.6.0 → 3.6.1
 OpenCVのオプション変更:WITH_CUDA=ON
 dlibのバージョン変更:19.13 → 19.16

 また、JetsonはARMアーキテクチャのため、CMakeLists.txt から “-msse” のオプションも無効にする必要があります。ビルド中、未導入のライブラリやヘッダファイルが必要となった場合は、順次、aptなどで導入する必要はあります。

 ビルドが無事完了すると、GUIモードを含めたOpenFaceの機能を利用することができます。ビルドの際の注意としては、かなり時間を要するため、可能なら "$ sudo nvpmodel -m 0" にてパフォーマンスを最大にするのが良いと思います。ビルド中はCPUの高負荷状態が続き、温度や使用する電源に気を付けないと、途中で固まることもあるため、可能ならヒートシンクにファンを装着(または外からファンで送風)し5V/4Aの電源ジャック(micro USBではなく)から電源供給をしておくと安心です。

OpenFace GUI

《OpenFace Gaze GUI表示》

OpenFace GUI

《OpenFace GUI 数値表示:Win》

 図はOpenFaceのGUIモードでの様子です。このように顔の角度や方向、視線などの各情報を得ることが可能です。インプットは、静止画や動画の他、リアルタイムでのカメラからの情報も利用可能です。注意点としては、顔や視線は思っている以上に頻繁に動くので、より細かく情報を取得したい場合は動画やカメラのコマ数(FPS)がかなり重要である、ということが挙げられます。
 OpenFaceをJetson Nanoに最適化することができれば本来の実力を発揮できる可能性がありましたが、デフォルト設定の状態だと、リアルタイムのカメラ入力では思っていた以上にFPSが出せませんでした。(カメラの性能もあり7FPS前後)そのため、今回の検証ではJetson Nanoで一旦録画(ffmpeg + v4l2)したデータを利用し、視線分析を行っています。通常の録画であれば720Pで30FPS に近い動画を得ることができますし、動画からの解析にも対応しているため、バッチ的な処理で視線の可視化を行うことが可能になります。加えて実際の現場での使用を考慮した場合、購入に来た顧客単位(1人毎など)で視線の動きを可視化できれば、どのように商品を選んでいるかを「視線」という観点で分析することができるため、要件を満たすことができます。

■検証の流れ
(1)動画の録画
 ↓
(2)OpenFaceによる分析
 ↓
(3)プロット表示
(※すべてJetson Nano上で実施)

今回の検証の様子と結果は以下の通りです。

冷蔵庫カメラ設置

《カメラの冷蔵庫への設置》

視線集計結果

《視線集計結果》

画像の集計方法については、OpenFaceから吐き出されたフレーム単位の検知結果(csvファイル)をPythonのスクリプトでプロットしています。
 テストでは、視線を1段目の左から右、2段目の右から左と移動し、4段目まで見たら一番上を再度見てもらう、という流れで検証しました。
 各ポイントは、水色 → 紫 になるに従って、時間が経過していることを示しており、1段目の左から始まり、ある程度の視線の動きを検知できていることが確認できました。

 これにより、例えばAとBの2つの商品があった際どのくらい迷って購入したかや、商品の配置による購入までのプロセス、購入商品の変化などの分析を行うことができます。

【課題】
 今回利用したOpenFaceは、デフォルト設定のままではJetson Nanoの性能を活かしきれていない点がありました。そのため、より高精度かつリアルタイムでデータを取得したい場合は、チューニングが必要と考えています。仮にリアルタイム性が向上すると、システム的にはより単純な構成にすることができ、視線データを集計するだけでなく、購入を迷っているタイミングでなんらかのアクションに繋げることができるかもしれません。考えられる例としては、A社とB社の飲料で迷っているような場合、メーカーA社のキャンペーンと合わせて、ディスプレイでA社の飲料を宣伝する、というような方法です。

【まとめ】
 Jetson Nanoは、UbuntuベースのLinux環境でNvidia Cudaを利用することができます。メモリ等の制限はありますが、条件が揃えば、既存のデスクトップ上で開発していたCudaベースのDLモデルも動かすことができますし、それが、手のひらサイズで動く!という点が今までにない可能性を広げてくれると思います。
 次回もJetson Nanoを利用したリテールテック関連の検証を記事にしたいと思いますので、お楽しみに。

 

■Jetson Nanoについて

・Jetsonとは
 NVIDIA社が展開する、組み込み向けのプラットフォームです。AIやディープラーニングを小型かつ省電力で実行可能なモジュールで、様々なシーンでの利用が想定されています。
 Jetsonファミリーは、「Jetson AGX Xavier」「Jetson TX1/TX2」の2種類がありましたが、本年3月に米国で新たな「Jetson Nano」が発表されました。Jetsonファミリーでは、最小で値段も一番安いモデルとなります。
 今回は、この「Jetson Nano」の Developer Kitを入手しましたので、レビューを兼ねて試したことを書いてみたいと思います。

・Jetson Nano Developer Kit
 Jetson Nano Developer Kit は「Jetson Nano」のモジュールに、I/Fを備えた開発用ボード(マザーボード)が付属したキットです。日本国内でも ¥12,000前後で購入することができます。
 Jetson Nanoモジュール自体は、ヒートシンクが厚みの大半をしめており、それを含めると20mmほどの厚さとなりますが、基板のフットプリント自体は 70 x 45mm と、名刺の6割ほどのサイズしかありません。残念ながら、現時点でこのコアモジュール単体で動作させることはできず、USBやHDMI、GPIOなどのI/Fを備えた開発用ボードに、ノートパソコンのメモリのように取り付けて利用することになります。
 Jetsonの大きな特徴は、AI分野、特にディープラーニングでは必須とも言える、GPGPUを行えることです。世代は少し古くなりますが、NVIDIA Maxwellアーキテクチャを採用した、128基のCUDAコアを搭載しています。最新の一般向けGPUは、4,000基を超えるCUDAコアを搭載していることを考えると、心もとない気もしますが、CUDAを利用しているフレームワークがこのサイズ、しかも10Wほどの消費電力で利用できる点は非常にメリットがあります。後述するOSのセットアップイメージの時点で、既にCUDAのライブラリが搭載されていますし、TensorFlow-GPU、OpenCVもGPUバージョンが利用できます。

細かな仕様は公式サイトをご覧ください。
Nvidia Jetson Nano

 実はJetson Nanoは、Developer Kitに付属するJetson Nanoモジュールと、今後発売されるJetson Nanoモジュール とで仕様が一部異なります。
 前者にはストレージは搭載されておらず、代わりにmicroSDカードを利用しますが、後者はeMMC 16GBのストレージが搭載されるようです。開発ボードで開発された機能やAIのモデルを絞り、外部ストレージなどを使用せずに載せることを想定しているようです。

・外観

Jetson Nano

《Jetson Nano 外観》

 Jetson Nanoの外観はこのようになっています。
 写真からもわかるように、開発用ボードにモジュールが搭載されており、巨大なヒートシンクが目につきます。
 また、多くの方が言及していますが、基板裏側のUSB部に、後付け感のあるチップ型のコンデンサの出っ張りがあります。もし机の角などに引っ掛けたり、落としてその部分が当たったりすると壊れてしまいそうです。そのことに加え、基板をむき出しのまま開発することになるため、ショート防止を兼ねてクリアファイルで裏側を絶縁してみました。

Jetson Nano

《Jetson Nano 裏面カバー》

 ボードの置き場所ですが、梱包されていた段ボールが公式の置台となります。(捨てないようにしましょう)

・Raspberry Pi 3 Model B+ との比較
Jetson Nanoの本題に入る前に、I/Fやサイズ感などから、組み込み向けのCPUボードにおいてライバル的な存在となる、Raspberry piと簡単に比較してみます。

Jetson Nano

《Jetson Nano と Raspberry pi 3 B+ との比較》

まずはサイズ感ですが、Jetson Nanoのコアボードを取り付けた開発ボードと、Raspberry Pi 3 Model B+(以下、ラズパイ)を比べてみます。Jetson Nanoの開発ボードは 100 x 80mm、ラズパイは 86 x 56mm で、Nanoの開発ボードは厚みもあるため、実際比べるとラズパイより二回りほど大きく感じます。
 続いてスペックですが、詳細は各々公式サイトをご確認いただくとして、特徴的なところをピックアップしてみたいと思います。
I/Fで大きく異なる点は、以下の通りです。
・無線環境:Jetson Nano=無し、ラズパイ=WiFi+BT
・USB:Jetson Nano=Ver.3.0×4ポート、ラズパイ=Ver.2.0×4ポート
・M.2:Jetson Nano=TypeEあり、ラズパイ=無し
・外部電源コネクタ:Jetson Nano=あり、ラズパイ=無し

 Jetson Nanoの開発ボードにもWiFiがあると便利だと思いましたが、1,000円前後で購入することができるUSBタイプのWiFiドングルを取り付けるだけで、WiFiを利用することができます。また、動作は未確認ですが、Jetson Nanoの開発ボードに搭載されているM.2(TypeE)には、IntelのWireless-ACタイプのようなWiFi-BTボードが搭載できるのでは…と考えています。USBも塞ぐことがないので、スリムになって良いかもしれません。
 1点、気になる個所としては、Jetson Nanoが外部電源コネクタを標準で搭載している点です。これは、電力消費が大きい(USBでは足りなくなる)ことを意味しています。実際、電源はMicro-USBコネクタから供給することも可能ですが、最大でも 5V/2A(10W)程度までが限度のようです。
 "$ sudo nvpmodel -q" というコマンドで現状のパフォーマンスモードを確認できますが、"$ sudo nvpmodel -m 0″ にて最大パワーを利用したい場合には、外部電源(5V/4A)が推奨とされています。

 一方、I/Fが似ている、もしくは共通となっている部分もあります。GPIOのコネクタはラズパイとほぼ共通したものになっていますし、CSIというコネクタもJetson Nanoの開発ボードに搭載されており、ラズパイ用のカメラをそのまま接続することができます。これはJetson Nano自体がラズパイユーザも視野に入れているためだと考えられますが、開発資産が共有できるのは大きなメリットです。

・セットアップ
 続いてJetson Nanoのセットアップに関してです。基本的には、MicroSDカードを利用し、公式にある手順に従うことで問題なくOSを導入することができます。Jetson TX1といった他のファミリーは、母艦としてのLinuxマシンが必要でしたが、Nanoに関してはMicroSDブートが可能となるため単体利用できます。

セットアップガイド

 標準でセットアップされるOSは、Ubuntu 18.04ベースのDesktop版 Linuxです。CPUがArmのため、利用したいモジュールやドライバによっては、ビルドする必要もありますが、一般的なユーティリティは apt-get 経由でも導入することができ、通常のUbuntu Linux同様に利用することができます。
 しかし一般的なPCスペックと比べると、ストレージがMicroSDであることも影響し、速度やレスポンスは全体的に遅い印象です。特にファイルコピーなどのI/Oやビルドも遅い印象を受けたため、以下のサイトを参考にして、高速なUSBメモリをメインで利用するよう変更してみました。(残念ながらMicroUSB無しでは起動できません)
(参考サイト:Jetson Nano – Run on USB Drive

 もしMicroSDカードを利用する場合は、高速でかつランダムアクセスに強い「A1」「A2」などの、Application Performance Class に対応したMicroSDを使用するのが良さそうです。

・電源
 Jetson Nanoの電源は、micro USB給電に対応しています。しかしラズパイと同様、それなりに電力を消費しますので、スマホの充電器などでは足りなくなる可能性があります。最低でもラズパイ用電源(できれば、3A以上)が理想で、Jetson Nanoに関しては、5V×4Aまで対応した外部電源用コネクタも搭載されています。安定して動作させるには、外部電源を使うのが良さそうです。

・ファン
 巨大なヒートシンクが既に搭載されていますが、4cm角のクーリングファンも取り付けられるようになっています。デモなどでファンレスのCPU温度が80℃近くになっているものも見たことがありますが、高温になってしまうと高負荷動作時やビルド時に不安定になることがあるため、外付けファンや卓上ファンの併用をおすすめします。(ファンの効果は絶大です)

Jetson Nano 外観

《Jetson Nano + 6cm Fan》

・カメラ
 続いてJetsonで利用できるカメラですが、UVC規格のWebカメラなどは全く問題なく利用できます。
(使用実績:ELECOM社 UCAM-DLE300T、Buffalo社 BSWHD06M)
 また、先にも記載しましたが、ラズパイ用のカメラもCSIコネクタを搭載しているため、特に設定することなく利用することができます。Webカメラの性能にもよりますが、OpenCVなどで試したところ、CSIコネクタ経由の方が映像のタイムラグは小さくなりました。