LoginSignup
0
1

More than 3 years have passed since last update.

停まれ標識検知 可視化部分の開発part4 物体を検知した時にソケット通信を使って音声で知らせる(複数編)

Posted at

前回まで

前回はスマホに絞って椅子を検知した時に音声で知らせるためのプログラムを書きました.しかし,本以外のものを検知したとしてもそれを知らせることは前回のプログラムではできませんでした.なので今回はスマホじゃないものを検知した時も知らせることができるようにしようというプログラムになります.

今回実装した機能

Yolov5上で物体を検知した時➡ソケット通信をする.➡ソケット通信を受けたときに音声を再生する.
※ただこれだけをやっています.今回は複数のものに対応できるようになっています.

実装部分

(ソケット通知部分を関数にしました)

detect.py
def socket1():
    host = "192.168.10.4" #Processingで立ち上げたサーバのIPアドレス
    port = 10001       #Processingで設定したポート番号
    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())

def socket2():
    host = "192.168.10.4" #Processingで立ち上げたサーバのIPアドレス
    port = 10001       #Processingで設定したポート番号
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s2:
                         s2.connect(('127.0.0.1', 50007))
                         BUFFER_SIZE=1024
                         data1='2'
                         s2.send(data1.encode())
                         print(s2.recv(BUFFER_SIZE).decode())

(認識部分)

detect.py
                    if label1=="cell phone":
                     print("スマホを発見しました")
                     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("本を発見しました")
                     socket2()
                     with open('daystext/'+str(d_today)+'.txt', 'a') as f:
                         dt_now = datetime.datetime.now()
                         f.write(str(dt_now)+"本を発見しました"+"\n")

サーバ部分

server.py
# 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(('127.0.0.1', 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')

※これらのコードは全部もしくは一部を載せています.

問題点

socketを送ったときに2回送ってしまう仕様になっていて,二回しゃべってしまうことになっています.ここを今後改善していくことが課題です.

次回へ

・今回のプログラムは問題点も残すことになりましたので今後課題に向けて解決していくためにプログラムを改善していく必要があります.なのでこれについては今後も改善する為のプログラムを書いていくつもりです.
・このシステムを停まれ標識検知に適応させて,より良いシステムを開発していくために,GPSとの連携をしていこうと考えています.
次回はこの辺について書いていくつもりですが,次回は少し重くなりそうなので更新が少し途切れるかもしれませんが宜しくお願いします.

0
1
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
1