IoT・電子工作

Raspberry Pi × PythonでAIカメラを自作!画像認識IoTデバイス構築ガイド

「AIカメラって、なんだかプロ向けの難しい話でしょ…」そんな印象を持っていませんか?

実は、Raspberry PiPythonがあれば、自宅でも本格的な画像認識デバイスを作ることができるんですよね。カメラモジュールをつなげて、AIが「これは猫だ」「これはペットボトルだ」と認識してくれる――そんなワクワクするIoTデバイスを、今回は一緒に作っていきましょう! 🎉

このガイドで作るもの・対象読者

Raspberry Pi camera AI
Raspberry Pi camera AI / Photo by ThisIsEngineering via Pexels

今回作るのは、カメラ映像をリアルタイムで解析して物体を識別するAIカメラデバイスです。

対象読者はこんな方です:

  • ✅ Pythonの基本文法を知っている(初〜中級者)
  • ✅ Raspberry Piに触れたことがある、または興味がある
  • ✅ 電子工作 × AIの組み合わせに挑戦したい

完全なゼロスタートでも、ざっくりとした流れがつかめるはずです。一歩ずつ進めていきましょう!

必要なもの(材料リスト)

まず、ハードウェア・ソフトウェアの準備から確認しておきましょう。

ハードウェア

  • Raspberry Pi 4(または3B+)
  • Raspberry Pi Camera Module(またはUSBカメラ)
  • microSDカード(16GB以上推奨)
  • 電源アダプター

ソフトウェア・ライブラリ

  • Raspberry Pi OS(最新版)
  • Python 3.8以上
  • OpenCV(画像処理ライブラリ)
  • TensorFlow Lite(軽量AIモデル実行エンジン)

イメージとしては、「Raspberry Piが脳みそ、カメラが目、TensorFlow LiteがAIの知識」という感じです。それぞれがうまく連携することで、モノを見て判断できるデバイスになります。

STEP 1:環境セットアップ

まずは必要なライブラリをインストールします。ターミナルで以下を実行してください。

# システムの更新
sudo apt update && sudo apt upgrade -y

# OpenCVのインストール
pip install opencv-python

# TensorFlow Liteのインストール(Raspberry Pi向け軽量版)
pip install tflite-runtime

# その他必要なライブラリ
pip install numpy Pillow

インストールが完了したら、Pythonを起動して import cv2 がエラーなく通るか確認をしておきましょう。ここで詰まると後の工程に影響するので、焦らず確認が大事です 🔍

STEP 2:カメラ映像を取得してみよう

環境が整ったら、まずカメラ映像を取得する基本コードを書いてみましょう。

import cv2

# カメラを初期化(引数0はデフォルトカメラ)
cap = cv2.VideoCapture(0)

if not cap.isOpened():
    print("カメラが見つかりません。接続を確認してください。")
    exit()

print("カメラ起動成功!'q'キーで終了します")

while True:
    # フレームを1枚取得
    ret, frame = cap.read()

    if not ret:
        print("フレームの取得に失敗しました")
        break

    # 画面にフレームを表示
    cv2.imshow("AI Camera Preview", frame)

    # 'q'キーが押されたら終了
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# リソースを解放
cap.release()
cv2.destroyAllWindows()

ポイントをまとめるとこんな感じです:

  • VideoCapture(0):デバイス番号0のカメラを開く(USBカメラが複数あるなら1や2も試してみて)
  • cap.read():フレームを1枚取得。retTrueなら成功
  • cv2.imshow():ウィンドウに映像を表示する関数

これを実行すると、カメラ映像がリアルタイムで表示されるはずです。「動いた!」という感動、ぜひ味わってみてください 😄

STEP 3:TensorFlow Liteで画像認識を実装する

いよいよメインの画像認識部分です。ここではMobileNetという軽量AIモデルを使います。

つまり、「難しい計算はAIモデルに任せて、Pythonコードはカメラとの橋渡し役に徹する」というイメージです。

まずモデルファイルを取得します(TensorFlow公式が配布している軽量モデルを使用)。

import cv2
import numpy as np
from tflite_runtime.interpreter import Interpreter

# --- 設定 ---
MODEL_PATH = "mobilenet_v1_1.0_224_quant.tflite"  # モデルファイルのパス
LABEL_PATH = "labels.txt"                          # ラベルファイルのパス
THRESHOLD  = 0.6                                    # 認識の信頼度しきい値(60%以上で表示)

# ラベルファイルを読み込む
with open(LABEL_PATH, "r") as f:
    labels = [line.strip() for line in f.readlines()]

# TFLiteモデルを読み込んでセットアップ
interpreter = Interpreter(model_path=MODEL_PATH)
interpreter.allocate_tensors()

# 入出力の情報を取得
input_details  = interpreter.get_input_details()
output_details = interpreter.get_output_details()

# モデルが期待する入力サイズ(MobileNetは224×224)
input_h = input_details[0]['shape'][1]
input_w = input_details[0]['shape'][2]

