瑞昱半导体AMB82 MINI SD卡加载模型RTSP视频流AI识别图像和声音分类

news2025/1/18 3:23:23

AMB82 MINI Arduino的方法迭代更新十分及时,github维护也十分频繁。最新推出的4.0.7版本开始支持SD卡加载模型。有的网友装了4.0.6版本是看不到摄像头和模型加载选项的。
用这个实例来呈现RTSP视频流AI识别图像,同时展示对声音进行分类效果。

SDK升级到4.0.7b

在这里插入图片描述

怎么获得官方提供的各种训练好的模型

去github上下载Ambiot发布的最新版Arduino SDK ,解压以后训练好的模型文件在\Ameba_misc\All_NN_models里面。
在这里插入图片描述

SD卡加载模型文件

SD卡用sd-memory-card格式化一下,在根目录创建NN_MDL文件夹,然后将yamnet.nb和yolov7_tiny.nb两个模型文件复制进去。这两个模型的文件12.7M,可见瑞昱半导体增加sd卡加载模型是为了方便用户使用尺寸比较大的模型资料,功能也日臻完善。

介绍YAMNet和YOLOv7 Tiny

YAMNet(Yet Another Multi-Task Network)是一个用于音频事件检测的深度学习模型,由谷歌开发。它是基于卷积神经网络(CNN)的,能够识别音频中的多种声音事件,如狗吠、汽车喇叭声、电话铃声等。YAMNet 模型可以应用于各种音频分析任务,包括声音识别、环境声音分类和音频场景理解等。
YAMNet 模型的特点包括:
多任务学习:YAMNet 不仅能识别音频中的特定声音事件,还能同时进行音频特征提取等任务。
端到端模型:YAMNet 从原始音频波形直接学习到声音事件的识别,无需手动特征提取。
可扩展性:YAMNet 可以扩展到不同的音频数据集和任务,具有很好的泛化能力。
实时性能:YAMNet 模型设计时考虑了实时处理的需求,可以在实时或近实时环境中使用。

YOLOv7 Tiny 是 YOLO(You Only Look Once)系列目标检测算法的一个变体,专为需要在资源受限的环境中使用而设计。YOLOv7 是 YOLO 系列的第七代版本,它在速度和精度上都有所提升。“Tiny” 版本意味着它是一个轻量级的模型,适用于计算能力较低的设备,如移动设备或嵌入式系统。
YOLOv7 Tiny 保持了 YOLO 算法的核心特点,即快速和高效,同时在以下几个方面进行了改进:
网络结构优化:YOLOv7 Tiny 采用了更高效的网络结构,以减少计算量和模型大小。
性能提升:通过改进的网络结构和训练技术,YOLOv7 Tiny 在保持较小模型大小的同时,仍然能够提供较高的检测精度。
多尺度检测:YOLOv7 Tiny 支持多尺度输入,可以处理不同大小的图像,提高检测的灵活性。
实时性能:YOLOv7 Tiny 特别适合需要实时处理的应用场景,如视频监控、自动驾驶等。
YOLOv7 Tiny 通常使用较小的输入图像尺寸,并减少网络层的数量,以降低模型的复杂度。这样虽然可能会牺牲一些精度,但可以显著提高运行速度,使其更适合在资源受限的设备上运行。

在这里插入图片描述

安装VLC播放器和SSCOM串口工具

因为AMB82 MINI采集使用的RTSP视频流通过无线网络传递,为了便于观察电脑或者手机上安装VLC播放器 ,并且为了观察串口输出要去Microsoft Store安装SSCOM串口工具。

程序如下:

#include "WiFi.h"
#include "StreamIO.h"
#include "VideoStream.h"
#include "RTSP.h"
#include "NNAudioClassification.h"
#include "AudioClassList.h"
#include "NNObjectDetection.h"
#include "VideoStreamOverlay.h"
#include "ObjectClassList.h"

#define CHANNEL 0
#define CHANNELNN 3

// 较低的分辨率用于神经网络处理
#define NNWIDTH 576
#define NNHEIGHT 320

//神经网络音频分类需要16KHz
VideoSetting config(VIDEO_FHD, 30, VIDEO_H264, 0);
VideoSetting configNN(NNWIDTH, NNHEIGHT, 10, VIDEO_RGB, 0);
AudioSetting configA(16000, 1, USE_AUDIO_AMIC); // 采样率,通道计数,麦克风类型
Audio audio;
NNAudioClassification audioNN;
NNObjectDetection ObjDet;
RTSP rtsp;
StreamIO videoStreamer(1, 1);
StreamIO audioStreamerNN(1, 1);                 // 1输入音频-> 1输出Audio Classification
StreamIO videoStreamerNN(1, 1);

