はじめに
こんにちは!
ソニーセミコンダクタソリューションズの平尾と申します。
2024年9月、Raspberry Pi (以下、Raspi) AI Cameraが発売されました。公式サイトでは、クラス分類や物体検出といった複数のタスクのサンプルが公開されており、誰でも簡単にエッジ環境でAIモデルを実行できるようになりました。
AIの活用事例の1つに人物検出があります。人物検出AIモデルは、人流計測、侵入検知、混雑検知など、様々な用途に応用可能です。従来の画像による人物検出では、撮影した画像を環境構築済みのPCやクラウドに転送し、AIモデルによる推論を行う必要がありました。しかし、この方式では撮影画像がPCやクラウドに残る可能性があり、プライバシー保護の観点から導入の障壁となっています。
これに対し、Raspi AI Cameraでは、センサ内部でAI処理が完結し、人の検出状況や位置情報のみをメタデータとして転送できるため、プライバシーに配慮した人物検出が実現可能です。
本記事では、Raspi AI Cameraで人物検出を行い、PLCを用いて人物検出状況をパトライトで通知するシステムを構築します。PLCは製造設備のシーケンス制御を行うための専用コンピュータで、製造業を中心に幅広く使用されています。PLCを介した通知方法には様々な選択肢がありますが、本記事では視覚的な理解のしやすさを重視し、動画のようにパトライトの点灯による人物検出情報の通知を実装します。

人物のモザイク処理については別途実装しています。詳細は記事をご覧ください。
この記事でできること
- Raspi AI cameraを使用した人物検知アプリケーションの実行
- 本記事で作成するコードは下記githubから取得可能です。
- https://github.com/SonySemiconductorSolutions/aitrios-rpi-sandbox/blob/main/examples/plc_human_detection
- AI Cameraの推論結果を用いたOpenPLC経由での外部機器の制御
- ※ 本記事では外部機器としてパトライトを使用していますが、使用しない場合もアプリケーション上から動作確認が可能です。
必要機材
必要機材のリストは以下のとおりです。
Item | 必須 | メモ | |
---|---|---|---|
1 | Raspi AI Camera | * | 購入先はこちら |
2 | Raspi × 2 | * | 本記事ではRaspi 4を1台, Raspi 5を1台使用しています。OpenPLCの使用にはRaspi 4以前のデバイスが必要です。Raspi AI Cameraの対応可能機種はこちら |
3 | TypeCケーブル | * | 電源接続用 |
4 | micro SDカード | * | 32GB以上推奨 |
5 | マウス | 開発で必要な方のみ | |
6 | モニタ | 開発で必要な方のみ | |
7 | キーボード | 開発で必要な方のみ | |
8 | HDMIケーブル | 開発で必要な方のみ | |
9 | パトライト | 本記事では使用していますが、用途に応じて変更可能です。本記事で使用した機器はこちらです。 | |
10 | スイッチング電源 | パトライトへの電源供給用。本記事で使用した機器はこちらです。 | |
11 | リレーモジュール | パトライトとRaspiの接続用。本記事で使用した機器はこちらです。 | |
12 | GPIO Pin | パトライトとRaspiの接続用。本記事で使用した機器はこちらです。 | |
13 | ヒートシンク&ケース | 必要な方のみ (ヒートシンクについては使用推奨)。本記事で使用した機器はこちらです。 | |
14 | PC | OpenPLC Editorインストール用。Windows / MacOS / Linux 対応です。インストールはこちらです。 |
セットアップ
Raspi Imageの書き込み
Raspberry Pi OS Imager (ダウンロード先) を使うことで、SDカードへのOSイメージの書き込みができます。Windows、MacOS、Ubuntu対応です。
手順はこちらを参照ください。
AI Cameraセットアップ
Raspi AI Cameraの同封物は写真のとおりです。

