0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

RaspberryPi AI CameraとOpenPLCを接続して、人物検出状況をパトライトで通知してみた

Last updated at Posted at 2025-03-26

はじめに

こんにちは!

ソニーセミコンダクタソリューションズの平尾と申します。

2024年9月、Raspberry Pi (以下、Raspi) AI Cameraが発売されました。公式サイトでは、クラス分類や物体検出といった複数のタスクのサンプルが公開されており、誰でも簡単にエッジ環境でAIモデルを実行できるようになりました。

AIの活用事例の1つに人物検出があります。人物検出AIモデルは、人流計測、侵入検知、混雑検知など、様々な用途に応用可能です。従来の画像による人物検出では、撮影した画像を環境構築済みのPCやクラウドに転送し、AIモデルによる推論を行う必要がありました。しかし、この方式では撮影画像がPCやクラウドに残る可能性があり、プライバシー保護の観点から導入の障壁となっています。

これに対し、Raspi AI Cameraでは、センサ内部でAI処理が完結し、人の検出状況や位置情報のみをメタデータとして転送できるため、プライバシーに配慮した人物検出が実現可能です。

本記事では、Raspi AI Cameraで人物検出を行い、PLCを用いて人物検出状況をパトライトで通知するシステムを構築します。PLCは製造設備のシーケンス制御を行うための専用コンピュータで、製造業を中心に幅広く使用されています。PLCを介した通知方法には様々な選択肢がありますが、本記事では視覚的な理解のしやすさを重視し、動画のようにパトライトの点灯による人物検出情報の通知を実装します。

human_detection_1_edit

人物のモザイク処理については別途実装しています。詳細は記事をご覧ください。

この記事でできること

必要機材

必要機材のリストは以下のとおりです。

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の同封物は写真のとおりです。

AICamera
  • 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を画像のように接続します。

AICamera_connect Raspi_connect

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

Raspi_cable

接続後、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

実行結果は以下のとおりです。画像内のリンゴの検知が正しく行えていることが確認できます。

detection_sample_apple

実装内容

本記事では、物体検出のAIモデルを使用して人物検出を行います。検出結果をOpenPLCで監視し、その結果に応じてパトライトの点灯状態を制御します。具体的には、人物が検出された場合は赤色LEDを点灯させ、人物が検出されない場合は緑色LEDを点灯させます。

システム構成としては以下のとおりです。2つのRaspiについては同一LAN内に接続してください。

system

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

実行結果は以下のとおりです。人物の検出が正しく行えていることが確認できます。(モザイク処理は別途実装)

detection_sample_person_mosaic

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

detection_sample_hand

検出結果の解析

実装の前に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スクリプトの基本的な設定は以下のとおりです。

app.py
#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を呼び出し、人物の検出状況に応じて接点の値を動的に変更します。実装は以下のとおりです。

app.py
# 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にインストールして使用しています。

ladder_1

よりシンプルな以下の構成でも同様の機能が実装可能です。

ladder_2

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

st

OpenPLC Runtime

続いてOpenPLC Runtimeの設定を行います。ここでは実行プログラムの選択、環境設定、Slave Device (OpenPLC Runtime内での表記に準拠) の設定などを行います。インストールは公式サイトを参考にしてください。githubはこちらです。

OpenPLC Runtimeを起動後、<RaspiのIPアドレス>:8080にアクセスすると、ログイン画面が表示されます。初回認証情報は以下のとおりです。

  • username:openplc

  • password:openplc

    OpenPLC_Runtime_Login