char ssid[] = "您的WiFi名称";  
char pass[] = "您的WiFi密码";     
int status = WL_IDLE_STATUS;

IPAddress ip;
int rtsp_portnum; 

void setup() {
    //为音频数据格式配置音频外设
    Serial.begin(115200);

    // 尝试连接Wifi网络:
    while (status != WL_CONNECTED) {
        Serial.print("Attempting to connect to WPA SSID: ");
        Serial.println(ssid);
        status = WiFi.begin(ssid, pass);

        // 休息呀2秒
        delay(2000);
    }
    ip = WiFi.localIP();

  //配置摄像机视频通道和视频格式信息
  //根据你的WiFi网络质量调整比特率
    config.setBitrate(2 * 1024 * 1024);     // 建议使用2Mbps的RTSP流,避免网络拥塞
    Camera.configVideoChannel(CHANNEL, config);
    Camera.configVideoChannel(CHANNELNN, configNN);
    Camera.videoInit();

    // 配置RTSP,配置相应的视频格式信息
    rtsp.configVideo(config);
    rtsp.begin();
    rtsp_portnum = rtsp.getPort();

    audio.configAudio(configA);
    audio.begin();

    audioNN.configAudio(configA);
    audioNN.setResultCallback(ACPostProcess);
    audioNN.modelSelect(AUDIO_CLASSIFICATION, NA_MODEL, NA_MODEL, NA_MODEL, CUSTOMIZED_YAMNET);
    audioNN.begin();

   //使用相应的视频格式信息配置对象检测
   //选择神经网络(NN)任务和模型
    ObjDet.configVideo(configNN);
    ObjDet.setResultCallback(ODPostProcess);
    ObjDet.modelSelect(OBJECT_DETECTION, CUSTOMIZED_YOLOV7TINY, NA_MODEL, NA_MODEL);
    ObjDet.begin();

    //配置StreamIO对象将数据从视频通道流到RTSP
    videoStreamer.registerInput(Camera.getStream(CHANNEL));
    videoStreamer.registerOutput(rtsp);
    if (videoStreamer.begin() != 0) {
        Serial.println("StreamIO link start failed");
    }
	
	Camera.channelBegin(CHANNEL);

    // 配置StreamIO对象以将数据从音频流到音频分类
    audioStreamerNN.registerInput(audio);
    audioStreamerNN.registerOutput(audioNN);
    if (audioStreamerNN.begin() != 0) {
        Serial.println("StreamIO link start failed");
    }

    // 配置StreamIO对象将数据从RGB视频通道流到对象检测
    videoStreamerNN.registerInput(Camera.getStream(CHANNELNN));
    videoStreamerNN.setStackSize();
    videoStreamerNN.setTaskPriority();
    videoStreamerNN.registerOutput(ObjDet);
    if (videoStreamerNN.begin() != 0) {
        Serial.println("StreamIO link start failed");
    }

    // 为NN启动视频频道
    Camera.channelBegin(CHANNELNN);

    // 在RTSP视频通道上启动OSD绘图
    OSD.configVideo(CHANNEL, config);
    OSD.begin();
}

void loop() {
 
}

// 用户回调函数
void ACPostProcess(std::vector<AudioClassificationResult> results) {
    printf("No of Audio Detected = %d\r\n", audioNN.getResultCount());

    if (audioNN.getResultCount() > 0) {
        for (int i = 0; i < audioNN.getResultCount(); i++) {
            AudioClassificationResult audio_item = results[i];
            int class_id = (int)audio_item.classID();
            if (audioNames[class_id].filter) {
                int prob = audio_item.score();
                printf("%d class %d, score: %d, audio name: %s\r\n", i, class_id, prob, audioNames[class_id].audioName);
            }
        }
    }
}

