##前回まで
前回実装した機能は以下のものになります.
Yolov5上で物体を検知した時➡ソケット通信をする.➡ソケット通信を受けたときに音声を再生する.(複数)
##今回実装する機能
今までの実装で,音での可視化は可能でしたが実際のものを可視化することはできませんでした.
逆にカメラ映像を見ていればわかるだろという話もありますが...なので今回はあまり意味がないと思われる方もいる機能かもしれませんが,認識したものを可視化するプログラムについて述べていきたいと考えています.
##なぜこの機能を実現するのか
これは後々web上での可視化を行いたいと考えているので,その時にソケットで飛ばせるようにこの機能を実現しました.
##実装について
今回はソケット通信の部分を関数化したのでそこについてもちらっと載せていきます.内容はpart3とかpart4とかで書いています.
###socket部分
クライアント部分
def socket1():
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s2:
s2.connect(('127.0.0.1', 50007))
BUFFER_SIZE=1024
data1='1'
s2.send(data1.encode())
print(s2.recv(BUFFER_SIZE).decode())
ここの関数は認識するものが増えたらsocketの後の数字だけ増やしてdata='1'の部分の数字を変えることで認識するものが増えても対応できます.
# socket サーバを作成
from playsound import playsound
import socket
cont=1
# AF = IPv4 という意味
# TCP/IP の場合は、SOCK_STREAM を使う
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
# IPアドレスとポートを指定
s.bind(('', 50007))
# 1 接続
s.listen(1)
# connection するまで待つ
while True:
# 誰かがアクセスしてきたら、コネクションとアドレスを入れる
conn, addr = s.accept()
with conn:
while True:
# データを受け取る
data = conn.recv(1024)
if not data:
break
else:
data2=str(data)
data3=(data2.replace('b', ''))
conn.sendall(b'Received: ' + data)
if data3 == "'1'":
playsound('2.wav')
if data3 == "'2'":
playsound('3.wav')
認識部分
if label1=="cell phone":
print("スマホを発見しました")
cv2.imwrite('sumaho.jpg',im0)
img = cv2.imread('sumaho.jpg')
cv2.imshow('sumaho', img)
socket1()
with open('daystext/'+str(d_today)+'.txt', 'a') as f:
dt_now = datetime.datetime.now()
f.write(str(dt_now)+"スマホを発見しました"+"\n")
if label1=="book":
print("本を発見しました")
cv2.imwrite('book.jpg',im0)
img = cv2.imread('book.jpg')
cv2.imshow('book', img)
socket2()
with open('daystext/'+str(d_today)+'.txt', 'a') as f:
dt_now = datetime.datetime.now()
f.write(str(dt_now)+"本を発見しました"+"\n")
サーバ部分はdata3="'1'"の数字の部分を変えてif文を増やすことで対応できます.
###可視化部分
img = cv2.imread('sumaho.jpg')
cv2.imshow('sumaho', img)
このコードをif label1=="":後に埋め込むことで実現できます.
##最後に
今までpart5まで書いてきて録画機能以外はyolov5で実現したい機能をほぼ実現してきましたのでとりあえずyolov5部分を終了にしたいと思います.次は可視化web部分を作っていけたらいいなと思っています.
もしなんか実現できそうな機能を思いついたらこの記事を書きますので連続投稿はこれで終了になります.