- AI Camera
- mipi DSIケーブル ディスプレイ用FPC (Standard - Standard 20 cm)
- Raspberry Pi 4シリーズに接続する場合はこちらのケーブルを使用します
- mipi DSIケーブル ディスプレイ用FPC (Standard - Mini 20 cm)
- Raspberry Pi 5、Pi Zeroシリーズに接続する場合はこちらのケーブルを使用します
- 小型フォーカス調整工具
- 工具をはめ込み、回すことでフォーカスの調整が可能です
Raspi AI CameraとRaspiを画像のように接続します。


ケーブルには表裏があります。接続の際は注意してください。

接続後、Raspiの公式ドキュメントの手順に沿ってセットアップを進めてください。
動作確認
正しく接続できているかの確認のためにサンプルスクリプトを動かすことができます。物体検出のサンプルスクリプトを試す場合は以下のコードを実行します。
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モデルを使用して人物検出を行います。検出結果をOpenPLCで監視し、その結果に応じてパトライトの点灯状態を制御します。具体的には、人物が検出された場合は赤色LEDを点灯させ、人物が検出されない場合は緑色LEDを点灯させます。
システム構成としては以下のとおりです。2つのRaspiについては同一LAN内に接続してください。

OpenPLC
OpenPLCは、オープンソースのPLCソフトウェアです。公式サイトはこちらから確認いただけます。PLCの国際規格IEC61131-3に準拠しており、5種類のPLCプログラミング言語に対応しています。実機のPLC機器は導入コストが高く、用意が困難であるため、OpenPLCは学習やデモ用途の代替ソリューションとして使用されています。本記事では、対応している5種類のPLCプログラミング言語の1つであるラダー言語を使用して、PLC制御プログラムを作成します。
実装
AI Camera撮影スクリプト
人物検出には、AICameraセットアップ時にインストールされる物体認識のサンプルモデルの1つであるnanodet_plus_416×416.rpk
を使用します。モデルの一覧は/usr/share/imx500-models
ディレクトリで確認できます。
このモデルはcocoデータセットで学習されており、そのラベルの1つにperson
が含まれています。このラベルを用いて人物検出を実装します。
人物検出のコードについては、RaspberryPi財団が公開している物体認識のサンプルスクリプトを参考にします。まず、以下のコマンドでスクリプトをクローンします。
git clone https://github.com/raspberrypi/picamera2.git
動作確認は以下のコマンドで実行できます。
python picamera2/examples/imx500_object_detection_demo.py --model=/usr/share/imx500-models/imx500_network_nanodet_plus_416x416.rpk
実行結果は以下のとおりです。人物の検出が正しく行えていることが確認できます。(モザイク処理は別途実装)

また、手のみの検出も可能です。(モザイク処理は別途実施)