//用户回调函数对目标检测结果进行后处理
void ODPostProcess(std::vector<ObjectDetectionResult> results) {
    uint16_t im_h = config.height();
    uint16_t im_w = config.width();

    Serial.print("Network URL for RTSP Streaming: ");
    Serial.print("rtsp://");
    Serial.print(ip);
    Serial.print(":");
    Serial.println(rtsp_portnum);
    Serial.println(" ");

    printf("Total number of objects detected = %d\r\n", ObjDet.getResultCount());
    OSD.createBitmap(CHANNEL);

    if (ObjDet.getResultCount() > 0) {
        for (uint32_t i = 0; i < ObjDet.getResultCount(); i++) {
            int obj_type = results[i].type();
            if (itemList[obj_type].filter) {    // check if item should be ignored

                ObjectDetectionResult item = results[i];
                //结果坐标为0.00到1.00之间的浮点数
                //与RTSP分辨率相乘得到坐标像素
                int xmin = (int)(item.xMin() * im_w);
                int xmax = (int)(item.xMax() * im_w);
                int ymin = (int)(item.yMin() * im_h);
                int ymax = (int)(item.yMax() * im_h);

                // 绘制边界框
                printf("Item %d %s:\t%d %d %d %d\n\r", i, itemList[obj_type].objectName, xmin, xmax, ymin, ymax);
                OSD.drawRect(CHANNEL, xmin, ymin, xmax, ymax, 3, OSD_COLOR_WHITE);

                // 打印识别文本
                char text_str[20];
                snprintf(text_str, sizeof(text_str), "%s %d", itemList[obj_type].objectName, item.score());
                OSD.drawText(CHANNEL, xmin, ymin - OSD.getTextHeight(CHANNEL), text_str, OSD_COLOR_CYAN);
            }
        }
    }
    OSD.update(CHANNEL);
}

如何修改模型文件名称

如果需要修改模型名称请移步到C:\Users\用户名\AppData\Local\Arduino15\packages\realtek\hardware\AmebaPro2\4.0.7-build20240610\libraries\NeuralNetwork\src\SD_Model.CPP 里面做修改。

烧录和观察实验效果

烧录程式到AMB82 MINI 的Arduino IDE设置见下图:
在这里插入图片描述
程序烧录好以后,按一下rest键重启一下AMB82 MINI 开发板,打开SSCOM串口工具可以可能到RTSP视频流的地址,譬如 rtsp://192.168.3.18:554 ,然后在VLC media player输入该地址就可以看到AMB82 MINI 开发板拍摄到的视频了。
在这里插入图片描述

如果您对着水杯,在视频流中就会用方框框住并标注。同时SSCOM串口工具也会输出图像和声音的识别情况。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1810130.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

XUbuntu24.04之制作ISO镜像启动盘(二百四十八)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

【数据结构与算法 经典例题】括号匹配问题

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《数据结构与算法 经典例题》C语言 期待您的关注 ​​ 目录 一、问题描述 二、解题思路 &#x1f343;破解之道 &#x1f343;…

基于大模型的360度全景图像生成技术:L-MAGIC

在数字技术的浪潮中,我们迎来了一项革命性的创新——L-MAGIC,一个能够基于一张普通照片和简单文字描述,快速生成360度全方位全景画面的系统。L-MAGIC不仅提供了沉浸式的视觉体验,还融合了多种素材和技术手段,让全景图像的生成变得更加丰富和真实。 技术亮点 1. 多角度视…

小熊家务帮day19-day21 订单模块2(取消订单,退款功能等)

目录 1 订单退款功能1.1 需求分析1.2 接口分析1.3 退款流程分析1.4 表结构设计1.5 取消未支付订单实现1.5.1 接口开发Controller层开发Service层开发 1.5.2 接口测试 1.5 取消已支付订单实现 1 订单退款功能 1.1 需求分析 用户下单成功可以取消订单&#xff0c;在订单的不同状…

【网络编程开发】11.IO模型 12.IO多路复用

11.IO模型 什么是IO: IO 是 Input/Output 的缩写&#xff0c;指的是输入和输出。在计算机当中&#xff0c;IO 操作通常指将数据从一个设备或文件中读取到计算机内存中&#xff0c;或将内存中的数据写入设备或文件中。这些设备可以包括硬盘驱动器、网卡、键盘、屏幕等。 通常用…

kettle_Hbase

kettle_Hbase ☀Hbase学习笔记 读取hdfs文件并将sal大于1000的数据保存到hbase中 前置说明&#xff1a; 1.需要配置HadoopConnect 将集群中的/usr/local/soft/hbase-1.4.6/conf/hbase-site.xml复制至Kettle中的 Kettle\pdi-ce-8.2.0.0-342\data-integration\plugins\pentah…

手机投屏到电脑时,手机提示连接失败

前言 注意&#xff0c;本方法建立在你已经通过其他帖子等解决了前置条件的情况下&#xff0c;手机提示连接失败情况下&#xff0c;包括但不限于关闭防火墙、安装无线投屏工具、手机和电脑连接在同一个WiFi频段下、关闭杀毒软件等。 具体操作方法 1、请进入设置 > 系统和…

前端 JS 经典:动态执行 JS

前言&#xff1a;怎么将字符串当代码执行。有 4 中方式实现 eval、setTimeout、创建 script 标签、new Function 1. eval 特点&#xff1a;同步执行&#xff0c;当前作用域 var name "yq"; function exec(string) {var name "yqcoder";eval(string); …

