项目背景: 当前学生特别是中学生课业繁重,经常导致书桌桌面凌乱,难以快速找到所需资料。
可以设计一个整理书桌提醒小助手,在识别到桌面凌乱时候,播报语言:“书桌需要整理咯”,来提示学生主动自觉地整理书桌。
一、整体思路
1.准备 3类数据集 分别标注为 凌乱、一般、整洁
每类准备了50张不同角度的书桌照片
2.在mind+里训练图像分类模型
用mind+内置的ai模型训练(图像分类)一键训练
3.导出训练好的模型
4.写行空板程序
摄像头拍摄
模型推理
根据结果播放语音
二、过程
第一步、数据集整理
图片清晰多角度
在这里为了得到足够多的图片,通过视频抽取的图片
第二步:Mind+ 训练图像分类模型
1. 打开 Mind+(最新版)
2. 顶部切换到:AI模式
3. 左侧选择:图像分类
4. 点击:导入数据集 → 选择你上面的 书桌数据集 文件夹
5. 等待加载完成,确认 3 个类别都显示
6. 点击:开始训练
- 训练轮次默认即可
- 等待训练完成(1~3分钟)
7. 训练完成后:
- 点击 导出模型
- 选择 行空板 / UNIHIKER
- 导出得到一个 .kmodel 文件
四、第三步:把模型和语音文件放到行空板
1. 模型上传
1. 用数据线连接行空板
2. 打开 Mind+ → 切换到 上传模式
3. 打开 文件系统
4. 把刚才导出的 xxx.kmodel 上传到行空板根目录或 model 文件夹
2. 准备语音(推荐)
你可以直接用我给你写好的文字转语音,也可以自己录 3 段 MP3/WAV:
- 凌乱.mp3
- 一般.mp3
- 整洁.mp3
同样上传到行空板。
五、第四步:行空板 Python 代码
from unihiker import GUI, Audio import cv2 import numpy as np import time from maix import nn # 初始化GUI和音频 gui = GUI() audio = Audio() # 加载模型(与你上传的文件名一致) model = nn.load("/root/desk_model.kmodel") # 类别顺序必须和训练时一致! labels = ["凌乱", "一般", "整洁"] def desk_detect(): # 1. 打开摄像头 cap = cv2.VideoCapture(0) cap.set(cv2.CAP_PROP_FRAME_WIDTH, 224) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 224) gui.clear() gui.draw_text(x=120, y=20, text="书桌状态识别", origin="center", font_size=16) while True: ret, frame = cap.read() if not ret: break # 2. 预处理图片 img = cv2.resize(frame, (224, 224)) img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) img = img.astype(np.float32) / 255.0 # 3. 模型推理 out = model.forward(img) max_idx = np.argmax(out) result = labels[max_idx] confidence = out[max_idx] # 4. 屏幕显示结果 gui.clear() gui.draw_text(x=120, y=40, text="书桌状态识别", origin="center") gui.draw_text(x=120, y=80, text=f"状态:{result}", origin="center") gui.draw_text(x=120, y=110, text=f"置信度:{confidence:.2f}", origin="center") # 5. 语音播报(只在状态变化时播报,避免一直叫) if hasattr(desk_detect, "last_result"): if desk_detect.last_result != result: play_voice(result) else: play_voice(result) desk_detect.last_result = result time.sleep(0.2) cap.release() def play_voice(status): """根据状态播放语音""" if status == "凌乱": audio.play("/root/凌乱.mp3") # 或者直接文字朗读: # audio.say("书桌有点乱,该整理啦") elif status == "一般": audio.play("/root/一般.mp3") # audio.say("书桌还算整齐,继续保持") elif status == "整洁": audio.play("/root/整洁.mp3") # audio.say("书桌非常整洁,你真棒") if __name__ == "__main__": desk_detect()
前提:
- 已接 USB 摄像头
- 已接 音箱/耳机
- 模型名为 desk_model.kmodel
from unihiker import GUI, Audio
import cv2
import numpy as np
import time
from maix import nn
# 初始化GUI和音频
gui = GUI()
audio = Audio()
# 加载模型(与你上传的文件名一致)
model = nn.load("/root/desk_model.kmodel")
# 类别顺序必须和训练时一致!
labels = ["凌乱", "一般", "整洁"]
def desk_detect():
# 1. 打开摄像头
cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 224)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 224)
gui.clear()
gui.draw_text(x=120, y=20, text="书桌状态识别", origin="center", font_size=16)
while True:
ret, frame = cap.read()
if not ret:
break
# 2. 预处理图片
img = cv2.resize(frame, (224, 224))
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img = img.astype(np.float32) / 255.0
# 3. 模型推理
out = model.forward(img)
max_idx = np.argmax(out)
result = labels[max_idx]
confidence = out[max_idx]
# 4. 屏幕显示结果
gui.clear()
gui.draw_text(x=120, y=40, text="书桌状态识别", origin="center")
gui.draw_text(x=120, y=80, text=f"状态:{result}", origin="center")
gui.draw_text(x=120, y=110, text=f"置信度:{confidence:.2f}", origin="center")
# 5. 语音播报(只在状态变化时播报,避免一直叫)
if hasattr(desk_detect, "last_result"):
if desk_detect.last_result != result:
play_voice(result)
else:
play_voice(result)
desk_detect.last_result = result
time.sleep(0.2)
cap.release()
def play_voice(status):
"""根据状态播放语音"""
if status == "凌乱":
audio.play("/root/凌乱.mp3")
# 或者直接文字朗读:
# audio.say("书桌有点乱,该整理啦")
elif status == "一般":
audio.play("/root/一般.mp3")
# audio.say("书桌还算整齐,继续保持")
elif status == "整洁":
audio.play("/root/整洁.mp3")
# audio.say("书桌非常整洁,你真棒")
if __name__ == "__main__":
desk_detect()
返回首页
回到顶部
评论