📘

AIさんに手伝ってもらって、侵入検知

2024/06/29に公開

はじめに

前回の思い付きで日本語をしゃべらすアプリを作ったけど、調子に乗って、今度はパソコンについてるカメラを使用して侵入検知できるアプリを作れないか、を思いついて作ってみた。

AIさんに聞いてみた

今回はChatGPTを使用

固定カメラからの映像を解析して、人の侵入を検知するようなシステムを検討しています。どういったアプリケーションが必要ですか?

回答は以下

人の侵入を検知するためのシステムを構築するには、以下のようなアプリケーションと技術が必要です。
1.カメラハードウェア
2.ビデオ管理ソフトウェア (VMS)
3.侵入検知アルゴリズム
4.データ処理と分析プラットフォーム
...

もちろん各項目毎に詳細に教えてもらえました。今回は、「侵入検知アルゴリズム」について、さらに聞きたかったので、再度質問してみました。

侵入検知アルゴリズムについて詳しく説明してください

いくつかの検知の方式について、詳細に説明してもらえました。どれも知らない技術で、これだけでも勉強になるんですが、知らない中で適当にYOLOという方法に決めました。
このYOLO方式について再度質問で理解を深めます。

YOLOをC#で使用するサンプルを教えて

回答は、

YOLO(You Only Look Once)は、リアルタイムの物体検出を行うための人気のあるディープラーニングモデルです。C#でYOLOを使用するには、通常、YOLOの実装をC#で利用できる形にするために、ラッパーライブラリやバインディングを使用します。最も一般的な方法の一つは、YOLOv4のラッパーライブラリであるAlturos.Yoloを使用することです。

実装

これ以降にソースも教えてくれています。必要なNugetパッケージについても記載があって、とっても親切です。

dotnet add package OpenCvSharp4
dotnet add package OpenCvSharp4.runtime.windows
dotnet add package Alturos.Yolo --version 2.3.1

ChatGPTさんが言うには以下の3つのファイルをダウンロードして、プロジェクトと同じ場所に置く必要があるそうです。

weights: https://pjreddie.com/media/files/yolov3.weights
cfg: https://github.com/pjreddie/darknet/blob/master/cfg/yolov3.cfg
coco.names: https://github.com/pjreddie/darknet/blob/master/data/coco.names

あるあるですが、最初のコードでは動作しなかったんですが、出たエラーを記載して、「修正して」って頼むと、直してくれます。
最終的には以下のコードでした。

using System;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Alturos.Yolo;
using Alturos.Yolo.Model;
using OpenCvSharp;


namespace ConsoleApp2
{
    internal class Program
    {
        static void Main(string[] args)
        {
            //Console.WriteLine("Hello, World!");

            // YOLOの設定ファイル、重み、クラス名ファイルのパスを指定
            string configFilePath = @"yolov3.cfg";
            string weightsFilePath = @"yolov3.weights";
            string namesFilePath = @"coco.names";

            var yoloConfig = new YoloConfiguration(configFilePath, weightsFilePath, namesFilePath);
            var yoloWrapper = new YoloWrapper(yoloConfig);

            // カメラキャプチャの初期化
            using var capture = new VideoCapture(0); // カメラID 0 (デフォルトカメラ)

            if (!capture.IsOpened())
            {
                Console.WriteLine("カメラを開けませんでした。");
                return;
            }

            using var window = new Window("YOLO Object Detection");
            var frame = new Mat();

            while (true)
            {
                // フレームをキャプチャ
                capture.Read(frame);

                if (frame.Empty())
                {
                    break;
                }

                // フレームをバイト配列に変換
                var imageData = frame.ToBytes(".jpg");

                // 物体検出を実行
                var items = yoloWrapper.Detect(imageData);

                // 検出結果をフレームに描画
                foreach (var item in items)
                {
                    var rect = new OpenCvSharp.Rect(item.X, item.Y, item.Width, item.Height);
                    Cv2.Rectangle(frame, rect, Scalar.Red, 2);
                    Cv2.PutText(frame, item.Type, new OpenCvSharp.Point(item.X, item.Y - 10), HersheyFonts.HersheySimplex, 1, Scalar.Red, 2);
                }

                // フレームを表示
                window.ShowImage(frame);

                // 1ミリ秒待機して、キー入力を確認
                if (Cv2.WaitKey(1) >= 0)
                {
                    break;
                }
            }

            yoloWrapper.Dispose();
        }
    }
}

ノートパソコンのカメルを使用して、移った物を赤枠で囲って、何かを記載してくれています。
CPU使用率が半端なく上がるほど、大変な処理みたいです。
意味分かってないんですが、なんか遊べそうな物が出来ました。
カメラに映った人を認知出来るので、もう少し作りこめば侵入検知といった用途にも使えると思います。

つづく

https://zenn.dev/maedan/articles/d6888e0a29ee55

Discussion