【Git】Windows下使用可视化工具Sourcetree

参考&#xff1a;[最全面] SourceTree使用教程详解(连接远程仓库&#xff0c;克隆&#xff0c;拉取&#xff0c;提交&#xff0c;推送&#xff0c;新建/切换/合并分支&#xff0c;冲突解决&#xff0c;提交PR) 1.Git工具–sourcetree 之前文章介绍过Linux系统中的Git工具&…

如何系统学习vue框架

前言 在软件开发的浩渺星海中&#xff0c;编程规范如同航海的罗盘&#xff0c;为我们指引方向&#xff0c;确保我们的代码之旅能够顺利、高效地到达目的地。无论是个人开发者还是大型团队&#xff0c;编程规范都是提升代码质量、保障项目成功不可或缺的一环。 因此&#xff0c…

Mysql 的分布式策略

1. 前言 MySQL 作为最最常用的数据库&#xff0c;了解 Mysql 的分布式策略对于掌握 MySQL 的高性能使用方法和更安全的储存方式有非常重要的作用。 它同时也是面试中最最常问的考点&#xff0c;我们这里就简单总结下 Mysq 的常用分布式策略。 2. 复制 复制主要有主主复制和…

数据挖掘丨轻松应用RapidMiner机器学习内置数据分析案例模板详解(上篇)

RapidMiner 案例模板 RapidMiner 机器学习平台提供了一个可视化的操作界面&#xff0c;允许用户通过拖放的方式构建数据分析流程。 RapidMiner目前内置了 13 种案例模板&#xff0c;这些模板是预定义的数据分析流程&#xff0c;可以帮助用户快速启动和执行常见的数据分析任务。…

私有化AI搜索引擎FreeAskInternet

什么是 FreeAskInternet FreeAskInternet 是一个完全免费、私有且本地运行的搜索聚合器&#xff0c;并使用 LLM 生成答案&#xff0c;无需 GPU。用户可以提出问题&#xff0c;系统将使用 searxng 进行多引擎搜索&#xff0c;并将搜索结果合并到ChatGPT3.5 LLM 中&#xff0c;并…

微服务之负载均衡器

1、负载均衡介绍 负载均衡就是将负载(工作任务&#xff0c;访问请求)进行分摊到多个操作单元(服务器&#xff0c;组件)上 进行执行。 根据负载均衡发生位置的不同&#xff0c; 一般分为服务端负载均衡和客户端负载均衡。 服务端负载均衡指的是发生在服务提供者一方&#xff…

第十五届蓝桥杯物联网试题(国赛)

好&#xff0c;很好&#xff0c;国赛直接来个阅读理解&#xff0c;我猛做4个小时40分钟&#xff0c;cpu都干冒烟了&#xff0c;也算是勉强做完吧&#xff0c;做的很仓促&#xff0c;没多检查就交了&#xff0c;方波不会&#xff0c;A板有个指示灯没做&#xff0c;其他应该都还凑…

C语言详解(文件操作)2

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C语言 &#x1f680;本系列文章为个人学习…

【python】flask 框架

python flask 框架 flask是一个轻量级的python后端框架 (Django, tornado, flask) 官网&#xff1a;欢迎来到 Flask 的世界 — Flask中文文档(3.0.x) 安装&#xff1a;pip install Flask -i https://pypi.douban.com 常识&#xff1a; http,默认端口号为80; https,默认端口号…

攻防世界---misc---embarrass

1、下载附件是一个数据包 2、用wireshark分析 3、ctrlf查找字符 4、 flag{Good_b0y_W3ll_Done}

[Algorithm][动态规划][完全背包问题][零钱兑换][零钱兑换Ⅱ][完全平方数]详细讲解

目录 1.零钱兑换1.题目链接2.算法原理详解3.代码实现 2.零钱兑换 II1.题目链接2.算法原理详解3.代码实现 3.完全平方数1.题目链接2.算法原理详解3.代码实现 1.零钱兑换 1.题目链接 零钱兑换 2.算法原理详解 思路&#xff1a; 确定状态表示 -> dp[i][j]的含义 dp[i][j]&am…

Python学习笔记速成版

数据容器 列表的方法-总览 具体操作 元组 定义 相关操作 注意事项 特点 字符串 总览 常用操作 特点 序列 定义 切片操作 Set集合 总览 定义 常用操作 注意事项 字典 总览 定义 常用操作 获取 嵌套 其他操作 summary 通用操作 字符串大小比较 函数进阶 多个返回值 多种传…