Raspberry Pi(ラズパイ)で監視カメラや防犯カメラを自作するなら、Raspberry Pi AI Camera(Sony IMX500)をつなぎ、カメラ側で人を検知したときだけ録画する構成が組みやすい選択肢です。物体検出の推論はカメラ内のセンサーが行うので、ラズパイ本体は録画と配信に専念できます。
この記事では、カメラの選び方から、人検知で録画するPythonコード、起動時の自動実行と古い録画の削除、スマホで見るネットワークカメラ化、屋外設置と個人情報保護法の注意点までを、Raspberry Pi公式ドキュメントと各ソフトのソースに沿って説明します。
まとめ:ラズパイ監視カメラの構成と手順の要点
- AIをどこで動かすか:人や車の検知だけならAI Camera(推論はセンサー上・70ドル)。複数カメラや重いモデルを回すならRaspberry Pi 5+AI HAT+。動きの検知だけならAIは不要で、通常のカメラモジュールで足ります。
- カメラ:室内はCamera Module 3、部屋全体を写すならWide(水平102度)、夜間は赤外線照明と組み合わせるNoIR版。AI CameraにNoIR版はありません。
- 接続と認識:本体側はPi 5とカメラ端子付きZeroシリーズが22ピン、Pi 4など標準コネクタ搭載機が15ピンです。認識は
rpicam-hello --list-camerasで確かめます。現行のRaspberry Pi OSにraspi-configの「カメラを有効化」はありません。 - 録画:Picamera2の
CircularOutput2で検知の数秒前から遡ってMP4に保存し、systemdで起動時に自動実行、古い録画はfindで定期削除します。 - 見る:MediaMTXでRTSP・WebRTC配信。外出先からはルーターのポートを開けず、VPN経由で見ます。
- 屋外と法令:公式カメラの動作温度は0〜50度で乾燥環境が前提です。事業者が防犯目的で設置するなら、撮影に気づきにくい場所では作動中の掲示などが必要で、顔識別まで行うなら利用目的の通知・公表も必要です。
処理を置く場所で決まるラズパイ監視カメラの構成
最初に決めるのは、AIの推論をどこで走らせるかです。映像をクラウドへ送らず手元で判定する構成(エッジAI)なら、回線が細くても動き、映像を外部に出さずに済みます。推論をカメラ・NPU・CPUのどこに置くかで、必要な機材の大半が決まります。
| 構成 | 推論の場所 | 対応本体 | 向く用途 |
|---|---|---|---|
| カメラモジュールのみ | なし(画素差分) | カメラ端子のある全機種 | 動きがあれば録画 |
| AI Camera | カメラ内(IMX500) | Pi 5・Pi 4ほか | 人・車だけ録画 |
| カメラ+AI HAT+ | 本体のNPU(Hailo) | Pi 5のみ | 重いモデル・複数カメラ |
| カメラ+CPU推論 | 本体CPU | Pi 4・Pi 5 | 低フレームレートの試作 |
監視カメラで困るのは、風に揺れる木や照明の変化でも録画が始まってしまうことです。画素差分の動体検知はこれを区別できません。AI Cameraは「人が写ったか」で判定でき、公式ドキュメントがAll object detection runs directly on the AI Camera.と書くとおり、MobileNet SSDの物体検出はカメラ内で完結します。本体のCPUを録画と配信に回せるので、1台で組むならAI Cameraが第一候補です。
YOLO系の大きなモデルを使いたい、複数のカメラ映像をまとめて推論したいといった場合は、Raspberry Pi 5にAI HAT+を載せます。アクセラレータの性能差と価格はラズベリーパイ(Raspberry Pi)でAIを動かす方法|AI HAT+ 2・AI HAT+・AI Cameraの選び方と価格、LLM導入手順で比較しています。本記事はカメラ側の構築に絞ります。
監視用途で比べる公式カメラモジュールの仕様
Raspberry Pi公式のハードウェア仕様表から、監視カメラの選定に効く項目を抜き出すと次のとおりです。
| モデル | センサー | 静止画 | 水平画角 | フォーカス | NoIR版 | 公式価格 |
|---|---|---|---|---|---|---|
| Camera Module 3 | Sony IMX708 | 11.9MP | 66度 | 電動AF | あり | 25ドル |
| Camera Module 3 Wide | Sony IMX708 | 11.9MP | 102度 | 電動AF | あり | 35ドル |
| AI Camera | Sony IMX500 | 12.3MP | 66度±3 | 手動 | なし | 70ドル |
| HQ Camera | Sony IMX477 | 12.3MP | レンズ次第 | レンズ次第 | なし | 50ドル |
| GS Camera | Sony IMX296 | 1.58MP | レンズ次第 | レンズ次第 | なし | 50ドル |
仕様の出典はRaspberry Pi公式のカメラ仕様表、価格は公式の米ドル定価です(AI Cameraは製品資料のList price: $ 70 US)。国内の販売価格は為替と販売店で変わります。AI CameraはCamera Module 3の約3倍ですが、推論用のAI HAT+が要らず、Pi 4でも使えます。人検知だけが目的なら、構成は最も単純になります。
部屋全体を写すならCamera Module 3 Wide、夜間はNoIR
玄関や部屋の隅に置いて全体を写すなら、水平102度のCamera Module 3 Wideが向いています。標準のCamera Module 3は水平66度です。必要な画角は部屋の広さだけでなく、設置位置・向き・撮影対象までの距離で変わるため、取り付け前に撮影範囲を確認します。最短撮影距離は標準が約10cm、Wideが約5cmです。
夜間の監視は、赤外線カットフィルターを外したNoIR版に赤外線照明(IR LED)を組み合わせます。NoIR版は昼間の色が赤紫に転ぶので、昼夜を1台で撮るなら色味は諦めることになります。公式ドキュメントは、現行のrpicam-appsでNoIRカメラの色を調整する場合、--tuning-fileでセンサーと本体に対応するNoIR用チューニングファイルを指定するよう案内しています。
AI Camera・HQ Camera・GS Cameraが向く場面
AI Cameraは、画角とフォーカス範囲(約20cm〜無限遠)がCamera Module 3標準に近く、推論機能が付いたものと考えると選びやすいです。NoIR版がなく、フォーカスは手動なので、夜間に人検知まで行うなら照明で明るさを確保する前提になります。
HQ Camera(C/CSマウント版)はレンズを付け替えられるため、駐車場の奥など遠くを望遠で狙う用途に向きます。GS Camera(グローバルシャッター)は1.58MPと低解像度ですが、全画素を同時に露光するので、ローリングシャッター特有の斜めのゆがみが出ません。ライン上を流れる製品の検査など、監視より計測寄りの用途で選びます。
カメラの接続と認識確認の手順
ケーブル:Pi 5とZeroは22ピン、Pi 4以前は15ピン
公式カメラ側の端子はすべて15ピンの標準コネクタです。本体側はRaspberry Pi 4までが15ピンなので付属ケーブルをそのまま使えますが、Raspberry Pi 5とカメラ端子付きのZeroシリーズ(初代Zeroはv1.3以降)は22ピンのミニコネクタです。Camera Module 3の製品資料はケーブル端子を15ピンのみと記載しているため、Pi 5につなぐには「Standard-Mini」ケーブルを用意します。AI Cameraの製品資料は15 × 1mm FPC or 22 × 0.5mm FPCと記載しており、Pi 5用のケーブルにも対応しています。Pi 5のCAM/DISP0とCAM/DISP1はどちらにつないでも構いません。
作業の前にラズパイをシャットダウンして電源を抜きます。ロックのフラップを引き出し、金属端子をフラップと反対側に向けてまっすぐ差し込みます。Pi 5にアクティブクーラーを付けるなら、先にカメラケーブルを挿しておかないと端子に手が届きにくくなります。
rpicam-helloによるカメラ認識の確認
接続したら、OSを最新にしてからカメラ一覧を表示します。
sudo apt update && sudo apt full-upgrade
rpicam-hello --list-cameras
rpicam-hello -t 5s
--list-camerasは検出されたカメラとセンサーモードを一覧表示します。何も出なければ次の節の確認に進みます。Raspberry Pi OS Bookworm以降、カメラ用コマンドはlibcamera-*からrpicam-*へ名前が変わりました。古い記事のlibcamera-helloやraspistillは読み替えが必要です。
カメラを認識しないときの確認順
「raspi-configでカメラを有効化する」という手順は、レガシーカメラスタック時代のものです。Bookworm以降はレガシースタック自体が動作せず、公式ドキュメントもdeprecated for many years, and is now unsupportedとしています。現行のTrixie系を含むRaspberry Pi OSは、config.txtのcamera_auto_detectが既定で有効なので、設定なしで公式カメラを自動検出します。認識しない場合は、公式のトラブルシューティングに沿って次の順に確かめます。
- ケーブルがCSI端子に挿さっているか。表示用のDSI端子にも物理的には挿さりますが、カメラに給電と制御をするのはCSIだけです(Pi 5の2端子はどちらも兼用)。
- ケーブルが斜めに入っていないか、端子の向きが逆でないか。
- 電源容量。カメラモジュールは本体の消費電流を約200〜250mA押し上げます。
- サードパーティ製カメラを使う場合は、
/boot/firmware/config.txtでcamera_auto_detect=0にしたうえでdtoverlay=imx708のようにセンサーを明示します。
Raspberry Pi 3以前はGPUが扱える画像サイズが2048×2048までなので、それを超える解像度で録画するとプレビューが乱れることがあります。監視用途なら1280×720程度に抑えると避けられます。
Picamera2で動きを検知して録画するPythonコード
AIを使わない最小構成として、画素の変化量で動きを検知し、MP4で録画する仕組みを先に作ります。Picamera2は最近のRaspberry Pi OSに同梱されており、入っていない場合もpipではなくaptで入れます(公式はpipで入れたものをアンインストールするよう案内しています)。
sudo apt install -y python3-picamera2
次のコードはpicamera2-examplesの公式サンプルcapture_circular_improved.pyをもとにしています(サンプル類はPicamera2 0.3.38で本体リポジトリからこちらへ移りました)。320×240の低解像度ストリームで前フレームとの平均二乗誤差を取り、7を超えたら録画を始めます。CircularOutput2が直近3秒をメモリに保持しているので、動きを検知した瞬間より前の映像も録画に残ります(起動直後はまだ3秒分たまっておらず、保存はバッファ内のキーフレームから始まります)。
#!/usr/bin/python3
import time
import numpy as np
from picamera2 import Picamera2
from picamera2.encoders import H264Encoder
from picamera2.outputs import CircularOutput2, PyavOutput
lsize = (320, 240)
picam2 = Picamera2()
main = {"size": (1280, 720), "format": "YUV420"}
lores = {"size": lsize, "format": "YUV420"}
picam2.configure(picam2.create_video_configuration(main, lores=lores))
duration = 3
encoder = H264Encoder(bitrate=1000000, repeat=True)
output = CircularOutput2(buffer_duration_ms=duration * 1000)
picam2.start_recording(encoder, output)
w, h = lsize
prev = None
encoding = False
ltime = 0
try:
while True:
cur = picam2.capture_array("lores")[:h, :w] # YUV420の輝度成分だけ使う
if prev is not None:
diff = cur.astype(np.float32) - prev.astype(np.float32) # uint8のまま引くと桁あふれする
mse = np.square(diff).mean()
if mse > 7:
if not encoding:
output.open_output(PyavOutput(f"{int(time.time())}.mp4"))
encoding = True
ltime = time.time()
elif encoding and time.time() - ltime > duration + 2:
output.close_output()
encoding = False
prev = cur
except KeyboardInterrupt:
pass
finally:
picam2.stop_recording()
公式サンプルは8ビット整数のまま差を取っているため、差が桁あふれして動きを取りこぼします(差16の画素が0として計算される)。上のコードは浮動小数点に変換してから計算するよう直しています。しきい値の7は公式サンプルと同じ値ですが検証済みの推奨値ではないので、設置場所で録画の頻度を見ながら調整する初期値として扱ってください。屋外でこのまま使うと、雲の影や木の揺れで録画が止まらなくなりがちです。その誤検知を減らすのが、次のAI Cameraによる人検知です。
OpenCVで顔や輪郭を検出する方法はOpenCVとは?Pythonでの使い方入門|pip installから画像処理・顔検出まで【5.0対応】で扱っています。
AI Cameraで人を検知したときだけ録画する方法
imx500-allの導入とrpicam-helloでの物体検出
AI Cameraは起動時にIMX500センサーへファームウェアとニューラルネットワークモデルを転送します。必要なファイル一式はimx500-allパッケージにまとまっています。
sudo apt update && sudo apt full-upgrade
sudo apt install imx500-all
sudo reboot
このパッケージで、ファームウェア(/lib/firmware/imx500_loader.fpkほか)、モデル群(/usr/share/imx500-models/)、rpicam-apps用の後処理ステージ、Sonyのモデルのパッケージングツールが入ります(自作モデルの変換ツールは後述のEdge-MDTで別途入れます)。再起動後、MobileNet SSDによる物体検出をプレビューで確認できます。
rpicam-hello -t 0s --post-process-file /usr/share/rpi-camera-assets/imx500_mobilenet_ssd.json --viewfinder-width 1920 --viewfinder-height 1080 --framerate 30
初回はモデルの転送に数分かかることがあります(公式ドキュメントの記載)。AI Camera上のRP2040マイコンが転送済みのファームウェアをキャッシュするので、2回目以降は速くなります。コマンドが固まったように見えても、コンソールの進捗バーを待ってください。
公式の前提はRaspberry Pi 4 Model BまたはPi 5ですが、ドキュメントは小さな変更でZero 2 WやPi 3 Model B+でも動くとしています。人の姿勢を推定するimx500_posenet.jsonも同梱されています。
Picamera2で人を検知して録画するスクリプト
rpicam-vidの--post-process-fileでも検出枠付きの録画はできますが、常時録画になります。「人が写ったときだけ録画する」には、Picamera2で推論結果を読んで録画を制御します。次のコードは、公式デモimx500_object_detection_demo.pyの推論結果の読み方に前節の録画の仕組みを組み合わせ、後述の自動起動に備えて保存先と停止処理を足したものです。~/person_record.pyとして保存します。
#!/usr/bin/python3
import signal
import time
from pathlib import Path
from picamera2 import Picamera2
from picamera2.devices import IMX500
from picamera2.encoders import H264Encoder
from picamera2.outputs import CircularOutput2, PyavOutput
MODEL = "/usr/share/imx500-models/imx500_network_ssd_mobilenetv2_fpnlite_320x320_pp.rpk"
PERSON = 0 # COCOラベルの0番が person
THRESHOLD = 0.55 # 公式デモの既定値
PRE_SEC = 3 # 検知前に遡って残す秒数
HOLD_SEC = 5 # 最後の検知後に保存する映像の秒数
OUT_DIR = Path.home() / "recordings"
OUT_DIR.mkdir(exist_ok=True)
def stop(signum, frame):
raise KeyboardInterrupt # systemctl stop(SIGTERM)でも録画中のファイルを閉じる
signal.signal(signal.SIGTERM, stop)
imx500 = IMX500(MODEL) # Picamera2 より先に生成する
picam2 = Picamera2(imx500.camera_num)
config = picam2.create_video_configuration(
main={"size": (1280, 720), "format": "YUV420"}, buffer_count=12
)
imx500.show_network_fw_progress_bar()
encoder = H264Encoder(bitrate=2_000_000, repeat=True)
output = CircularOutput2(buffer_duration_ms=PRE_SEC * 1000)
picam2.start_recording(encoder, output, config=config)
recording = False
last_seen = 0.0
try:
while True:
metadata = picam2.capture_metadata()
tensors = imx500.get_outputs(metadata, add_batch=True)
if tensors is not None:
scores, classes = tensors[1][0], tensors[2][0]
if any(s > THRESHOLD and int(c) == PERSON for s, c in zip(scores, classes)):
last_seen = time.time()
if not recording:
name = time.strftime("%Y%m%d-%H%M%S") + ".mp4"
output.open_output(PyavOutput(str(OUT_DIR / name)))
recording = True
# 書き出しはPRE_SEC遅れで進むため、その分も待ってから閉じる
if recording and time.time() - last_seen > PRE_SEC + HOLD_SEC:
output.close_output()
recording = False
except KeyboardInterrupt:
pass
finally:
picam2.stop_recording()
IMX500(MODEL)はPicamera2より先に生成する必要があります(公式デモのコメントにある制約)。推論結果はフレームのメタデータCnnOutputTensorに入っており、get_outputs()でNumPy配列として取り出せます。このSSDモデルの出力は、0番目が検出枠、1番目がスコア、2番目がクラス番号です。停止時はstop_recording()がCircularOutput2のバッファを書き出してからファイルを閉じる処理を行います。ただし、停電・強制終了・書き込みエラー時までMP4の正常保存を保証するものではありません。
車や犬を対象にするならPERSONの値を変えます。ラベルの並びは公式サンプルのcoco_labels.txtで確認でき、欠番を表す-行も番号に数えます。上のコードはPicamera2 0.3.38のAPIに合わせており、実機での動作は未検証です。導入前に、使用する本体とカメラで録画開始・終了、停止後のMP4再生を確認してください。
自作モデルをAI Cameraに載せる流れ
同梱モデルにない対象(特定の製品や作業服など)を検知したい場合は、学習したモデルをIMX500用に変換します。公式の手順は、Sonyのedge-mdt(PyTorch版はpip install edge-mdt[pt])で量子化・圧縮し、imxconv-ptまたはimxconv-tfで変換、最後にラズパイ上のパッケージャーで.rpkにまとめる3段階です。IMX500の入力テンソルは最大640×640で、ファームウェア・重み・作業領域を合わせたメモリは8,388,480バイト(約8MB)しかありません。変換時に--no-input-persistencyを付けると、その限られたメモリを推論に回せます(デバッグ用の入力テンソル出力は無効になります)。
物体検出モデルの仕組みや代表手法の比較は物体検出とは?仕組み・代表手法の比較から実装判断までエンジニア向けに解説にまとめています。
電源を入れれば録画が始まる常時運用の設定
systemdによる録画スクリプトの起動時自動実行
停電やOS更新で再起動したあと自動で録画に戻らなければ、監視カメラとしては使えません。録画スクリプトをsystemdのサービスにすると、起動時に自動実行され、異常終了しても5秒後に再起動します。次の内容を/etc/systemd/system/person-record.serviceとして作ります(piの部分は自分のユーザー名に置き換えます。2022年以降のRaspberry Pi OSには既定のpiユーザーがありません)。
[Unit]
Description=AI Camera person recorder
[Service]
User=pi
ExecStart=/usr/bin/python3 /home/pi/person_record.py
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now person-record.service
journalctl -u person-record.service -f
User=を指定したサービスではHOMEがそのユーザーのホームになるので、録画は/home/pi/recordings/に溜まります。systemctl stopが送るSIGTERMをスクリプト側でKeyboardInterruptに変えているのは、何もしないとPythonがfinallyを通らずに終わり、録画中のMP4が閉じられないためです。同じカメラを使うプログラム(rpicam-helloや後述のMediaMTX)は、サービスを止めてから動かします。
録画容量の見積もりと古い録画の自動削除
容量はビットレートから計算できます。上のコードの2Mbps(bitrate=2_000_000)なら1秒あたり250KB、1分で15MB、1時間で900MBです。人を検知したときだけ録るなら、1回の録画は検知前最大3秒+最後の検知から約5秒が目安です(起動直後のバッファ不足やキーフレームの位置で短くなることがあります)。1回1分として1日100回録れば1.5GBです。常時録画なら1日21.6GBになるので、32GBのmicroSDカードでは2日持ちません。
OSと同じ媒体に録画を保存すると、容量不足でOSの書き込みにも支障が出ます。保持日数は録画用の空き容量から逆算します(2Mbpsの常時録画を7日保持するなら映像だけで約151.2GB)。cronで古いファイルを定期的に消しておきます(crontab -eで追記。次の例は毎時0分に7日=10,080分より古いMP4を削除)。
0 * * * * find /home/pi/recordings -name '*.mp4' -mmin +10080 -delete
書き込みが続く用途なので、録画先はOSの入ったmicroSDカードと分け、USB接続のSSDやUSBメモリにするとSDカードの書き込み量を減らせます。起動時に自動でマウントする設定はRaspberry Pi Flash Drive(公式USBメモリ)の仕様と国内価格|USBブート設定・fstab自動マウントの手順で説明しています。その場合はOUT_DIRとcronのパスをマウント先に書き換えます。
スマホやPCから映像を見るネットワークカメラ化(MediaMTX)
ラズパイをネットワークカメラ(IPカメラ)にしてライブ映像を見るなら、公式ドキュメントも紹介しているMediaMTXが手軽です。2026年10月時点の最新はv1.21.3で、MediaMTXのドキュメントはRaspberry Pi OSのTrixieとBookworm(32ビット・64ビットとも)を対応OSとしています。64ビット版のOSならリリースページからarm64版を取得し、mediamtx.ymlのpathsの中身を次のように置き換えて起動します。
paths:
cam:
source: rpiCamera
RTSPならrtsp://<ラズパイのIP>:8554/camをVLCなどで、ブラウザならhttp://<ラズパイのIP>:8889/cam(WebRTC)で映像を確認できます。sourceOnDemand: yesを足すと、誰かが接続したときだけカメラを使います。ArduCamなど独自のlibcameraが要るカメラは、配布バイナリでは動かずソースからのビルドが必要です。
source: rpiCameraではMediaMTXがカメラを自分で開くので、前節の録画スクリプトと同じカメラを同時には使えません。録画と配信を両立させる方法は2つあります。検知録画とライブ配信を同時に行うには、掲載スクリプトに別途配信用の出力処理を追加し、MPEG-TSをUDPで送り、MediaMTXのsourceをudp://127.0.0.1:1234にする方式を公式が案内しています。検知せず常時録画でよいなら、MediaMTX自体の録画機能を使い、record: yesで録画、recordDeleteAfter(既定1d)で保持期間を決めれば、前節のcronも要りません。
外出先から映像を見る方法
外出先から見るときに、ルーターのポートを開けてRTSPや8889番を公開するのは避けます。MediaMTXの既定の設定は認証なしで誰でも視聴できるため、公開すると映像が第三者に見えます。自宅のネットワークにVPNで入ってから見る構成にします。WireGuardでの組み方はWireGuardとは?仕組み・使い方と設定手順、繋がらない時の切り分け【2026年10月】を参照してください。
公式のRaspberry Pi Connectはブラウザから画面共有やリモートシェルを使うサービスで、カメラ映像の配信手段ではありません。外出先からスクリプトを直すときの入口として使います。
LINE Notify終了後の検知通知の手段
自作監視カメラの解説記事には、検知時の通知にLINE Notifyを使うものが多く残っています。しかしLINE Notifyは2025年3月31日でサービスを終了しており、今は動きません。LINEで受け取りたいなら、LINEヤフーが代替として案内しているMessaging API(LINE公式アカウントからの送信)を使います。メールやチャットツールのWebhookでも構いません。
屋外に設置するときの温度・防水・結露の条件
公式カメラは屋外用ではありません。Camera Module 3の製品資料もAI Cameraの製品資料も、動作温度を0〜50度とし、乾燥した環境で使うことと、結露で画質が落ちるので急な温度変化を避けることを求めています。本体のRaspberry Pi 5は0〜70度(2026年10月版の製品資料)なので、屋外で先に限界に達するのはカメラ側です。
- 夏の直射日光:密閉した防水ケースの中は外気より高温になります。日陰に置き、ケースの色を明るくし、50度を超えない置き場所を選びます。
- 冬の結露と氷点下:0度を下回る地域の冬季は仕様の範囲外です。ケース内に乾燥剤を入れ、窓ガラス越しに室内から撮る方法も検討します。
- 電源と通信:屋外コンセントからの給電は防雨型の配線が必要です。本体の機種に対応したPoE HATを使えば、LANケーブル1本で給電と通信をまとめられます(PoE対応のハブまたはインジェクターが要ります)。
窓の内側に置けば雨を避けられますが、日射による温度上昇や窓際の結露への対策は必要です。また、夜間はガラスに赤外線照明が反射するので、NoIR版で夜を撮るならレンズをガラスに密着させるか照明を外に出します。屋外に常設するなら、カメラは防水の市販ネットワークカメラにし、ラズパイは室内で録画機として使う分担が確実です。
コードを書かずに組む選択肢:motionEyeとFrigate
検知条件を自分で書き換える必要がなく、Web画面から設定して録画を見られればよいなら、既成の監視ソフトを入れる方法もあります。代表的な2つの性格はかなり違います。
| ソフト | 最新版 | 検知の方式 | 向く構成 |
|---|---|---|---|
| motionEye | 0.44.0(2026-06) | 画素差分(motion) | 1〜数台・設定画面で手軽に |
| Frigate | 0.18.2(2026-10) | 物体検出(AIアクセラレータ) | 複数のIPカメラ・人や車で録画 |
motionEyeは動体検知ソフトmotionのWeb画面です。pipで入れてsudo motioneye_initを実行するとhttp://<IP>:8765/で設定画面が開きます(Bookworm以降はREADMEのとおり/etc/pip.confにbreak-system-packages=trueを足してから入れます)。初期管理者はadminです。0.44.0では管理者と監視用ユーザーの両方にパスワードが必須となり、未設定の場合はログイン時に設定を求められます。検知は画素差分なので、木の揺れによる誤検知は自作の動体検知と変わりません。公式カメラはMediaMTXでRTSP配信し、ネットワークカメラとして登録すると組みやすくなります。
Frigateは物体検出で録画を制御する録画機(NVR)ソフトです。ドキュメントはRaspberry Pi 5+AI Kit(PCIe接続のHailo)での動作を明記しており、同じページの表ではHailo-8LのYOLOv6nの推論時間が約11ミリ秒です。ただし対応として書かれているのはHailo-8とHailo-8Lで、AI HAT+ 2のHailo-10Hは0.18.2のドキュメントに記載がありません。Bookwormではカーネル同梱の古いHailoドライバーを無効にする手順が要り、Trixieでは不要です。カメラはRTSPなどのネットワーク経由の映像で受ける前提なので、市販のIPカメラを何台もまとめる録画機としてラズパイを使う構成に向きます。
反対に、AI Camera1台で「人が来たら録画」を組むなら、Frigateを入れるより本記事のスクリプトのほうが部品が少なく済みます。カメラ内で推論が終わっているので、録画機側にアクセラレータを足す必要がないためです。
防犯カメラとして運用する前に確認する個人情報保護法の扱い
自作でも、店舗や事務所に設置して特定の個人を識別できる映像を撮れば、その映像は個人情報になります。個人情報保護委員会のQ&A(Q1-13)は、特定の個人を識別できる画像を取得する事業者に対し、利用目的の特定と、その範囲内での利用を求めています。
- 通常の防犯カメラ:設置状況から防犯目的が明らかなら、利用目的の通知・公表は不要とされます(法第21条第4項第4号)。ただし撮影されていることを本人が容易に認識できない場合は、「防犯カメラ作動中」の掲示など、認識できるようにする措置が必要です(法第20条第1項)。
- 顔識別まで行う場合:Q1-14は、カメラの外観から顔識別をしていることは分からないため、防犯目的が明らかな場合の例外に当たらないとしています。顔識別機能を使っていることも明示したうえで利用目的を通知・公表する必要があります。
- 目的外利用:防犯目的で撮った映像を、来店者分析などのマーケティングに転用するには本人の同意が必要です。
本記事の構成は顔ではなく「人がいるかどうか」だけを判定しています。顔認識を付けると法的な手当てが一段重くなるので、防犯目的なら人検知で止めるのが現実的です。家庭用でも、隣家の窓や公道を常時写す向きに設置するとトラブルの元になるため、撮影範囲は敷地内に絞ります。
自作をやめて市販の監視カメラを選ぶべき条件
ラズパイで自作するかどうかは、検知条件や保存の仕方を自分で書き換えたいかで決めます。次の条件に当てはまるなら、市販のネットワークカメラやNVR(録画機)のほうが確実です。
- 屋外に常設する:公式カメラは0〜50度・乾燥環境が前提で、防水と熱対策を自前で設計することになります。
- 証拠として映像を確実に残す必要がある:本記事の構成は停電中は録画できず、録画は1か所にしか残りません。NASへの退避や空き容量の監視まで自前で作ることになります。
- 照明のない暗所でカラー映像が要る:照明を置けない場所ではNoIR+赤外線照明による白黒に近い映像になります。
どれにも当てはまらない、たとえば「室内で人が来たときだけ記録したい」「工場の特定エリアへの立ち入りを検知したい」といった用途では、検知対象・しきい値・録画の前後秒数をコードで変えられるAI Cameraの自作構成が向いています。業務の現場で検知結果を既存システムへつなぐところまで含めて検討するなら、AI/IoTソリューションとして相談することもできます。本体の選び方はRaspberry Pi 5とPi 4の違いを比較|スペック・性能・価格と選び方【2026年10月】を参照してください。
よくある質問
Raspberry Pi AI Cameraでは何ができますか?
カメラ内のSony IMX500で物体検出・画像分類・セグメンテーション・姿勢推定を実行できます。標準でMobileNet SSD(物体検出)とPoseNet(姿勢推定)などのモデルが用意され、rpicam-appsやPicamera2から結果を受け取れます。推論はセンサー上で行うので、ラズパイ本体にアクセラレータは要りません。
Raspberry Pi 4でもAI Cameraは使えますか?
使えます。公式ドキュメントはRaspberry Pi 4 Model BとPi 5を前提に手順を書いており、小さな変更でZero 2 WやPi 3 Model B+でも動くとしています。AI HAT+はPi 5専用ですが、AI CameraはPi 4でも推論できる点が違いです。
raspi-configにカメラを有効化する項目がないのはなぜですか?
現行のRaspberry Pi OSは、カメラを自動検出するlibcameraベースのスタックに移行しているためです。「有効化」はレガシースタックの手順で、Bookworm以降はレガシースタックが動作せず、公式もサポート対象外としています。接続後はrpicam-hello --list-camerasで認識を確認します。
USBカメラでも監視カメラは作れますか?
作れます。公式ドキュメントもUSBウェブカメラの使い方(fswebcamでの撮影)を案内しています。配信はMediaMTXでもできますが、source: rpiCameraは公式カメラ用なので、USBカメラはFFmpegなどで取り込んでMediaMTXへ送る形になります。AI Cameraのようなセンサー上の推論は使えず、AI処理は本体CPUかAI HAT+で行います。
ラズパイの監視カメラで夜間も撮影できますか?
可視光の照明があれば通常版のカメラでも撮影できます。照明を置けない場所なら、Camera Module 3またはWideのNoIR版に赤外線照明を組み合わせます。AI CameraにはNoIR版がないため、夜間に人検知まで行うなら照明で明るさを確保します。