Raspberry Pi OS Bullseye 64bitでTFLite環境構築



# 1.はじめに

Raspberry PiでAI推論をするとき、モデルの量子化と64bitOS化が良く効くと聞いていたので、Bullseyeで64Bit TFLite環境を作るぞー、おーーーー！

64bit化が良く効く例
その１　[Raspberry Pi4 単体で TensorFlow Lite はどれくらいの速度で動く？](https://qiita.com/terryky/items/243000fcfcb89af11510)
その２　[Raspberry Pi4 単体で TensorFlow Lite はどれくらいの速度で動く？【2020年12月版】](https://qiita.com/terryky/items/09434b8027d8a199379c)

#### ※この記事を書き終えて、、、[32bit版で環境を作った前回記事](https://qiita.com/airpocket/items/9f3dfdaa30d56424fd94)と全く同じやりかたで出来てしまいました。~~もったいないので~~成功した記録として公開しますが、代わり映えの無い内容です。

#### ※２　タイトルを「Raspberry Pi OS Bullseye 64bitでTFLite環境高速化」から「Raspberry Pi OS Bullseye 64bitでTFLite環境構築」に変更しました。高速化したいから64bit環境作ったのは確かですが、高速化の検証を載せてなかったので。

# 2.Bullseye 64bitのSDを作る

2022/1/12現在、[こちら](https://downloads.raspberrypi.org/raspios_arm64/images/raspios_arm64-2021-11-08/)に64bit版OS（2021-10-30-raspios-bullseye-arm64.zip）がありますのでダウンロードして解凍してRaspberry Pi ImagerでMicroSDに書き込みます。

初期設定等は32bit版と同様に済ませられます。

64bitで動いてることを確認。

```sh
$ getconf LONG_BIT
64
$ uname -a
Linux raspberrypi 5.10.63-v8+ #1459 SMP PREEMPT Wed Oct 6 16:42:49 BST 2021 aarch64 GNU/Linux
```

パッケージも取り合えず最新版にしておきます。

```sh
$ sudo apt update
$ sudo apt upgrade
```


# 3.OpenCVのインストール

OpenCVとTFLiteのruntimeは[この記事](https://qiita.com/airpocket/items/9f3dfdaa30d56424fd94)で紹介した方法で入れておきます。まずはOpenCV。

```sh
$ git clone https://github.com/luxonis/depthai.git
$ cd depthai
$ python3 install_requirements.py
```

Warningがちょこちょこ出ていたので心配ですが、とりあえずインポートして様子を見ます。

```python
$ python
Python 3.9.2 (default, Feb 28 2021, 17:03:44) 
[GCC 10.2.1 20210110] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> 
```

インポートできたので、USBカメラの画像も読めるか確認しておきます。
標準でThonnyが入っていたのでこのコードをコピペですぐ動きます。

```python
import cv2
import time
capture = cv2.VideoCapture(0)

if capture.isOpened() is False:
    raise IOError

start_time = time.time()

while(True):
    try:
        ret, frame = capture.read()
        if ret is False:
            raise IOError

        elapsed_time = time.time() - start_time
        start_time = time.time()
        cv2.putText(frame,
             "Elapsed Time : " + '{:.1f}'.format(elapsed_time * 1000) + "ms" + " / " + '{:.1f}'.format(1 / elapsed_time) + "fps" ,
             (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 255, 0), 2,
             cv2.LINE_AA)

        cv2.imshow('frame',frame)
        cv2.waitKey(1)

    except KeyboardInterrupt:
        # 終わるときは CTRL + C を押す
        break

capture.release()
```

動きました。

# 4.TFLiteも入れてみる

```sh
pip3 install --extra-index-url https://google-coral.github.io/py-repo/ tflite_runtime
```

```sh
$ git clone https://github.com/PINTO0309/TensorflowLite-bin
$ cd TensorflowLite-bin
$ python3 mobilenetv2ssd.py
time:  0.06339740753173828
[[(128, 223), (320, 542), 0.96484375, 'dog'], [(114, 135), (564, 432), 0.953125, 'bicycle'], [(459, 80), (694, 173), 0.87890625, 'car']]
coordinates: (128, 223) (320, 542). class: "dog". confidence: 0.96
coordinates: (114, 135) (564, 432). class: "bicycle". confidence: 0.95
coordinates: (459, 80) (694, 173). class: "car". confidence: 0.88
```

動いた。
というわけで、32bitと同じ手順で問題なく動いてしまいました。あれ？

# 5.まとめ
Qiitaの記事は覚書目的が8割で、書きながら作業を進めるのですが、今回は何のトラブルもなく32bitと同じ方法で動いてしまいました。もったいないので公開しますが、冒頭で書いた通りあまり意味のない記事になってしまいました。