摘要
本项目主要基于树莓派5开发了一套智能穿搭识别与情感互动系统。通过对使用者的拍照,以及对季节、天气、时间等的识别,调用豆包大语言模型API生成个性化的夸奖语句,并且根据当时具体情况进行个性化的穿搭建议,在为用户提供正向情绪反馈的同时提高用户穿搭审美,给予穿搭建议。核心创新:通过AI来对人们的日常生活进行帮助,提供人们情绪及价值,让AI更好的帮助人类。
项目背景
问题源起
在现代社交生活中,人们越来越注重穿搭表达,虽然人们的社交联系越来越多,但缺乏即时、真诚的反馈。传统社交平台反馈延迟,而且几乎难以给用户提供情绪价值。
AI大模型主要以文字形式进行与用户进行聊天,但其与用户在现实生活中的互动较少。
现在AI更多的被用于对高难度问题的解答上,却缺乏对于人们日常生活的关注。
技术机遇
系统特性
| 特性 | 描述 |
| 实时识别、交流 | 通过拍摄实时照片,与用户多媒体互动,本地总结画像,定制化夸奖与穿搭建议并实时播放 |
| 智能夸奖 | 通过豆包API与随机生成的提示词,基于具体衣物进行个性化的情感反馈,使夸奖不会千篇一律 |
| 自动拍照 | 使用运动检测参数并计算帧间差异,判断用户静止时进行自动拍照 |
| 与环境相结合 | 节日、时间段特别夸奖(通过prompt),根据天气与地区数据提供穿搭建议 |
| 对特征tag的提取与记录 | 用记录的特征tag形成用户画像,并生成个性化建议 |
硬件要求
必要:
可选:
快速开始
下载mainForPi.py到树莓派,填写文件中API,python3 mainForPi.py一键运行。
代码解释(配合.py文件食用)

1. 实时音频流播放器模块StreamAudioPlayer(将音频数据块加入队列,并使用双端队列实现先进先出,对音频流进行处理并播放)
初始化方法init:
- 设置采样率(默认24000)
- 初始化一个双端队列(deque)用于存储音频数据块
- 设置播放状态为False,表示当前没有在播放
- 初始化播放线程为None
- 初始化Pygame的mixer(设置频率为给定的采样率)
add_audio_chunk方法:
start_playback方法:
_playback_worker方法(工作线程):
将is_playing设置为True,表示开始播放
进入循环,只要音频队列中有数据或者is_playing为True(允许在队列空时等待新数据)就继续
如果队列中有数据,则取出一个音频数据块(从左端取出)
创建一个BytesIO内存缓冲区来存放音频数据,因为Pygame的Sound对象需要文件类对象或缓冲区
使用pygame.mixer.Sound加载音频数据并播放
然后使用pygame.mixer.get_busy()检查是否正在播放,如果正在播放则等待(每次等待10毫秒)直到播放完成
如果出现pygame.error,则打印错误
最后关闭内存缓冲区
如果队列为空,则等待50毫秒,避免空循环占用CPU
stop方法:
将is_playing设置为False,停止播放循环
如果播放线程还在运行,则等待线程结束(最多等1秒)
然后调用pygame.mixer.quit()退出mixer
2. 智能运动检测系统MotionDetectionSystem(在这里设计了一个状态机,通过检测明显运动判断是否有人进入,通过识别微小运动以判断用户是否静止,通过检测极细微变化来检测用户石否离开)
状态管理:定义了5个状态:
- WAITING_FOR_PERSON: 等待人物进入
- PERSON_ENTERED: 人物进入
- PERSON_STILL: 人物静止
- PROCESSING: 处理中
- WAITING_FOR_LEAVE: 等待人物离开
运动检测参数:
self.previous_frame: 用于存储前一帧图像,以便与当前帧比较检测运动。
self.motion_threshold: 运动检测的阈值,表示多少像素变化才算是运动。
self.still_threshold: 静止阈值,表示多少像素变化以内算是静止。
self.leave_threshold: 人物离开的阈值,当运动区域小于这个阈值时认为人物离开。
self.motion_history: 一个双端队列,用于记录运动历史。
self.captured_frame: 用于存储捕获的帧。
离开检测计数器机制:
渐进式确认:避免瞬时低运动导致的误判
抗干扰性:有效过滤短暂的环境变化
通过帧差法进行运动检测:
峰值检测:关注运动强度的最大值
阈值比较:超过1000表示明显的人员活动
历史确认:确认之前确实有人进入
静止确认:最近3帧平均运动量低于静止阈值(10)
离开检测:连续3帧都低于离开阈值(1)
持续确认:需要维持100帧的持续低运动
抗干扰设计:任何一帧运动超标就重置计数器
上传豆包相关prompt与图片并调用豆包API
从预设prompt中随机选择一个,填入当前时间、记录的用户tag,发送到豆包
解析返回的字符串内容并保存tag
将传回的字符串解析为JSON对象
建立相关tag并保存以形成用户画像
使用了多种异常保护机制,防止程序崩溃
调用火山API并进行语音播报
使用流式音频处理,确保音频的低延迟与实时性
使用了多种异常保护机制,防止程序崩溃
3.主循环与收尾工作
检测周期处理(人物静止 → 捕获关键帧 → Base64编码 → AI分析 → 文本响应 → TTS转换 → 语音播报)
进入主循环 :
- 初始化摄像头
- 循环读取帧
- 运动检测
- 状态机转换
- 显示界面
- 调用API并处理结果
有序的资源释放:
- 停止摄像头:释放硬件资源
- 关闭显示窗口:清理GUI资源
- 设置停止标志:确保循环终止
- 停止音频播放:关闭音频设备
- 状态确认:打印关闭确认信息
改进
- 加入语音识别功能,实现与用户对话。
- 当前运动检测机制对低速运动不敏感,可优化。
- 添加人脸识别功能,用于登录云端账号,便于设备共享使用。
- 换用更轻量的硬件从而降本增效。