总结一下大作业罢
总算是告一段落了,累似我了
先介绍一下:这玩意是自动买水果柜子,和学校楼下的小嗨机差不多。扫码登录后点击开门。然后就开门了。然后是用手从里面拿水果出来并关门,然后识别你拿出来了什么东西,生成订单上传到后端上。
整体架构
flowchart LR
springboot --> |传递数据库信息|vue
vue -->|发出请求|springboot
vue --> |可视化信息|用户
树莓派 --> |http|springboot
springboot --> |阿里云mqtt|树莓派
树莓派实现
订单计算步骤
flowchart TD
等待后端信息 --> |结构为command:...,data:...|id1{命令是否为open}
id1{命令是否为open} --> |是|开始录像
检测到关门-->结束录像
开始录像 -->结束录像
结束录像-->选取视频的首帧和尾帧
选取视频的首帧和尾帧-->计算售出的水果数量和种类
YOLO-->计算售出的水果数量和种类
计算售出的水果数量和种类-->生成订单
生成订单-->上传到后端
水果异常检测
flowchart TD
定时触发 --> 获取传感器信息
获取传感器信息 -->|硫化氢、烟雾、温湿度|sklearn推理
sklearn推理-->|含量是否有问题|上传到后端
定时触发-->YOLO
YOLO-->|水果画框后裁剪的图像|vgg16
vgg16-->|是否有腐烂位置|上传到后端
技术栈
前端
基于vue3框架,使用element-plus组件库。
后端
基于javaspringboot框架,mysql数据库,redis,mybatis-plus。
边端
- 视觉模型为yolov11,转换为onnx格式,使用opencv-python部署
class Yolofruit():
def __init__(self):
modelpath =yaml.safe_load(open('./init.yaml', 'r'))['YOLO']['model_path']
Inshape =yaml.safe_load(open('./init.yaml', 'r'))['YOLO']['In_shape']
self.net = cv2.dnn.readNetFromONNX(modelpath)
self.in_h=Inshape[1]
self.in_w=Inshape[2]
def getPred(self,frame,conf=0.5,iou=0.45):
blob=cv2.dnn.blobFromImage(frame,1/255.0,(self.in_h, self.in_w),(20,30,40),True,False)
self.net.setInput(blob)
pred:np.ndarray = self.net.forward()[0].T
pred = detect_postprocess(pred,[self.in_w,self.in_h],frame.shape[0:2],conf,iou)
return pred
def draw(self,frame,preds):
for pred in preds:
cv2.rectangle(frame, (int(pred[0]),int(pred[1])), (int(pred[2]),int(pred[3])), colors[pred[4:].argmax()], 2) # 添加颜色和线宽参数
cv2.putText(frame, fruits[pred[4:].argmax()], (int(pred[0]), int(pred[1]) - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, colors[pred[4:].argmax()], 2)
return frame
- 信息接收的方式为阿里云物联网平台,调用库
linkkit和paho-mqtt实现,注意!paho-mqtt的版本不能大于1.6.1。 - 上传信息到后端的方式采用了库
requests,牛魔的不想用mqtt了,还是http简单爽。
tm我就该用websocket的
资源
- 阿里云物联网平台
- 阿里云ecs服务器2核2G
- 阿里云域名服务
- 七牛云对象存储
- 七牛云deepseek的api服务
- 宝塔面板部署服务
后台管理系统
库存管理
订单查询
销售统计
异常状态
实物图
没有这种东西,忘记拍了
评论