【Raspberry Piで手軽にAI実装】OpenCV、TensorFlowを試してみる

opencv-title Raspberry Pi

今回はRaspberry Piのカメラモジュールを用いて撮影した画像から人間を抽出すること(+α)をゴールに、AI開発ライブラリを試してみました。

近年のAIトレンドとは逆行する一昔前の技術ばかりですが、最新の生成系AI技術を学ぶ知識土台として、画像系AIをRaspberry Piに実装しています。どうぞご参考になさってください。

Raspberry Piの特徴

2025年のAI開発環境といえば、Google Colaboratory、Anacondaなど、手軽に無料で試せるものが豊富に用意されています。

とはいえ、インターネット接続が必須であったり(Google Colaboratory)、商用利用時に課金が必要(Anaconda)など、エッジAIデバイスとしてRaspberry Piに実装するには不向きなものも多いです。

エッジAIとは – IoT市場で注目されるコンピューティングより

今回はRaspberry Piのカメラモジュールを用いて撮影した画像から人間を抽出する(+α)をゴールとして、AI開発ライブラリのTensorFlowを実装してみることにしました。

事前準備

必要なもの

  • Raspberry Pi Zero 2 W(Raspberry Pi OS Lite 64bit)
  • Mini HDMIケーブル変換コネクタ
  • USB MicroB – USB-A変換コネクタ
  • カメラモジュール
created by Rinker
¥3,360 (2025/03/16 23:09:54時点 Amazon調べ-詳細)

まっさらなRaspberry Pi Zeroを用いたので、まずはパッケージを最新に更新しておきます。

sudo apt update
sudo apt upgrade

私のケースではpipがインストールされていなかったので、pipも入れておきます。そのうえでOpenCVをインストールします。

sudo apt install pip
sudo pip install opencv-python --break-system-packages

–break-system-packagesに関しては、以下の記事に従って記載しました。

Raspberry Pi OSでのerror: externally-managed-environmentの対処方法

カメラの有効化

Raspberry Pi Zero 2 WにはRaspberry Pi OS Lite(64bit)をインストールしましたが、このままではカメラが使えない状態でした。以前はraspi-configから有効化をするだけでOKだったところが、どうやらOSの変更によってconfig.txtを書き換えないとダメな模様です。

cd /boot/firmware
sudo vi config.txt

私はAmazonで一番安いカメラモジュール(OV5647)ユーザなので、書き換えるのは以下の二カ所になります。

Viのセンスが全く無いので、備忘としてコマンド参考集も残しておきます。(いつも思ったように書き換えられず失敗します。。。)

Vi コマンド一覧 - Qiita
備忘録です。現場にVimmerがいたのでまとめました。よくあるものなので何番煎じかわかりません...コマンドの一覧

それでもなお、no cameras availableでカメラが認識されない時は、フレキシブルケーブルの表裏間違いがないか等もチェックしてください。

OpenCV(機械学習)

このままOpenCVをインポートしても、Import error: libGL.so.1 cannot open….でエラーとなってしまうため、追加のライブラリをインストールします。

sudo apt install libgl1-mesa-dev

python実行後に、import cv2と入力して、エラーが返ってこなければ準備OKです。

Hello World 画像を出力する練習

以下の方の記事を参考に、hello.pyを作成してみました。出力された画像をCUIのRaspberry Piで表示させるには、fbiコマンドを利用します。

sudo apt install fbi
sudo fbi -T 7 -d /dev/fb0 -a  /home/hogehoge/hogehoge.png 
opencv-python 4.2 で Hello World と顔検出 - Qiita
概要OpenCV 非公式の opencv-python パッケージを pip でインストールするHello World 画像を出力するサンプルコードを書いて実行する画像から顔の位置を検出するサ…

橙色でHello Worldと描かれた画像が表示されれば、練習完了です。

画像から顔の位置を検出

先ほどの続きでfacedetect.pyを用意してみます。fbiコマンドで顔に丸印が付いた画像を確認できれば、OpenCVを用いた画像からの特徴検出はクリアです。

python facedetect.py hoehoge.jpg hogehoge-output.jpg
sudo fbi -T 7 -d /dev/fb0 -a  /home/hogehoge/hogehoge.png 

カメラで撮影した画像をOpenCVで機械学習

OpenCVのライブラリにはcv2.VideoCapture(0)という接続(内蔵)カメラから画像や動画を取得する手法があるのですが、どうやらlibcameraには対応しておらず、picamera2を使う必要があるようです。

OpenCVからラズパイの公式カメラを使おうとしたら、思ったより大変だった

また、picamera2はnumpy2.0に対応していないようなので、合わせてnumpyをダウングレードする必要がありました。

sudo apt install python3-picamera2
sudo pip uninstall numpy
sudo pip install numpy==1.26.0

pythonのコードに関しては、先のniwasawa様のものをベースに以下参考として残します。

import sys
import numpy
import cv2
from picamera2 import Picamera2

# フル解像度で画像を取得
picam2 = Picamera2()
capture_config = picam2.create_still_configuration()
picam2.configure(capture_config)
picam2.start()
picam2.capture_file("test.jpg")
picam2.stop()

# アルファチャンネル付きに対応するため IMREAD_UNCHANGED を使う
input_image = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED)

# 顔検出用のカスケード分類器を使用
face_cascade_name = cv2.data.haarcascades + "haarcascade_frontalface_default.xml"
face_cascade = cv2.CascadeClassifier(face_cascade_name)

# 顔を検出
faces = face_cascade.detectMultiScale(input_image)

# 入力画像データを出力画像データにコピー
output_image = numpy.copy(input_image)

for (x, y, w, h) in faces:

  # 検出した顔の座標を出力
  print("Face: [{} x {} from ({}, {})]".format(w, h, x, y))

  # 顔の位置に楕円を描画
  center = (x + w // 2, y + h // 2)
  size = (w // 2, h // 2)
  angle = 0
  startAngle = 0
  endAngle = 360
  color = (127, 0, 255, 255) # Blue, Green, Red, Alpha
  thickness = 4
  cv2.ellipse(output_image, center, size, angle, startAngle, endAngle, color, thickness)

# 画像を出力
cv2.imwrite("test-output.jpg", output_image)

Tensorflowで数値予測

最後にTensorflowを用いた深層学習STEPになります。まずはRaspberry Pi ZeroにTensorflowをインストールします。なかなか重いため、Zero2でもインストール処理に10~15分ほどかかります。

sudo pip install tensorflow --break-system-packages

ここで、tensorflowのサンプルコードを実行すると、partially initialized module ‘tensorflow’ has no attribute ‘keras’というエラーで引っかかることがあります。

Kerasの公式ページに記載の互換性の通り、tensorflow(2.18.0)とkeras(3.8.0)のバージョンを合わせることで、数値予測サンプルコードはクリアできるはずです。(かなりの処理時間を要しますが、、、)

Keras documentation: Getting started with Keras
Keras documentation
TensorFlow の概念と python 実装例

Tensorflowを用いた画像解析については、別記事で投稿するかもしれないです。

コメント