Yoctoで meta-tensorflow-lite × Raspberry Pi 5 AI Kit(meta-hailo) × Raspberry Pi 5 向けの組み込みAI向けLinuxディストリビューションをビルドする

前回の記事ではYocto Projectを利用してRaspberry Pi 5上で動作するGUIを備えたLinuxディストリビューションをビルドして起動できることを確認しました。ただ、基本構成ですとアプリケーションが無いので、あまり実用的とは言えません。

#### Yoctoをビルドするための環境構築

Yoctoの基本的な使い方は、前回記事をご参照ください。

~~https://qiita.com/xtrizeShino/items/fcfd4491c09570a51cad~~

<font color="red">**kirkstoneとRaspberry Pi 5は組み合わせてはいけないようです。
対応記事の方をご確認ください。**</font>

#### 非推奨な組み合わせ：Yocto Project 4.0.23 × Raspberry Pi 5

https://qiita.com/xtrizeShino/items/9098a0c188ac3b17ad7c

https://qiita.com/xtrizeShino/items/9c4a8cc28198243a7fab

#### 対策記事：Yocto Project 5.0.5(scarthgap) × Raspberry Pi 5

整合性に関する問題を修正し、 **Linux Kernel 6.xに対応したYocto Project 5.0.5(scarthgap)を利用してLinuxカーネルのビルド環境も含む開発環境を構築する方法** を以下をご確認ください。こちらが正規手順となります。

https://qiita.com/xtrizeShino/items/91974cdc84bc8af24017

# 組み込みAI向けLinuxディストリビューション 

そこで今回はGUIに加えて、以下の機能を備え、組み込みプラットフォームである Raspberry Pi 5上で組み込みAIのベースとして動作できる **組み込みAI向けLinuxディストリビューションを構築** してみます。 **特にYocto 4.0.23向けのmeta-tensorflow-liteはRaspberry Pi 5に対応していないため、それについても更新** します。組み込むのは、下記の機能です。

- Yocto 4.0.23(kirkstone) + meta-raspberrypi
  - Networking <font color="blue">**(OK)**</font>
    - meta-networking 
  - Docker <font color="blue">**(OK)**</font>
    - meta-virtualization
  - Python3 <font color="blue">**(OK)**</font>
    - meta-python
  - OpenCV <font color="blue">**(OK)**</font>
    - opencv, python3-opencv
    - imshowはDesktop周りの影響か機能しない <font color="red">**(NG)**</font>
  - Tensorflow <font color="blue">**(OK)**</font>
    - meta-tensorflow
  - Tensorflow Lite <font color="blue">**(OK)**</font>
    - meta-tensorflow-lite
    - Raspberry Pi 4までしか対応していないため修正 <font color="blue">**(OK)**</font>
  - Raspberry Pi 5 AI Kit <font color="blue">**(OK)**</font>
    - meta-hailo
    - i.MXにのみ対応している状態だったため修正 <font color="blue">**(OK)**</font>

# 組み込みAI向けLinuxをビルドする手順

それでは、Linuxディストリビューションをビルドしていきましょう。

## Linuxを構成するLayerを収集する

まず、Linuxディストリビューションのベースとなり、ビルドスクリプトを備えたpokyと、Linuxディストリビューションに統合したいLayer(各種機能:meta-*)の構成ファイルをビルドディレクトリ内に収集します。

```bash
# 作業ディレクトリを作成します
$ mkdir ~/yocto-work-2024_v1
$ cd ./yocto-work-2024_v1
$ pwd
# /home/shino/yocto-work-2024_v1
```

### poky

まず、Yoctoのフレームワークとなるpokyを入手します。 **pokyにはLinuxの基礎となる機能に加えて、ビルド用スクリプトが含まれています。** `git clone`でリポジトリを入手した後に`git checkout`で「kirkstone(4.0.23)」ブランチへ切り替えビルドに必要なリソースを入手します。

https://git.yoctoproject.org/poky

![Screenshot from 2024-12-25 21-13-22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/6bc76e72-c72b-5bef-200d-d3d4413a7a64.png)

```bash
$ cd ~/yocto-work-2024_v1/
$ pwd
# /home/shino/yocto-work-2024_v1/
$ git clone git://git.yoctoproject.org/poky
$ cd ./poky
$ git checkout -b kirkstone refs/tags/kirkstone-4.0.23
```

### meta-raspberrypi

