OpenCVとTelegramボットを使用したビデオ監視システムの改善

それがすべて始まった方法



すべては、Raspberryに「スマート」ビデオ監視システムをインストールしたかったという事実から始まりました。



これについては、Habréの記事をいくつか使用したことに注意してください。 投稿してくれた著者に感謝します。 彼らは本当に助けてくれました。



その結果、購入したRaspberry Pi3にLogitech USBカメラをインストールし、Yandex.Diskをマウントし、30秒の頻度で写真を撮影し、Yandex.Diskのフォルダーにコピーしました。

個々のスナップショットからビデオをマウントし、さらにファイルをアーカイブして遊んだので、私は数ヶ月間新しい「おもちゃ」を捨てました。



物語の続き



Raspberryが生産から撤回された間、ソリューションの動作中にYandex.Diskに蓄積された多数の画像をどのように取り除くかという考えに悩まされていました。 実装されたソリューションを最適化したかった...



アイデア



少しグーグルで、私はそのような改善を行いました:Yandex.Diskにコピーすることで、たとえば、ドアが最初に閉じられてから開かれるなど、人物の存在が検出されるか、画像内の画像が変更される画像のみをコピーします。 同時に、Telegramを使用してそのようなイベントが検出されたときに通知を送信します。 メールの代わりに電報が選択されたのは、 リアルタイムのメッセージ配信に加えて、これはファッショナブルです。

Pythonとbashで開発することにしました。



実装



人の存在を検出するために、OpenCVライブラリが選択されました。これは、とりわけ、画像内のオブジェクト(人の顔など)の存在を判別できます。 このライブラリは、多数の機械学習アルゴリズムの実装も提供します。



以下のサンプルPythonコード。 既製のxmlの1つを使用して、顔を決定しました(haarcascade_frontalface_default.xml)。



import cv2 import sys imagePath = sys.argv[1] cascPath = sys.argv[2] faceCascade = cv2.CascadeClassifier(cascPath) image = cv2.imread(imagePath) gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) faces = faceCascade.detectMultiScale( gray, scaleFactor=1.3, minNeighbors=5, minSize=(30, 30), flags = cv2.cv.CV_HAAR_SCALE_IMAGE ) if(len(faces)>0): print("Found {0} faces!".format(len(faces))) else: print("Not found")
      
      





画像の変更を決定することは完全に簡単な作業ではありませんでしたが、Raspberry以外にも、最新バージョンであるPi3があることに注意してください。2つの画像の違い(変更)を識別するには一定の時間がかかります。 インターネットで調べたところ、いくつかの異なる方法が見つかりました。



Pythonで既成のアルゴリズムを使用することをすぐに予約し、必要に応じて少しだけ変更しました。 したがって、私はコードを引用しませんでした。



1. OpenCVライブラリーからの減算機能で開始しました。



 diff=cv2.subtract(img2,img1)
      
      





2. scipyを使用してユークリッド距離とマンハッタン距離を決定しようとしました。

3. PILライブラリで遊んだ。



これらのオプションを試した後、2つの画像間のファイルサイズの差をパーセンテージで決定することに決めました。 この「アプローチ」をシェルスクリプトに実装しました。 この方法は、テストされたものの中で最も生産的であることが判明しましたが、驚くことではありません。 もちろん、これまでのところ高い精度について話す必要はありませんが、私のcronスケジューラーは30秒ごとに定期的に撮影するように設定されているため、差を検出するために余分な7-8秒を許可するのは無駄すぎると考えました。 私はすでに約5秒間、顔の定義を「食べ尽くします」(撮影の低解像度を考慮して)。



以下のシェルスクリプトの小さな断片。



 f1=`stat -c%s "$prev_file"` f2=`stat -c%s "$new_file"` if [[ $f1 -le $f2 ]];then top=$f1 base=$f2 else top=$f2 base=$f1 fi percentage=$(( (100-(100*top / base)) )) echo "Difference is $percentage%" if(($percentage >= $hurdle));then changed=0 echo "Big change" else echo "Small change" fi
      
      





Telegramとの統合



Telegramとの統合については既に説明されています。 必要な手順を実行し、ボットを登録し、トークンを受け取りました。



次に、作成した電報ボットからメッセージを送信する小さなPythonスクリプトを作成しました。 メッセージは、呼び出されたときに指定するスクリプトパラメーターの1つです。



 import sys import telepot bot = telepot.Bot('###############################') #bot.getMe() #from pprint import pprint #response = bot.getUpdates() #pprint(response) #bot.sendMessage(########, 'Alarm from Telegram bot!') bot.sendMessage(########, sys.argv[1])
      
      





決定アルゴリズム



ソリューションのアルゴリズムは、連続して撮影し、受信した画像に変化があるかどうかを分析し、画像内の人物を識別し、変化が検出された場合または顔が検出された場合に特定のメッセージを含むテレグラムボットからメッセージを送信するシェルスクリプトに実装されました。 人または変更が検出された場合、ファイルはYandex.Diskにコピーされます。



以下は、Pythonスクリプトの呼び出しを反映するスクリプトの唯一の部分です。



 #! /bin/bash #... face=$(python face_detect.py "$new_file" haarcascade_frontalface_default.xml 2>&1) echo "$face" if [[ $face != "Not found" ]];then ffound=0 echo "Faces found" else echo "Faces does not found" fi echo "----------" echo "Changes: $changed" echo "Faces found: $ffound" echo "----------" #=====================Processing========================================= now=$(date +"%Y-%m-%d_%H%M") # 1. Copy if [ $changed == 0 ] || [ $ffound == 0 ];then cp "$new_file" "/home/pi/webcam/$now---$new_file" \ && echo "File copied." else echo "All Ok." fi # 2. Rename cd /home/pi \ && mv "$new_file" previous.jpg \ && echo "File renamed." # 3. Send telegram nessage if [ $changed == 0 ] && [ $ffound == 0 ];then python send_telegram.py 'Alarm: Changes & Faces detected!' \ && echo "Alarm: Changes & Faces detected!" elif [ $changed == 1 ] && [ $ffound == 0 ];then python send_telegram.py 'Alarm: Faces detected!' \ && echo "Alarm: Faces detected!" elif [ $changed == 0 ] && [ $ffound == 1 ];then python send_telegram.py 'Alarm: Changes detected!' \ && echo "Alarm: Changes detected!" else echo "Nothing to send." fi #... exit 0
      
      





結果



以下に、ソリューションのいくつかの結果を示します。



1.写真の顔を決定した結果。 彼は写真を添付し​​ませんでした。



画像



画像






2.テレグラムボットからのメッセージ。



画像






3. Yandex.Diskの写真



画像






結論と次のステップ



新しいソリューションをテストすると、いくつかの問題が明らかになりました。



写真に写っている人物の識別と変更管理-微調整が必​​要なもの。 たとえば、ボットが、普通の人が決して顔とは思わない顔を見つけることについてのメッセージを私にスパム送信しないように、これをいじる必要があります。



一般に、本番でアイデアを立ち上げるために残っているものはほとんどありません。



1.赤外線カメラをインストールします。

2.信頼できる変更管理方法を選択します。

3.そしてもちろん、写真の顔検出パラメーターを設定します。



ソリューションのさらなる研究/テストは継続されます...



All Articles