0 前言
这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。
为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是
基于Stm32的家庭智能监控系统
学长这里给一个题目综合评分(每项满分5分)
- 难度系数:3分
- 工作量:4分
- 创新点:4分
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_indexfor 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 numpybbox_pred = bbox_pred.data.cpu().numpy()iou_pred = iou_pred.data.cpu().numpy()prob_pred = prob_pred.data.cpu().numpy()
并且通过 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 {.....@Autowiredprivate MqttTransportContext context;@PostConstructpublic 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();}}
5 最后
项目分享与指导:https://gitee.com/sinonfin/sharing