「meta-raspberrypi」は **Raspberry Pi向けのBSP(Board Support Package)** を含むLayerです。`git clone`でリポジトリを取得した後に`git checkout`でkirkstone向けのリソースに切り替えます。

https://layers.openembedded.org/layerindex/branch/master/layer/meta-raspberrypi/

![Screenshot from 2024-12-25 21-17-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/35b515ef-e2ee-99be-2b87-86dfa19091a2.png)

```bash
$ cd ~/yocto-work-2024_v1/poky
$ git clone git://git.yoctoproject.org/meta-raspberrypi
$ cd ./meta-raspberrypi
$ git checkout -b kirkstone origin/kirkstone
```

### meta-openembedded

「meta-openembedded」は **Linuxでよく利用されるアプリケーションやミドルウェア、ライブラリなどが集約されたLayer** です。いくつかのSub-Layerから構成されます。`git clone`でリポジトリを取得した後に`git checkout`でkirkstone向けのリソースに切り替えます。

https://git.openembedded.org/meta-openembedded

![Screenshot from 2024-12-25 21-21-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/b2ce8f8f-80ff-b7a1-6bbb-5cc79ac48833.png)


```bash
$ cd ~/yocto-work-2024_v1/poky
$ git clone git://git.openembedded.org/meta-openembedded
$ cd meta-openembedded
$ git checkout -b kirkstone origin/kirkstone
```

### meta-virtualization

「meta-virtualization」は仮想化機能を含むLayerです。近年の開発で広く利用されるDockerもこのLayerに含まれています。 **Dockerを利用することにより、異なるPythonのバージョンのプログラムをカプセル化してシームレスに統合したり、複数のバージョンの依存関係を保持したままシステムに組み上げることなどが可能** になります。`git clone`でリポジトリを取得した後に`git checkout`でkirkstone向けのリソースに切り替えます。

https://layers.openembedded.org/layerindex/branch/master/layer/meta-virtualization/

![Screenshot from 2024-12-26 18-30-50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/12c63a14-a283-bafb-b5aa-5a370bb64798.png)

https://mickey-happygolucky.hatenablog.com/entry/2023/02/23/070542

```bash
$ cd ~/yocto-work-2024_v1/poky
$ git clone git://git.yoctoproject.org/meta-virtualization
$ cd meta-virtualization
$ git checkout -b kirkstone origin/kirkstone
```

### meta-tensorflow

「meta-tensorflow」は組み込みAIで広く利用されているTensorflowを利用可能とするLayerです。**このTensorflow Layerは、Tensorflowの軽量版であるTensorflow Lite Layerよりも大きいため、本番運用ではTensorflowかTensorflow Liteのいずれかに絞ったほうが良いでしょう。** `git clone`でリポジトリを取得した後に`git checkout`でkirkstone向けのリソースに切り替えます。

https://layers.openembedded.org/layerindex/branch/master/layer/meta-tensorflow/

![Screenshot from 2024-12-26 18-31-13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/7bff708d-ff06-7905-3a29-551f94fbcb45.png)

```bash
$ cd ~/yocto-work-2024_v1/poky
$ git clone git://git.yoctoproject.org/meta-tensorflow
$ cd meta-tensorflow
$ git checkout -b kirkstone origin/kirkstone
```

### meta-tensorflow-lite

「meta-tensorflow-lite」は **Tensorflowのうち推論に特化した機能のみを抜き出したミドルウェアTensorflow Liteを利用可能とするLayer** です。`git clone`でリポジトリを取得した後に`git checkout`でkirkstone向けのリソースに切り替えます。

<font color="red">**ただし、このビルドスクリプトはRapsbery Pi 5に対応していないため、`git checkout`した後、Raspberry Pi 5向けにビルドスクリプトを書き足してください。**</font>


https://zenn.dev/nbo/articles/6c4493f6124f8f

https://github.com/NobuoTsukamoto/meta-tensorflow-lite

```bash
$ cd ~/yocto-work-2024_v1/poky
$ git clone https://github.com/NobuoTsukamoto/meta-tensorflow-lite.git
$ cd meta-tensorflow-lite/
$ git checkout -b kirkstone origin/kirkstone
```

#### python3-tensorflow-liteのビルドスクリプトを更新する

Raspberry Pi 5向けの設定がないため、追記します。