設定手順

  1. ハードウェア設定

    Hardwareタブを選択し、OpenPLC Hardware LayerにてRaspberry Piを選択します。これによりRaspberry Pi用のGPIOピン割り当てが設定されます。

    OpenPLC_Runtime_Hardware1.png

  2. プログラムのアップロード

    Programsタブを選択し、実行するプログラムの選択を行います。先ほどOpenPLC Editorで作成した.stファイルを選択し、適当な名前をつけてUpload Programsを実行します。コンパイル完了後、Go to Dashboardと表示されればプログラムのアップロード完了です。

    OpenPLC_Runtime_Programs OpenPLC_Runtime_Program_Upload OpenPLC_Runtime_Program_Compile
  3. 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の接点
    OpenPLC_Runtime_SlaveDevice_Register

    IP PortについてはSettingsタブのModbus Server Portと一致させてください。

    OpenPLC_Runtime_Settings

GPIO設定

RaspiのGPIOは3.3 Vまたは5 Vの低電圧出力のため、より高い電圧を必要とする機器の制御には追加の電源とリレー回路が必要です。今回使用するパトライトは15 V - 24 V駆動のため、24Vリレー回路を構築し、AC - DCスイッチング電源 (24 V設定) を使用します。配線は以下の図のとおりです。

GPIO GPIO_Hardware

実行結果

実際に作成したコードを動かし、人物検出状況に応じたパトライトの点灯制御が正しく機能するかの検証を行います。

実行手順

  1. OpenPLC Runtimeの起動

    Dashboardタブを選択し、Start PLCを押してPLC制御を開始します。

    OpenPLC_Runtime_StartPLC.png

  2. AI Cameraの起動

    コードを取得し、以下のコマンドで実行します。

    sudo python app.py
    

    Modbus通信で使用する502番ポートは特権ポートのため、管理者モードで実行してください。

検証結果

  1. detection_area未設定時

    画像内の人の検出状況に応じてパトライトの点灯が切り替わっていることが確認できます。

    human_detection_1_edit
  2. detection_area設定時

    detection_areaを画像の左半分(赤枠)に設定して実行します。結果を見てわかるとおり、detection_areaに入っていない場合、パトライトは緑色のままであり、detection_areaに入った場合にのみパトライトが赤色に切り替わっていることが確認できます。

    human_detection_2_edit
  3. OpenPLC Runtime内での動作確認

    制御の様子は実際のパトライトの点灯状況だけでなく、OpenPLC Runtime内のMonitoringタブから確認可能です。

    • 人物検出時(LED_Red = TRUE)
    OpenPLC_Runtime_Monitoring2
    • 人物未検出時(LED_Green = TRUE)
    OpenPLC_Runtime_Monitoring1

今回のデモンストレーションでは動作確認用に映像出力を行っていますが、Raspi AI Cameraではメタデータのみの取得も可能です。これにより、画像データを保存せずにプライバシーへ配慮した人物検出システムの構築も可能です。

まとめ

本記事では、RaspberryPi AI CameraとOpenPLCを接続して、人物検出情報をパトライトで通知するシステムを構築しました。PLCは工場設備制御の自動化にも多く使われているため、今回のような人検出タスクだけでなく、幅広いタスクに活用できます。例えば、異常検出を行い異常品が検出された場合にアラートを出すシステムも同様の構成で構築可能です。一方で、異常検知システムの構築において、最大の課題は異常サンプルの収集です。多くのケースで、十分な異常サンプルを用意できないことが導入の障壁となっています。そこでおすすめなのが、BrainBuilderを使用したAIモデルの作成です。BrainBuilderでは正常品の画像50枚程度のみで高精度な異常検出AIモデルの作成が可能です。さらに、GUIツールが用意されているため、AI開発に慣れていない方でも簡単にモデル作成ができます。BrainBuilderについて詳細が知りたい場合はこちらを確認ください。

困った時は

もし、記事の途中でうまくいかなかった場合は、気軽にこの記事にコメントいただいたり、以下のサポートのページもご覧ください。
コメントのお返事にはお時間を頂く可能性もありますがご了承ください。

Support (FAQ)

また、記事の内容以外で AITRIOS についてお困りごとなどあれば以下よりお問い合わせください。

Contact Us

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?