Coral USB TPU AcceleratorをWindows端末で(疑似的に)使う (VirtuaBox編)

## 【目的】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454012/1b241581-35d3-f926-cb72-003046d42133.png)
Coral USB TPU Accelerator(Edge TPU)をWindows端末で使えるようにします。
(写真のCoralの山は…)

## 【内容】
Googleが開発したEdge TPU (Tensor Processing Unit)は現時点ではUbuntuおよびRaspbian(ラズパイのOS )などDebianベースのOSでの動作のみ保証されています。
これを、なんとかWindows端末で動かそうという試みです。

## 【WSLで使ってみる】(前置き)
WindowsでUbuntuといって真っ先に思いつくのは、Windows 10 1607から使えるようになった「Windows Subsystem for Linux (WSL)」を使う方法です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454012/c4bed20a-2f47-2832-e221-0ddf209d0b56.png)

WSLの使い方は下記記事を参照してください。
[【Windowsで環境を極力汚さずにPythonを動かす方法 (WSL利用 Windows10, version 1607以降限定)】](https://qiita.com/rhene/items/ff11c7850a9a7617c50f)

インストールできたら早速Ubuntuを起動して、必要モジュールをインストールしてみます。

```bash
cd ~/
wget https://dl.google.com/coral/edgetpu_api/edgetpu_api_latest.tar.gz -O edgetpu_api.tar.gz --trust-server-names
tar xzf edgetpu_api.tar.gz
cd edgetpu_api
bash ./install.sh

Your platform is not supported.
```
「あなたのプラットフォームではサポートされてません」と言われてしまいました。
もっともここをクリアしてもWSLは現時点ではUSBデバイスを認識しないので、無理なのはわかってましたが…


## 【VirtuaBoxで使ってみる】(本題)
VirtualBoxとはx86仮想化ソフトの一つで、現在はOracle社が管理しています。
特徴としてはWindows10に標準で搭載されている仮想化ソフト「Hyper-V」とは異なり、**USBデバイスを認識できる**というところです。
これは期待できます。
利用経験はありませんでしたが、試しに使ってみました。

### 【VirtuaBoxのインストール】
インストール自体は簡単です。
公式HPからダウンロードしてきてインストールするのみです。

- [Download VirtualBox](https://www.virtualbox.org/wiki/Downloads)

一点気をつける点として、インストール後に「Oracle VM VirtualBox Extension Pack」を追加で適用する必要があります。(これを行わないと仮想環境内でUSB2および3が利用できません)
こちらも上記のサイトからダウンロードできるので、ダウンロードしたものをダブルクリックすると適用が開始されます。

### 【仮想マシン(VM)の作成】
ubuntuをインストールするためのVMを作成します。
スペックなどは適当でいいです。
今回は4CPU、4GBメモリ、40GBストレージで作成しました。

### 【USBデバイスフィルタの作成】
VM作成後、「設定」＞「USB」から、右端の「＋」がついているアイコンをクリックし「Global Unichip Corp. [0100]」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454012/cb0ec07f-dd43-8122-7160-351a691ca550.png)

**この操作を2回繰り返し**、USBデバイスフィルタを2つ作ります。
そのうちの一つをダブルクリックで設定画面を開いて、以下の内容に変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454012/51a7d02c-18d8-a936-4dfc-f93596509122.png)

以下のようになれば設定完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454012/a1d74424-9fb7-b225-ec7b-ea3a58239744.png)
「USB コントローラを有効化」にチェックが付いていることを確認し、「USB 3.0(xHCI)コントローラー」を選択しておきましょう。


### 【Ubuntu18.04 LTSのインストール】
上記で作ったVMにUbuntuをインストールします。
今回は安定版の「18.04 LTS」を使いました。
インストール方法は省きますが、インストーラーのisoイメージをダウンロードし、VMにマウントした状態でVMを起動するとインストールが始まるので、指示に従うだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454012/9b3a78b8-26a2-f6d9-30a5-a79f77897339.png)


### 【動作確認】
インストールが完了しUbuntuが起動したら、デスクトップ上を右クリックして「端末を開く」を実行するとターミナル画面が開きます。
まずは下記コマンドでアップデートを行います。
インストール時のオプションによっては勝手にアプデートが動きますので、処理が完了するまで待ちましょう。

```bash
sudo apt update
sudo apt upgrade
```

次にEdge TPUが認識されているか確認します。

```bash
lsusb
```

下記のように「Bus 002 Device 002: ID 18d1:9302 Google Inc. 」のような表示が出ていれば成功です。

```出力結果.txt
Bus 002 Device 002: ID 18d1:9302 Google Inc. 
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 002: ID 80ee:0021 VirtualBox USB Tablet
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
```
表示されていない場合はEdge TPUを抜き差ししてみるか、一旦VMの電源を落としてからVMの設定からUSBデバイスフィルタの設定を確認してみましょう。


### 【Edge TPU用のモジュールのインストールと動作確認】
基本的には下記の記事を踏襲します。
[【Coral USB TPU Accelerator(EdgeTPU)をとりあえず使う (Quick Start)】](https://qiita.com/rhene/items/4a55e9d428594092ee58)

ただし、以下の2点が異なります。

- ubuntuを日本語でセットアップした場合は【3. サンプルモデルを使って推論を行う】の最初に`mkdir ~/Downloads/`を実行する  
(もしくは`Downloads`の部分をすべて`ダウンロード`に置き換える)
- `cd /usr/local/lib/python3.5/dist-packages/edgetpu/demo`の`python3.5`の部分を`python3.6`に置き換える

実際に動かした結果は以下のとおりです。

```bash
python3 classify_image.py \
 --model ~/Downloads/mobilenet_v2_1.0_224_inat_bird_quant_edgetpu.tflite \
 --label ~/Downloads/inat_bird_labels.txt \
 --image ~/Downloads/parrot.jpg
---------------------------
Ara macao (Scarlet Macaw)
Score :  0.76171875
```
無事、認識結果が表示されています。