```bash
$ pwd
# /home/shino/yocto-work-2024_v1/poky/meta-tensorflow-lite
$ vi ./recipes-framework/tensorflow-lite/python3-tensorflow-lite_2.8.4.bb 
###
# 以下の行を追加
###
# ... TENSORFLOW_TARGET_ARCH:raspberrypi4-64 = "aarch64"
# ... TUNE_CCARGS:raspberrypi4-64 = ""
# ... EXTRA_OECMAKE:append:raspberrypi4-64 = " -DTFLITE_ENABLE_XNNPACK=ON"
TENSORFLOW_TARGET_ARCH:raspberrypi5 = "aarch64"
TUNE_CCARGS:raspberrypi5 = ""
EXTRA_OECMAKE:append:raspberrypi5 = " -DTFLITE_ENABLE_XNNPACK=ON"
# ...
```

#### libtensorflow-liteのビルドスクリプトを更新する

Raspberry Pi 5向けの設定がないため、追記します。

```bash
$ pwd
# /home/shino/yocto-work-2024_v1/poky/meta-tensorflow-lite
$ vi ./recipes-framework/tensorflow-lite/libtensorflow-lite_2.8.4.bb 
###
# 以下の行を追加
###
# ... TENSORFLOW_TARGET_ARCH:raspberrypi4-64 = "aarch64"
# ... TUNE_CCARGS:raspberrypi4-64 = ""
# ... EXTRA_OECMAKE:append:raspberrypi4-64 = " -DTFLITE_ENABLE_XNNPACK=ON"
TENSORFLOW_TARGET_ARCH:raspberrypi5 = "aarch64"
TUNE_CCARGS:raspberrypi5 = ""
EXTRA_OECMAKE:append:raspberrypi5 = " -DTFLITE_ENABLE_XNNPACK=ON"
# ...
```


### meta-onnxruntime

ONNX runtimeのLayer **「meta-onnxruntime」はYoctoの"styhead(5.1)" or "scarthgap(5.0)"にのみ対応** しておりkirkstone(4.0.23)は非サポートのため、今回のインストールでは諦めます。

https://github.com/NobuoTsukamoto/meta-onnxruntime/tree/styhead

![Screenshot from 2024-12-26 20-34-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/c0ce34c5-9a7e-9d05-7d52-3ba648e1de5e.png)


### meta-hailo

「meta-hailo」はRaspberry Pi 5 AI Kit向けのLayer群です。以下の機能を提供します。meta-hailoはSub-Layerである「meta-hailo-accelerator」「meta-hailo-libhailort」「meta-hailo-tappas」「meta-hailo-vpu」から構成されています。今回のビルドでは **「meta-hailo-accelerator」「meta-hailo-libhailort」「meta-hailo-tappas」を利用** します。

- HailoRT library
- HailoRT drivers
- Firmware for Hailo devices 
- pyHailoRT - HailoRT Python API (wraps the run-time library)

`git clone`でリポジトリを取得した後に`git checkout`でkirkstone向けのリソースに切り替えます。<font color="red">**ただし、このビルドスクリプトはi.MX用でありRapsbery Pi 5に対応していないため、git checkoutした後、Raspberry Pi 5向けにビルドスクリプトを書き足してください。**</font>

https://github.com/hailo-ai/meta-hailo

https://www.macnica.co.jp/en/business/semiconductor/articles/hailo/145447/

```bash
# Layerの入手は下記のコマンドでできるように思えます
$ cd ~/yocto-work-2024_v1/poky
$ git clone https://github.com/hailo-ai/meta-hailo.git
$ cd meta-hailo
$ git checkout -b kirkstone origin/kirkstone
```

#### meta-hailo-tappasをRaspberry Pi 5 (Hailo-8)向けにする

「meta-hailo」はi.MX向けのLayerらしく、Raspberry Pi 5でビルドするとHailo-15のバイナリが生成されてしまうようです。そのため、下記の記事を参考に **ソースコードが常にHailo-8向けにビルドされるようビルドスクリプトを修正** しました。

https://community.hailo.ai/t/yocto-kirkstone-meta-hailo-build-failed/2258/8