検出結果の解析
実装の前にRaspi AI Cameraの物体検出出力について確認します。カメラからの出力はparse_detections
関数のnp_outputs
で受け取り、結果はlast_detections
に格納されます。
last_detections
にはDetection
クラスのオブジェクトとして、検出サンプルごとのデータが格納されます。Detection
クラスのデータメンバは以下のとおりです。
-
category
:検出サンプルのカテゴリ -
conf
:検出結果の確信度 (confidence score) -
box
:検出結果の位置情報 (x,y,w,h)
よって、人の検出情報はcategory = person
の有無によって判定できます。
Pymodbus実装
AICameraを接続したRaspiとOpenPLCを動かすRaspi間の通信にはModbus TCPプロトコルを使用します。これは産業用機器間の標準的な通信プロトコルの1つで、OpenPLCでも採用されています。
Pythonでの実装にはPymodbusライブラリを使用します。
sudo pip install pymodbus #今回はpymodbus==2.5.3
Modbus通信で使用する502番ポートは特権ポートのため、管理者権限での実行が必要です。
Modbus Serverを使用するために必要なpythonスクリプトの基本的な設定は以下のとおりです。
#pymodbus module
from pymodbus.server.asynchronous import StartTcpServer
from pymodbus.datastore import ModbusSequentialDataBlock, ModbusSlaveContext, ModbusServerContext
from pymodbus.device import ModbusDeviceIdentification
# Setting of modbus Server
store = ModbusSlaveContext(
di=ModbusSequentialDataBlock(0, [0,0,0]) # Initialize of di
)
context = ModbusServerContext(slaves={0x01: store}, single=False) #0x0n:slave device number n
def modbus_server(context):
identity = ModbusDeviceIdentification()
identity.VendorName = 'RaspberryPi'
identity.ProductCode = 'RPi'
identity.VendorUrl = 'http://www.raspberrypi.org/'
identity.ProductName = 'RPi Modbus Server'
identity.ModelName = 'RPi Model'
identity.MajorMinorRevision = '1.0'
StartTcpServer(context, identity, ("", 502))
続いて、AI Cameraの出力をもとに、Modbus Serverの値を変更する部分の実装を行います。check_including_person
関数はupdate_di
を呼び出し、人物の検出状況に応じて接点の値を動的に変更します。実装は以下のとおりです。
# Setting of Detection Area
is_detection_area = False # ON = True / OFF = False
class Detection_Area:
def __init__(self, x, y, w, h):
self.x = x # 0 <= x < 640
self.y = y # 0 <= y < 480
self.w = w # 1 < w <= 640 - x
self.h = h # 1 < h <= 480 - y
if is_detection_area:
detection_area = Detection_Area(0, 0, 320, 480)
# Check for person in detection area
def check_including_person(request):
global context
detections = last_detections
labels = get_labels()
if detections == []:
update_di(context, in_person=False)
return
else:
for detection in detections:
if labels[int(detection.category)] == "person":
if is_detection_area:
p_x, p_y, p_w, p_h = detection.box # detection area of person
if not((detection_area.x + detection_area.w <= p_x) or (p_x + p_w <= detection_area.x) or (detection_area.y + detection_area.h <= p_y) or (p_y + p_h <= detection_area.y)):
update_di(context, in_person=True)
return
else:
update_di(context, in_person=True)
return
update_di(context, in_person=False)
return
# Update di based on detection results
def update_di(context, in_person):
if in_person:
values = [1,0,0]
context[0x01].setValues(2, 0, values)
else:
values = [0,1,0]
context[0x01].setValues(2, 0, values)
Raspi AI Cameraの物体認識モデルは、デフォルトでは画面全体に対してAI推論を行います。しかし、実用上は特定の領域のみで人物検出を行いたいケースが考えられます。そこでdetection_area
パラメータを導入し、指定された検出領域内で人物が検知された場合のみパトライトの点灯状態が切り替わるように実装しています。
最後に、Modbus Serverをスレッドとして起動することで準備完了です。詳細はコードを確認ください。コード全体はこちらから確認いただけます。
OpenPLC Editor
OpenPLC側の実装に移ります。今回、PLC制御に使用するラダープログラムは、人物検出状況に応じてパトライトの点灯を制御する単純な機能のみを実装しているため、非常にシンプルな構成となっています。ラダープログラムの作成にはOpenPLC Editorを使用しました。インストールは公式サイトを参考にしてください。今回はWindowsPCにインストールして使用しています。

作成したラダープログラムは、OpenPLC Runtimeで使用するために.st (Structure Text) 形式への変換が必要です。変換はEditor上部の下矢印アイコンから実行できます。