def classify_image(frame):
    """フレームを受け取り、認識結果のラベルとスコアを返す"""
    # モデル入力サイズにリサイズ
    resized = cv2.resize(frame, (input_w, input_h))
    # RGBに変換(OpenCVはBGRで取得するため)
    rgb_frame = cv2.cvtColor(resized, cv2.COLOR_BGR2RGB)
    # バッチ次元を追加してuint8型に変換
    input_data = np.expand_dims(rgb_frame, axis=0).astype(np.uint8)

    # AIモデルに入力して推論実行
    interpreter.set_tensor(input_details[0]['index'], input_data)
    interpreter.invoke()

    # 推論結果(確率)を取得
    output_data = interpreter.get_tensor(output_details[0]['index'])[0]
    # スコアが最大のインデックスを取得
    top_index = np.argmax(output_data)
    score     = output_data[top_index] / 255.0  # 0〜1に正規化

    return labels[top_index], score

# --- メインループ ---
cap = cv2.VideoCapture(0)
print("AIカメラ起動中... 'q'キーで終了")

while True:
    ret, frame = cap.read()
    if not ret:
        break

    # 画像認識を実行
    label, score = classify_image(frame)

    # しきい値を超えた場合のみ画面に表示
    if score >= THRESHOLD:
        text = f"{label}: {score:.1%}"
        # 結果をフレームに描画(緑色テキスト)
        cv2.putText(frame, text, (10, 40),
                    cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 255, 0), 2)

    cv2.imshow("AI Camera", frame)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

ここが重要です!ポイントを整理しましょう:

  • 🔵 前処理が大事:OpenCVはBGRで画像を取得するので、cvtColorでRGBに変換する必要があります
  • 🔵 しきい値(THRESHOLD):低すぎると誤認識が増え、高すぎると何も表示されなくなります。0.5〜0.7あたりが使いやすいです
  • 🔵 normalize処理:量子化モデルの出力は0〜255なので、255で割って確率に変換しています

これを実行してカメラの前にスマホやコップを置いてみてください。AIがリアルタイムで「何か」を当てようとしている様子、なかなか面白いですよ 😆

STEP 4:認識結果をLEDで通知する(IoT連携)


せっかくRaspberry Piを使っているので、GPIO(汎用入出力ピン)を活用してLEDと連動させてみましょう。特定のものを認識したらLEDが光る、というIoTらしい動きを追加します。

import RPi.GPIO as GPIO

# GPIOの設定
LED_PIN = 17  # 使用するGPIOピン番号
GPIO.setmode(GPIO.BCM)
GPIO.setup(LED_PIN, GPIO.OUT)

def notify_led(detected: bool):
    """検出されたらLEDをON、そうでなければOFF"""
    GPIO.output(LED_PIN, GPIO.HIGH if detected else GPIO.LOW)

# メインループ内でこう使う:
# label, score = classify_image(frame)
# target_detected = ("cat" in label.lower() and score >= THRESHOLD)
# notify_led(target_detected)

# 終了時はGPIOをクリーンアップ
# GPIO.cleanup()

たとえば「cat(猫)」を認識したらLEDが光る、という仕掛けを作ることができます。これ、ペットカメラとして使っても面白いですよね 🐱

まとめ


今回はRaspberry Pi × Python × TensorFlow Liteを組み合わせて、AIカメラデバイスを構築する方法を解説しました。

やったことをおさらいするとこんな感じです:

  • ✅ OpenCV・TensorFlow Liteの環境セットアップ
  • ✅ カメラ映像のリアルタイム取得
  • ✅ MobileNetモデルによる画像認識の実装
  • ✅ GPIOを使ったLED通知でIoTらしさをプラス

「AIカメラなんて難しそう」が「意外とできそう!」に変わっていたら嬉しいです 😊

次のステップとしては、認識した結果をデータベースに記録したり、LINEに通知を送ったりと、活用の幅がぐっと広がります。ぜひ自分なりにカスタマイズして試してみてください!一緒に楽しいIoTデバイスを作っていきましょう 🚀

📡 Arduinoをもっと深く学ぼう!

Arduino・ラズパイ・ロボットプログラミングを体系的に学びたい方へ。おすすめのUdemyコースや電子部品もまとめています。

Arduinoロボット入門のおすすめコース・部品を見る →

📚 関連商品・おすすめ書籍

スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ)

もしも

スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ)

初心者に定番のPython入門書

Amazonで見る

Arduinoをはじめよう 第4版 (Make: PROJECTS)

もしも

Arduinoをはじめよう 第4版 (Make: PROJECTS)

Arduino公式推薦の定番入門書

Amazonで見る

徹底攻略! 電子工作&プログラミング Arduinoで学ぶ電子工作完全ガイド

もしも

徹底攻略! 電子工作&プログラミング Arduinoで学ぶ電子工作完全ガイド

電子工作とプログラミングを同時に学べる

Amazonで見る

※本記事にはアフィリエイトリンクが含まれます。

ABOUT ME
やまちゃん
これまで学生と社会人を合わせて5000人以上にプログラミング学習を指導。 ゼロからイチをわかりやすく解説する専門家として活動しており、本業ではArduinoを用いたIoT開発とロボットプログラミングが専門。 Pythonを用いたアプリ開発、ウェブアプリケーションの開発で業務の効率化をサポートしています。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です