```bash
# bitbake時にtappas-appsをビルドするレシピに移動
$ cd ../meta-hailo/meta-hailo-tappas/recipes-gstreamer/tappas-apps

# tappas-appを変更する
$ vi tappas-apps_3.30.0.bb 
# ...
# i.MX8の場合のみhailo8に切り替える箇所を変更
python () {
#    if 'imx8' in d.getVar('MACHINE'):
        d.setVar('REQS_FILE', d.getVar('REQS_IMX8_FILE'))
        d.setVar('ARM_APPS_DIR', d.getVar('IMX8_DIR'))
#    else:
#        d.setVar('REQS_FILE', d.getVar('REQS_HAILO15_FILE'))
#        d.setVar('ARM_APPS_DIR', d.getVar('HAILO15_DIR'))
#        d.appendVar('DEPENDS', " libmedialib-api xtensor")
}
# ...
```

## 設定ファイルを更新してビルドする

### bitbake-layersでレイヤーを統合する

ここまでの手順で収集した **「meta-*」の各LayerをYoctoのビルド対象に追加** します。bitbake-layersコマンドで各ディレクトリを指定することにより「./conf/bblayers.conf」が更新されます。`bitbake-layers add-layer`を実行後「./conf/bblayers.conf」ファイルにLayerが追加されていることを確認できます。

```bash
####
# ビルドディレクトリと設定ファイルの生成
####
$ cd ~/yocto-work-2024_v1/poky
$ pwd
# /home/shino/yocto-work-2024_v1/poky
$ source oe-init-build-env aiot-build

# 直前のコマンドにより作業ディレクトリがビルド用に切り替わる
$ pwd
# /home/shino/yocto-work-2024_v1/poky/aiot-build

$ ls conf/
# bblayers.conf  
# local.conf  
# templateconf.cfg

####
# Layerを追加する
####
# ビルド対象にRaspberry Pi 5 GUI向けのレイヤーを追加する
$ bitbake-layers add-layer ../meta-raspberrypi/
$ bitbake-layers add-layer ../meta-openembedded/meta-oe/
$ bitbake-layers add-layer ../meta-openembedded/meta-python/
$ bitbake-layers add-layer ../meta-openembedded/meta-multimedia/
$ bitbake-layers add-layer ../meta-openembedded/meta-networking/

# Docker向けのLayer
$ bitbake-layers add-layer ../meta-openembedded/meta-filesystems/
$ bitbake-layers add-layer ../meta-virtualization/

# Tensorflow向けのLayer
$ bitbake-layers add-layer ../meta-tensorflow/
$ bitbake-layers add-layer ../meta-tensorflow-lite/

# Raspberry Pi 5 AI Kit向けのLayer
$ bitbake-layers add-layer ../meta-hailo/meta-hailo-accelerator/
$ bitbake-layers add-layer ../meta-hailo/meta-hailo-libhailort/
$ bitbake-layers add-layer ../meta-hailo/meta-hailo-tappas/
### 今回のビルドには含めない
# $ bitbake-layers add-layer ../meta-hailo/meta-hailo-vpu/


####
# Layerを確認する
####
$ grep /home/shino ./conf/bblayers.conf 
#   /home/shino/yocto-work-2024_v1/poky/meta \
#   /home/shino/yocto-work-2024_v1/poky/meta-poky \
#   /home/shino/yocto-work-2024_v1/poky/meta-yocto-bsp \
#   /home/shino/yocto-work-2024_v1/poky/meta-raspberrypi \
#   /home/shino/yocto-work-2024_v1/poky/meta-openembedded/meta-oe \
#   /home/shino/yocto-work-2024_v1/poky/meta-openembedded/meta-python \
#   /home/shino/yocto-work-2024_v1/poky/meta-openembedded/meta-multimedia \
#   /home/shino/yocto-work-2024_v1/poky/meta-openembedded/meta-networking \
#   /home/shino/yocto-work-2024_v1/poky/meta-openembedded/meta-filesystems \
#   /home/shino/yocto-work-2024_v1/poky/meta-virtualization \
#   /home/shino/yocto-work-2024_v1/poky/meta-tensorflow \
#   /home/shino/yocto-work-2024_v1/poky/meta-tensorflow-lite \
#   /home/shino/yocto-work-2024_v1/poky/meta-hailo/meta-hailo-accelerator \
#   /home/shino/yocto-work-2024_v1/poky/meta-hailo/meta-hailo-libhailort \
#   /home/shino/yocto-work-2024_v1/poky/meta-hailo/meta-hailo-tappas \
```

### conf/local.confでビルド対象を指定する

各機能のリポジトリのREADMEや各種記事を参考に、 **Linuxディストリビューションに組み込みたいアプリケーション名や、それらのオプションを「./conf/local.conf」に指定** します。

