Safie Engineers' Blog!

Safieのエンジニアが書くブログです

屋外向けAIカメラを開発しました

こんにちは。Safieの画像認識チームでサブグループリーダーをしている柏木です。

今回は私が主担当としてAIアプリ開発に携わった、エッジAI搭載屋外向けクラウド録画カメラについて紹介します。

プレスリリースはこちらにあります。興味のある方はご覧ください。

エッジAI搭載屋外向けクラウドカメラについて

本製品は人物検出を行うAIアプリが搭載されたAIネットワークカメラで、i-PRO(アイプロ)株式会社(以下i-PRO)と共同開発したものです。i-PRO株式会社はパナソニックの技術を引き継いで2019年に設立した会社で、ネットワークカメラやセキュリティシステムの開発と販売を行っています。

今回i-PROのカメラにセーフィー独自のファームウェアおよびアプリを搭載することで、特別仕様のカメラの開発を行いました。

開発中のカメラ

こちらのカメラにはAI-App 人数カウント(旧名: Store People Detection Pack)が搭載されています。AI-App 人数カウントはSafie Oneで搭載されていたアプリであり、カメラに映る人物の検知や、UI上で設定したラインを通過する人数のカウントを行うことができます。技術的な詳細については過去のブログにまとまっています。本アプリに興味がある方はご覧ください。

アプリ開発上の違い

i-PROのカメラにおけるAI-App 人数カウントの開発は、Safie Oneで元々搭載していたアプリを移植した形になります。カメラが変わったことによるアプリの一番大きな違いは、Object Detection(物体検出)です。以下がアプリのシステム全体の構成です。

SafieOneとi-PRO、双方ともコードの大部分はC++で書かれており、これらに違いはあまりありません。特にTrackingとEvent Publishmentはほとんどそのままのコードで動作しました。

しかし、2つの機種ではカメラに搭載しているAIチップが異なります。SafieOneではQualcomm製のチップを搭載しており、SNPE (Snapdragon Neural Processing Engine) SDKというSDKを利用することでチップでの推論が可能となっていました。一方、i-PROではambarella社のチップを搭載しており、i-PROの提供している独自SDKを利用して開発をする必要がありました。

SNPEとi-PROのSDKで、機能面での違いはそこまで大きくないです。しかし細かい仕様の違いは結構ありました。具体的は以下の面で違いがありました。

  • モデル変換ツール

SNPEは独自形式への変換と量子化をステップごとに実行可能

i-PROは独自形式への変換と量子化がセット

  • モデル読み込み

SNPEはモデルをポインタで読み込む

i-PROはパスを指定し、ファイルを読み込む

  • 前処理の組み込み

SNPEは前処理があまり用意されていない

i-PROは一部前処理を組み込み可能

実装上の工夫

今回のアプリ開発はAI-App 人数カウントの移植だったため、実装上は大部分がSafie Oneのアプリと同じものでした。そこで、アプリのコードはi-PRO用に新規作成することはせず、SafieOneと同じコードで必要な箇所だけ分岐することにしました。

こうすることで保守コストを抑えることができます。例えばTrackingアルゴリズムの改修をする際はSafie Oneとi-PROの双方で適用することができます。

AI-App 人数カウントは、Make時にカメラ機種に応じてビルドタイプを変更してビルドしております。そこで機種で共通のIDetectorという検出用のInterfaceを作成し、機種専用のYoloV5がそれを継承する実装としました(今回の検出器ではYoloV5を用いています)。機種ごとに読み込むYoloV5のコードが格納されているディレクトリを分けることで実現していまます。

こうすることで、機種ごとの違いを意識せずにDetectorを扱うことができます。

classDiagram
    IDetector <|.. YoloV5_SafieOne
    IDetector <|.. YoloV5_iPro
class IDetector{
            + void Detect()
}
class YoloV5_SafieOne{
            - void preprocess
            + void Detect()
}
class YoloV5_iPro{
            - void preprocess
            + void Detect()
}

独自データセットによる学習

学習モデルは屋外向けに再学習しました。屋内をターゲットとしているSafieOneと、屋外を対象としているi-PROでは、同じアプリでも検出するシーンが異なります。SafieOneでは屋内に特化したオリジナルデータセットを作成して学習していました。以下の画像のようなものをイメージしていただければと思います。

屋内データセットのイメージ

一方で屋外では以下の画像のようなイメージです。そこで、屋外においても独自に新しく画像を収集し、データセットを作成しました。屋外では背景が屋内と比較して乱雑でシーンが多様であるため、検出がやや難しくなります。今回は、本カメラが設置されるであろうシーンをいくつか選定し、それらのシーンに注力したデータセットを作成・学習しました。

屋外データセットのイメージ(APhotoより)

屋内データセット、屋外データセットそれぞれに対して、屋内用モデル・屋外用モデルで評価を行いました。PR曲線などの評価指標では大きな改善となりました。以下に結果を載せておきます。

屋内データセットに対するPR曲線

屋外データセットに対するPR曲線

屋内データセットでは大きな劣化はなく、屋外データセットにおける精度向上が見込めました。

もちろん評価ではPR曲線のような物体検出の評価だけではなく、設定したラインやエリアを通過する人数のカウント精度や人検知精度など、アプリのEnd-to-Endな評価も行っております。

今後は実際に製品を使っていただいたお客様の声や、データをもとにさらなる精度改善を行う予定です。

終わりに

屋外向けAIカメラの開発について紹介しました。複数のカメラを扱っている、セーフィーならではのEdgeAIの開発の話をしたつもりです。これをきっかけに興味を持っていただければ嬉しいです。

セーフィーではエンジニアを積極的に募集しています。どのような職種があるのか気になる方はこちらをご覧ください。カジュアル面談から受け付けておりますので、気軽に応募いただければと思います。

© Safie Inc.