OpenPLC Runtime
続いてOpenPLC Runtimeの設定を行います。ここでは実行プログラムの選択、環境設定、Slave Device (OpenPLC Runtime内での表記に準拠) の設定などを行います。インストールは公式サイトを参考にしてください。githubはこちらです。
OpenPLC Runtimeを起動後、<RaspiのIPアドレス>:8080
にアクセスすると、ログイン画面が表示されます。初回認証情報は以下のとおりです。
設定手順
-
ハードウェア設定
Hardwareタブを選択し、
OpenPLC Hardware Layer
にてRaspberry Pi
を選択します。これによりRaspberry Pi用のGPIOピン割り当てが設定されます。 -
プログラムのアップロード
Programsタブを選択し、実行するプログラムの選択を行います。先ほどOpenPLC Editorで作成した.stファイルを選択し、適当な名前をつけて
Upload Programs
を実行します。コンパイル完了後、Go to Dashboard
と表示されればプログラムのアップロード完了です。 -
Slave Deviceの設定
Slave Devicesタブを選択し、Deviceの設定を行います。本記事ではRaspi 5(AICamera側)がSlave Deviceになります。設定項目は以下のとおりです。詳細は公式サイトを参照してください。
- Slave ID:各Slave Deviceごとに一意の識別子
- IP Address:Slave DeviceのIPアドレス
- IP Port:Modbus通信を行うPort番号 (通常は502)
- Discrete Inputs:Slave Deviceの接点
GPIO設定
RaspiのGPIOは3.3 Vまたは5 Vの低電圧出力のため、より高い電圧を必要とする機器の制御には追加の電源とリレー回路が必要です。今回使用するパトライトは15 V - 24 V駆動のため、24Vリレー回路を構築し、AC - DCスイッチング電源 (24 V設定) を使用します。配線は以下の図のとおりです。


実行結果
実際に作成したコードを動かし、人物検出状況に応じたパトライトの点灯制御が正しく機能するかの検証を行います。
実行手順
-
OpenPLC Runtimeの起動
Dashboardタブを選択し、
Start PLC
を押してPLC制御を開始します。 -
AI Cameraの起動
コードを取得し、以下のコマンドで実行します。
sudo python app.py
Modbus通信で使用する502番ポートは特権ポートのため、管理者モードで実行してください。
検証結果
-
detection_area
未設定時画像内の人の検出状況に応じてパトライトの点灯が切り替わっていることが確認できます。
-
detection_area
設定時detection_area
を画像の左半分(赤枠)に設定して実行します。結果を見てわかるとおり、detection_area
に入っていない場合、パトライトは緑色のままであり、detection_area
に入った場合にのみパトライトが赤色に切り替わっていることが確認できます。 -
OpenPLC Runtime内での動作確認
制御の様子は実際のパトライトの点灯状況だけでなく、OpenPLC Runtime内のMonitoringタブから確認可能です。
- 人物検出時(LED_Red = TRUE)
- 人物未検出時(LED_Green = TRUE)
今回のデモンストレーションでは動作確認用に映像出力を行っていますが、Raspi AI Cameraではメタデータのみの取得も可能です。これにより、画像データを保存せずにプライバシーへ配慮した人物検出システムの構築も可能です。
まとめ
本記事では、RaspberryPi AI CameraとOpenPLCを接続して、人物検出情報をパトライトで通知するシステムを構築しました。PLCは工場設備制御の自動化にも多く使われているため、今回のような人検出タスクだけでなく、幅広いタスクに活用できます。例えば、異常検出を行い異常品が検出された場合にアラートを出すシステムも同様の構成で構築可能です。一方で、異常検知システムの構築において、最大の課題は異常サンプルの収集です。多くのケースで、十分な異常サンプルを用意できないことが導入の障壁となっています。そこでおすすめなのが、BrainBuilderを使用したAIモデルの作成です。BrainBuilderでは正常品の画像50枚程度のみで高精度な異常検出AIモデルの作成が可能です。さらに、GUIツールが用意されているため、AI開発に慣れていない方でも簡単にモデル作成ができます。BrainBuilderについて詳細が知りたい場合はこちらを確認ください。
困った時は
もし、記事の途中でうまくいかなかった場合は、気軽にこの記事にコメントいただいたり、以下のサポートのページもご覧ください。
コメントのお返事にはお時間を頂く可能性もありますがご了承ください。
また、記事の内容以外で AITRIOS についてお困りごとなどあれば以下よりお問い合わせください。