https://qiita.com/byuu/items/95086d07e317dfe64ee2

```bash
BB_NUMBER_THREADS = "8"
PARALLEL_MAKE = "-j 8"
```

https://community.nxp.com/t5/i-MX-Processors/imx8mm-mini-adding-python-opencv-to-yocto/m-p/1233965?profile.language=ja

```bash
IMAGE_INSTALL:append = " python3 python3-numpy python3-opencv opencv"
```

https://stackoverflow.com/questions/32964257/building-gstreamer-using-yocto

https://community.nxp.com/t5/i-MX-Processors/how-to-compile-gstreamer-in-yocto/m-p/856407?profile.language=ja

https://community.nxp.com/t5/i-MX-Processors/i-MX8MP-EVK-v4l2-ctl-v4l-utils-missing/m-p/1476820#M191684

```bash
IMAGE_INSTALL:append = " v4l-utils"
```

https://mickey-happygolucky.hatenablog.com/entry/2023/02/23/070542

https://yoctobbq.lineo.co.jp/?q=node/130

```bash
DISTRO_FEATURES:append = " systemd pam"
VIRTUAL-RUNTIME_init_manager = "systemd"
DISTRO_FEATURES_BACKFILL_CONSIDERED = "sysvinit"
VIRTUAL-RUNTIME_initscripts = "systemd-compat-units"
IMAGE_INSTALL:append = " packagegroup-docker"
```

https://qiita.com/naohikowatanabe/items/fb7abb2db601013b8e7a

```bash
UBOOT_EXTRA_CONFIGS = "LPDDR4_8GB"
DISTRO_FEATURES_append = " wayland opengl" 
DISTRO_FEATURES_remove = " x11" 
MACHINE_FEATURES += "vc4graphics" 
```

https://www.digi.com/support/knowledge-base/how-to-add-curl-to-an-embedded-connectcore-som

```bash
IMAGE_INSTALL:append = " curl"
```

https://zenn.dev/nbo/articles/6c4493f6124f8f

```bash
FORTRAN:forcevariable = ",fortran"
# MACHINE ?= "raspberrypi4-64"
IMAGE_INSTALL:append = " python3-tensorflow-lite libtensorflow-lite"
LICENSE_FLAGS_ACCEPTED = "synaptics-killswitch"
```

https://lists.yoctoproject.org/g/yocto/message/57468

```bash
FORTRAN:forcevariable = ",fortran"
```


https://www.macnica.co.jp/en/business/semiconductor/articles/hailo/145447/

```bash
IMAGE_INSTALL:append = " hailo-firmware hailortcli hailo-pci libgsthailo libgsthailotools tappas-apps hailo-post-processes tappas-tracers"
```

----

**以上をまとめると「./conf/local.conf」は以下のようになります。** `IMAGE_INSTALL:append = " tensorflow"` と `IMAGE_INSTALL:append = " python3-tensorflow-lite libtensorflow-lite"` は `bitbake core-image-weston -c populate_sdk` 実行時に競合するため、いずれかを指定してください。


```bash
$ vi ./conf/local.conf

# ...
BB_NUMBER_THREADS = "8"
PARALLEL_MAKE = "-j 8"
# ...

# ...
# MACHINEにはRaspberry Pi 5を指定する
MACHINE ??= "raspberrypi5"
####
# 以下の設定を追記する
####
UBOOT_EXTRA_CONFIGS = "LPDDR4_8GB"
# ...

# ...
DISTRO ?= "poky"
# ...

# ...
####
# 以下の設定を追記する
####
DISTRO_FEATURES:append = " wayland opengl"
DISTRO_FEATURES:remove = " x11"
DISTRO_FEATURES:append = " virtualization"
MACHINE_FEATURES += "vc4graphics"

# option for systemd
DISTRO_FEATURES:append = " systemd pam"
VIRTUAL-RUNTIME_init_manager = "systemd"
DISTRO_FEATURES_BACKFILL_CONSIDERED = "sysvinit"
VIRTUAL-RUNTIME_initscripts = "systemd-compat-units"

IMAGE_INSTALL:append = " hailo-firmware hailortcli hailo-pci libgsthailo libgsthailotools tappas-apps hailo-post-processes tappas-tracers"
IMAGE_INSTALL:append = " python3 python3-numpy python3-opencv opencv"
IMAGE_INSTALL:append = " packagegroup-docker"

######
### いずれか一方のみコメントアウトを外す(競合対策)
######
# IMAGE_INSTALL:append = " tensorflow"
# IMAGE_INSTALL:append = " python3-tensorflow-lite libtensorflow-lite"

IMAGE_INSTALL:append = " curl"
IMAGE_INSTALL:append = " v4l-utils"

# build option
FORTRAN:forcevariable = ",fortran"
LICENSE_FLAGS_ACCEPTED = "synaptics-killswitch"

# ...

####
# 変更を加えて保存する
####
```

 <font color="red">**上記の設定ファイルでは両方組み込んでいますが、「meta-tensorflow」の軽量版(推論専用版)が「meta-tensorflow-lite」であり、SDKを生成しようとするとコンフリクトが発生します(`bitbake core-image-weston -c populate_sdk`時に下記のエラーが発生する)。必ずどちらか片方をコメントアウトしてください。**</font>


