eefocus_3891719 发表于 3 天前

【欧时RS x Arduino】02 手势识别Demo

# 背景

我此次申请的测评的项目是手势识别控制风扇,先找 Arduino App Lab 相关的示例工程,熟悉手势识别应用。

在 Arduino App Lab 中找到了一个示例工程 Detect Objects on Camera,专门用于演示摄像头的实施目标检测功能。

必须使用 Network Mode :在 Arduino App Lab 中通过 Wi\-Fi 连接开发板,而非直接USB连接模式。

!(//m.qjumbo.com/forum/data/attachment/forum/202610/31/165205sgqwrajdmgdqnraz.png)

# 实例说明

这个示例使用预训练模式,对摄像头实时视频流进行目标检测。

工作流程为:持续获取摄像头帧 \-\-\> 通过 `video_objectdetection `Brick 进行AI处理 \-\-\> 在检测结果周围显示边界框。应用通过交互式网页界面进行管理。

!(//m.qjumbo.com/forum/data/attachment/forum/202610/31/165217cw0tg00q70g4g4mx.png)

# Bricks 说明

- web\_ui 创建网页界面,用于显示分类结果与模型控制选项
- `video_objectdetection `对摄像头实时视频流中的物体进行分类与检测

其中 video\_objectdetection 默认使用的模型是 General purpose object detection \- YoloX nano。也可以手动修改为下方的 Hand gestures,这个才是我项目中使用的模型。

!(//m.qjumbo.com/forum/data/attachment/forum/202610/31/165304xkdg75emaa7zk1dr.png)

# 代码解读

这个示例主要代码在 python,还有一部分网页代码,在 assets 目录下。

其中 python 代码最关键,如下:

```Python
# SPDX-FileCopyrightText: Copyright (C) Arduino s.r.l. and/or its affiliated companies
#
# SPDX-License-Identifier: MPL-2.0

from arduino.app_utils import App
from arduino.app_bricks.web_ui import WebUI
from arduino.app_bricks.video_objectdetection import VideoObjectDetection
from datetime import datetime, UTC

ui = WebUI()
detection_stream = VideoObjectDetection(confidence=0.5, debounce_sec=0.0)

ui.on_message("override_th", lambda sid, threshold: detection_stream.override_threshold(threshold))

# Register a callback for when all objects are detected
def send_detections_to_ui(detections: dict):
for key, values in detections.items():
    for value in values:
      entry = {
      "content": key,
      "confidence": value.get("confidence"),
      "timestamp": datetime.now(UTC).isoformat()
      }
      ui.send_message("detection", message=entry)

detection_stream.on_detect_all(send_detections_to_ui)

App.run()
```

**关键说明:**

- `VideoObjectDetection `内部持续从摄像头获取帧,运行预训练模型(或自定义 Edge Impulse 模型),并输出检测结果字典。
- `on_detect_all `在每一帧有检测结果时触发回调。
- `WebUI `负责托管前端页面(端口 7000)并提供双向 WebSocket 通信。
- `App.run()` 启动内部事件循环,保持检测流与消息通信持续运行。

**前端逻辑(index\.html \+ app\.js)**

- 通过 iframe 加载摄像头视频流(自动重试 /embed 直到可用)。
- 监听 WebSocket 消息 detection,更新:

- 最近 5 次检测记录(含百分比与时间戳)。
- 特殊物体(猫、狗、杯子、手机、时钟、盆栽)的 GIF 与文字反馈。
- 滑块/输入框调整置信度阈值,通过 `ui.send_message("override_th", value) `实时回传后端。
- 连接断开时显示错误提示。

# 演示:通用物体识别

Brick 使用默认的 General purpose object detection \- YoloX nano 模型。

键盘识别,置信度 82%

!(//m.qjumbo.com/forum/data/attachment/forum/202610/31/165319fqp051njqkf0tzb7.png)

鼠标识别,错误地识别成了 cell phone ,置信度 56%

!(//m.qjumbo.com/forum/data/attachment/forum/202610/31/165329wswzsc66eeiiiji4.png)

人生果,识别错了,误识别为 mouse 置信度 81%

!(//m.qjumbo.com/forum/data/attachment/forum/202610/31/165339miyexu58cpgeypx3.png)

经过查证,General purpose object detection \- YoloX nano 可以的物体列表如下,有80种常见物体:

- airplane(飞机)
- apple(苹果)
- backpack(背包)
- banana(香蕉)
- baseball bat(棒球棒)
- baseball glove(棒球手套)
- bear(熊)
- bed(床)
- bench(长椅)
- bicycle(自行车)
- bird(鸟)
- boat(船)
- book(书)
- bottle(瓶子)
- bowl(碗)
- broccoli(西兰花)
- bus(公交车)
- cake(蛋糕)
- car(汽车)
- carrot(胡萝卜)
- cat(猫)
- cell phone(手机)
- chair(椅子)
- clock(时钟)
- couch(沙发)
- cow(牛)
- cup(杯子)
- dining table(餐桌)
- dog(狗)
- donut(甜甜圈)
- elephant(大象)
- fire hydrant(消防栓)
- fork(叉子)
- frisbee(飞盘)
- giraffe(长颈鹿)
- hair drier(吹风机)
- handbag(手提包)
- hot dog(热狗)
- horse(马)
- keyboard(键盘)
- kite(风筝)
- knife(刀)
- laptop(笔记本电脑)
- microwave(微波炉)
- motorcycle(摩托车)
- mouse(鼠标)
- orange(橙子)
- oven(烤箱)
- parking meter(停车计时器)
- person(人)
- pizza(披萨)
- potted plant(盆栽)
- refrigerator(冰箱)
- remote(遥控器)
- sandwich(三明治)
- scissors(剪刀)
- sheep(羊)
- sink(水槽)
- skateboard(滑板)
- skis(滑雪板)
- snowboard(单板滑雪)
- spoon(勺子)
- sports ball(运动球)
- stop sign(停车标志)
- suitcase(行李箱)
- surfboard(冲浪板)
- teddy bear(泰迪熊)
- tennis racket(网球拍)
- tie(领带)
- toaster(烤面包机)
- toilet(马桶)
- toothbrush(牙刷)
- traffic light(交通信号灯)
- train(火车)
- truck(卡车)
- tv(电视)
- umbrella(雨伞)
- vase(花瓶)
- wine glass(酒杯)
- zebra(斑马)

# 演示:手势识别

Brick 选择 Hand gestures。这是一款轻量级视觉模型,可检测四种手势:中性握拳(neutral fist)、张开手掌(five)、V 手势(和平手势),以及竖起大拇指(点赞)。

!(//m.qjumbo.com/forum/data/attachment/forum/202610/31/165350azl12mwl7wm13rlo.png)

以下截图是我多次换手势、摆弄位置、调整光照,最终的识别结果。总的来说 good, five 识别效果最好,其他两种 neut, peace 识别效果不好。

此外,手势在画面中的比例也影响识别效果,太大、太小都不能顺利识别。

!(//m.qjumbo.com/forum/data/attachment/forum/202610/31/165404u0ivho9toz6ofh30.png)

!(//m.qjumbo.com/forum/data/attachment/forum/202610/31/165430pc7c9prmrfe1rwmc.png)

!(//m.qjumbo.com/forum/data/attachment/forum/202610/31/165442laeaxhabtjevfajv.png)

!(//m.qjumbo.com/forum/data/attachment/forum/202610/31/165453s5c7fgzhh4xth44f.png)

视频演示,链接地址:
<iframe src="//player.bilibili.com/player.html?isOutside=true&aid=117499299370710&bvid=BV1csHg6pEfL&cid=43032643941&p=1" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"></iframe>

页: [1]
查看完整版本: 【欧时RS x Arduino】02 手势识别Demo

Baidu
map