- 2025-04-11
-
发表了主题帖:
基于米尔全志T527开发板的OpenCV行人检测方案
本文将介绍基于米尔电子MYD-LT527开发板(米尔基于全志T527开发板)的OpenCV行人检测方案测试。
摘自优秀创作者-小火苗
一、软件环境安装
1.在全志T527开发板安装OpenCV
sudo apt-get install libopencv-dev python3-opencv
2.在全志T527开发板安装pip
sudo apt-get install python3-pip
二、行人检测概论
使用HOG和SVM基于全志T527开发板构建行人检测器的关键步骤包括:
准备训练数据集:训练数据集应包含大量正样本(行人图像)和负样本(非行人图像)。
计算HOG特征:对于每个图像,计算HOG特征。HOG特征是一个一维向量,其中每个元素表示图像中特定位置和方向的梯度强度。
训练SVM分类器:使用HOG特征作为输入,训练SVM分类器。SVM分类器将学习区分行人和非行人。
评估模型:使用测试数据集评估训练后的模型。计算模型的准确率、召回率和F1分数等指标。
三、代码实现
import cv2
import time
def detect(image,scale):
imagex=image.copy() #函数内部做个副本,让每个函数运行在不同的图像上
hog = cv2.HOGDescriptor() #初始化方向梯度直方图描述子
#设置SVM为一个预先训练好的行人检测器
hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())
#调用函数detectMultiScale,检测行人对应的边框
time_start = time.time() #记录开始时间
#获取(行人对应的矩形框、对应的权重)
(rects, weights) = hog.detectMultiScale(imagex,scale=scale)
time_end = time.time() #记录结束时间
# 绘制每一个矩形框
for (x, y, w, h) in rects:
cv2.rectangle(imagex, (x, y), (x + w, y + h), (0, 0, 255), 2)
print("sacle size:",scale,",time:",time_end-time_start)
name=str(scale)
cv2.imshow(name, imagex) #显示原始效果
image = cv2.imread("back.jpg")
detect(image,1.01)
detect(image,1.05)
detect(image,1.3)
cv2.waitKey(0)
cv2.destroyAllWindows()
四、实际操作
- 2025-03-21
-
发表了主题帖:
米尔全志T113-i国产开发板实测:RISC-V+DSP性能揭秘
近年来,随着半导体产业的快速发展和技术的不断迭代,物联网设备种类繁多(如智能家居、工业传感器),对算力、功耗、实时性要求差异大,单一架构无法满足所有需求。因此米尔推出MYD-YT113i开发板(基于全志T113-i)来应对这一市场需求。
米尔基于全志T113-i核心板及开发板
part 01 T113-i芯片及OpenAMP简介
T113-i芯片简介
T113-i由两颗ARM A7 、一颗C906(RISC-V)和一颗DSP(HIFI 4)组成。
C906(RISC-V核)特性:
主频最高1008MHz
32KB I-cache+32 KB D-cache
操作系统支持裸跑和FreeRTOS实时操作系统
支持少量数据核间通讯(RPMsg)和大量核间数据(RPBuf)
DSP(HIFI 4)特性:
最高主频600MHz
32KB L1 I-cache+32 KB L1 D-cache
64KB I-ram+64KB D-ram
操作系统支持裸跑和FreeRTOS实时操作系统
支持少量数据核间通讯(RPMsg)和大量核间数据(RPBuf)
OpenAMP系统原理
T113-i=2×ARM A7 + 1×C906(RISC-V) + 1×DSP(HIFI 4)组成,其中两个A7核为主核心,C906(RISC-V核)和DSP为双副核心。而其中的RISC-V属于超高能效副核心,标配内存管理单元,可运行RTOS或裸机程序,T113的主核运行Linux进行人机界面的交互和应用流程,而RISC-V则是后台可进行大数据数据采集,或者相关编码器的控制等,降低主核被中断的次数,大大提供了主核的运行效率。每个处理器核心相互隔离,拥有属于自己的内存,既可各自独立运行不同的任务,又可多个核心之间进行核间通信,这些不同架构的核心以及他们上面所运行的软件组合在一起,就成了 AMP 系统(Asymmetric Multiprocessing System 异构多处理系统)即非对称多处理架构。
part 02 AMP系统通信机制详解
AMP通信原理
由于两个核心存在的目的是协同的处理,因此在异构多处理系统中往往会形成Master-Remote结构。主核心启动后启动从核心。当两个核心上的系统都启动完成后,他们之间就通过IPC(Inter Processor Communication)方式进行通信,而 RPMsg就是IPC中的一种。
在AMP系统中,两个核心通过共享内存的方式进行通信。两个核心通过AMP中断来传递讯息。内存的管理由主核负责。
使用 RPMsg进行核间通信
RPMsg整体通讯框架
上面介绍了通讯原理,这里讲解如何通讯,AMP使用RPMsg框架进行通讯,该框架用于AMP场景下处理器之间进行相互通信。OpenAMP内部实现了可用于RTOS或裸机系统中的RPMsg框架,与Linux内核的RPMsg框架兼容。
其通信链路建立流程如下:
RTOS 端调用 rpmsg_create_ept 创建指定 name 的端点。
Linux 端 rpmsg core 层收到端点创建消息,调用 rpmsg_register_device 将其作为一个设备注册到 rpmsg bus。
Linux 端 rpmsg bus 匹配到相应的驱动,触发其 probe 函数。
Linux 端驱动 probe 函数完成一些资源的分配以及文件节点的生成。
Linux 端驱动的 probe 函数调用完后,rpmsg bus 会回复一个 ACK。
RTOS 端收到 ACK 后设置端点的状态,此时使用 is_rpmsg_ept_ready 函数会返回 true。
RPMsg数据传输流程如下:
下面展示一次RPMsg数据传输的通信过程,下面详细说明:
arm端把数据拷贝到buffer中,在初始化时已经将buffer和payload memory地址绑定,因此数据拷贝后相当于存放到了payloadmemory中。
在消息传输命令后加上数据在payload memory中的起始地址和长度,组成数据包,调用RPMsg接口发送。
RPBuf:基于共享内存和RPMsg消息通知,实现传输大数据传输的框架。
RPMsg:基于VirtIO管理的共享内存,实现数据传输的框架。
VirtIO:原本是一套用在虚拟化环境中传输数据的框架,这里用作共享内存(VRING)的管理。
OpenAMP:OpenAMP框架为RTOS、裸机和Linux用户空间提供了RPMsg、VirtIO、re-moteproc(未列出)的实现,并且与Linux内核兼容。
Msgbox:是全志平台提供的一套消息中断机制,已通过linux内核中原生的mailbox框架作适配。
MSGBOX_IRO_REG:Msgbox的中断相关寄存器。
buffer:表示申请到的共享内存。用户通过操作buffer对象,可直接访问对应的共享内存。
payload memory:用来存放实际传输数据的共享内存,因此称为payload(有效负载)。
VRING:由Virtl0管理的一个环形共享内存。
part 03 案例与性能测试
A核与RISC-V核通讯流程
A核与RISC-V核通讯流程如下:
1. 首先监听端点
2. 创建端点
3. 节点通讯
linux向riscv发送
4. riscv接收数据
A核与RISC-V核数据传输性能测试
A核与RISC-V核数据传输性能测试,使用rpmsg_test命令对rpmsg进行性能测试,测试发送方向和接收方向各自的耗时以及速率。
1. 主核测试结果:
2. 从核测试结果:
3. 通过输出的结果可以得到:
[rpmsg1] send: 496.000000Kb 20.000000ms 24.799999M/s
[rpmsg1] receive : 496.000000Kb 9980.000000ms 0.049699Mb/s
发送496KB数据耗时20ms发送速率为24.79Mb/s
接收496KB数据耗时9980ms发送速率为0.049699Mb/s
DSP GPADC采集测试
采集流程如下:
1. 开启DSP
2. DSP核打印
3. 开启DSP后,把GPADC0引脚接入1.8V电源,此时用户可以执行A核应用程序与DSP进行通讯,使DSP进行GPADC采集并返回数据
可以看到GPADC0收的电压数据为1792,转换为电压值为:1792/1000=1.792V。
- 2025-03-14
-
发表了主题帖:
国产AI开发板新标杆:米尔RK3576深度体验,瑞芯微平台如何实现6TOPS算力突围?
文章来源:硬件笔记本
最近,AI的风刮得是真猛啊!各种AI工具层出不穷,仿佛一夜之间,人工智能就从科幻走进了现实。作为一名硬件工程师,我自然也按捺不住内心的激动,琢磨着怎么把AI和硬件结合起来,搞点有意思的项目。
这不,机会来了!刚好看到国内知名主板厂商米尔电子新推出了一款RK3576开发板,主打AI边缘计算,性能强劲,价格还亲民,跟他们工作人员聊了聊,问我有没有兴趣体验一下,这还用说?当然是安排!
01 开发板介绍
收到开发板的第一时间,我就迫不及待地拆开了包装。不得不说,米尔的包装还是很用心的,防震泡沫包裹得严严实实,开发板完好无损。
拿出开发板,第一印象就是精致小巧,巴掌大的板子上集成了各种元器件,布局紧凑,做工精细。
开发板是与核心板配套使用的扩展底板,咱们先来一张正面照,可以看到丰富的外设接口。
DC JACK( 12VDC/3A 5.5-2.1DC插座)
USB TYPE-C(debug调试接口)
WIFI/BT(板载WIFI模块)
Audio( 1路音频接口,3.5mm耳麦插座)
DP(1路DP接口,MiniDP插座)
HDMI(1路HDMI接口,HDMI Type-A插座)
USB( 2路USB3.0,采用1x2 Type-A接口)
Ehernet( 2路10/100/1000M 以太网RJ45接口)
风扇接口(一路风扇插座1x2x2.0mm)
2.54mm间距的40PIN排针(GPIO/I2C/UART/SPI/CAN-FD)
再来一张背面照片
背面接口包括:
SD接口(1路 SD卡槽)
SSD接口(M.2 NVME SSD盘插座,尺寸2280,PCIE信号)
MIPI-DSI接口(4路MIPI-DSI,FPC插座,多媒体显示接口)
下面进行细节展示:
DC JACK 5.5-2.1DC,通用型号,可以兼容市面上大多数电源适配器。
旁边是通用的type-C接口,用于DEBUG调试。
有5个按键,功能分别是MaskRom、RST、PWR、V+、V-,每个按键位置都有丝印标注。
有三颗贴片LED指示灯,分别表示PWR,RUN,USER,能很清楚的了解设备的工作状态。
搭配板载模块WIFI模块AP6256,支持2.4GHz和5GHz频段,集成蓝牙5.0,使用标准的U.FL(IPEX)天线接口。
1路音频接口,3.5mm耳麦插座,用于连接耳机或麦克风,支持音频输入输出,适用于多种场景。
旁边是MiniDP接口,比标准DisplayPort更小,有效节约主板的占用空间。主要用于视频和音频传输,支持高分辨率和高刷新率,最高可达8K@60Hz或4K@120Hz。
标准的HDMI TYPE-A接口,具有高带宽、音视频一体化、广泛兼容性和高可靠性,成为音视频传输的主流接口。
从板内向外看,HDMI和DP接口的差分信号线上都有ESD静电管作为接口防护,DP接口还有共模电感,能有效抑制EMI。
两个USB3.0接口,两个千兆以太网口。
网口背面细节展示。
主板两侧各有一个2.54mm间距的40PIN排针,其实当我看到主板第一眼最醒目的就是这个橙色的排针,再搭配黑色的主板,整体看起来有种高端大气上档次的感觉。这个针座有丰富的GPIO接口,可根据实际项目需求进行应用,满足各种使用场景。
板子背面的可插入SD卡,能够方便地进行存储卡的读写操作。
SSD插槽,主要用于连接固态硬盘,通过高速传输特性提升设备的读写速度和存储容量。
MIPI-DSI接口,包含3组4 lane的MIPI CSI摄像头输入接口,以及一个MIPI DSI显示输出接口,需要FPC软件线进行连接,可以清晰看到接口处也加了ESD防静电管。
米尔金色的丝印真的很好看,不像咱们通用的白色丝印,看起来就很喜欢。米尔MYIR,是Make Your Idea Real第一个大写字母的缩写,很有寓意。
细心的同学会发现,板子的四个角都有塑料间隔柱,当我们进行产品开发时,可以直接把它放在桌面,不用再单独找一张纸进行绝缘隔离,这个高度刚刚好,细节拉满。
咱们做硬件的有一个癖好,看到坏的东西就想修,看到板子就想拆。
大家可以看到这个散热器热别大,我很好奇,散热器下面的主芯片模块又是什么样子,说干就干,继续拆解散热器。
散热器下面可以看到这个金属屏蔽罩里面就是米尔的SOC核心板,核心板是以SMD贴片的形式焊接在底板,管脚LGA贴片封装,通过 LGA 焊盘引出信号和电源地共计381PIN。板卡采用12层高密度PCB设计,沉金工艺生产,独立的接地信号层。
外形尺寸:43mm*45mm*3.85mm(含屏蔽罩),是相当的小,元件多,空间小,也难怪是12层板。
不得不提一句,这种模组的要求是非常的高,内部集成了内部集成了PMIC、DDR、eMMC等芯片,以及各种阻容、电感器件,对于布局和走线要求很高,一般公司不一定做得出来,就算你做出来了,也不一定保证可靠性,所以一般的企业没有必要做核心板,直接买现成的可以节约很多时间和精力。
写到这里,我感触颇深。近年来,国产芯片发展迅猛,像RK3576这样的高性能芯片不断涌现,打破了国外厂商的垄断,像RK3576核心板、开发板这样的优秀产品出现,更加助力中国科技的腾飞!
这就是RK3576 SoC,通过金属壳边缘可以看到芯片周边很多的阻容元件,上面可以明显看到散热硅胶垫留下的印迹,芯片主要是通过散热硅胶垫将CPU的热量导出到外部散热器。
RK3576 是咱们的重头戏,作为一款主打AI边缘计算的开发板,它搭载了瑞芯微近期推出的第二代高性能AIOT平台——RK3576,采用先进的8nm制程工艺,四核Cortex-A72+四核Cortex-A53架构,主频高达2.4GHz,内置Mail-G52 MC3 GPU。
更重要的是,它集成了NPU神经网络处理单元,AI算力高达6TOPS,可以轻松运行各种AI模型。
板子的信息都基本了解,开始上电,板厂已经烧录好了固件,接上我的家用办公显示屏,成功点亮。
02 资料完整,认证通过,售后有保障
作为个人玩家,我比较关心的是他们的资料是否完善,一个简单的产品介绍就有几十页,文档内容也很规范。
当然,一旦你购买了他们家的产品,可以下载更完善的HDK和SDK参考资料,包含开发板的技术规格、设计指南、接口说明、驱动程序、示例代码和必要的软件工具,以便于开发者能够顺利进行产品的开发。
作为企业,认证要求是必选项,有了相关认证,可以为整个产品的开发周期节约很多时间和精力。
该模块通过了传导CE和辐射RE测试,而且是ClassB标准,这两项测试通过,必将为整个产品加分。
再看辐射波形,余量在10dB以上,吊打其它大多数产品了。
再好的产品,在使用过程中,也难免会遇到各种问题,可靠的售后服务也是相当重要,这一点咱们做产品的人深有体会。遇到问题不可怕,可怕的是当你遇到问题,供应商态度差,回复慢,不专业,解决不了问题,就很让人头疼。
据王工了解,这款MYD-LR3576 米尔开发板的公司,专注于嵌入式处理器模组设计研发、生产、销售于一体,在咱们嵌入式行业已经深耕10多年,产品都做过信号量测,高低温可靠性测试,EMC测试和防静电测试以及其它测试,大厂品质有保证。
最后,给大家附上米尔RK3576核心板、开发板、边缘计算盒子的配置型号:
- 2025-03-07
-
发表了主题帖:
超强算力+实时响应!米尔发布基于STM32MP25x核心板Debian系统
一、系统概述
MYD-LD25X搭载的Debian系统包含以太网、WIFI/BT、USB、RS485、RS232、CAN、AUDIO、HDMI显示和摄像头等功能,同时也集成了XFCE轻量化桌面、VNC远程操控、SWITCH网络交换和TSN时间敏感网络功能,为工业设备赋予“超强算力+实时响应+极简运维”的体验!
类别
名称
描述
源码
TF-A
Arm Trusted Firmware 2.8
OP-TEE
OP-TEE 3.19
Bootloader
U-boot 2022.10
Kernel
Linux Kernel 6.1.82
文件系统
myir-image-debian
Debian12文件系统
工具
烧录工具
STM32CubeProgrammer
文档
MYD-LD25X_Debian系统开发指南
包含源码编译,烧录等
注:目前Debian系统只适配了高配置开发板型号:MYD-LD257-8E2D-150-I
图:MYC-LD25X核心板及开发板
二、亮点功能介绍
1、Xfce桌面
Xfce是一款轻量级的开源桌面环境,旨在提供高效、稳定和易于使用的桌面体验。
轻量级:Xfce以资源效率为目标,注重在低资源消耗下提供快速响应和流畅的用户体验。它适用于各种硬件配置,包括旧式计算机和嵌入式设备。
简洁和直观:Xfce遵循简洁和直观的设计原则,提供了直观易用的用户界面,使用户能够快速上手和自定义桌面环境。
模块化:Xfce采用模块化的设计,桌面环境由多个独立的组件(如面板、窗口管理器、文件管理器等)组成,用户可以根据自己的需求进行定制和配置。
1.1.启动Xfce
myir-image-debian系统默认已经包含xfce显示界面,开发板启动进入系统后,接上屏幕会显示如下界面,说明成功启动Xfce,需输入设置的账户进入系统界面。
图1.1 xfce显示界面
2、VNC远程控制
2.1. vnc简介
VNC(Virtual Network Computing,虚拟网络计算)是一种远程桌面控制技术,允许用户通过互联网或局域网远程访问和控制另一台计算机的桌面环境。系统默认安装了TigerVNC。以下是其核心特点和应用:
协议基础:基于RFB协议(Remote Framebuffer Protocol),通过传输屏幕图像的更新部分和用户输入指令实现交互。
客户端-服务端架构:
服务端:运行在MYD-LD25X上,负责分享屏幕并接收客户端指令。
客户端:用户通过客户端连接到服务端,查看并操作远程桌面。
网络传输:默认使用TCP端口5900+N(N为显示器编号,如:1对应5901)。
2.2. 启动VNC服务
Debian系统默认上电就开启VNC服务端,使用下面命令查看vnc服务:
root@myd-ld25x:~# ps -ef | grep vnc
root 2348 1 0 15:14 ? 00:00:00 /usr/bin/perl /usr/bin/vncserver -geometry 1280x720 -depth 24 -localhost no :1
root 2349 2348 0 15:14 ? 00:00:01 /usr/bin/Xtigervnc :1 -localhost=0 -desktop myd-ld25x:1 (root) -rfbport 5901 -PasswordFile /tmp/tigervnc.QQW419/passwd -SecurityTypes VncAuth,TLSVnc -auth /root/.Xauthority -geometry 1280x720 -depth 24
root 2350 2348 0 15:14 ? 00:00:00 /bin/sh /etc/X11/Xtigervnc-session
root 2356 2350 0 15:14 ? 00:00:00 tigervncconfig -iconic
root 4836 3480 0 16:48 ttySTM0 00:00:00 grep vnc
2.3 客户端连接测试
下载客户端
Windows下载并安装客户端软件(如RealVNC Viewer),如下图所示:
图2.1 客户端VNC界面
获取连接信息
通过myd-ld25x开发板获取目标设备的IP地址或主机名
(如192.168.40.198或myd-ld25x):
root@myd-ld25x:~# cat /etc/hosts
127.0.0.1 myd-ld25x
root@myd-ld25x:~# ifconfig
end1: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
ether 38:d5:47:00:29:62 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
device interrupt 65 base 0xc000
end2: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.40.198 netmask 255.255.255.0 broadcast 192.168.40.255
inet6 fe80::bd6:742b:ef7e:ee6f prefixlen 64 scopeid 0x20<link>
ether 5e:08:0d:0e:83:b6 txqueuelen 1000 (Ethernet)
RX packets 12454 bytes 2524533 (2.4 MiB)
RX errors 0 dropped 129 overruns 0 frame 0
TX packets 476 bytes 41087 (40.1 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
device interrupt 68 base 0x8000
通过VNC服务器的log,获取端口/显示编号,如:1(对应端口5901)或直接指定端口号5901:
root@myd-ld25x:~# cat .vnc/myd-ld25x:1.log
Xvnc TigerVNC 1.12.0 - built 2023-01-06 16:01
Copyright (C) 1999-2021 TigerVNC Team and many others (see README.rst)
See https://www.tigervnc.org for information on TigerVNC.
Underlying X server release 12101006, X.Org
Mon Mar 3 18:02:44 2025
vncext: VNC extension running!
vncext: Listening for VNC connections on all interface(s), port 5901
vncext: created VNC server for screen 0
3NI3X0 New Xtigervnc server 'myd-ld25x:1 (root)' on port 5901 for display :1.
3NI3X0 Use xtigervncviewer -SecurityTypes VncAuth,TLSVnc -passwd /tmp/tigervnc.otB4Rd/passwd myd-ld25x:1 to connect to the VNC server.
[mi] mieq: warning: overriding existing handler (nil) with 0xaaaae7efad10 for event 2
[mi] mieq: warning: overriding existing handler (nil) with 0xaaaae7efad10 for event 3
..................................................
输入连接地址
依次点击VNC客户端界面“File->New connection”输入服务器和主机名,格式如下:
格式:目标地址:显示编号或 目标地址::端口号
示例1(主机名+显示编号):myd-ld25x:1
示例2(IP+端口):192.168.40.198:5901
以主机名为例子,配置完成后,点击”OK”按钮,如下图所示:
图2.2 客户端VNC配置
成功连接
连接成功后,客户端窗口将显示远程设备的桌面,可进行交互操作。
图2.3 VNC连接成功界面
3、交换机功能
3.1. 交换机简介
以太网交换机是一种硬件设备,用于连接局域网(LAN)上的设备,并在这些设备之间转发数据包。它在OSI模型的数据链路层(第2层)运行,并使用MAC地址来确定每个数据包的目的地。以太网交换机可以通过减少冲突和拥塞来提高网络性能,同时还可以提供如虚拟局域网(VLAN)和基于端口的访问控制等安全功能。与以太网桥接器相比,以太网交换机在CPU使用率方面更为高效。由于硬件以太网交换机负责数据转发、过滤和优先级排序,因此减轻了CPU的工作负担。这样一来,CPU可以专注于处理其他任务,从而进一步提升网络性能。本节主要介绍myd-ld25x作为交换机进行双网段转发功能。
3.2. 网络拓扑介绍
STM32MP257有两个以太网控制器,MYD-LD25X以太网控制器1支持交换机功能。其网络拓扑如下图:
图3.1 网络拓扑图
根据上图很容易了解网络拓扑结构:
[Device1] (169.254.1.2)
│
├── end2 接口
│
[MP25 板]
│
├── end2 接口: 169.254.1.1(连接 Device1)
├── sw0p2 接口: 192.168.0.20(连接 Device2 end2)
│
└── IP 转发已启用 (`echo 1 > /proc/sys/net/ipv4/ip_forward`)
[Device2] (192.168.0.11)
3.3.关键拓扑配置解析
myd-ld25x的配置
从网络拓扑图可知,myd-ld25x被当作为交换机/网关,连接不同的子网络,
子网1配置169.254.1.0/24(通过 end2 接口);子网2:配置192.168.0.0/24(通过 sw0p2 接口)。启用 ip_forward 后,myd-ld25x可将来自子网1的流量转发到子网2,反之亦然。
Device1 配置
设置 IP 为169.254.1.2,默认网关指向 myd-ld25x的 end2 接口 (169.254.1.1)。使得所有非本子网的流量(如访问 192.168.0.11)通过网关 myd-ld25x 转发。
Device2 配置
设置 IP 为192.168.0.11,默认网关指向myd-ld25x的 sw0p2 接口 (192.168.0.20)。使所有非本子网的流量(如访问 169.254.1.2)通过网关myd-ld25x转发。
3.4.转发功能配置与测试
切换交换机设备树
启动开发板,在uboot阶段选择交换机设备树,如下图所示:
图3.2 选择交换机设备树
转发功能配置
根据拓扑结构对myd-ld25x开发板板进行配置,启动设备并设置 end1/sw0ep 接口,同时启用 IP 转发功能,使设备能够充当路由器,转发网络流量。
root@myd-ld25x:~# ifconfig end2 169.254.1.1 up
root@myd-ld25x:~# ifconfig sw0p2 192.168.0.20 up
root@myd-ld25x:~# echo 1 > /proc/sys/net/ipv4/ip_forward
配置设备1(开发板或者PC)网络接口IP和路由,这里Device1使用一块MYD-LD25X开发板:
Board EEWORLDBBCODETK4gt; ifconfig end2 169.254.1.2 up
Board EEWORLDBBCODETK4gt; ip route add default via 169.254.1.1
配置设备2(开发板或者PC)网络IP和路由,这里Device2也使用一块MYD-LD25X开发板:
Board EEWORLDBBCODETK4gt; ifconfig end2 192.168.0.11 up
Board EEWORLDBBCODETK4gt; ip route add default via 192.168.0.10
3.5.连通性验证
从Device1->Device2,当执行ping 192.168.0.11 时, 数据包从 Device1 发送到默认网关MYD-LD25X (169.254.1.1),MYD-LD25X根据路由表将数据包转发到 sw0p2 接口 (192.168.0.20)。Device2 收到数据包并回复,路径反向同理。
Board EEWORLDBBCODETK4gt; ping 192.168.0.11
PING 192.168.0.11 (192.168.0.11) 56(84) bytes of data.
64 bytes from 192.168.0.11: icmp_seq=1 ttl=63 time=0.959 ms
64 bytes from 192.168.0.11: icmp_seq=2 ttl=63 time=0.618 ms
64 bytes from 192.168.0.11: icmp_seq=3 ttl=63 time=0.649 ms
64 bytes from 192.168.0.11: icmp_seq=4 ttl=63 time=0.669 ms
64 bytes from 192.168.0.11: icmp_seq=5 ttl=63 time=0.625 ms
64 bytes from 192.168.0.11: icmp_seq=6 ttl=63 time=0.624 ms
64 bytes from 192.168.0.11: icmp_seq=7 ttl=63 time=0.630 ms
64 bytes from 192.168.0.11: icmp_seq=8 ttl=63 time=0.669 ms
从Device2->Device1,过程一样:
Board EEWORLDBBCODETK4gt; ping 169.254.1.2
PING 169.254.1.2 (169.254.1.2) 56(84) bytes of data.
64 bytes from 169.254.1.2: icmp_seq=1 ttl=63 time=0.761 ms
64 bytes from 169.254.1.2: icmp_seq=2 ttl=63 time=0.688 ms
64 bytes from 169.254.1.2: icmp_seq=3 ttl=63 time=0.678 ms
64 bytes from 169.254.1.2: icmp_seq=4 ttl=63 time=0.640 ms
64 bytes from 169.254.1.2: icmp_seq=5 ttl=63 time=0.676 ms
64 bytes from 169.254.1.2: icmp_seq=6 ttl=63 time=0.614 ms
64 bytes from 169.254.1.2: icmp_seq=7 ttl=63 time=0.608 ms
64 bytes from 169.254.1.2: icmp_seq=8 ttl=63 time=0.543 ms
通过MYD-LD25X板作为路由中转,成功实现了两个不同子网(169.254.1.0/24和 192.168.0.0/24)间的通信。
4、TSN
4.1.TSN简介
TSN代表时间敏感网络(Time-Sensitive Networking),它是由电气和电子工程师协会(IEEE)开发的一系列标准,旨在通过以太网网络提供确定性和低延迟的通信。TSN旨在支持实时应用,如工业自动化、汽车以及音频/视频流传输。
TSN通过在网络中的所有设备之间提供时间同步,并使用流量整形和调度机制为时间关键型流量分配优先级和网络资源,从而实现确定性通信。TSN还支持冗余和容错机制,以确保高可用性和可靠性。此处列出了IEEE定义的TSN标准的完整清单。TSN的关键特性包括:
时间同步:TSN使用精确时间协议(PTP)来同步网络中所有设备的时钟,精度可达亚微秒级。IEEE 802.1AS-Rev
流量整形和调度:TSN使用服务质量(QoS)机制为时间关键型流量分配优先级和网络资源,并防止拥塞和数据包丢失。IEEE 802.1Qav和IEEE 802.1Qbv
互操作性:TSN设计为与现有以太网网络兼容,并支持不同供应商和设备之间的互操作性。
总体而言,TSN为以太网网络上的实时通信提供了一个标准化且可靠的解决方案,有助于在各行各业启用新的应用和用例。802.1Qav和802.1Qbv之间的选择取决于应用的特定需求。802.1Qav通常用于带宽需求可变且不可预测的应用,而802.1Qbv则通常用于带宽需求固定且可预测的应用。MYD-LD25X独立网口end2和switch都支持TSN功能。本节将以myd-ld25x开发板独立以太网为例,展示TSN 802.1Qav如何提升流量整形效果。
4.2. 网络拓扑介绍
通过预留4个带宽序列,给每个序列分别不同的优先级,如下网络拓扑图所示:
图4.1 QAV例子
如上图所示,配置网口如下:
使用4个队列(Q0-Q3)。每个队列在硬件中都有预留的带宽。最多支持4个队列。
队列0无带宽限制,用于通用流量。
队列1预留了最大带宽的10%(100Mbps)
队列2预留了最大带宽的20%(200Mbps)
队列3预留了最大带宽的30%(300Mbps)
Q3是最高优先级队列,而Q0是最低优先级队列。
4.3. 网络流量控制
创建vlan端口
在MYD-LD25X开发板发送端执行下面命令创建vlan端口,并建立端口映射:
root@myd-ld25x:~# ip link add link end2 name end2.200 type vlan id 200
root@myd-ld25x:~# ip link set end2.200 type vlan egress 0:0 1:1 2:2 3:3 4:4 5:5 6:6 7:7
root@myd-ld25x:~# ifconfig end2.200 192.168.200.60 netmask 255.255.255.0
在接受端(PC或者其他开发板)接收端创建vlan端口:
root@localhost:~# ip link add link eno0 name eno0.200 type vlan id 200
root@localhost:~# ip link set eno0.200 up
root@localhost:~# ip addr add 192.168.200.30/24 dev eno0.200
配置网络流量
CBS用于通过限制流量类别的数据速率来强制实施服务质量;为了将数据包划分为不同的流量类别,用户可以选择使用mqprio。
root@myd-ld25x:~# tc qdisc add dev end0 clsact
root@myd-ld25x:~# tc qdisc add dev end0 handle 100: parent rootmqprio
num_tc 4
map 0 0 1 1 2 2 3 3 3 3 3 3 3 3 3 3
queues 1@0 1@1 1@2 1@3 hw 0
为每个队列分配不同的带宽
// Set bandwidth of queue 1 to be 100Mbps
root@myd-ld25x:~# tc qdisc replace dev end0 parent 100:2 cbs
idleslope 100000
sendslope -900000
hicredit 150
locredit -1350
offload 1
// Set bandwidth of queue 2 to be 200Mbps
root@myd-ld25x:~# tc qdisc replace dev end0 parent 100:3 cbs
idleslope 200000
sendslope -800000
hicredit 300
locredit -1200
offload 1
// Set bandwidth of queue 3 to be 300Mbps
root@myd-ld25x:~# tc qdisc replace dev end0 parent 100:4 cbs
idleslope 300000
sendslope -700000
hicredit 450
locredit -1050
offload 1
流量测试
在连接到端点end2且IP地址为192.168.200.30的远程PC或其他设备上运行4个iperf会话,以生成具有不同优先级的多个数据流。
root@localhost:~# iperf3 -s -p 5003&
root@localhost:~# iperf3 -s -p 5002&
root@localhost:~# iperf3 -s -p 5001&
root@localhost:~# iperf3 -s -p 5000&
在MYD-LD25X开发板,使用iperf3开始传输数据流:
//Stream with SKB priority 6 : TOS=0x14 == SO_PRIORITY=6
// https:man7.org/linux/man-pages/man8/tc-prio.8.html
root@myd-ld25x:~# iperf3 -c 192.168.200.30 -u -b 0 -p 5003 -l1472 -t60 --tos 0x14 &
//Stream with SKB priority 4
root@myd-ld25x:~# iperf3 -c 192.168.200.30 -u -b 0 -p 5002 -l1472 -t60 --tos 0x1a &
//Stream with SKB priority 2
root@myd-ld25x:~# iperf3 -c 192.168.200.30 -u -b 0 -p 5001 -l1472 -t60 --tos 0xa &
//Stream with SKB priority 0 (Best effort)
root@myd-ld25x:~# iperf3 -c 192.168.200.30 -u -b 0 -p 5000 -l1472 -t60 &
测试结果
对于优先级为6且带宽为300Mbps的队列3,使用TC规则后:
root@myd-ld25x:~# iperf3 -c 192.168.200.30 -u -b 0 -p 5003 -l1472 -t60 --tos 0x14 &
[1] 5238
root@myd-ld25x:~# warning: UDP block size 1472 exceeds TCP MSS 1448, may result in fragmentation / drops
Connecting to host 192.168.200.30, port 5003
[ 5] local 192.168.200.60 port 56663 connected to 192.168.200.30 port 5003
[ ID] Interval Transfer Bitrate Total Datagrams
[ 5] 0.00-1.00 sec 34.7 MBytes 291 Mbits/sec 24720
[ 5] 1.00-2.00 sec 34.7 MBytes 291 Mbits/sec 24710
[ 5] 2.00-3.00 sec 34.7 MBytes 291 Mbits/sec 24730
[ 5] 3.00-4.00 sec 34.6 MBytes 291 Mbits/sec 24680
[ 5] 4.00-5.00 sec 34.6 MBytes 290 Mbits/sec 24670
对于优先级为4且带宽为200Mbps的队列2,使用TC规则后:
root@myd-ld25x:~# iperf3 -c 192.168.200.30 -u -b 0 -p 5002 -l1472 -t60 --tos 0x1a &
[1] 5335
root@myd-ld25x:~# warning: UDP block size 1472 exceeds TCP MSS 1448, may result in fragmentation / drops
Connecting to host 192.168.200.30, port 5002
[ 5] local 192.168.200.60 port 33494 connected to 192.168.200.30 port 5002
[ ID] Interval Transfer Bitrate Total Datagrams
[ 5] 0.00-1.00 sec 23.3 MBytes 195 Mbits/sec 16600
[ 5] 1.00-2.00 sec 23.2 MBytes 195 Mbits/sec 16550
[ 5] 2.00-3.00 sec 23.2 MBytes 195 Mbits/sec 16550
[ 5] 3.00-4.00 sec 23.2 MBytes 195 Mbits/sec 16550
[ 5] 4.00-5.00 sec 23.2 MBytes 195 Mbits/sec 16550
[ 5] 5.00-6.00 sec 23.2 MBytes 195 Mbits/sec 16550
对于优先级为2且带宽为100Mbps的队列1,使用TC规则后:
root@myd-ld25x:~# iperf3 -c 192.168.200.30 -u -b 0 -p 5001 -l1472 -t60 --tos 0xa &
[1] 5376
warning: UDP block size 1472 exceeds TCP MSS 1448, may result in fragmentation / drops
root@myd-ld25x:~# Connecting to host 192.168.200.30, port 5001
[ 5] local 192.168.200.60 port 40923 connected to 192.168.200.30 port 5001
[ ID] Interval Transfer Bitrate Total Datagrams
[ 5] 0.00-1.00 sec 11.7 MBytes 98.3 Mbits/sec 8350
[ 5] 1.00-2.00 sec 11.7 MBytes 97.9 Mbits/sec 8310
[ 5] 2.00-3.00 sec 11.7 MBytes 97.7 Mbits/sec 8300
[ 5] 3.00-4.00 sec 11.7 MBytes 97.9 Mbits/sec 8310
[ 5] 4.00-5.00 sec 11.7 MBytes 97.8 Mbits/sec 8310
[ 5] 5.00-6.00 sec 11.7 MBytes 97.8 Mbits/sec 8300
[ 5] 6.00-7.00 sec 11.7 MBytes 97.9 Mbits/sec 8310
对应优先级为0且带宽无限制的流量,使用TC规则后:
root@myd-ld25x:~# iperf3 -c 192.168.200.30 -u -b 0 -p 5000 -l1472 -t60 &
[1] 5426
root@myd-ld25x:~# warning: UDP block size 1472 exceeds TCP MSS 1448, may result in fragmentation / drops
Connecting to host 192.168.200.30, port 5000
[ 5] local 192.168.200.60 port 47330 connected to 192.168.200.30 port 5000
[ ID] Interval Transfer Bitrate Total Datagrams
[ 5] 0.00-1.00 sec 101 MBytes 845 Mbits/sec 71800
[ 5] 1.00-2.00 sec 104 MBytes 875 Mbits/sec 74300
[ 5] 2.00-3.00 sec 105 MBytes 880 Mbits/sec 74750
[ 5] 3.00-4.00 sec 105 MBytes 880 Mbits/sec 74700
[ 5] 4.00-5.00 sec 105 MBytes 881 Mbits/sec 74790
[ 5] 5.00-6.00 sec 105 MBytes 878 Mbits/sec 74560
- 2025-02-28
-
发表了主题帖:
瑞芯微米尔RK3562国产核心板,ARM中量级多面手
近日,米尔电子携手推出全新一代ARM核心板——基于瑞芯微RK3562(J)处理器的MYC-YR3562核心板及开发板。这款核心板凭借其强大的性能、丰富的接口和灵活的扩展能力,为工业控制、物联网网关、边缘计算等领域提供了高性价比的解决方案。
核心板基于 RK3562 或RK3562J处理器,采用四核ARM Cortex-A53架构,主频高达2GHz,集成Mali-G52 GPU,支持4K视频解码和1080P视频编码。相较于前代产品,RK3562在性能上有了显著提升,同时保持了较低的功耗,堪称ARM中量级处理器中的多面手。MYC-YR3562核心板存储配置存储器1GB/2GB LPDDR4、8GB/16GB eMMC等多个型号供选择,配备开发板供开发者评估使用。下面详细介绍这款核心板的优势。
瑞芯微RK3562处理器,1TOPS NPU,升级摄像头ISP
RK3562J/RK3562 是一款专为消费电子及工业设备设计的高性能、低功耗四核应用处理器。配备四核 ArmCortex-A53 +Cortex-M0,主频最高可达2.0GHz;具有1TOPS NPU,与TensorFlow、PyTorch、Caffe、ONNX、MXNet、Keras、Darknet 等深度学习框架兼容;集成 Mali G52 GPU,支持OpenGL ES1.1/2.0/3.2、OpenCL2.0 和 Vulkan1.1。
丰富的多媒体资源
RK3562支持3D GPU Mail-G52-2EE,13M ISP,支持1080P@60fps H.264 编码,4K@30fps H.265、1080P@60fps H.264解码,支持丰富多媒体接口MIPI CSI/Parallel RGB/LVDS/MIPI DSI等。
根据主芯片、存储器件参数的不同,MYC-YR3562核心板细分为3种型号。
核心板配置型号
产品型号
主芯片
NPU
内存
存储器
工作温度
MYC-YR3562J-8E1D-180-I
RK3562J
/
1 GB LPDDR4
8 GB
-40℃~+85℃ 工业级
MYC-YR3562J-16E2D-180-I
RK3562J
/
2 GB LPDDR4
16 GB
-40℃~+85℃ 工业级
MYC-YR3562-16E2D-200-C
RK3562
1 TOPS
2 GB LPDDR4
16 GB
0℃~+70℃ 商业级
MYC-YR3562核心板选型表
开发板配置型号
产品型号
对应核心板型号
工作温度
MYD-YR3562-16E2D-200-C
MYC-YR3562-16E2D-200-C
0℃~+70℃ 商业级
MYD-YR3562J-16E2D-180-I-GK
MYC-YR3562J-16E2D-180-I
-40℃~+85℃ 工业级
MYD-YR3562开发板选型表
- 2025-02-21
-
发表了主题帖:
双目视觉处理系统开发实例-基于米尔安路国产DR1M90开发板
1. 系统架构解析
本系统基于米尔MYC-YM90X构建,基于安路飞龙DR1M90处理器,搭载安路DR1 FPGA SOC 创新型异构计算平台,充分发挥其双核Cortex-A35处理器与可编程逻辑(PL)单元的协同优势。通过AXI4-Stream总线构建的高速数据通道(峰值带宽可达12.8GB/s),实现ARM与FPGA间的纳秒级(ns)延迟交互,较传统方案提升了3倍的传输效率,极大地提升了系统整体性能。
国产化技术亮点:
全自主AXI互连架构,支持多主多从拓扑,确保系统灵活性与可扩展性
硬核处理器与PL单元共享DDR3控制器,提高内存带宽利用率(可升级至DDR4)
动态时钟域隔离技术(DCIT),确保跨时钟域的数据交互稳定性,避免时序错误
国产SM4加密引擎硬件加速模块,为数据加密任务提供硬件级别的支持,提升加密处理效率
图一 系统架构框图
如图一所示,系统架构通过“低内聚,高耦合”的设计思想,通过模块化的设计方式,完成了以下工作。
1. 通过I²C对OV5640摄像头进行分辨率,输出格式等配置。
2. 双目图像数据进行三级帧缓存,FIFO——DMA——DDR。
3. 客制化低延迟ISP(开发者根据场景需求加入)
4. VTC驱动HDMI输出显示
2. 系统程序开发
2.1 DR1固件架构设计
GUI设计界面,类Blockdesign设计方式,通过AXI总线,连接DR1的ARM核与定制化外设,包括以太网,RAM模块,PL DMA和VTC。
图二 FPGA底层架构框图
2.2 双目视觉处理流水线
2.2.1 传感器配置层
为实现高效的传感器配置,本系统采用混合式I²C配置引擎,通过PL端硬件I²C控制器实现传感器参数的动态加载。与纯软件方案相比,该硬件加速的配置速度提升了8倍,显著降低了配置延迟。
// 可重配置传感器驱动IP
module ov5640_config (
input wire clk_50M,
output tri scl,
inout tri sda,
input wire [7:0] reg_addr,
input wire [15:0] reg_data,
output reg config_done
);
// 支持动态分辨率切换(1920x1080@30fps ↔ 1280x720@60fps)
parameter [15:0] RESOLUTION_TABLE[4] = '{...};
该配置引擎支持多分辨率与高帧率动态切换,适应不同应用场景需求。
2.2.2 数据采集管道
系统构建了三级缓存体系,确保数据处理的高效性和实时性:
像素级缓存:采用双时钟FIFO(写时钟74.25MHz,读时钟100MHz),实现数据的稳定缓存和传输。
行缓冲:使用BRAM的乒乓结构(每行1920像素×16bit),减少数据延迟。
帧缓存:通过DDR3-1066 1GB内存支持四帧循环存储,确保图像的持续流畅展示。
// 位宽转换智能适配器
module data_width_converter #(
parameter IN_WIDTH = 16,
parameter OUT_WIDTH = 96
)(
input wire [IN_WIDTH-1:0] din,
output wire [OUT_WIDTH-1:0] dout,
// 时钟与使能信号
);
// 采用流水线式位宽重组技术
always_ff @(posedge clk) begin
case(state)
0: buffer <= {din, 80'b0};
1: buffer <= {buffer[79:0], din};
// ...6周期完成96bit组装
endcase
end
2.2.3. 异构计算调度
系统通过AXI-DMA(Direct Memory Access)实现零拷贝数据传输,优化内存和外设间的数据交换:
写通道:PL→DDR,采用突发长度128、位宽128bit的高速数据传输
读通道:DDR→HDMI,配合动态带宽分配(QoS等级可调),确保不同带宽需求的动态适配
2.2.4 VTC显示引擎深度优化
PL DMA输出显示优化
显示时序的优化对高质量图像输出至关重要。通过VTC(Video Timing Controller),本系统能够实现多模式自适应输出。
axi_hdmi_tx#(
.ID(0),
.CR_CB_N(0),
.DEVICE_TYPE(17), // 17 for DR1M
.INTERFACE("16_BIT"),
.OUT_CLK_POLARITY (0)
)
axi_hdmi_tx_inst (
.hdmi_clk (pll_clk_150),
//.hdmi_clk (clk1_out),
.hdmi_out_clk (hdmi_clk ),
.hdmi_16_hsync (hdmi_hs ),
.hdmi_16_vsync (hdmi_vs ),
.hdmi_16_data_e (hdmi_de),
.hdmi_16_data (/*hdmi_data*/ ),
// .hdmi_16_data (hdmi_data ),
.hdmi_16_es_data (hdmi_data),
.hdmi_24_hsync (),
.hdmi_24_vsync (),
.hdmi_24_data_e (),
.hdmi_24_data (/*{r_data,g_data,b_data}*/),
.hdmi_36_hsync (),
.hdmi_36_vsync (),
.hdmi_36_data_e (),
.hdmi_36_data (),
.vdma_clk (pll_clk_150 ),
.vdma_end_of_frame (dma_m_axis_last ),
.vdma_valid (dma_m_axis_valid ),
.vdma_data (dma_m_axis_data ),
.vdma_ready (dma_m_axis_ready),
.s_axi_aclk (S_AXI_ACLK ),
.s_axi_aresetn (S_AXI_ARESETN ),
.s_axi_awvalid (axi_ds5_ds5_awvalid ),
.s_axi_awaddr (axi_ds5_ds5_awaddr ),
.s_axi_awprot (axi_ds5_ds5_awprot ),
.s_axi_awready (axi_ds5_ds5_awready ),
.s_axi_wvalid (axi_ds5_ds5_wvalid ),
.s_axi_wdata (axi_ds5_ds5_wdata ),
.s_axi_wstrb (axi_ds5_ds5_wstrb ),
.s_axi_wready (axi_ds5_ds5_wready ),
.s_axi_bvalid (axi_ds5_ds5_bvalid ),
.s_axi_bresp (axi_ds5_ds5_bresp ),
.s_axi_bready (axi_ds5_ds5_bready ),
.s_axi_arvalid (axi_ds5_ds5_arvalid ),
.s_axi_araddr (axi_ds5_ds5_araddr ),
.s_axi_arprot (axi_ds5_ds5_arprot ),
.s_axi_arready (axi_ds5_ds5_arready ),
.s_axi_rvalid (axi_ds5_ds5_rvalid ),
.s_axi_rresp (axi_ds5_ds5_rresp ),
.s_axi_rdata (axi_ds5_ds5_rdata ),
.s_axi_rready (axi_ds5_ds5_rready)
);
动态时序生成器
通过PL-PLL动态调整像素时钟,确保显示无卡顿、无闪烁,误差控制在<10ppm内。
// VTC配置代码片段(Anlogic SDK)
void config_vtc(uint32_t h_total, uint32_t v_total) {
VTCRegs->CTRL = 0x1; // 使能软复位
VTCRegs->HTOTAL = h_total - 1;
VTCRegs->VTOTAL = v_total - 1;
// 详细时序参数配置
VTCRegs->POLARITY = 0x3; // HS/VS极性配置
VTCRegs->CTRL = 0x81; // 使能模块
}
3. 硬件连接与测试
硬件连接
米尔的安路飞龙板卡采用2 X 50 PIN 连接器设计,可灵活插拔多种子卡,配合子卡套件,可扩展成多种形态,多种应用玩法。
图三 使用模组,底板,子卡和线缆搭建硬件系统(使用米尔基于安路飞龙DR1M90开发板)
显示测试
实测双目显示清晰,无卡帧,闪屏。
图四 输出显示效果
系统集成
在FPGA硬件描述文件的基础上,进一步在Linux下实现双摄,为复杂系统调度应用铺平道路。
内核加载5640驱动下通过dma搬运ddr数据,在应用层中通过v4l2框架显示到HDMI上,完整数据流如下:
FPGA DDR → AXI-DMA控制器 → Linux DMA引擎 → 内核dma_buf → V4L2 vb2队列 → mmap用户空间 → 应用处理
三路DMA设备树HDMI、camera1、camera2代码片段:
//hdmi
soft_adi_dma0: dma@80400000 {
compatible = "adi,axi-dmac-1.00.a";
reg = <0x0 0x80400000 0x0 0x10000>;
interrupts = <GIC_SPI 83 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&axi_dma_clk>;
#dma-cells = <1>;
status = "okay";
adi,channels {
#size-cells = <0>;
#address-cells = <1>;
dma-channel@0 {
reg = <0>;
adi,source-bus-width = <32>;
adi,source-bus-type = <0>;
adi,destination-bus-width = <64>;
adi,destination-bus-type = <1>;
};
};
};
// cam1
mipi_adi_dma0: dma@80300000 {
compatible = "adi,axi-dmac-1.00.a";
reg = <0x0 0x80300000 0x0 0x10000>;
interrupts = <GIC_SPI 82 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&axi_dma_clk>;
#dma-cells = <1>;
status = "okay";
adi,channels {
#size-cells = <0>;
#address-cells = <1>;
dma-channel@0 {
reg = <0>;
adi,source-bus-width = <128>;
adi,source-bus-type = <1>;
adi,destination-bus-width = <64>;
adi,destination-bus-type = <0>;
};
};
};
//cam2
mipi_adi_dma1: dma@80700000 {
compatible = "adi,axi-dmac-1.00.a";
reg = <0x0 0x80700000 0x0 0x10000>;
interrupts = <GIC_SPI 86 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&axi_dma_clk>;
#dma-cells = <1>;
status = "okay";
adi,channels {
#size-cells = <0>;
#address-cells = <1>;
dma-channel@0 {
reg = <0>;
adi,source-bus-width = <128>;
adi,source-bus-type = <1>;
adi,destination-bus-width = <32>;
adi,destination-bus-type = <0>;
};
};
};
双路i2c OV5640设备树配置代码片段
camera@3c {
compatible = "ovti,ov5640";
pinctrl-names = "default";
// pinctrl-0 = <&pinctrl_ov5640>;
reg = <0x3c>;
clocks = <&ov5640_clk>;
clock-names = "xclk";
// DOVDD-supply = <&vgen4_reg>; /* 1.8v */
// AVDD-supply = <&vgen3_reg>; /* 2.8v */
// DVDD-supply = <&vgen2_reg>; /* 1.5v */
powerdown-gpios = <&portc 8 GPIO_ACTIVE_HIGH>;
reset-gpios = <&portc 7 GPIO_ACTIVE_LOW>;
port {
/* Parallel bus endpoint */
ov5640_out_0: endpoint {
remote-endpoint = <&vcap_ov5640_in_0>;
bus-width = <8>;
data-shift = <2>; /* lines 9:2 are used */
hsync-active = <0>;
vsync-active = <0>;
pclk-sample = <1>;
};
};
};
性能测试
性能实测数据。
指标
实测值
理论峰值
图像处理延迟
18.7ms
≤20ms
DDR吞吐量
2GB/s
2.6GB/s
功耗(全负载)
3.8W
4.2W
启动时间(Linux)
18s
-
4. 场景化应用扩展
该方案可广泛应用于以下领域:
智能驾驶:前视ADAS系统,包含车道识别和碰撞预警
工业检测:高速AOI(自动光学检测)流水线,提升检测精度和效率
医疗影像:内窥镜实时增强显示,支持多视角成像
机器人导航:SLAM(同步定位与地图构建)点云加速处理,提升机器人自主导航能力
通过安路TD 2024.10开发套件,开发者能够快速移植和定制化开发,具体包括:
使用GUI图形化设计约束工具,简化硬件开发过程
调用预置的接口与处理器IP,加速产品开发上市时间,专注应用和算法的处理
进行动态功耗分析(DPA)与仿真,确保系统的稳定性与高效性
0. One More Thing…
这里,回到我们原点,回到我们开发设计国产 FPGA SOC的初衷 ,芯片也好,模组也好,都只是开始,无论是FPGA,SOC,或者SOM,都是为了以更快,更好,平衡成本,体积,开发周期,开发难度,人员配置等等综合因素,做出的面向解决问题的选择,最终结果是降低成本和产品力的平衡。
安路飞龙系列的问世,让我们很欣喜看见国产SOC FPGA的崛起,希望和业界开发者一起开发构建国产SOC FPGA生态,所以选择将系列教程以知识库全部开源,共同无限进步!
米尔可能只是其中非常非常小的一个数据集,但会尽力撬动更大贡献。
- 2025-02-14
-
发表了主题帖:
国产开发板的端侧AI测评-基于米尔瑞芯微RK3576
MYD-LR3576开发板
最近,半导体圈的小伙伴应该都有所耳闻,美丽国又开始单方面无理由的制裁国内的高科技企业,从半导体设备、材料到芯片,可谓是全方位的封禁。这种形势下,显然大家应该做好最坏的打算,国产自主可控必须搞起来。那与非网本期内容就跟自主可控强关联——评测一款基于国产SoC的板卡,由米尔电子推出的瑞芯微RK3576开发板(MYD-LR3576)。
开发板外设
MYD-LR3576开发板分为核心板以及扩展板,核心板是基于瑞芯微在今年第二季推出的全新通用型SOC芯片RK3576,扩展板则扩展了众多的外设接口,方便工程师调试或者直接基于开发板做原型开发。
值得一提的是,笔者拿到的这个开发板型号(MYD-LR3576-64E8D-220-C)属于高配版本,带有8GB LPDDR4以及64GB eMMC,其余外设接口资源分布情况如下图所示。
开发板正面接口:
12V的DC Jack接口座,Type-C的Debug接口,5个机械功能按键,LED,WiFi/BT的天线
兼容树莓派的40pin接口扩展座,USB选择跳帽接口
音频接口、miniDP接口、HDMI接口、两个USB3.0接口、两个千兆的以太网口
RTC的电池接口,米尔电子自家定义的40pin扩展座接口,预留的风扇接口
开发板背面接口:
3个MIPI-CSI接口
1个MIPI-DSI接口
一个M.2 SSD接口
一个MicroSD卡槽
除了开发板的外设接口资源,板卡上涉及到的大多数芯片方案都是国产芯,所以不难发现厂商对于国产芯片替代在不断地推进。
瑞芯微SoC RK3576
瑞芯微电源管理芯片(RK806S-5)
晶存64GB eMMC(RS70B64G4S16G)
长鑫存储8GB LPDDR4(CXDB6CCDM-MA-M)
正基WiFi/BT模组AP6256
Microchip USB控制器(USB5742)
顺芯音频编解码器芯片ES8388
裕太微千兆以太网收发器(YT8531SH)
沁恒微电子USB转串口芯片(CH342F)
RTC实时时钟芯片(LK8563)
其中核心SoC RK3576可以说是板子最大特色之一,集成了四核A72与四核A53处理器,主频高达2.2GHz;自研的NPU(算力6Tops);集成G52 GPU;支持丰富的多媒体接口如HDMI、DP、DSI、CSI等。所以基于RK3576这颗SoC的核心板可以应用于像商业显示(多屏显示)、智能家居(多摄像头采集)、边缘计算(AI)等领域。
开发板上电
连接相关外设,将开发板上电后。发现默认烧录的是Debian Linux系统,系统菜单中可以看到带有 Xfce 桌面环境,64位操作系统,8GB的内存,相关软件工具也基本一应俱全。
从实际的使用情况来看,无论是浏览网页还是观看网页上的视频,无论是与非网还是B站上的高清视频,都能非常流畅的播放,丝毫没有卡顿,瑞芯微SoC加上板载的这些配置确实比较给力。
通用的性能测试工具Sysbench实际测试了RK3576 SoC的性能,如上图所示,分别是单核和8核的测试结果。跟大家熟悉的树莓派5相比,单核性能要差15%左右,而多核性能要高22%左右,毕竟是4大核、4小核的8核架构,实际应用中调度也能更加灵活。
小结
米尔电子MYD-LR3576开发板采用核心板+底板的结构,核心板基于瑞芯微最新发布的RK3576 SoC+晶存的存储和长鑫的运存,使用LGA贴片封装直接焊接到底板上;底板基于核心板扩展出丰富的外设接口,非常方便工程师做评估或者直接进行原型开发,适合像商业多屏显示,多摄像头采集的智能设备以及需要具备边缘计算能力的AI应用产品。
- 2025-02-08
-
发表了主题帖:
如何创建机器学习环境-基于瑞芯微米尔RK3576开发板
本篇源自:优秀创作者 lulugl
本文将介绍基于米尔电子MYD-LR3576开发板(米尔基于瑞芯微 RK3576开发板)的创建机器学习环境方案测试。
【前言】
【米尔-瑞芯微RK3576核心板及开发板】具有6TpsNPU以及GPU,因此是学习机器学习的好环境,为此结合《深度学习的数学——使用Python语言》
1、使用vscode 连接远程开发板
2、使用conda新建虚拟环境:
root@myd-lr3576x-debian:/home/myir/pro_learn# conda create --name myenv python=3.9
执行结果如下:
root@myd-lr3576x-debian:/home/myir/pro_learn# conda create --name myenv python=3.9
Channels:
- defaults
Platform: linux-aarch64
Collecting package metadata (repodata.json): done
Solving environment: done
## Package Plan ##
environment location: /root/miniconda3/envs/myenv
added / updated specs:
- python=3.9
The following packages will be downloaded:
package | build
---------------------------|-----------------
_libgcc_mutex-0.1 | main 2 KB defaults
_openmp_mutex-5.1 | 51_gnu 1.4 MB defaults
ca-certificates-2024.11.26 | hd43f75c_0 131 KB defaults
ld_impl_linux-aarch64-2.40 | h48e3ba3_0 848 KB defaults
libffi-3.4.4 | h419075a_1 140 KB defaults
libgcc-ng-11.2.0 | h1234567_1 1.3 MB defaults
libgomp-11.2.0 | h1234567_1 466 KB defaults
libstdcxx-ng-11.2.0 | h1234567_1 779 KB defaults
ncurses-6.4 | h419075a_0 1.1 MB defaults
openssl-3.0.15 | h998d150_0 5.2 MB defaults
pip-24.2 | py39hd43f75c_0 2.2 MB defaults
python-3.9.20 | h4bb2201_1 24.7 MB defaults
readline-8.2 | h998d150_0 381 KB defaults
setuptools-75.1.0 | py39hd43f75c_0 1.6 MB defaults
sqlite-3.45.3 | h998d150_0 1.5 MB defaults
tk-8.6.14 | h987d8db_0 3.5 MB defaults
tzdata-2024b | h04d1e81_0 115 KB defaults
wheel-0.44.0 | py39hd43f75c_0 111 KB defaults
xz-5.4.6 | h998d150_1 662 KB defaults
zlib-1.2.13 | h998d150_1 113 KB defaults
------------------------------------------------------------
Total: 46.2 MB
The following NEW packages will be INSTALLED:
_libgcc_mutex anaconda/pkgs/main/linux-aarch64::_libgcc_mutex-0.1-main
_openmp_mutex anaconda/pkgs/main/linux-aarch64::_openmp_mutex-5.1-51_gnu
ca-certificates anaconda/pkgs/main/linux-aarch64::ca-certificates-2024.11.26-hd43f75c_0
ld_impl_linux-aar~ anaconda/pkgs/main/linux-aarch64::ld_impl_linux-aarch64-2.40-h48e3ba3_0
libffi anaconda/pkgs/main/linux-aarch64::libffi-3.4.4-h419075a_1
libgcc-ng anaconda/pkgs/main/linux-aarch64::libgcc-ng-11.2.0-h1234567_1
libgomp anaconda/pkgs/main/linux-aarch64::libgomp-11.2.0-h1234567_1
libstdcxx-ng anaconda/pkgs/main/linux-aarch64::libstdcxx-ng-11.2.0-h1234567_1
ncurses anaconda/pkgs/main/linux-aarch64::ncurses-6.4-h419075a_0
openssl anaconda/pkgs/main/linux-aarch64::openssl-3.0.15-h998d150_0
pip anaconda/pkgs/main/linux-aarch64::pip-24.2-py39hd43f75c_0
python anaconda/pkgs/main/linux-aarch64::python-3.9.20-h4bb2201_1
readline anaconda/pkgs/main/linux-aarch64::readline-8.2-h998d150_0
setuptools anaconda/pkgs/main/linux-aarch64::setuptools-75.1.0-py39hd43f75c_0
sqlite anaconda/pkgs/main/linux-aarch64::sqlite-3.45.3-h998d150_0
tk anaconda/pkgs/main/linux-aarch64::tk-8.6.14-h987d8db_0
tzdata anaconda/pkgs/main/noarch::tzdata-2024b-h04d1e81_0
wheel anaconda/pkgs/main/linux-aarch64::wheel-0.44.0-py39hd43f75c_0
xz anaconda/pkgs/main/linux-aarch64::xz-5.4.6-h998d150_1
zlib anaconda/pkgs/main/linux-aarch64::zlib-1.2.13-h998d150_1
Proceed ([y]/n)? y
Downloading and Extracting Packages:
Preparing transaction: done
Verifying transaction: done
Executing transaction: done
#
# To activate this environment, use
#
# $ conda activate myenv
#
# To deactivate an active environment, use
#
# $ conda deactivate
root@myd-lr3576x-debian:/home/myir/pro_learn#
然后再激活环境:
root@myd-lr3576x-debian:/home/myir/pro_learn# conda activate myenv
(myenv) root@myd-lr3576x-debian:/home/myir/pro_learn#
2、查看python版本号:
(myenv) root@myd-lr3576x-debian:/home/myir/pro_learn# python --version
Python 3.9.20
3、使用conda install numpy等来安装组件,安装好后用pip list查看
编写测试代码:
import numpy as np
from sklearn.datasets import load_digits
from sklearn.neural_network import MLPClassifier
d = load_digits()
digits = d["data"]
labels = d["target"]
N = 200
idx = np.argsort(np.random.random(len(labels)))
xtest, ytest = digits[idx[:N]], labels[idx[:N]]
xtrain, ytrain = digits[idx[N:]], labels[idx[N:]]
clf = MLPClassifier(hidden_layer_sizes=(128, ))
clf.fit(xtrain, ytrain)
score = clf.score(xtest, ytest)
pred = clf.predict(xtest)
err = np.where(pred != ytest)[0]
print("score:", score)
print("err:", err)
print("actual:", ytest[err])
print("predicted:", pred[err])
在代码中,使用MLPClassifier对象进行建模,训练测试,训练数据集非常快,训练4次后可以达到0.99:
【总结】
米尔的这款开发板,搭载3576这颗强大的芯片,搭建了深度学习的环境,进行了基础的数据集训练,效果非常好!在书中记录训练要几分钟,但是这在这款开发板上测试,只要几秒钟就训练完毕,书中说总体准确率为0.97,但是我在这款开发板上有0.99的良好效果!
-
发表了主题帖:
如何安装模拟器玩nes小游戏-基于米尔瑞芯微RK3576开发板
本篇源自:优秀创作者 小手凉凉
本文将介绍基于米尔电子MYD-LR3576开发板(米尔基于瑞芯微 RK3576开发板)的安装模拟器玩nes小游戏方案测试。
核心板系统
操作系统镜像文件说明
myir-image-lr3576-debian: 提供 debian 系统,Gnome 默认桌面环境,包含完整的硬件
驱动,常用的系统工具,调试工具等。
myir-image-linux-full: 以 buildroot 构建的全功能的镜像,weston 桌面环境,包含所有
的完整的硬件驱动,常用的系统工具,调试工具等。
此次是在linux开发板上安装nestopia
linux下安装模拟器
主板连接hdmi到显示器接入鼠标键盘,连接网络后更新apt,后面需要用到apt安装
执行命令
# sudo apt-get install nestopia
等待即可一路安装下来
在应用程序查找器中即可看到图标,以便于开启模拟器
效果如下
将预先准备的额nes格式小游戏放桌面,通过打开文件方式加载进去
打开模拟器开始启动
试玩nes
打开nes游戏效果如下
可以通过设置画面全屏显示
设置模拟器中按键功能,可惜现在没有游戏手柄
最终开启效果
视频效果
视频:https://www.bilibili.com/video/BV1dG6RY9ESL/?vd_source=e9927453e87f8203e95e89bd26c68f4d
- 2025-01-22
-
发表了主题帖:
米尔瑞芯微RK3576第二代8nm高性能AIoT平台到底有多香?
文章来源公众号:电子开发学习
瑞芯微近期推出了第二代8nm高性能AIOT平台——RK3576。
RK3576应用方向指向工业控制及网关,云终端,人脸识别设备,车载中控,商显等等。参数方面,内置了四核Cortex-A72+四核Cortex-A53,频率最高2.2GHz,内置ARM G52 MC3 GPU,NPU算力高达6TOPS……
参数看着非常犀利,而且据说主打的就是性价比。我们近期也拿到了米尔电子推出的搭载RK3576芯片的开发板——MYD-LR3576,简单体验一番之后,给大家推出这篇开发板上手体验文章,供您在做选型时参考。
01
开发板欣赏
包装盒里最主要的东西当然就是MYD-LR3576开发板本身以及一个纸质的快速上手指南,另外盒子里还有电源适配器和USB线等附件,限于篇幅不做展示。
板子依然是米尔最经典的配色,雅光黑色油墨+焊盘沉金工艺,看着逼格拉满。SOC模组上加了一个很大的散热器。一侧是音频、Mini DP、HDMI、两个USB3.0口、两个以太网接口等。
另一侧是电源输入口、调试口、五个按键(包含三个用户按键、RESET按键、BOOT按键)。
两端各是2*20的2.54mm间距排针。
背面是M.2硬盘接口、SD卡槽、3组4 lane的MIPI CSI摄像头输入接口,以及一个MIPI DSI显示输出接口。
去掉散热器之后,就可以看到板载的米尔MYC-LR3576模组了。这个模组就是米尔推出的LGA封装模组。模组有加屏蔽壳,屏蔽壳在RK3576芯片顶端部分有开窗。这个RK3576就是标题里说的性价比无敌的SOC,集成了四核ARM Cortex-A72@2.2GHz和四核ARM Cortex-A53@1.8GHz,以及还有一颗Cortex-M0的MCU核。GPU方面,它集成的是Mali-G52 MC3。搭载了算力高达6TOPS的NPU加速器。集成度是真的高,性能也是真的强啊。
从缝隙看进去,里面用的阻容器件是真的小啊。这模组里面封装了SOC、PMIC、DDR、eMMC,以及各种阻容感,布局布线密度很大。所以做终端产品的一般规模企业,真的没必要自己做核心板。首先是研发难度较大、其次研发成本和时间投入巨大。索性专业的事情交给专业的人做,直接买这种成熟的模组往底板上一贴,还挺香的。
从这个角度看,这个模组真漂亮啊,这就是LGA封装的魅力。相比于BTB连接器、邮票孔连接、排针连接等方式,LGA可以做到连接尺寸最小,可靠性最高,焊接也很方便,把模组当做一个大号的LGA封装的芯片一样使用即可。
板子上电源入口部分细节。
按键及指示灯细节。
HDMI和USB等接口防护电路细节。
以太网接口细节。
Wifi模组及天线细节。
MYiR logo细节。米尔真是把电路板的配色玩到极致了,黑金电路板搭配橙色排针,看起来就很高端,实际上他们的板子应用场景也确实都很高端。
板子看完了,接下来上电,出厂固件已经烧录好了Debian 12 操作系统。把我的一个2K 27寸显示屏用HDMI线连接到这个开发板,无压力点亮。再给接个键盘,鼠标,就可以当做另一台电脑用了。
虽然看起来蛮帅气的,但是我还是想体验一下,这个板子的开发流程。
02
资料
要体验就要先拿到资料。开发板的包装盒和核心板屏蔽壳上都有二维码及产品的PN码和SN码,使用这两个码可以在米尔开发者中心下载对应产品的资料。
第一次体验到这么正规的开发板资料获取方式,瞬间感觉付费用户就是不一样。
资料列表中的硬件资料,提供了硬件设计指南、硬件用户手册、硬件资料包。
软件提供了米尔定制的Debian操作系统相关的软件包和Linux操作系统相关软件包。这个下载方式是阿里云盘,将近20G的资料,十来分钟就下载完了,体验感很不错,看来米尔是真的从用户层面考虑这些细节了。
先看看文档中的《MYD-LR3576 Debian软件开发指南.pdf》
目录。
随便找个内容看看,也很详细,而且写了可能会遇到的错误以及处理办法。
作为硬件工程师转行的嵌入式工程师,硬件资料是我首要关注的,仔细看发现内容真多啊。其实也不意外,我之前就有分享过米尔的瑞米派资料:谁家做板子这么开源啊?赶紧下载资料囤起来,怕他们后悔。
任何一个外设都有详细的参考电路、Layout建议。那是不是说,如果我想使用他们的核心板做底板,快速出产品给客户,直接照抄他们的设计指南就行了?我觉得大可不必,因为他们直接提供了底板的原理图和PCB文件啊,东西都喂到嘴里了,还需要自己再去动手抄吗?那我CV工程师的尊严何在?开玩笑归开玩笑,这样减小了硬件环节的工作量,企业就有更多的精力专注于软件层面的开发了。
底板是六层板,拼板也做好了。Allegro的好处就是直接可以把封装和焊盘一键导出,为我所用,一个字,爽!后面如果有客户找我做3576项目的话,那赚钱不是分分钟嘛,哈哈哈。
03
开发初体验
看着这么详细的软硬件开发资料,我觉着不跟着走一下有点对不起这资料。于是赶紧打开Ubuntu,跟着《MYD-LR3576 Debian软件开发指南.pdf》开始编译系统。
第一步就是进入SDK目录,使用./build.sh lunch指令来配置目标开发板,这里选择7。
接下来就使用./build.sh指令来全部编译一遍。第一遍全编译会比较慢,可能需要几个小时,这时候起来活动活动、喝喝茶、甚至可以约个球友出去打会儿球,回来就编译好了。
编译好固件之后,使用瑞芯微的烧录工具烧录到板子上即可。关于烧录,《MYD-LR3576 Debian软件开发指南.pdf》中花了整整八页来讲,真就差手把手了。
烧录完重新上电,相当于又进入了一个全新系统,连上网浏览个网页、打开终端玩一玩,都没啥问题。我在Github上看到有一个开源的HomeNAS,打算抽空把它部署到这个板子上,这样的话,这个板子就可以作为我的家庭存储管理中心了,这部分内容等我做好了再分享给大家。
04
后记
整体来说,经过我的一番上手体验,发现这个板子无论做工用料、颜值都是非常不错的。资料完善程度也是远远超出了我的预期。跟着文档简单操作编译个SDK也是非常顺手。有句话说得很好:改变自己最快的方法,就是做自己最害怕做的事!我以前很排斥去上手嵌入式Linux,因为我觉得这里面的东西过于庞杂,所以这些年错过了不少发财的机会。但是最近硬着头皮真的去上手了嵌入式Linux,发现并没有那么难,而且资料比我之前学MCU的资料更丰富、详细、规范。真的就属于:早上手早涨薪,晚上手晚享受!
- 2025-01-17
-
发表了主题帖:
米尔瑞芯微RK3576实测轻松搞定三屏八摄像头
RK3576参数强劲
RK3576是瑞芯微推出的一款高性能AIoT处理器,这款芯片以其卓越的计算能力、多屏幕支持、强大的视频编解码能力和高效的协处理器而闻名。
三屏8摄像头轻松搞定
米尔基于他们推出的MYD-LR3576开发板开发了一个三屏异显,8路摄像头输入的DEMO, 实测下来,RK3576轻松搞定了该任务。
MYD-LR3576开发板是基于RK3576设计的一款高性能开发板。它提供了丰富的接口资源,包括HDMI、DP、DSI、CSI等多种多媒体接口,USB 3.1/TYPE-C/DP1.4等高速接口,以及多个SAI音频接口、PCIe 2.1、SATA 3.1等接口。这些接口使得MYD-LR3576开发板能够灵活应用于各种场景。
米尔基于Linux系统开发的DEMO具体设计如下:
开发平台:
MYD-LR3576开发板
配置使用2GB DDR和16GB EMMC进行部署
三屏异显:
LVDS实现接10寸触摸屏:输出内容为是通过开启浏览器引擎访问米尔网页
MINI DP接27寸显示器:输出内容为8路摄像头捕捉图像预览
HDMI接15寸HDMI显示器:输出以基于QT开发的人机互动界面
八路摄像头:
通过米尔AHD转接板,每一路转接板将4路1080P AHD摄像头转换成MIPI信号。
本DEMO中,采用了MIPI CSI1和CS2,总计接了8路AHD摄像头。实现了8路摄像头的视频预览和采集。
性能分析:
运行以上全部应用,CPU占用34%,DDR占用50%,CPU仍有具体的利用空间赋能应用开发。
运行以上应用,在常温环境下,不加散热片状态,CPU读取温度约为65度。正面了高负载下的低功耗和低发热特性。
RK3576将为多屏多摄像头应用场景带来更高性价比的选择
RK3576的多屏多摄像头能力使其适用于多种应用场景,包括机器人、工程机械和高端显控系统。
机器人:
在机器人领域,RK3576的多屏显示和多摄像头输入能力使得机器人能够同时处理多个视觉任务,提高机器人的智能化水平。例如,迎宾机器人/养老机器人/快递机器人等可以通过多摄像头输入实现人脸识别和物体检测,同时通过多屏显示提供丰富的交互信息。米尔的MYD-LR3576开发板凭借其强大的计算能力和丰富的接口资源,非常适合用于机器人的原型开发和功能测试。
工程机械:
在工程机械领域,RK3576的多屏显示和多摄像头输入能力可以帮助工程机械实现远程监控和智能控制。通过多摄像头输入,工程机械可以实时采集工作现场的画面,并通过多屏显示提供清晰的监控画面,帮助操作人员更好地掌握工程进展。米尔的MYD-LR3576开发板以其高性能和稳定性,非常适合用于工程机械的智能控制系统开发。
高端显控系统:
在高端显控系统领域,RK3576的多屏显示能力使得系统能够同时支持多个高清显示屏幕,提供丰富的信息显示和交互界面。例如,在指挥中心或控制中心,高端显控系统需要同时显示多个监控画面和数据信息,RK3576的多屏显示能力能够满足这一需求。米尔的MYD-LR3576开发板凭借其强大的计算能力和丰富的接口资源,非常适合用于高端显控系统的开发和优化。
综上所述,RK3576以其卓越的计算能力、多屏幕支持、强大的视频编解码能力和高效的协处理器,在多屏多摄像头应用场景中表现出色。米尔的MYD-LR3576开发板凭借其丰富的接口资源和强大的性能,非常适合用于这类产品的开发,为机器人、工程机械和高端显控系统等领域的发展提供了有力支持。
- 2025-01-10
-
发表了主题帖:
米尔国产FPGA SoC芯选择,安路飞龙DR1M90核心板重磅发布
在边缘智能、物联网、5G通信和自动驾驶等技术的快速发展下,FPGA市场需求呈现爆发式增长。国产FPGA也在这场技术浪潮中崭露头角,吸引了广大行业人士的关注。
昨日,米尔电子基于安路科技最新一代国产工业级FPGA FPSoC——发布MYC-YM90X SOM模组及评估套件。该产品采用安路飞龙DR1M90,95K LEs 可编程逻辑,片上集成 64位2*Cortex-A35 @1GHz处理器,适用于复杂的实时嵌入式系统应用,支持多种内存接口和丰富的外设端口,满足多样化场景需求。
通过硬核NPU,JPU,MIPI 来支持边缘智能应用,为FPGA市场注入新的活力。SOM模组标配1GB DDR3和8GB eMMC大容量存储,满足用户数据处理日益增长需求。
MYC-YM90X 核心板——小尺寸,大功能
安路飞龙DR1M90:高性能与丰富接口赋能边缘计算
DR1M90是安路科技推出的SALDRAGON系列高性能FPSoC器件之一。它集成了双核ARM Cortex-A35处理器、FPGA可编程逻辑和AI引擎,延续了安路科技FPSoC家族的低功耗、软硬件可编程和高扩展性的优势。
核心亮点
1.高性能计算(PS):双核ARM v8架构,主频高达1GHz,满足复杂嵌入式系统的实时性需求。
2.可编程逻辑(PL):提供94,464 LEs、240 DSP48单元、5.4Mb Bram,支持灵活的硬件加速功能。
3.可编程加速引擎(NPU,JPU):搭载0.4 TOPS NPU与JPU图像编解码单元,专为高效边缘计算与视频处理设计。
4.丰富接口支持(connect):支持LVCMOS、LVDS、三速以太网、USB、CAN-FD和MIPI等高速接口,通过PL侧可编程IO拓展更多用户可定制接口。
Mutilchip→One chip FPSoC 单片全场景解决方案
集成加速引擎,助力边缘智能
双核Cortex-A35 + 95K LEs等效逻辑单元,定义边缘智能新高度
开发资源丰富,快速上手
米尔为MYC-YM90X核心板及开发板提供完善的开发资源,包括:
操作系统支持:预装Linux系统,支持用户定制化开发。
配套文档:详细的用户手册、原理图PDF、BSP源码包和外设驱动。
开发工具:提供成熟的开发环境和技术支持,帮助开发者快速启动项目。
强劲边缘智能平台,定义行业新标准
评估板接口丰富,开箱即用
配套软件开发资源丰富
MYC-YM90X核心板:工业级品质与紧凑设计
MYC-YM90X集成了DR1M90、DDR、eMMC、QSPI、WDT、Osc、Power IC等电路,在50mm x 52mm x 1.6mm的紧凑尺寸中实现了高功能密度。
工艺设计
12层高密度PCB设计:采用沉金工艺生产,具备独立接地信号层,提升信号完整性。
LCC + LGA封装:核心板背面设计有200个引脚,确保可靠焊接与稳定连接。
工业级元器件:经过宽温、高湿、振动等环境适应性测试,适应恶劣工业条件。
LCC+ LGA封装,小尺寸,大功能!
自有工厂,国际认证标准,品质可靠
多元化应用场景
凭借强大的边缘计算能力和广泛的接口支持,MYC-YM90X核心板在以下领域具有广泛的应用前景:
机器视觉:支持复杂图像处理与实时边缘计算。
工业控制:满足工业设备高实时性与稳定性要求。
能源电力:优化智能电网与新能源设备的运行效率。
汽车电子:赋能智能驾驶与车载系统。
多场景应用,工业级设计的最佳选择
配套开发板型号与核心板配置
MYC-YM90X核心板支持多种型号配置,用户可根据项目需求选择不同存储与接口规格。此外,米尔提供全套开发板解决方案,包含必要的外围接口模块,助力用户快速搭建测试环境。
核心板配置型号
产品型号
主芯片
内存
存储器
工作温度
MYC-YM90G-8E1D-100-I
DR1M90GEG484
1GB DDR3
8GB eMMC
-40℃~+85℃
MYC-YM90M-8E1D-150-I
(支持硬核MIPI,待上市)
DR1M90MEG484
1GB DDR3
8GB eMMC
-40℃~+85℃
开发板配置型号
产品型号
主芯片
内存
存储器
工作温度
MYD-YM90G -8E1D-100-I
DR1M90GEG484
1GB DDR3
8GB eMMC
-40℃~+85℃
MYD-YM90M-8E1D-80-I
(支持硬核MIPI,待上市)
DR1M90MEG484
1GB DDR3
8GB eMMC
-40℃~+85℃
结语
国产FPGA正以强劲的势头推动技术创新,安路DR1M90核心板及其开发板作为代表性产品,为边缘计算和人工智能应用提供了强大的技术支持。米尔电子将继续以客户需求为中心,提供高品质、高可靠性的国产化解决方案,助力更多企业实现数字化转型与技术升级。
更多精彩内容,欢迎关注米尔电子公众号,第一时间获取最新技术资讯和产品动态!
- 2025-01-03
-
发表了主题帖:
国产高性能CPU--米尔瑞芯微RK3576赋能AIoT、工业、智能显示终端
随着市场需求不断的变化,各行各业对CPU的要求越来越高,特别是近几年流行的 AIOT,为了有更好的用户体验,CPU的算力就要求更高了。
今天为大家推荐由米尔基于瑞芯微RK3576处理器推出的MYC-LR3576核心板及开发板。
关于RK3576处理器
国产CPU,是这些年的骄傲,华为手机全国产化,国人一片呼声,再也不用卡脖子了。
RK3576处理器,就是一款由国产是厂商瑞芯微,今年第二季推出的全新通用型的高性能SOC芯片,这款CPU到底有多么的高性能,下面看看它的几个特性:
8核心
6 TOPS超强算力
双千兆以太网
8K@30fps/4K@120fps 解码
······
CPU具备4xA72@2.2Hz + 4xA53@1.8Hz,除了以上强悍的性能,还有众多通用的功能模块和外设资源,比如:PCIE、USB、SATA、DSMC/Flexbus、CANFD、UART等。
给大家看下RK3576的框图:
通过这些参数,你会发现,这款国产高性能CPU适用于工业、AIoT、边缘计算、智能移动终端以及其他多种数字多媒体等场景。
米尔基于RK3576核心板/开发板
上面介绍了这款今年新推出的国产高性能CPU,下面给大家看看米尔基于这款RK3576处理器的核心板/开发板。
1、核心板
这款核心板尺寸仅为:43x45x3.85mm,采用LGA封装,具备高可靠性,为了满足工业应用场景,核心板还带有屏蔽骨架,能有效减少工业干扰。
同时,为满足应用,核心板匹配最高内存 8GB LPDDR4X、 64GB eMMC、 32KBit E2PROM等
2、开发板
为了方便用户拓展自己的外设,米尔提供了配套的开发板(底板)。
开发板提供的接口非常丰富,包括常见的通信和多媒体接口:
MYC-LR3576核心板及开发板特色
1、支持三屏异显
这款开发板支持支持三屏异显,得益于处理器强大的音视频编解码能力,同时,开发板还具备HDMI/DP/MIPIDSI等图形输出的常用外设。
它最高支持4K分辨率的视频显示,还支持8K分辨率的硬解码,满足多场景多样化的显示需求。
2、支持多摄像头
由于具备强大的音视频编解码能力,然后也支持MIPI-DSI/Parallel RGB/MIPI CSI/16M Pixel ISP等市面上常见的多媒体接口。
视频输入能力:
MIPI-CSI D-PHY v2.0,4 lane, 4.5Gbps/C-PHY v1.1, 3 trios, 2.5Gbps
MIPI-CSI D-PHY v1.2, 2*4 lane或4*2 lane或4+2*2, 2.5Gbps
DVP, 8/10/12/16-bit, BT.601/BT.656 and BT.1120
单通道ISP,16M pixels
3、赋能AIOT、边缘计算
RK3576处理器高性能8核心,具有6 TOPS的NPU加速器、3D GPU的高算力,在AIOT、边缘计算、 商用机器人、 AI 商显、 智能车载终端、 智慧电力等需要强大算力的应用也不在话下。
丰富的开发资源
MYC-LR3576系列核心板及开发板,提供 Linux 操作系统的驱动支持,并提供用户手册、PDF 原理图、外设驱动、BSP源码包、开发工具等相关资料;为开发者提供了稳定的设计参考和完善的软件开发环境。
1、操作系统镜像文件
myir-image-lr3576-debian:提供 debian 系统, Gnome 默认桌面环境, 包含完整的硬件驱动, 常用的系统工具, 调试工具等。
myir-image-linux-full:以 buildroot 构建的全功能的镜像, weston 桌面环境, 包含所有的完整的硬件驱动, 常用的系统工具, 调试工具等。
2、丰富的软件资源
为了用户快速上手,米尔提供了丰富的软件资源,包括Bootloader、Linux 内核、设备驱动、文件系统等。
- 2024-12-27
-
发表了主题帖:
米尔RK3576和RK3588怎么选?-看这篇就够了
在中国半导体产业的版图中,瑞芯微作为国内SoC芯片领跑者,凭借其在处理器芯片设计领域的深厚积累和持续创新,推出很多智能应用处理器芯片,在嵌入式系统领域得到大规模的应用。RK3588和RK3576系列作为都是瑞芯微(Rockchip)高性能处理器代表,性能如何?价格如何?作为硬件产品开发的我们,这两款产品到底有什么区别呢?
CPU性能强劲,应用场景丰富
CPU 性能:RK3588采用的四核Cortex - A76+四核Cortex - A55 ,而RK3576出于成本考量选用的四核Cortex - A72+四核Cortex - A53架构,并配备ARM Cortex M0的协处理器,给相关应用带来了更多可能性。
GPU性能:RK3576采用ARM Mali G52 MC3,RK3588配备ARM Mali - G610MC4,都支持OpenGL ES 1.1、2.0和3.2,Vulkan 1.2,支持的图形标准上两者类似,但在OpenCL版本上RK3588更高(2.2对比2.1)。
NPU性能:两者都配备了6Tops的算力,都支持int4/int8/int16/FP16/BF16/TF32等数据格式,适配多样化的AI应用场景。
内存和存储
RK3576支持32位LPDDR4/LPDDR4X/LPDDR5,同时支持eMMC5.1,SDIO3.0和SFC以及UFS v2.0,
RK3588支持64位 LPDDR4/LPDDR4x/LPDDR5,支持eMMC5.1;搭配HS400,SDIO3.0搭配HS200,以及支持NMe和SFC。两者在内存数据位宽上不一样(64bit对比32bit),数据传输上RK3588更有优势。
超强的视频编解码能力
编码能力RK3588最高支持8K@30fps H.264/H.265,RK3576最高支持4K@60fps H.264/H.265。解码能力RK3588支持最高8K@60fps H.265,RK3576最高支持8K@30fps。两者都具备很强的视频编解码能力,在8K的视频编解码能力上RK3588更胜一筹。
支持多屏异显
两者都支持多屏异显和各种常见的显示接口。RK3576最多支持3屏异显和最高可支持(4K@120 + 2.5K@60 + 2K@60),具有HDMI v2.1/ eDP v1.3组合接口、MIPI DSI 4通道、DP v1.4和USB 3.0组合(Type - C)接口等多种接口。
RK3588最高可以支持7屏异显和支持8K,具有双HDMI2.1/eDP V1.4组合接口、双MIPI - DSI TX 4通道以及双DP v1.3嵌入USB 3.1且带有音频和HDCP2.x。
摄像头视频输入对比
RK3576支持最高16MPixel ISP带有HDR和3DNR
RK3588配备48M Pixel ISP带有HDR和3DNR,RK3588的像素ISP分辨率更高(48M对比16M)
具备丰富的接口配置
两者都配备了丰富的接口配置,PCIe/ SATA/ TYPE C/ USB3.0/ USB2.0/双网口/多路串口,满足不同的产品应用需求。
总结:性价比极高的RK3576
综合性能来讲,RK3588的CPU性能更强,强AI需求建议使用RK3588;但RK3576作为瑞芯微最新推出的一款高性能SOC,它可以说极具性价比,以30%的价格获RK3588的70%的性能,可用于大部分AIOT、人工智能、工业应用等场景。RK3576作为瑞芯微的又一款良心大作,是您的不二之选。
- 2024-12-19
-
发表了主题帖:
如何用OpenCV进行人脸疲劳检测--基于米尔瑞芯微RK3576开发板
本篇源自:优秀创作者 lulugl
本文将介绍基于米尔电子MYD-LR3576开发板(米尔基于瑞芯微 RK3576开发板)的人脸疲劳检测方案测试。
米尔基于RK3576核心板/开发板
【前言】
人脸疲劳检测:一种通过分析人脸特征来判断一个人是否处于疲劳状态的技术。其原理主要基于计算机视觉和机器学习方法。当人疲劳时,面部会出现一些特征变化,如眼睛闭合程度增加、眨眼频率变慢、打哈欠、头部姿态改变等。
例如,通过检测眼睛的状态来判断疲劳程度是一个关键部分。正常情况下,人的眨眼频率相对稳定,而当疲劳时,眨眼频率会降低,并且每次眨眼时眼睛闭合的时间可能会延长。同时,头部可能会不自觉地下垂或者摇晃,这些特征都可以作为疲劳检测的依据。米尔MYC-LR3576采用8核CPU+搭载6 TOPS的NPU加速器,3D GPU,能够非常轻松的实现这个功能,下面就如何实现这一功能分享如下:
【硬件】
1、米尔MYC-LR3576开发板
2、USB摄像头
【软件】
1、v4l2
2、openCV
3、dlib库:dlib 是一个现代化的 C++ 工具包,它包含了许多用于机器学习、图像处理、数值计算等多种任务的算法和工具。它的设计目标是提供高性能、易于使用的库,并且在开源社区中被广泛应用。
【实现步骤】
1、安装python-opencv
2、安装dlib库
3、安装v4l2库
【代码实现】
1、引入cv2、dlib以及线程等:
import cv2
import dlib
import numpy as np
import time
from concurrent.futures import ThreadPoolExecutor
import threading
2、初始化dlib的面部检测器和特征点预测器
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')
3、定义计算眼睛纵横比的函数
def eye_aspect_ratio(eye):
A = np.linalg.norm(np.array(eye[1]) - np.array(eye[5]))
B = np.linalg.norm(np.array(eye[2]) - np.array(eye[4]))
C = np.linalg.norm(np.array(eye[0]) - np.array(eye[3]))
ear = (A + B) / (2.0 * C)
return ear
4、定义计算头部姿势的函数
def get_head_pose(shape):
# 定义面部特征点的三维坐标
object_points = np.array([
(0.0, 0.0, 0.0), # 鼻尖
(0.0, -330.0, -65.0), # 下巴
(-225.0, 170.0, -135.0), # 左眼左眼角
(225.0, 170.0, -135.0), # 右眼右眼角
(-150.0, -150.0, -125.0), # 左嘴角
(150.0, -150.0, -125.0) # 右嘴角
], dtype=np.float32)
image_pts = np.float32([shape[i] for i in [30, 8, 36, 45, 48, 54]])
size = frame.shape
focal_length = size[1]
center = (size[1] // 2, size[0] // 2)
camera_matrix = np.array(
[[focal_length, 0, center[0]],
[0, focal_length, center[1]],
[0, 0, 1]], dtype="double"
)
dist_coeffs = np.zeros((4, 1))
(success, rotation_vector, translation_vector) = cv2.solvePnP(
object_points, image_pts, camera_matrix, dist_coeffs, flags=cv2.SOLVEPNP_ITERATIVE
)
rmat, _ = cv2.Rodrigues(rotation_vector)
angles, _, _, _, _, _ = cv2.RQDecomp3x3(rmat)
return angles
5、定义眼睛纵横比阈值和连续帧数阈值
EYE_AR_THRESH = 0.3
EYE_AR_CONSEC_FRAMES = 48
6、打开摄像头
我们先使用v4l2-ctl --list-devices来例出接在开发板上的列表信息:
USB Camera: USB Camera (usb-xhci-hcd.0.auto-1.2):
/dev/video60
/dev/video61
/dev/media7
在代码中填入60为摄像头的编号:
cap = cv2.VideoCapture(60)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 480) # 降低分辨率
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 320)
7、创建多线程处理函数,实现采集与分析分离:
# 多线程处理函数
def process_frame(frame):
global COUNTER, TOTAL
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = detector(gray, 0) # 第二个参数为0,表示不使用upsampling
for face in faces:
landmarks = predictor(gray, face)
shape = [(landmarks.part(i).x, landmarks.part(i).y) for i in range(68)]
left_eye = shape[36:42]
right_eye = shape[42:48]
left_ear = eye_aspect_ratio(left_eye)
right_ear = eye_aspect_ratio(right_eye)
ear = (left_ear + right_ear) / 2.0
if ear < EYE_AR_THRESH:
with lock:
COUNTER += 1
else:
with lock:
if COUNTER >= EYE_AR_CONSEC_FRAMES:
TOTAL += 1
COUNTER = 0
# 绘制68个特征点
for n in range(0, 68):
x, y = shape[n]
cv2.circle(frame, (x, y), 2, (0, 255, 0), -1)
cv2.putText(frame, f"Eye AR: {ear:.2f}", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, font_scale, (0, 0, 255), 2)
cv2.putText(frame, f"Blink Count: {TOTAL}", (10, 60), cv2.FONT_HERSHEY_SIMPLEX, font_scale, (0, 0, 255), 2)
# 计算头部姿势
angles = get_head_pose(shape)
pitch, yaw, roll = angles
cv2.putText(frame, f"Pitch: {pitch:.2f}", (10, 120), cv2.FONT_HERSHEY_SIMPLEX, font_scale, (0, 0, 255), 2)
cv2.putText(frame, f"Yaw: {yaw:.2f}", (10, 150), cv2.FONT_HERSHEY_SIMPLEX, font_scale, (0, 0, 255), 2)
cv2.putText(frame, f"Roll: {roll:.2f}", (10, 180), cv2.FONT_HERSHEY_SIMPLEX, font_scale, (0, 0, 255), 2)
# 判断疲劳状态
if COUNTER >= EYE_AR_CONSEC_FRAMES or abs(pitch) > 30 or abs(yaw) > 30 or abs(roll) > 30:
cv2.putText(frame, "Fatigue Detected!", (10, 210), cv2.FONT_HERSHEY_SIMPLEX, font_scale, (0, 0, 255), 2)
return frame
8、创建图像显示线程:
with ThreadPoolExecutor(max_workers=2) as executor:
future_to_frame = {}
while True:
ret, frame = cap.read()
if not ret:
break
# 提交当前帧到线程池
future = executor.submit(process_frame, frame.copy())
future_to_frame[future] = frame
# 获取已完成的任务结果
for future in list(future_to_frame.keys()):
if future.done():
processed_frame = future.result()
cv2.imshow("Frame", processed_frame)
del future_to_frame[future]
break
# 计算帧数
fps_counter += 1
elapsed_time = time.time() - start_time
if elapsed_time > 1.0:
fps = fps_counter / elapsed_time
fps_counter = 0
start_time = time.time()
cv2.putText(processed_frame, f"FPS: {fps:.2f}", (10, 90), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
if cv2.waitKey(1) & 0xFF == ord('q'):
实现效果:
根据检测的结果,我们就可以来实现疲劳提醒等等的功能。
整体代码如下:
import cv2
import dlib
import numpy as np
import time
from concurrent.futures import ThreadPoolExecutor
import threading
# 初始化dlib的面部检测器和特征点预测器
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')
# 修改字体大小
font_scale = 0.5 # 原来的字体大小是0.7,现在改为0.5
# 定义计算眼睛纵横比的函数
def eye_aspect_ratio(eye):
A = np.linalg.norm(np.array(eye[1]) - np.array(eye[5]))
B = np.linalg.norm(np.array(eye[2]) - np.array(eye[4]))
C = np.linalg.norm(np.array(eye[0]) - np.array(eye[3]))
ear = (A + B) / (2.0 * C)
return ear
# 定义计算头部姿势的函数
def get_head_pose(shape):
# 定义面部特征点的三维坐标
object_points = np.array([
(0.0, 0.0, 0.0), # 鼻尖
(0.0, -330.0, -65.0), # 下巴
(-225.0, 170.0, -135.0), # 左眼左眼角
(225.0, 170.0, -135.0), # 右眼右眼角
(-150.0, -150.0, -125.0), # 左嘴角
(150.0, -150.0, -125.0) # 右嘴角
], dtype=np.float32)
image_pts = np.float32([shape[i] for i in [30, 8, 36, 45, 48, 54]])
size = frame.shape
focal_length = size[1]
center = (size[1] // 2, size[0] // 2)
camera_matrix = np.array(
[[focal_length, 0, center[0]],
[0, focal_length, center[1]],
[0, 0, 1]], dtype="double"
)
dist_coeffs = np.zeros((4, 1))
(success, rotation_vector, translation_vector) = cv2.solvePnP(
object_points, image_pts, camera_matrix, dist_coeffs, flags=cv2.SOLVEPNP_ITERATIVE
)
rmat, _ = cv2.Rodrigues(rotation_vector)
angles, _, _, _, _, _ = cv2.RQDecomp3x3(rmat)
return angles
# 定义眼睛纵横比阈值和连续帧数阈值
EYE_AR_THRESH = 0.3
EYE_AR_CONSEC_FRAMES = 48
# 初始化计数器
COUNTER = 0
TOTAL = 0
# 创建锁对象
lock = threading.Lock()
# 打开摄像头
cap = cv2.VideoCapture(60)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 480) # 降低分辨率
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 320)
# 初始化帧计数器和时间戳
fps_counter = 0
start_time = time.time()
# 多线程处理函数
def process_frame(frame):
global COUNTER, TOTAL
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = detector(gray, 0) # 第二个参数为0,表示不使用upsampling
for face in faces:
landmarks = predictor(gray, face)
shape = [(landmarks.part(i).x, landmarks.part(i).y) for i in range(68)]
left_eye = shape[36:42]
right_eye = shape[42:48]
left_ear = eye_aspect_ratio(left_eye)
right_ear = eye_aspect_ratio(right_eye)
ear = (left_ear + right_ear) / 2.0
if ear < EYE_AR_THRESH:
with lock:
COUNTER += 1
else:
with lock:
if COUNTER >= EYE_AR_CONSEC_FRAMES:
TOTAL += 1
COUNTER = 0
# 绘制68个特征点
for n in range(0, 68):
x, y = shape[n]
cv2.circle(frame, (x, y), 2, (0, 255, 0), -1)
cv2.putText(frame, f"Eye AR: {ear:.2f}", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, font_scale, (0, 0, 255), 2)
cv2.putText(frame, f"Blink Count: {TOTAL}", (10, 60), cv2.FONT_HERSHEY_SIMPLEX, font_scale, (0, 0, 255), 2)
# 计算头部姿势
angles = get_head_pose(shape)
pitch, yaw, roll = angles
cv2.putText(frame, f"Pitch: {pitch:.2f}", (10, 120), cv2.FONT_HERSHEY_SIMPLEX, font_scale, (0, 0, 255), 2)
cv2.putText(frame, f"Yaw: {yaw:.2f}", (10, 150), cv2.FONT_HERSHEY_SIMPLEX, font_scale, (0, 0, 255), 2)
cv2.putText(frame, f"Roll: {roll:.2f}", (10, 180), cv2.FONT_HERSHEY_SIMPLEX, font_scale, (0, 0, 255), 2)
# 判断疲劳状态
if COUNTER >= EYE_AR_CONSEC_FRAMES or abs(pitch) > 30 or abs(yaw) > 30 or abs(roll) > 30:
cv2.putText(frame, "Fatigue Detected!", (10, 210), cv2.FONT_HERSHEY_SIMPLEX, font_scale, (0, 0, 255), 2)
return frame
with ThreadPoolExecutor(max_workers=2) as executor:
future_to_frame = {}
while True:
ret, frame = cap.read()
if not ret:
break
# 提交当前帧到线程池
future = executor.submit(process_frame, frame.copy())
future_to_frame[future] = frame
# 获取已完成的任务结果
for future in list(future_to_frame.keys()):
if future.done():
processed_frame = future.result()
cv2.imshow("Frame", processed_frame)
del future_to_frame[future]
break
# 计算帧数
fps_counter += 1
elapsed_time = time.time() - start_time
if elapsed_time > 1.0:
fps = fps_counter / elapsed_time
fps_counter = 0
start_time = time.time()
cv2.putText(processed_frame, f"FPS: {fps:.2f}", (10, 90), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放摄像头并关闭所有窗口
cap.release()
cv2.destroyAllWindows()
【总结】
【米尔MYC-LR3576核心板及开发板】
这块开发板性能强大,能轻松实现对人脸的疲劳检测,通过计算结果后进入非常多的工业、人工智能等等的实用功能。
- 2024-12-13
-
发表了主题帖:
OpenCV手势识别方案--基于米尔全志T527开发板
本文将介绍基于米尔电子MYD-LT527开发板(米尔基于全志T527开发板)的OpenCV手势识别方案测试。
摘自优秀创作者-小火苗
米尔基于全志T527开发板
一、软件环境安装
1.安装OpenCV
sudo apt-get install libopencv-dev python3-opencv
2.安装pip
sudo apt-get install python3-pip
二、OpenCV手势识别步骤
1.图像获取:从摄像头或其他图像源获取手部图像。使用OpenCV的VideoCapture类可以捕获视频流,或者使用imread函数加载图像。
2.图像预处理:对图像进行预处理,以提高特征提取的准确性。常用的预处理操作包括灰度化、滤波、边缘检测、二值化、噪声去除和形态学处理等。
灰度化:将彩色图像转换为灰度图像,去除颜色信息,简化图像。
滤波:使用滤波器去除图像中的噪声。
边缘检测:使用边缘检测算法提取图像中的边缘信息。
二值化:将灰度图像转换为二值图像,将像素值分为黑色和白色。
形态学处理:使用形态学操作增强手势轮廓。
3.特征提取:从预处理后的图像中提取手部特征。常用的特征包括形状特征、纹理特征和运动轨迹特征等。
形状特征:提取手部轮廓、面积、周长、质心等形状特征。
纹理特征:提取手部皮肤纹理、皱纹等纹理特征。
运动轨迹特征:提取手部运动轨迹、速度、加速度等运动轨迹特征。
4.分类和识别:使用机器学习算法对提取的特征进行分类,以识别特定的手势。
三、代码实现
# -*- coding: utf-8 -*-
import cv2
def reg(x):
o1 = cv2.imread('paper.jpg',1)
o2 = cv2.imread('rock.jpg',1)
o3 = cv2.imread('scissors.jpg',1)
gray1 = cv2.cvtColor(o1,cv2.COLOR_BGR2GRAY)
gray2 = cv2.cvtColor(o2,cv2.COLOR_BGR2GRAY)
gray3 = cv2.cvtColor(o3,cv2.COLOR_BGR2GRAY)
xgray = cv2.cvtColor(x,cv2.COLOR_BGR2GRAY)
ret, binary1 = cv2.threshold(gray1,127,255,cv2.THRESH_BINARY)
ret, binary2 = cv2.threshold(gray2,127,255,cv2.THRESH_BINARY)
ret, binary3 = cv2.threshold(gray3,127,255,cv2.THRESH_BINARY)
xret, xbinary = cv2.threshold(xgray,127,255,cv2.THRESH_BINARY)
contours1, hierarchy = cv2.findContours(binary1,
cv2.RETR_LIST,
cv2.CHAIN_APPROX_SIMPLE)
contours2, hierarchy = cv2.findContours(binary2,
cv2.RETR_LIST,
cv2.CHAIN_APPROX_SIMPLE)
contours3, hierarchy = cv2.findContours(binary3,
cv2.RETR_LIST,
cv2.CHAIN_APPROX_SIMPLE)
xcontours, hierarchy = cv2.findContours(xbinary,
cv2.RETR_LIST,
cv2.CHAIN_APPROX_SIMPLE)
cnt1 = contours1[0]
cnt2 = contours2[0]
cnt3 = contours3[0]
x = xcontours[0]
ret=[]
ret.append(cv2.matchShapes(x,cnt1,1,0.0))
ret.append(cv2.matchShapes(x,cnt2,1,0.0))
ret.append(cv2.matchShapes(x,cnt3,1,0.0))
max_index = ret.index(min(ret)) #计算最大值索引
if max_index==0:
r="paper"
elif max_index==1:
r="rock"
else:
r="sessiors"
return r
t1=cv2.imread('test1.jpg',1)
t2=cv2.imread('test2.jpg',1)
t3=cv2.imread('test3.jpg',1)
# print(reg(t1))
# print(reg(t2))
# print(reg(t3))
# ===========显示处理结果==================
org=(0,60)
font = cv2.FONT_HERSHEY_SIMPLEX
fontScale=2
color=(255,255,255)
thickness=3
cv2.putText(t1,reg(t1),org,font,fontScale,color,thickness)
cv2.putText(t2,reg(t2),org,font,fontScale,color,thickness)
cv2.putText(t3,reg(t3),org,font,fontScale,color,thickness)
cv2.imshow('test1',t1)
cv2.imshow('test2',t2)
cv2.imshow('test3',t3)
cv2.waitKey()
cv2.destroyAllWindows()
四、实践
1.程序运行
2、原始图像包含训练图像
3.识别结果
识别到了 剪刀 石头 布
原始图片
- 2024-12-06
-
发表了主题帖:
助力AIoT应用:在米尔FPGA开发板上实现Tiny YOLO V4
学习如何在 MYIR 的 ZU3EG FPGA 开发板上部署 Tiny YOLO v4,对比 FPGA、GPU、CPU 的性能,助力 AIoT 边缘计算应用。
一、 为什么选择 FPGA:应对 7nm 制程与 AI 限制
在全球半导体制程限制和高端 GPU 受限的大环境下,FPGA 成为了中国企业发展的重要路径之一。它可支持灵活的 AIoT 应用,其灵活性与可编程性使其可以在国内成熟的 28nm 工艺甚至更低节点的制程下实现高效的硬件加速。
米尔的 ZU3EG 开发板凭借其可重构架构为 AI 和计算密集型任务提供了支持,同时避免了 7nm 工艺对国产芯片设计的制约。通过在 ZU3EG 上部署 Tiny YOLO V4,我们可以为智能家居、智慧城市等 AIoT 应用提供高效的解决方案。
CPU GPU FPGA 架构对比
二、 了解 Tiny YOLO 模型及其适用性
YOLO(You Only Look Once)是一种实时物体检测模型,它通过一次性扫描整个图像,实现高效的对象识别。
而其简化版 Tiny YOLO V4 更适合嵌入式设备,具有较少的层数和参数。其轻量化特性更适合在资源受限的设备上运行,尤其在低功耗、实时检测的边缘计算设备中表现出色。
相比传统 GPU,FPGA 能在小面积和低功耗下实现类似的推理性能,非常契合 AIoT 应用。像米尔 ZU3EG 这样的 FPGA 开发板,通过底板和丰富接口的载板设计,非常适合高效的嵌入式低功耗数据处理。
Yolo V4 网络结构图
Tiny Yolo V4 网络结构图
(通过优化网络结构和参数,保持较高检测精度的同时,降低模型的计算量和内存占用)
三、 获取数据集和模型
可下载开源训练集或预训练模型。为了确保兼容性,建议将模型转换为 ONNX 格式,以便后续能在 FPGA 上完成优化。
1.下载 Tiny YOLO V4 模型:从Darknet 的 GitHub 仓库 获取 Tiny YOLO 的预训练权重,或者在 COCO 等数据集上自行训练模型。自定义的模型适用于特定应用场景(如车辆检测、人脸检测等)。
2.数据准备:若要自定义模型,可使用 LabelImg 等工具对数据集进行标注,将数据转为 YOLO 格式。之后,可将 YOLO 格式转换为 ONNX 格式,以便兼容 FPGA 优化工具链。
Tiny YOLO 在 Darknet 上训练的截图
四、 通过 Vivado HLS 为 FPGA 准备模型
要将模型部署到 FPGA,需要将神经网络操作转换为硬件级描述。使用 Xilinx 的 Vitis HLS(高级综合)可以将 Tiny YOLO v4 的 C++ 模型代码的转化为 Verilog RTL(寄存器传输级)代码,从而将模型从软件世界带入硬件实现。
详细步骤:
1.模型层映射和优化:
将 YOLO 的每一层(如卷积层、池化层)映射为硬件友好的 C/C++ 结构。例如,将卷积映射为乘累加(MAC)数组,通过流水线实现并行化。
2.算子加速与指令优化:
流水线(Pipelining):利用流水线来处理多项操作并行,减少延迟。
循环展开(Loop Unrolling):展开循环,以每周期处理更多数据,尤其在卷积操作中有效。
设置 DATAFLOW 指令,使层间独立处理。
3.量化与位宽调整:
将激活值和权重量化为定点精度(例如 INT8),而非浮点数。这在维持准确度的同时显著降低计算量,尤其适合 FPGA 的固定点运算支持。
Tiny YOLO 模型在 Vivado HLS 中的层层转化流程图
五、 使用 Vivado 综合与部署 Verilog 到 米尔的ZU3EG FPGA开发板
当 HLS 生成的 RTL 代码准备就绪后,可以使用 Vivado 将模型部署到 FPGA。
1.Vivado 中的设置:
将 HLS 输出的 RTL 文件导入 Vivado。
在 Vivado 中创建模块设计,包括连接AXI 接口与 ZU3EG 的 ARM 核连接。
2.I/O 约束与时序:
定义 FPGA 的 I/O 引脚约束,以匹配 ZU3EG 板的特定管脚配置。配置时钟约束以满足合适的数据速率(如视频数据 100-200 MHz)。
进行时序分析,确保延迟和响应速度达到实时要求。
3.生成比特流并下载到 ZU3EG:
生成的比特流可以直接通过 JTAG 或以太网接口下载到 ZU3EG。
将 Tiny YOLO 处理模块连接到 米尔ZU3EG开发板 的外设和接口
六、 在 FPGA 上测试并运行推理
现在 Tiny YOLO 已部署,可以验证其实时对象检测性能。
1.数据采集:
通过连接的相机模块捕捉图像或视频帧,或者使用存储的测试视频。
使用 ZU3EG 的 ARM 核上的 OpenCV 对帧进行预处理,再将它们传入 FPGA 预处理后进行推理。
2.后处理与显示:
模型检测对象后,输出边框和类别标签。使用 OpenCV 将边框映射回原始帧,并在每个检测到的对象周围显示类别和置信度。
3.性能测试:
测量帧速率(FPS)和检测准确度。微调量化位宽或数据流参数,以优化实时需求。
Tiny YOLO 模型在 ZU3EG 上显示检测结果的实时输出,视频帧中标注了检测到的对象
七、 性能优化与调试技巧
为提高性能,可以进行以下调整:
内存访问:设计数据存储方式,最大限度利用缓存并减少数据传输,降低内存瓶颈。
降低延迟:重新评估关键路径延迟。若延迟过高,调整 Vitis HLS 中的流水线深度,并验证层间的数据依赖性。
量化改进:尝试 INT8 量化。Xilinx 的 Vitis AI 可帮助微调量化参数,以平衡准确性与速度。
不同优化配置对资源使用的影响
米尔MYC-CZU3EG/4EV/5EV-V2核心板及开发板
在MYIR 的 ZU3EG 开发平台上提供了一种高效的解决方案。利用 FPGA 独特的灵活性和低功耗优势,助力未来 AIoT 设备的普及和智能升级。
- 2024-11-29
-
发表了主题帖:
FacenetPytorch人脸识别方案——基于米尔全志T527开发板
本篇测评由优秀测评者“小火苗”提供。
本文将介绍基于米尔电子MYD-LT527开发板(米尔基于全志 T527开发板)的FacenetPytorch人脸识别方案测试。
一、facenet_pytorch算法实现人脸识别
深度神经网络
1.简介
Facenet-PyTorch 是一个基于 PyTorch 框架实现的人脸识别库。它提供了 FaceNet 模型的 PyTorch 实现,可以用于训练自己的人脸识别模型。FaceNet 是由 Google 研究人员提出的一种深度学习模型,专门用于人脸识别任务。
在利用PyTorch神经网络算法进行人脸图像对比的实验设置中,我们专注于对比环节,而不涉及实际项目的完整实现细节。但55555贴近实际应用,我们可以构想以下流程:
1)捕捉新人脸图像:首先,我们使用摄像头或其他图像采集设备捕捉一张新的人脸照片。
2)加载存储的人脸图像:接着,从数据库中加载所有已存储的人脸图像。这些图像是之前采集并存储的,用于与新捕捉到的人脸照片进行对比。
3)构建神经网络模型:为了实现对比功能,我们需要一个预先训练好或自定义的神经网络模型。这个模型能够提取人脸图像中的关键特征,使得相似的图像在特征空间中具有相近的表示。
4)特征提取:利用神经网络模型,对新捕捉到的人脸照片和存储的每一张人脸图像进行特征提取。这些特征向量将用于后续的对比计算。
5)计算相似度:采用合适的相似度度量方法(如余弦相似度、欧氏距离等),计算新照片特征向量与存储图像特征向量之间的相似度。
6)确定匹配图像:根据相似度计算结果,找到与新照片相似度最高的存储图像,即认为这两张图像匹配成功。
7)输出匹配结果:最后,输出匹配成功的图像信息或相关标识,以完成人脸对比的实验任务。
2.核心组件
MTCNN:Multi-task Cascaded Convolutional Networks,即多任务级联卷积网络,专门设计用于同时进行人脸检测和对齐。它在处理速度和准确性上都有出色的表现,是当前人脸检测领域的主流算法之一。
FaceNet:由Google研究人员提出的一种深度学习模型,专门用于人脸识别任务。FaceNet通过将人脸图像映射到一个高维空间,使得同一个人的不同图像在这个空间中的距离尽可能小,而不同人的图像距离尽可能大。这种嵌入表示可以直接用于人脸验证、识别和聚类。
3.功能
支持人脸检测:使用MTCNN算法进行人脸检测,能够准确识别出图像中的人脸位置。
支持人脸识别:使用FaceNet算法进行人脸识别,能够提取人脸特征并进行相似度计算,实现人脸验证和识别功能。
二、安装facenet_pytorch库
1.更新系统
更新ubuntu系统,详情查看米尔提供的资料文件
2.更新系统软件
apt-get update
3.安装git等支持软件
sudo apt-get install -y python3-dev python3-pip libopenblas-dev libssl-dev libffi-dev git cmake
4.安装Pytorch支持工具
# 克隆 PyTorch 源代码
git clone --recursive https://github.com/pytorch/pytorch
# 进入 PyTorch 目录
cd pytorch
# 安装 PyTorch (需要根据你的需求选择 CUDA 版本,如果不需要 GPU 支持则不需要 --cuda 参数)
pip3 install --no-cache-dir torch -f https://download.pytorch.org/whl/torch_stable.html
# 测试 PyTorch 安装
python3 -c "import torch; print(torch.__version__)"
5.安装facenet_pytorch
pip3 install facenet_pytorch
三、CSDN参考案例
1.代码实现
############face_demo.py#############################
import cv2
import torch
from facenet_pytorch import MTCNN, InceptionResnetV1
# 获得人脸特征向量
def load_known_faces(dstImgPath, mtcnn, resnet):
aligned = []
knownImg = cv2.imread(dstImgPath) # 读取图片
face = mtcnn(knownImg) # 使用mtcnn检测人脸,返回人脸数组
if face is not None:
aligned.append(face[0])
aligned = torch.stack(aligned).to(device)
with torch.no_grad():
known_faces_emb = resnet(aligned).detach().cpu()
# 使用ResNet模型获取人脸对应的特征向量
print("n人脸对应的特征向量为:n", known_faces_emb)
return known_faces_emb, knownImg
# 计算人脸特征向量间的欧氏距离,设置阈值,判断是否为同一张人脸
def match_faces(faces_emb, known_faces_emb, threshold):
isExistDst = False
distance = (known_faces_emb[0] - faces_emb[0]).norm().item()
print("n两张人脸的欧式距离为:%.2f" % distance)
if (distance < threshold):
isExistDst = True
return isExistDst
if __name__ == '__main__':
# help(MTCNN)
# help(InceptionResnetV1)
# 获取设备
device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')
# mtcnn模型加载设置网络参数,进行人脸检测
mtcnn = MTCNN(min_face_size=12, thresholds=[0.2, 0.2, 0.3],
keep_all=True, device=device)
# InceptionResnetV1模型加载用于获取人脸特征向量
resnet = InceptionResnetV1(pretrained='vggface2').eval().to(device)
MatchThreshold = 0.8 # 人脸特征向量匹配阈值设置
known_faces_emb, _ = load_known_faces('yz.jpg', mtcnn, resnet) # 已知人物图
faces_emb, img = load_known_faces('yz1.jpg', mtcnn, resnet) # 待检测人物图
isExistDst = match_faces(faces_emb, known_faces_emb, MatchThreshold) # 人脸匹配
print("设置的人脸特征向量匹配阈值为:", MatchThreshold)
if isExistDst:
boxes, prob, landmarks = mtcnn.detect(img, landmarks=True)
print('由于欧氏距离小于匹配阈值,故匹配')
else:
print('由于欧氏距离大于匹配阈值,故不匹配')
此代码是使用训练后的模型程序进行使用,在程序中需要标明人脸识别对比的图像。
2.实践过程
第一次运行时系统需要下载预训练的vggface模型,下载过程较长,后面就不需要在下载了运行会很快。如图所示:
3.程序运行异常被终止
运行程序,提示killed,系统杀死了本程序的运行,经过多方面的测试,最终发现是识别的图片过大,使得程序对内存消耗过大导致。后将图片缩小可以正常运行了。
以下是对比图像和对比结果。
四、gitHub开源代码
1.首先下载代码文件
代码库中,大致的介绍了facenet算法的训练步骤等。
2.代码实现
以下是facenet的python代码,注意需要更改下面的一条程序"cuda" False,因为t527使用的是cpu,芯片到时自带gpu但是cuda用不了,因为cuda是英伟达退出的一种计算机架构。
import matplotlib.pyplot as plt
import numpy as np
import torchimport torch.backends.cudnn as cudnn
from nets.facenet import Facenet as facenet
from utils.utils import preprocess_input, resize_image, show_config
#--------------------------------------------#
# 使用自己训练好的模型预测需要修改2个参数
# model_path和backbone需要修改!
#--------------------------------------------#
class Facenet(object):
_defaults = {
#--------------------------------------------------------------------------#
# 使用自己训练好的模型进行预测要修改model_path,指向logs文件夹下的权值文件
# 训练好后logs文件夹下存在多个权值文件,选择验证集损失较低的即可。
# 验证集损失较低不代表准确度较高,仅代表该权值在验证集上泛化性能较好。
#--------------------------------------------------------------------------#
"model_path" : "model_data/facenet_mobilenet.pth",
#--------------------------------------------------------------------------#
# 输入图片的大小。
#--------------------------------------------------------------------------#
"input_shape" : [160, 160, 3],
#--------------------------------------------------------------------------#
# 所使用到的主干特征提取网络
#--------------------------------------------------------------------------#
"backbone" : "mobilenet",
#-------------------------------------------#
# 是否进行不失真的resize
#-------------------------------------------#
"letterbox_image" : True,
#-------------------------------------------#
# 是否使用Cuda# 没有GPU可以设置成False
#-------------------------------------------#
"cuda" : False,
}
@classmethod
def get_defaults(cls, n):
if n in cls._defaults:
return cls._defaults[n]
else:
return "Unrecognized attribute name '" + n + "'"
#---------------------------------------------------#
# 初始化Facenet
#---------------------------------------------------#
def __init__(self, **kwargs):
self.__dict__.update(self._defaults)
for name, value in kwargs.items():
setattr(self, name, value)
self.generate()
show_config(**self._defaults)
def generate(self):
#---------------------------------------------------#
# 载入模型与权值
#---------------------------------------------------#
print('Loading weights into state dict...')
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
self.net = facenet(backbone=self.backbone, mode="predict").eval()
self.net.load_state_dict(torch.load(self.model_path, map_location=device), strict=False)
print('{} model loaded.'.format(self.model_path))
if self.cuda:
self.net = torch.nn.DataParallel(self.net)
cudnn.benchmark = True
self.net = self.net.cuda()
#---------------------------------------------------#
# 检测图片
#---------------------------------------------------#
def detect_image(self, image_1, image_2):
#---------------------------------------------------#
# 图片预处理,归一化
#---------------------------------------------------#
with torch.no_grad():
image_1 = resize_image(image_1, [self.input_shape[1], self.input_shape[0]], letterbox_image=self.letterbox_image)
image_2 = resize_image(image_2, [self.input_shape[1], self.input_shape[0]], letterbox_image=self.letterbox_image)
photo_1 = torch.from_numpy(np.expand_dims(np.transpose(preprocess_input(np.array(image_1, np.float32)), (2, 0, 1)), 0))
photo_2 = torch.from_numpy(np.expand_dims(np.transpose(preprocess_input(np.array(image_2, np.float32)), (2, 0, 1)), 0))
if self.cuda:
photo_1 = photo_1.cuda()
photo_2 = photo_2.cuda()
#---------------------------------------------------#
# 图片传入网络进行预测
#---------------------------------------------------#
output1 = self.net(photo_1).cpu().numpy()
output2 = self.net(photo_2).cpu().numpy()
#---------------------------------------------------#
# 计算二者之间的距离
#---------------------------------------------------#
l1 = np.linalg.norm(output1 - output2, axis=1)
plt.subplot(1, 2, 1)
plt.imshow(np.array(image_1))
plt.subplot(1, 2, 2)
plt.imshow(np.array(image_2))
plt.text(-12, -12, 'Distance:%.3f' % l1, ha='center', va= 'bottom',fontsize=11)
plt.show()
return l1
3.代码实现
此代码调用的签名的代码,但其可以直接的去调用图片进行人脸识别。
from PIL import Image
from facenet import Facenet
if __name__ == "__main__":
model = Facenet()
while True:
image_1 = input('Input image_1 filename:')
try:
image_1 = Image.open(image_1)
except:
print('Image_1 Open Error! Try again!')
continue
image_2 = input('Input image_2 filename:')
try:
image_2 = Image.open(image_2)
except:
print('Image_2 Open Error! Try again!')
continue
probability = model.detect_image(image_1,image_2)
print(probability)
4.程序运行
运行程序后首先显示的是程序的配置信息,然后可以输入图像对比检测的内容。以下是图像识别的效果和对比的准确率。
五、参考文献
CSDN博客
https://blog.csdn.net/weixin_45939929/article/details/124789487?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-1-124789487-blog-142987324.235^v43^pc_blog_bottom_relevance_base6&spm=1001.2101.3001.4242.2&utm_relevant_index=4
官方源码来源
https://gitcode.com/gh_mirrors/fac/facenet-pytorch/overview
*部分图片来源于网络,如有版权问题请联系删除
- 2024-11-15
-
发表了主题帖:
如何用OpenCV的相机捕捉视频进行人脸检测--基于米尔NXP i.MX93开发板
本篇测评由优秀测评者“eefocus_3914144”提供。
本文将介绍基于米尔电子MYD-LMX93开发板(米尔基于NXP i.MX93开发板)的基于OpenCV的人脸检测方案测试。
OpenCV提供了一个非常简单的接口,用于相机捕捉一个视频(我用的电脑内置摄像头)
1、安装python3-opencv
apt install python3-opencv
2、查看摄像头支持的格式与分辨率
root@debian:~# v4l2-ctl --device=/dev/video0 --list-formats-ext
经测试,只能支持640*480
为此建立opencv_test.py
import cv2
video = cv2.VideoCapture(0)
设置相机参数
video .set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
video .set(cv2.CAP_PROP_FRAME_HEIGHT, 720)
while True:
ret, frame = video.read()
cv2.imshow("A video", frame)
c = cv2.waitKey(1)
if c == 27:
breakvideo.release()cv2.destroyAllWindows()
保存后执行”python3 opencv_test.py
OpenCV装好后,可以为后面的人脸检测提供可行性。
要实现人脸识别功能,首先要进行人脸检测,判断出图片中人脸的位置,才能进行下一步的操作。
OpenCV人脸检测方法
在OpenCV中主要使用了两种特征(即两种方法)进行人脸检测,Haar特征和LBP特征。用得最多的是Haar特征人脸检测,此外OpenCV中还集成了深度学习方法来实现人脸检测。
【参考资料】
使用OpenCV工具包成功实现人脸检测与人脸识别,包括传统视觉和深度学习方法(附完整代码,模型下载......)_opencv人脸识别-CSDN博客
【Haar级联检测器预训练模型下载】
opencv/opencv: Open Source Computer Vision Library (github.com)
下载好的,在opencv-4.xdatahaarcascades文件夹下有模型,把他上传到开发板。
【获取检测人脸的图片】
我在百度上找到了**的图片,并把它也上传到开发板。
【编写检测代码】
import numpy as np
import cv2 as cv
if __name__ == '__main__':
# (6) 使用 Haar 级联分类器 预训练模型 检测人脸
# 读取待检测的图片
img = cv.imread("yanmi.jpg")
print(img.shape)
# 加载 Haar 级联分类器 预训练模型
model_path = "haarcascade_frontalface_alt2.xml"
face_detector = cv.CascadeClassifier(model_path) # <class 'cv2.CascadeClassifier'>
# 使用级联分类器检测人脸
faces = face_detector.detectMultiScale(img, scaleFactor=1.1, minNeighbors=1,
minSize=(30, 30), maxSize=(300, 300))
print(faces.shape) # (17, 4)
print(faces[0]) # (x, y, width, height)
# 绘制人脸检测框
for x, y, width, height in faces:
cv.rectangle(img, (x, y), (x + width, y + height), (0, 0, 255), 2, cv.LINE_8, 0)
# 显示图片
cv.imshow("faces", img)
cv.waitKey(0)
cv.destroyAllWindows()
【实验效果】
运行程序后,可以正确地识别,效果如下:
- 2024-11-08
-
发表了主题帖:
上新!米尔-新唐MA35D1核心板512M DDR新配置发布!
米尔在2024年8月推出了基于新唐MA35D1芯片设计的嵌入式处理器模块MYC-LMA35核心板及开发板。MA35D1是集成2个Cortex-A35与1个Cortex-M4的异构微处理器芯片。核心板采用创新LGA 252PIN设计,原生17路UART和4路CAN FD等丰富的通讯接口,可广泛应用于新能源充电桩、工程机械控制器、OBD汽车诊断仪、工业网关、运动控制器和电力DTU等场景。
配置上新,容量选择更丰富
现为满足开发者更强大的性能和存储需求,助力更复杂的应用开发,米尔MA35D1核心板和开发板新增不同内存配置,芯片内置512MB DDR,8GB eMMC。
核心板型号
产品型号
主芯片
内存
存储器
工作温度
MYC-LMA35-8E256D-80-I
MA35D16A887C
芯片内置256MB DDR3L
8GB eMMC
-40℃~+85℃
MYC-LMA35-8E512D-80-I
MA35D16AJ87C
芯片内置512MB DDR3L
8GB eMMC
-40℃~+85℃
MYC-LMA35-256N256D-80-I
MA35D16A887C
芯片内置256MB DDR3L
256MB NAND FLASH
-40℃~+85℃
开发板型号
产品型号
主芯片
内存
存储器
工作温度
MYD-LMA35-8E256D-80-I
MA35D16A887C
芯片内置256MB DDR3L
8GB eMMC
-40℃~+85℃
MYD-LMA35-8E512D-80-I
MA35D16AJ87C
芯片内置512MB DDR3L
8GB eMMC
-40℃~+85℃
MYD-LMA35-256N256D-80-I
MA35D16A887C
芯片内置256MB DDR3L
256MB NAND FLASH
-40℃~+85℃
新唐 MA35D1 系列微处理器
NuMicro® MA35D1系列为一颗异核同构的多核心微处理器。它拥有两颗 64 位 Arm® Cortex®-A35 内核,执行速度可达 800 MHz,并搭载一颗 180 MHz Arm® Cortex®-M4 内核。为了简化系统设计和生产,MA35D1系列提供了DDR2/ DDR3L SDRAM,最大容量达 512 MB,集成了较大DDR内存,方便进行数据处理和硬件设计。MA35D1系列提供多组高性能的通讯接口,如千兆以太网、SDIO3.0、高速 USB 2.0、CAN-FD 等。MA35D1系列支持 LCD 显示控制器,分辨率可达 1920 x 1080 每秒 60 帧,内嵌图形加速器、JPEG 和 H.264 译码器等,带来更好的图形人机接口和视频播放效果。