```bash
# Running transaction test
# Error: Transaction test error:
#   file /usr/include/flatbuffers/base.h conflicts between attempted installs of libtensorflow-lite-dev-2.8.4-r0.cortexa76 and libflatbuffers-dev-2.0.0-r0.cortexa76
#   file /usr/include/flatbuffers/code_generators.h conflicts between attempted installs of libtensorflow-lite-dev-2.8.4-r0.cortexa76 and libflatbuffers-dev-2.0.0-r0.cortexa76
#   file /usr/include/flatbuffers/flatbuffers.h conflicts between attempted installs of libtensorflow-lite-dev-2.8.4-r0.cortexa76 and libflatbuffers-dev-2.0.0-r0.cortexa76
#   file /usr/include/flatbuffers/flexbuffers.h conflicts between attempted installs of libtensorflow-lite-dev-2.8.4-r0.cortexa76 and libflatbuffers-dev-2.0.0-r0.cortexa76
#   file /usr/include/flatbuffers/grpc.h conflicts between attempted installs of libtensorflow-lite-dev-2.8.4-r0.cortexa76 and libflatbuffers-dev-2.0.0-r0.cortexa76
#   file /usr/include/flatbuffers/idl.h conflicts between attempted installs of libtensorflow-lite-dev-2.8.4-r0.cortexa76 and libflatbuffers-dev-2.0.0-r0.cortexa76
#   file /usr/include/flatbuffers/minireflect.h conflicts between attempted installs of libtensorflow-lite-dev-2.8.4-r0.cortexa76 and libflatbuffers-dev-2.0.0-r0.cortexa76
#   file /usr/include/flatbuffers/reflection.h conflicts between attempted installs of libtensorflow-lite-dev-2.8.4-r0.cortexa76 and libflatbuffers-dev-2.0.0-r0.cortexa76
#   file /usr/include/flatbuffers/reflection_generated.h conflicts between attempted installs of libtensorflow-lite-dev-2.8.4-r0.cortexa76 and libflatbuffers-dev-2.0.0-r0.cortexa76
#   file /usr/include/flatbuffers/stl_emulation.h conflicts between attempted installs of libtensorflow-lite-dev-2.8.4-r0.cortexa76 and libflatbuffers-dev-2.0.0-r0.cortexa76
#   file /usr/include/flatbuffers/util.h conflicts between attempted installs of libtensorflow-lite-dev-2.8.4-r0.cortexa76 and libflatbuffers-dev-2.0.0-r0.cortexa76
# 
# 
# ERROR: Logfile of failure stored in: /home/shino/yocto-work-2024_v1/poky/aiot-build/tmp/work/raspberrypi5-poky-linux/core-image-weston/1.0-r0/temp/log.do_populate_sdk.2975
# ERROR: Task (/home/shino/yocto-work-2024_v1/poky/meta/recipes-graphics/images/core-image-weston.bb:do_populate_sdk) failed with exit code '1'

```

----

### bitbakeでLinuxディストリビューションをビルドする

**「bitbake」コマンドにGUI付きビルドである「core-image-weston」を指定して、GUI付きのLinuxディストリビューションをビルド**します。6500パッケージ程度のビルドが実行されます。しばらくお待ちください。 **また、`bitbake`に`-c populate_sdk`をつけてビルドすることにより構築したLinuxディストリビューションにあわせたアプリケーション開発用SDKを生成することができます。** こちらも必要に応じて、ビルドしてください。

