• 【毕业设计】 基于Stm32的家庭智能监控系统 - 单片机 图像识别 人体检测 AI



    0 前言

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。

    为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是

    🚩 基于Stm32的家庭智能监控系统

    🥇学长这里给一个题目综合评分(每项满分5分)

    • 难度系数:3分
    • 工作量:4分
    • 创新点:4分

    🧿 选题指导, 项目分享:

    https://gitee.com/dancheng-senior/project-sharing-1/blob/master/%E6%AF%95%E8%AE%BE%E6%8C%87%E5%AF%BC/README.md


    1 简介

    结合低功耗AI芯片以及移动网络,将人员/物体检测模型部署到设备端,达到较低功耗、实时响应、节省流量的效果。

    2 主要器件

    • 主控芯片使用勘智K210
    • 摄像头 OV7740
    • 数据传输使用 4G模块 EC20 或者 2G模块 SIM800C;

    3 实现效果

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    4 设计原理

    主模块原理图
    在这里插入图片描述

    设备端运行 FreeRTOS + LWIP

    LWIP协议栈支持的主要功能如下所示,本文将具体介绍各个协议的具体功能。
    在这里插入图片描述
    部分移植过程

    修改修改cc.h文件
    在这里插入图片描述

    修改sys_arch.c文件

    在这里插入图片描述

    通过PPPOS驱动4G模块

    LTE Standard EC20 R2.1是移远通信推出的 LTE Cat 4 无线通信模块,采用 LTE 3GPP Rel.11 技术,支持最大下行速率 150Mbps 和最大上行速率 50Mbps,使用LCC封装。
    在这里插入图片描述
    在这里插入图片描述

    系统启动后会加载 yolov2-tiny 模型

    yolov2网络结构图
    在这里插入图片描述

    YOLOv2相对v1版本,在继续保持处理速度的基础上,从预测更准确(Better),速度更快(Faster),识别对象更多(Stronger)这三个方面进行了改进。其中识别更多对象也就是扩展到能够检测9000种不同对象,称之为YOLO9000。

    #部分代码
    def test_net(net, imdb, max_per_image=300, thresh=0.5, vis=False):
        num_images = imdb.num_images
    
        # all detections are collected into:
        #    all_boxes[cls][image] = N x 5 array of detections in
        #    (x1, y1, x2, y2, score)
        all_boxes = [[[] for _ in range(num_images)]
                     for _ in range(imdb.num_classes)]
    
        # timers
        _t = {'im_detect': Timer(), 'misc': Timer()}
        det_file = os.path.join(output_dir, 'detections.pkl')
        size_index = args.image_size_index
    
        for i in range(num_images):
    
            batch = imdb.next_batch(size_index=size_index)
            ori_im = batch['origin_im'][0]
            im_data = net_utils.np_to_variable(batch['images'], is_cuda=True,
                                               volatile=True).permute(0, 3, 1, 2)
    
            _t['im_detect'].tic()
            bbox_pred, iou_pred, prob_pred = net(im_data)
    
            # to numpy
            bbox_pred = bbox_pred.data.cpu().numpy()
            iou_pred = iou_pred.data.cpu().numpy()
            prob_pred = prob_pred.data.cpu().numpy()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    并且通过 MQTT 协议接入后端服务器; 摄像头线程读取图像信息,处理后发送到K210内置的卷积神经网络加速器,得出 yolov2-tiny 的预测结果,如果存在超过预定分类阈值的结果,则通过 MQTT 协议发送到后端。

    后端Thingsboard

    后端服务器基于 Thingsboard 进行开发,实现图像信息展示以及设备固件OTA功能。
    ThingsBoard 是一个基于Java的开源的物联网平台,用于数据收集、处理、可视化和设备管理。它使用物联网行业的标准协议(MQTT、CoAP和HTTP)实现设备连接,并支持云和本地部署。 ThingsBoard 具有可扩展性、容错性和高性能,因此永远不会丢失数据。
    Thingsboard 基本特点

    • 提供设备、资产和客户,并定义它们之间的关系。
    • 警报管理:分析传入的遥测数据并通过复杂的事件处理触发警报。
    • 设备管理:使用远程过程调用(RPC)控制设备。根据设备生命周期事件,REST API 事件,RPC 请- 求等构建工作流
    • 可扩展性:可水平扩展的平台,使用领先的开源技术进行构建。
    • 数据可视化: 从设备和资产收集并可视化数据。提供了现成的30个可配置小部件,并能够使用内置编辑器创建自己的小部件。内置线图,数字和模拟仪表,地图等等。
    • 容错:没有单点故障,集群中的每个节点都是相同的。没有主人工人或热备用人员。自动检测到节点故障。可以在不停机的情况下更换故障节点。使用可靠的 NoSQL 数据库复制持久数据。
    • 强大而高效:单个服务器节点可以处理成千上万个设备,具体取决于用例。ThingsBoard 集群可以处理数百万个设备。
    • 可自定义的:通过可自定义的小部件和规则引擎节点,轻松添加新功能。使用可自定义的规则链,窗口小部件和传输实现来扩展默认平台功能。除了MQTT,CoAP和HTTP支持之外,ThingsBoard用户还可以使用自己的传输实现或自定义现有协议的行为。
    • 持久:永远不会丢失您的数据。
    • 遥测数据收集功能: 设计动态且响应迅速的仪表板,并向您的客户提供设备或资产遥测和见解。可以可靠地收集和存储遥测数据,以应对网络和硬件故障。使用可自定义的Web仪表板或服务器端API访问收集的数据。

    部分相关代码

    public class MqttTransportService {
    	.....
    
        @Autowired
        private MqttTransportContext context;
    
        @PostConstruct
        public void init() throws Exception {
            log.info("Setting resource leak detector level to {}", );
          ResourceLeakDetector.setLevel(ResourceLeakDetector.Level.valueOf(leakDetectorLevel.toUpperCase()));
    
         
            b.group(bossGroup, workerGroup)
                    .channel(NioServerSocketChannel.class)
                    .childHandler(new MqttTransportServerInitializer(context))
                    .childOption(ChannelOption.SO_KEEPALIVE, keepAlive);
            }
        .....
    }
    
    
    private void processDevicePublish(ChannelHandlerContext ctx, MqttPublishMessage mqttMsg, String topicName, int msgId) {
        try {
            if (topicName.equals(MqttTopics.DEVICE_TELEMETRY_TOPIC)) {
                TransportProtos.PostTelemetryMsg postTelemetryMsg = adaptor.convertToPostTelemetry(deviceSessionCtx, mqttMsg);
                transportService.process(sessionInfo, postTelemetryMsg, getPubAckCallback(ctx, msgId, postTelemetryMsg));
            } else if (topicName.equals(MqttTopics.DEVICE_ATTRIBUTES_TOPIC)) {
                TransportProtos.PostAttributeMsg postAttributeMsg = adaptor.convertToPostAttributes(deviceSessionCtx, mqttMsg);
                transportService.process(sessionInfo, postAttributeMsg, getPubAckCallback(ctx, msgId, postAttributeMsg));
            } 
            ...
            } else {
                transportService.reportActivity(sessionInfo);
            }
        } catch (AdaptorException e) {
            log.warn("[{}] Failed to process publish msg [{}][{}]", sessionId, topicName, msgId, e);
            log.info("[{}] Closing current session due to invalid publish msg [{}][{}]", sessionId, topicName, msgId);
            ctx.close();
        }
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    🧿 选题指导, 项目分享:

    https://gitee.com/dancheng-senior/project-sharing-1/blob/master/%E6%AF%95%E8%AE%BE%E6%8C%87%E5%AF%BC/README.md

    5 最后

  • 相关阅读:
    安全渗透测试之网络基础知识(IP地址)
    7.7 网络(一)
    从文件加密到到视频文件进度条播放揭秘
    JPA Buddy指南
    求助,有关Kriging 代理模型相关问题
    传统架构应用快速横向扩容PK容器!
    分数阶混沌系统李雅普指数和分岔图
    如何使用windbg查看C#某个线程的栈大小 ?
    【数据结构】字符串匹配(kmp算法)
    黑马-设计模式-笔记(未完)
  • 原文地址:https://blog.csdn.net/m0_71572576/article/details/126246634