从零开始完成YOLOv5目标识别(八)在客户端集成MQTT通信完成目标识别的实时上传

部分往期文章

​​​​​​从零开始完成YOLOv5目标识别(七)一种完成目标计数的简单方法​​​​​​

从零开始完成YOLOv5目标识别(六)用接续训练完成大规模数据集训练(以FLIR为例)

目录

一、架设EMQ服务器

1. 发布信号

2. 在EMQ服务器上监听

二、在YOLOv5目标识别模型中整合MQTT通信功能

1. 修改函数

2. 功能验证


MQTT通信协议暂时不论,本文主要记录在前文模型中集成MQTT的应用过程。

一、架设EMQ服务器

1. 发布信号

本文采用的是EMQX开源的社区版:官方网站

下载Windows版本的压缩包,本文的版本是v4.3

进入解压的emqx文件夹-》打开cmd执行:

cd bin
emqx start

访问IP:127.·0.0.1;端口:1883

默认用户名:admin;默认密码:public

运行EMQ的测试代码(如果没有paho包的需要提前pip):

# import random
import time

from paho.mqtt import client as mqtt_client


broker = '127.0.0.1'
port = 1883
topic = "testmqtt"
# generate client ID with pub prefix randomly
# client_id = f'python-mqtt-{random.randint(0, 1000)}'
client_id = f'python-mqtt-1'


def connect_mqtt():
    def on_connect(client, userdata, flags, rc):
        if rc == 0:
            print("Connected to MQTT Broker!")
        else:
            print("Failed to connect, return code %d\n", rc)

    client = mqtt_client.Client(client_id)
    client.on_connect = on_connect
    client.connect(broker, port)
    return client


def publish(client):
    msg_count = 0
    while True:
        time.sleep(1)
        msg = f"messages: {msg_count}"
        result = client.publish(topic, msg)
        # result: [0, 1]
        status = result[0]
        if status == 0:
            print(f"Send `{msg}` to topic `{topic}`")
        else:
            print(f"Failed to send message to topic {topic}")
        msg_count += 1


def run():
    client = connect_mqtt()
    client.loop_start()
    publish(client)


if __name__ == '__main__':
    run()

若能连接成功则返回:

从零开始完成YOLOv5目标识别(八)在客户端集成MQTT通信完成目标识别的实时上传_第1张图片

 

2. 在EMQ服务器上监听

在监听之前先启用所有模块:

从零开始完成YOLOv5目标识别(八)在客户端集成MQTT通信完成目标识别的实时上传_第2张图片

若连接成功则显示客户端:

从零开始完成YOLOv5目标识别(八)在客户端集成MQTT通信完成目标识别的实时上传_第3张图片

 统计分析-》日志追踪-》新建-》名称:undefined;clientID:python-mqtt-1-》操作-》查看:

若以上功能全部实现则EMQ的调试结束

二、在YOLOv5目标识别模型中整合MQTT通信功能

本文旨在向服务器上传前文的目标计数结果:

从零开始完成YOLOv5目标识别(六)用接续训练完成大规模数据集训练(以FLIR为例)理论上在进行目标识别的同时连接服务器并上传数据需要利用python多线程,但我在尝试了asyncio和QTread后依然无法避免软件前端假死,遂放弃多线程方案,改用在YOLOv5目标识别方法中集成通信功能。(当然也可以理解成是我编程能力不过关采取的下策)

1. 修改函数

定义全局变量:

broker = '127.0.0.1'
port = 1883
topic = "testmqtt"
client_id = f'python-mqtt-1'

 新建负责连接mqtt服务器的信号与槽函数:

def button_mqtt(self):
        def connect_mqtt():
            def on_connect(client, userdata, flags, rc):
                if rc == 0:
                    print("Connected to MQTT Broker!")
                else:
                    print("Failed to connect, return code %d\n", rc)

            self.client = mqtt_client.Client(client_id)
            self.client.on_connect = on_connect
            self.client.connect(broker, port)
            return self.client
        def run():
                self.client = connect_mqtt()
                self.client.loop_start()
        run()

在目标检测的方法中进行修改:

            for i, det in enumerate(pred):
                if det is not None and len(det):
                    
                    #锚框计数功能
                    count=1
                    for *xyxy, conf, cls in reversed(det):
                        c=int(cls)
                        label='%s %d' % (self.names[int(cls)],count)
                        name_list.append(self.names[int(cls)])
                        
                        single_info = plot_one_box(xyxy, showimg, label=label, color=self.colors[int(cls)], line_thickness=1)
                        count+=1
                        self.info_show = '%d %s \n' % (count-1,self.names[int(cls)])
                    num=count-1

                    if num>=2:
                        msg = f"messages: {self.info_show}"
                        result = self.client.publish(topic, msg)
                        # result: [0, 1]
                        status = result[0]
                        if status == 0:
                            print(f"Send `{msg}` to topic `{topic}`")
                        else:
                            print(f"Failed to send message to topic {topic}")
                    
        return  self.info_show
        return  num

新增的功能为:当YOLOv5识别的目标大于等于2时,向服务器发送textBrowser中的内容。

其余方法具体功能和变量本文不再详述,请参考前几期系列文章。

2. 功能验证

启动客户端连接EMQ-》加载权重-》调用摄像头

当目标小于2时客户端不会上传识别结果:

从零开始完成YOLOv5目标识别(八)在客户端集成MQTT通信完成目标识别的实时上传_第4张图片

 当目标大于等于2时上传结果:

从零开始完成YOLOv5目标识别(八)在客户端集成MQTT通信完成目标识别的实时上传_第5张图片

 在EMQ服务器上进行查看:

从零开始完成YOLOv5目标识别(八)在客户端集成MQTT通信完成目标识别的实时上传_第6张图片

 只收到了目标大于等于2之后的消息,功能实现。

你可能感兴趣的:(Yolov5,深度学习,python,pytorch,目标检测,计算机视觉)