```bash
######
### Linuxディストリビューションをビルドする
$ bitbake core-image-weston
# ...
# NOTE: Executing Tasks
# WARNING: spf13-cobra-v0.0.1+gitAUTOINC+b5d8e8f46a-r0 do_fetch: Failed to fetch URL git://github.com/spf13/cobra.git;destsuffix=git/src/github.com/spf13/cobra;branch=master;protocol=https, attempting MIRRORS if available
# NOTE: Tasks Summary: Attempted 7461 tasks of which 0 didn't need to be rerun and all succeeded.
# Summary: There was 1 WARNING message.

######
### Linuxディストリビューション向けのアプリケーションビルド環境を生成する
# -->> 注意：tensorflow と python3-tensorflow-lite が競合します（前述）
# -->>> conf/local.conf には必ずどちらかのみを指定してください
$ bitbake core-image-weston -c populate_sdk
# ...
# NOTE: Executing Tasks
# NOTE: Tasks Summary: Attempted 6933 tasks of which 6932 didn't need to be rerun and all succeeded.

$
```

![Screenshot from 2024-12-27 12-44-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/ab1b214f-c76f-eb20-5bc9-d7d98fef586d.png)


## ビルド成果物をmicro-SDカードへ書き込む

ビルドの成果物をRaspberry Pi 5の起動用micro-SDカードへ書き込みます。書き込むファイルはパーティション情報を含む"*.wic.bz2"イメージです。本手順は過去記事で紹介した内容の通りです。

https://qiita.com/xtrizeShino/items/fcfd4491c09570a51cad

```bash
####
# 生成されたイメージを確認する
# ※これをRaspberry Pi 5のmicro-SDカードへ書き込む
$ pwd
# /home/shino/yocto-work-2024_v1/poky/aiot-build
$ cd ./tmp/deploy/images/raspberrypi5
# ...
$ pwd
# /home/shino/yocto-work-2024_v1/poky/aiot-build/tmp/deploy/images/raspberrypi5

# wic.bz2のイメージが生成されています
$ ls *.wic.bz2
# core-image-weston-raspberrypi5-20241226234016.rootfs.wic.bz2
# core-image-weston-raspberrypi5.wic.bz2

# micro-SDカードをumountする
$ sudo umount /dev/sdX1
$ sudo umount /dev/sdX2

# イメージをmicro-SDカードへ書き込む
$ sudo bmaptool copy ./core-image-weston-raspberrypi5-20241226234016.rootfs.wic.bz2 /dev/sdX
# bmaptool: info: discovered bmap file './core-image-weston-raspberrypi5-20241227134229.rootfs.wic.bmap'
# bmaptool: info: block map format version 2.0
# bmaptool: info: 862106 blocks of size 4096 (3.3 GiB), mapped 507667 blocks (1.9 GiB or 58.9%)
# bmaptool: info: copying image 'core-image-weston-raspberrypi5-20241227134229.rootfs.wic.bz2' to block device '/dev/sda' using bmap file 'core-image-weston-raspberrypi5-20241227134229.rootfs.wic.bmap'
# bmaptool: info: 100% copied
# bmaptool: info: synchronizing '/dev/sda'
# bmaptool: info: copying time: 3m 47.2s, copying speed 8.7 MiB/sec


####
# micro-SDカードをRaspberry Pi 5に差し込んで起動する
####
```

# 動作確認

先の手順で作成した起動用micro-SDカードをRaspberry Pi 5に挿入し、電源を投入すると、GUIが表示されます。早速、画面左上からターミナルを開き、インストールした各種機能が動作するか確認してみましょう

### Networking

`ifconfig` コマンドでDHCPにより `eth0` にIPアドレスが割りあてられたことを確認できました、疎通確認は次のDocker項目で確認しています... <font color="blue">**(OK)**</font>

![WIN_20241228_09_37_32_Pro.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/be583fb1-d6e5-3dda-b98c-79997d26a78e.jpeg)


#### 参考：固定IPやWiFiを利用する場合の参考記事

https://www.gumstix.com/community/support/faq/yocto-wifi/

https://qiita.com/routerman/items/4d19b3084fa58723830c

https://qiita.com/tukiyo3/items/ffd286684a1c954396af

https://mickey-happygolucky.hatenablog.com/entry/2023/02/23/070542

https://mickey-happygolucky.hatenablog.com/entry/2016/03/22/233507



### Docker

