Mac環境でCoral USB Acceleratorを動かしてみる

#はじめに　
リアルタイムな映像の物体検出をサクッと試してみたかったので，Coral USB Acceleratorを動かしてみました．ほとんど[参考サイト][1]と内容は同じですが，動画への適応方法とうまくいかなかった箇所とその対処方を添えて書きます．

#前提環境
* mac : 12.0.1
* python : 3.8.12
* TensorFlow Lite : 2.6.0

#環境構築
[サイト][1]を参考にして環境を構築していきます．
1. python仮想環境構築
2. Edge TPUランタイム
3. TensorFlow Lite

### python仮想環境構築
Anacondaを利用し仮想環境を構築します．Anacondaのインストールが済んでない方は[こちらのサイト][2]を見てAnacondaをインストールをしてください．
ターミナルで以下のコマンドを叩きpythonの仮想環境を構築します．

```php:ターミナル
# 作業ディレクトリ作成
mkdir tflite-coral-example && cd tflite-coral-example

# 仮想環境作成
conda create -n 仮想環境名
```
以下の操作はこの仮想環境内で行います．

###Edge TPUランタイム
[Coralの公式サイト][3]の手順どおりにインストールします．OSごとに必要条件と叩くコマンドが異なるので注意．
以下はMacOSにおけるインストール手順．最後に動作周波数について聞かれますが今回は```N（通常の周波数）```で動かします．

```php:ターミナル（仮想環境内）
curl -LO https://github.com/google-coral/libedgetpu/releases/download/release-grouper/edgetpu_runtime_20210726.zip

unzip edgetpu_runtime_20210726.zip

cd edgetpu_runtime

sudo bash install.sh
```
この時『brewコマンドが見つかりません』というエラーが出た場合は，[こちらのサイト][4]を参考にHomebrewをインストールして再度```sudo bash install.sh```を叩く．


###TensorFlow Lite
[公式サイト][3]を参考にインストール．
以下はMacOsにおけるインストール手順（pip3でインストールするだけ）

```php:ターミナル（仮想環境内）
pip3 install --extra-index-url https://google-coral.github.io/py-repo/ tflite_runtime
```

##画像の物体検出をしてみる
まずリポジトリをクローン.

```php:ターミナル（仮想環境内）
mkdir google-coral && cd google-coral
git clone https://github.com/google-coral/tflite --depth 1
```
依存用ライブラリと推論データをインストール．

```php:ターミナル（仮想環境内）
cd tflite/python/examples/detection
./install_requirements.sh
```
以上で準備完了．以下のコマンドを叩き実行．

```php:ターミナル（仮想環境内）
python3 detect_image.py \
      --model models/mobilenet_ssd_v2_coco_quant_postprocess_edgetpu.tflite \
      --labels models/coco_labels.txt \
      --input images/grace_hopper.bmp \
      --output images/grace_hopper_processed.bmp
```
この時『opencvのモジュールが無い』と言われた場合は[こちらのサイト][5]を参考にopencvをインストール（opencvは諸々エラーが多発しますので粘ってください...）

##リアルタイム動画の物体検出をしてみる
``detect_image.py``内の画像の読み込み部分を書き換えることで，リアルタイム動画の物体検出が可能になります．しかし，このプログラムはpillow型しか読み込めないため，動画（OpenCV）をpillowに変換する必要があります．

```php:detect_image.py内に追加
def cv2pil(image):
    ''' OpenCV型 -> PIL型 '''
    new_image = image.copy()
    if new_image.ndim == 2:  # モノクロ
        pass
    elif new_image.shape[2] == 3:  # カラー
        new_image = cv2.cvtColor(new_image, cv2.COLOR_BGR2RGB)
    elif new_image.shape[2] == 4:  # 透過
        new_image = cv2.cvtColor(new_image, cv2.COLOR_BGRA2RGBA)
    new_image = Image.fromarray(new_image)
    return new_image

def pil2cv(image):
    ''' PIL型 -> OpenCV型 '''
    new_image = np.array(image, dtype=np.uint8)
    if new_image.ndim == 2:  # モノクロ
        pass
    elif new_image.shape[2] == 3:  # カラー
        new_image = cv2.cvtColor(new_image, cv2.COLOR_RGB2BGR)
    elif new_image.shape[2] == 4:  # 透過
        new_image = cv2.cvtColor(new_image, cv2.COLOR_RGBA2BGRA)
    return new_image
```
（参考サイト:https://qiita.com/derodero24/items/f22c22b22451609908ee）
USBカメラを接続し，同様に実行する．　

[1]:https://dev.classmethod.jp/articles/tensorflow-lite-with-coral-usb-accelerator-on-mac/
[2]:https://www.python.jp/install/anaconda/macos/install.html
[3]:https://coral.ai/docs/accelerator/get-started#runtime-on-mac
[4]:https://qiita.com/zaburo/items/29fe23c1ceb6056109fd
[5]:https://qiita.com/makki_maki04/items/f62c5e4e68709d9b3b89