Networkを介して"hello-world"のdockerイメージを取得し、実行できることを確認しました。特権が必要なため`su`をしてから実行します... <font color="blue">**(OK)**</font>

```bash
###
# ひとつのターミナルでdockerdを実行
$ dockerd

###
# 別のターミナルでdockerコマンドを使用してイメージを実行する

# 特権が必要
$ su

# hello-worldイメージを実行する
$ docker run hello-world
# Unable to find unafe 'hello-world:latest' locally
# latest: Pulling from library/hello-world
# ...
# Status: Downloaded newer image for hello-world:latest
#
# Hello from Docker!
# This message shows that your installation appears to be working correctly
# ...
```

![WIN_20241228_09_38_12_Pro.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/97cfd18a-7300-e271-1a18-d6d8b976da12.jpeg)


### v4l2-ctl / Python3 / OpenCV

下記のコマンドでインストールされていることを確認できます... <font color="blue">**(OK)**</font>

```bash
### on Raspberry Pi 5 + Yocto
# WEBカメラを接続した状態で下記コマンドを実行
$ v4l2-ctl --list-devices
# ...
# HD Webcam eMeet C960: HD Webcam (usb-xhci-hcd.1-1):
#     /dev/video0
#     /dev/video1
#     /dev/media3
# ...
$ python3
>>> import cv2
>>> cap = cv2.VideoCapture(0)
>>> ret, frame = cap.read()
### gtk周りの影響でimshowは機能しないようです...
>>> cv2.imshow('camera', frame)
```

#### opencvのimshowでエラーが発生する

「meta-openembedded」に含まれているopencvはimshowなどをする際に利用するGTKの設定がOFFとなっているようです。Webカメラの接続確認などにimshow等を使いたいので...このあたりは追って調査したいと思います...  <font color="red">**(NG)**</font>

https://yoctobbq.lineo.co.jp/?q=node/349

https://mickey-happygolucky.hatenablog.com/entry/2022/06/08/032232


`cv2.imshow()` を実行すると下記のエラーメッセージが出力されます。

```bash
$ python3
>>> import cv2
...
>>> cv2.imshow('camera', frame)
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# cv2.error: OpenCV(4.5.5) /usr/src/debug/opencv/4.5.5-r0/git/modules/highgui/src/window.cpp:1268:error:(-2:Unspecified error) The function is not implemented.
# Rebuild the library with windows, GTK+ 2.x or Cocoa support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function 'cvShowImage'
```

![WIN_20241227_23_01_29_Pro.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/6026c588-590e-19fe-37ab-b1191767d829.jpeg)


### Tensorflow / Tensorflow Lite

こちらは素直に動作しました。Tensorflowはビルドだけで8時間ぐらいかかりました、エッジAIなので特別な事情が無ければ推論だけ可能なTensorflow Liteのみインストールした方が良いと思います... <font color="blue">**(OK)**</font>

https://qiita.com/Yokogawa_Ishino/items/a389115da059756e6e4d

```bash
$ python3
>>> import tensorflow as tf
>>> import tflite-runtime as tflite
### エラーが発生しないことを確認
```

![WIN_20241228_02_21_01_Pro.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/e4a71ef0-df10-fe55-a8b4-f67b2e3fa266.jpeg)

### Hailo (Raspberry Pi 5 AI Kit)

`hailortcli fw-control identify` でHailo-8を認識できることを確認できました... <font color="blue">**(OK)**</font>

```bash
$ lspci
# ...
# 0000:01:00.0 Co-processor: Hailo Technologies Ltd. Hailo-8 AI Processor (rev 01)
# ...

$ hailortcli fw-control identify
# Executing on device: 0000:01:00.0
# Identifying board
# Control Protocol Version: 2
# Firmware Version: 4.19.0 
# ...
# Product Name: HAILO-8L AI ACC M.2 B+M KEY MODULE EXT TMP
```

![WIN_20241228_03_22_15_Pro.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/17793b83-d043-93d6-9563-9af84ccb5d10.jpeg)

----

以上のように、**組み込みAI開発に必要なコンポーネントをyoctoで利用できることを確認できました。割と素直に稼働しました** ので(Tensorflowの初回ビルド時間が超長時間なことは結構ネックですが...)、実運用にも耐えられるように思えます。参考に各サイトのリンクも埋め込んでいますので、本記事とあわせて是非ご活用ください！

お付き合い、ありがとうございました！