目录
四、基于OrangePi AIpro和yolov5实现AI算法帮忙图像识别
一、写在前面
前段时间,公司因要做嵌入式终端侧的AI推理预研项目,我开始去寻找能满足需求的板子。找了一圈发现,深圳市迅龙软件有限公司旗下开源产品品牌Orange Pi就非常符合我的需求。
从 它的官网 我们可以了解到它,迅龙软件成立于2005年,是全球领先的开源硬件和开源软件服务商,致力于让极客、创客、电子爱好者享用到来自中国的优质、低价的科技产品,通过大规模的社会化协作去创建一个更加美好的信息化人类文明。如今,认真用心做开源硬件的公司不多,而迅龙软件就是其一,这无疑给我带来了好印象。
另一方面,现在AI技术火爆,如果在终端边缘侧就完成一些初阶的AI推理,将是一个很好的发展赛道,恰好OrangePi的出现就可以帮助完成这个任务。
二、OrangePi AIpro开发板介绍
OrangePi AIpro(8-12T)采用昇腾AI技术路线,具体为4核64位处理器+AI处理器,集成图形处理器,支持8-12TOPS AI算力,拥有8GB/16GB LPDDR4X,可以外接32GB/64GB/128GB/256GB eMMC模块,支持双4K高清输出。 Orange Pi AIpro引用了相当丰富的接口,包括两个HDMI输出、GPIO接口、Type-C电源接口、支持SATA/NVMe SSD 2280的M.2插槽、TF插槽、千兆网口、两个USB3.0、一个USB Type-C 3.0、一个Micro USB(串口打印调试功能)、两个MIPI摄像头、一个MIPI屏等,预留电池接口,可广泛适用于AI边缘计算、深度视觉学习及视频流AI分析、视频图像分析、自然语言处理、智能小车、机械臂、人工智能、无人机、云计算、AR/VR、智能安防、智能家居等领域,覆盖 AIoT各个行业。 Orange Pi AIpro支持Ubuntu、openEuler操作系统,满足大多数AI算法原型验证、推理应用开发的需求。
从官网我们可以拿到板子的用户手册,手册很详细地描述了如何使用板子,体验还是很棒的。
以下是开发的顶层视图和底层面图:
我们可以发现,它的接口是非常丰富,我们使用它足以完成绝大多数的开发场景需求。
另一方面,我们来看下的规格参数:
我的板子是8GB内存的,使用起来,普通应用足够了。
不得不说,能在这样的板子上体验这么高性能的配置,在以往是不可思议的,相信它一定不会让我失望。
其他更多详细信息,可以从 Orange Pi 的官网了解更多信息。
三、手把手教你玩转OrangePi AIpro开发板
1、烧录镜像
拿到板子后,如果SD卡里面是空卡,没有镜像,那么需要给卡烧录镜像,具体可以参考下用户手册的对应章节,建议使用 balenaEtcher-Portable-1.18.4.exe 工具来完成烧录。
完成烧录后,直接插入板子背面的SD卡槽;等待上电。
2、上电开机&调试串口
参考用户手册,我们直接通过适配器给板子上电;在板子的如下图位置,有个MicroUSB的接口,让它连上电脑,电脑的设备管理-端口,找到对应的串口:
用电脑的串口工具,比如SecureCRT,串口连接参数:115200,8,n,1;然后打开串口,就可以看到开机log了:
ep/rc mode: 0
Enable wdg.
#1
Pll Init ..pll[0] inited
pll[2] inited
pll[3] inited
pll[4] inited
pll[5] inited
OK.
reset src:0x000015b6
lsadc dreset ok
lsadc0 init ok
adc0in0:92 adc0in1:589 adc0in2:225
adc1in2:1 adc1in3:91
adc boardId:10251
Load main hboot1_a
Load main hilink25
hboot1a hash 6277dd7a.
Boot Entry.
Load main hboot1_b
[0.090] [BOOT_TRACE]1b start
current[3], last[99]
Dfx init l2 xloader done
Hboot1_a point:[06] 01 02 05 06 11 15 00 00 00 00 00 00 00 00 00 00 00 00 00 00
sfc set Qline.
Device id: 0x3925c2
Flash unsport Quad.
Boot entry(121)
Iso state: 0x0
pll[6] inited
pll[7] inited
pll[8] inited
pll[9] inited
pll[10] inited
Board info:
sctrl pad info:0xd0940
boardid:10251
bootmode:5
rc/ep mode:0
pg info:0
reset reason:0x15b6
sfc mode:4byte
secure boot:1
current[4], last[99]
[0.143] [BOOT_TRACE]Load main userbasecfg
non-secure vef success!
invalid strategy offset 1.
Cfg type-1 no cfg info.
No info in userBaseConfig
current[5], last[99]
[0.157] [BOOT_TRACE]Load main sysbasecfg
SyscfgProc [345|0|1]
Select a power level based on the low power consumption configuration.!
Update bitmap: 0xf 0x1 0x1 0x0 0x3 0x3 0x0 0x0 0x0 0x0 0x0 0x0 0x1 0x5 0x5 0x33
bitmap info update load success
SyscfgProc [347|0|1]
write share info ok
write nosec share info ok
current[6], last[99]
[0.202] [BOOT_TRACE]Load main lpddr
[0.260] [BOOT_TRACE]Dreset Ts OK
current[7], last[99]
[0.261] [BOOT_TRACE]Load main hsmtag
current[8], last[99]
[0.319] [BOOT_TRACE]Load main atf
report atf info to ddr OK
current[9], last[99]
[0.393] [BOOT_TRACE]Load main hboot2
report uefi info to ddr OK
PCIE0/1/2/3 RC Config Preset OK.
use macro setting from syscfg
macro[0] protocols:
ds[0] : PCIE
ds[1] : PCIE
ds[2] : PCIE
ds[3] : PCIE
macro[1] protocols:
ds[0] : USB
ds[1] : USB
ds[2] : USB
ds[3] : USB
3Macro[0] power up (time 807ms)
6
iecc disable
Rpt 0x2000, fb 0x800, msdw 0x2000
[0.754] [BOOT_TRACE] ddr init end
Macro[1] power up (time 859ms)
cp_area_l2buf_2_ddr
Dfx init ddr done
Backup bbox data
Copy cfg OK.
Copy cfg OK.
Copy ddr Cache done.
current[10], last[99]
[0.919] [BOOT_TRACE]finish image load.
current[20], last[99]
current[70], last[99]
[926.926]Dreset main core...
Jump to HSM...
NOTICE: Mp conf...NOTICE: ok
NOTICE: Booting Trusted Firmware
NOTICE: BL1:
NOTICE: BL1: Built :
NOTICE: BL1: Booting BL2
NOTICE: BL2:
NOTICE: BL2: Built :
NOTICE: BL1: Booting BL31
NOTICE: BL31:
NOTICE: BL31: Built :
NOTICE: HSM boot keypoint 0x7807f!
NOTICE: A55 wfi ...NOTICE: OK
NOTICE: A55 close
NOTICE: jumper to uefi [1035]
current keypoint[71], last keypoint[99].
macmode:0x1, ulPort:0x0, ulPhyID:0x1CC910, ulMacSpeed:0x2!
The default boot selection will start in 1 seconds
[1.873] [BOOT_TRACE] auto boot.
This is sd boot entry
emmcsd init
count(1)
end
part cnt & map :[6] [0x5F]
force recov flag:[0]
RAWDATA upgrade status&part:[0x0] [0x0]
RECOVE upgrade status&part:[0x0] [0x0]
SYS Enable:0x0, gpio:0x4
recEnable:0x0, gpioStatus:0x0
current keypoint[89], last keypoint[99].
start load os image
try flag:0x1, reset count:0x0
boot2 reset count:0x1
firmware boot1 reset count:0x1
firmware update flag(main):0 0
firmware update flag(back):0 0
Current start mode :0x0 not support.
boot: main.
[3.831] [BOOT_TRACE] load image success.
load crl from Storage media
current keypoint[90], last keypoint[99].
waiting for hsm ..OK
[3.858] [BOOT_TRACE] Tee Load Start.
NOTICE: pub crl does not exist, pub_crl_size = 0x0!
NOTICE: pub crl broken, update crl ok!
NOTICE: cms verify process success.
NOTICE: #TEE Start#
NOTICE: #TEE End#
NOTICE: hw_start_tee done!
[4.107] [BOOT_TRACE] Tee Load Done.
current keypoint[95], last keypoint[99].
4108 Image.
4221 Done.
4221 DTB.
4225 Done.
[PARTUUID=1ceb0bce-8210-44e4-84ad-afd2ae6581ed]
sec_id:80 0 28 B
[dtb num 0]boardid:0 0 0 0
[dtb num 1]boardid:80 0 0 64
[dtb num 2]boardid:80 0 0 65
[dtb num 3]boardid:80 0 0 A0
[dtb num 4]boardid:80 0 0 96
[dtb num 5]boardid:80 0 0 97
[dtb num 6]boardid:80 0 3 84
[dtb num 7]boardid:80 0 3 85
[dtb num 8]boardid:80 0 3 86
[dtb num 9]boardid:80 0 3 89
[dtb num 10]boardid:80 0 3 87
[dtb num 11]boardid:80 0 C3 E6
[dtb num 12]boardid:80 0 C7 9C
[dtb num 13]boardid:80 0 C7 CE
[dtb num 14]boardid:80 0 C7 D8
No dts found in DTB
====equalVal[0]=====
Can't find dtb by boardId 0x280B in dt.img, use dtb.
sec_id:80 0 28 B
[dtb num 0]boardid:0 0 0 0
[dtb num 1]boardid:80 0 0 64
[dtb num 2]boardid:80 0 0 65
[dtb num 3]boardid:80 0 0 A0
[dtb num 4]boardid:80 0 0 96
[dtb num 5]boardid:80 0 0 97
[dtb num 6]boardid:80 0 3 84
[dtb num 7]boardid:80 0 3 85
[dtb num 8]boardid:80 0 3 86
[dtb num 9]boardid:80 0 3 89
[dtb num 10]boardid:80 0 3 87
[dtb num 11]boardid:80 0 C3 E6
[dtb num 12]boardid:80 0 C7 9C
[dtb num 13]boardid:80 0 C7 CE
[dtb num 14]boardid:80 0 C7 D8
No dts found in DTB
====equalVal[0]=====
Can't find dtb by boardId 0x280B in dt.img, use dtb.
isColdBoot index|max[0|0] status[0x15B6]
SC_NORESET_12[0x0]
SC_NORESET_7[0x0]
SC_NORESET_10[0x0]
SC_NORESET_9[0x0]
None reboot reason info updated, Status = Invalid Parameter
fdt delete sata subnode
fdt can not find subnode 0xFFFFFFFF!
ras init done
jump kernel(4359).
一直等到日志输出以下信息时,表示系统启动完毕,同时,开发板的两个LED都会两期;这时可以输入用户名和密码登录shell终端。
NOTICE: el3_int exit!
NOTICE: Int ID:174, syscnt:0x28d30e4f
NOTICE: intNum 174, nodeStatus1 0x40 !
NOTICE: nodeId[0x6], err_count[0x2], err_type[0x1]
NOTICE: [RasCbbCommonHandler]:[71L] moduleBase c1260000
NOTICE: [RasCbbCommonHandler]:[81] UE
NOTICE: [Module] MATA0
NOTICE: [FillHisiModuleErrorInfo]:[275L] moduleID = 0x14
NOTICE: [Module] MATA0
NOTICE: SubSysID:0xff, DeviceID:0x0, SubSysNum:0x0
NOTICE: RECOVERABLE!
NOTICE: HestNotifiedOS
NOTICE: [RasCbbCommonHandler]:[89] Handler end
NOTICE: base = 0xc1260000
NOTICE: ERR_FRL = 0x142aa2
NOTICE: ERR_FRH = 0x0
NOTICE: ERR_CTRLL = 0x515
NOTICE: ERR_CTRLH = 0x0
NOTICE: ERR_STATUSL = 0xfc30050e
NOTICE: ERR_STATUSH = 0x0
NOTICE: ERR_ADDRL = 0x10080010
NOTICE: ERR_ADDRH = 0xe0000001
NOTICE: ERR_MISC0L = 0x0
NOTICE: ERR_MISC0H = 0x7f
NOTICE: ERR_MISC1L = 0xc798005
NOTICE: ERR_MISC1H = 0x800122
NOTICE: el3_int exit!
cpu 0 entering scheduler
>>>>>>>>>>>>LiteOS start succeed!<<<<<<<<<<<
Ubuntu 22.04 LTS orangepiaipro ttyAMA0
orangepiaipro login:
orangepiaipro login:
orangepiaipro login: HwHiAiUser
Password:
用户名是:HwHiAiUser 密码是:Mind@123
同时,root用户的密码也是 Mind@123,后面的操作过程有到sudo,就需要这个密码。
注意,输入密码的时候不会回显,输入完成后按下回车就可以进入到系统了:
3、配置Wi-Fi
由于我装的Ubuntu镜像是命令行版本的,我并没有使用HDMI连接显示器使用,所以配置Wi-Fi需要使用命令的方式。
配置Wi-Fi要经过以下几步:
扫描无线热点:使用以下命令扫描
nmcli dev wifi
这样就可以看到我的无线热点了:
连接无线热点:使用以下命令连接指定的热点,注意【ap-name】【ap-passwprd】要替换成你自己的无线热点名称和对应的密码。
sudo nmcli dev wifi connect ap-name password ap-passwprd
显示连接无线热点成功后,可以查看OrangePi板子的IP地址,如下图所示:
查看IP的命令是:
ifconfig
基于Wi-Fi网络传输,我们可以用iperf软件来测试一下网络传输性能,我使用手机的 Magic Iperf 这个软件来配合;分别让开发板充当服务器和客户端,得出数据如下:
从这个速率上看,Wi-Fi网络通讯还是很香的嘛~~~
4、SSH登录
配置好Wi-Fi后,系统在完成启动后,就会自动取连接Wi-Fi热点,同时板子也就具备了网络能力。
OrangePi默认是开启了SSH服务的,所以我们PC电脑通过SSH协议就可以登录系统。
这里我采用的也是SecureCRT工具,新建session,填入开发板的IP和端口号22,以及用户名和密码就可以连上去了,非常的便捷。
登录进去后的显示界面,与调试串口登录系统之后是一样的。
5、配置samba服务
配置samba服务是为了可以很方便的让开发板跟PC电脑传输文件,比如我们要编写代码或者修改脚本之类的场景。
我们可以参考这篇博文:https://blog.csdn.net/gaohuihui258/article/details/120779378
基本就可以完成配置,不过需要注意的是,smb.conf 文件配置homes字段时,记得加上 writeable = yes 否则会出现,windows登录samba共享,但是只能查看不能新增或修改文件。
参考如下:
# Un-comment the following (and tweak the other settings below to suit)
# to enable the default home directory shares. This will share each
# user's home directory as \\server\username
[homes]
; comment = Home Directories
browseable = no
# By default, the home directories are exported read-only. Change the
# next parameter to 'no' if you want to be able to write to them.
; read only = yes
writeable = yes
# File creation mask is set to 0700 for security reasons. If you want to
# create files with group=rw permissions, set next parameter to 0775.
create mask = 0755
# Directory creation mask is set to 0700 for security reasons. If you want to
# create dirs. with group=rw permissions, set next parameter to 0775.
directory mask = 0755
# By default, \\server\username shares can be connected to by anyone
# with access to the samba server.
# Un-comment the following parameter to make sure that only "username"
# can connect to \\server\username
# This might need tweaking when using external authentication schemes
valid users = %S
安装完成了之后,可以在windows上通过 【添加一个网络位置】来登录samba共享服务。
在Windows电脑上就可以看到一个类似的磁盘,点进去就可以看到OrangePi家目录的文件了:
四、基于OrangePi AIpro和yolov5实现AI算法帮忙图像识别
1、yolov5介绍
yolov5算法是目前应用最广泛的目标检测算法之一,它基于深度学习技术,在卷积神经网络的基础上加入了特征金字塔网络和SPP结构等模块,从而实现了高精度和快速检测速度的平衡。
它的官方开源地址在这里:ultralytics/yolov5: YOLOv5 🚀 in PyTorch > ONNX > CoreML > TFLite (github.com)
2、安装yolov5的开发环境
要安装好yolov5的开发环境,我们需要经过以下几个必要步骤:
1)下载代码
在家目录合适的位置建立一个文件夹,然后在这个文件夹里面执行代码克隆,命令如下:
git clone https://github.com/ultralytics/yolov5
下载好代码如下图所示:
2)安装python环境
默认的OrangePi镜像默认带了python3,但可能没有pip工具,需要自己使用apt-get install来安装:
sudo apt-get install pip --fix-missing
后面的--fix-missing不一样要加,看自己的环境,我这边不加就会报错。
完成pip安装之后,就可以下面的命令来安装python依赖包了:
pip install -r requirements.txt
注意,要进入到yolov5目录下执行此命令。
安装可能需要一会,如果有些包安装失败了,根据错误提示,重新执行命令再次安装即可。
3、使用原生官方自带的模型来做目标检测
可以是使用detect脚本来测试一下效果,运行命令如下:
python detect.py --source ./data/images/bus.jpg
执行的过程中会触发一个包 (https://github.com/ultralytics/yolov5/releases/download/v7.0/yolov5s.pt)的下载:
后面就会显示检测的结果:
我们可以看到原图,在data/image/bus.jpg里面:
执行完一次检测,会有对应的识别图片输出,位于 runs/detect/exp目录下,每一次检测exp目录加1:
从上图我们可以看到识别的效果还是不错的。
我再从网上找了一张图来测试下,原图是:
修改一下检测的命令:
python detect.py --source ./data/images/3people.jpg
识别出来的数据,以及图片展示如下:
Fusing layers...
YOLOv5s summary: 213 layers, 7225885 parameters, 0 gradients, 16.4 GFLOPs
image 1/1 /home/HwHiAiUser/yolov5/data/images/3people.jpg: 448x640 3 persons, 1 car, 1 handbag, 601.2ms
Speed: 1.6ms pre-process, 601.2ms inference, 2.5ms NMS per image at shape (1, 3, 640, 640)
嗯,不错,效果挺好的。
4、训练 coco128 数据集
上面我们用的是官方提供的已经训练好的数据集,这一步我们将自己去训练数据集。
我们采用coco128数据集来训练,整个训练操作需要经过以下几步:
1)下载coco128数据集文件
使用通过浏览器访问:https://github.com/ultralytics/yolov5/releases/download/v1.0/coco128.zip
即可下载到本地,然后通过samba共享,把文件传输到OrangePi的家目录新建一个datasets目录,存放如下图所示;zip工具可以在OrangePi中使用unzip命令解压。
# parent
# ├── yolov5
# └── datasets
# └── coco128 ← downloads here (7 MB)
2)启动数据集训练操作
进入到yolov5目录下,执行下面命令开始数据集训练,整个耗时比较长,大概需要一个钟,慢慢等或者去喝杯咖啡吧。
python3 train.py --img 640 --batch 4 --epochs 5 --data ./data/coco128.yaml --cfg ./models/yolov5s.yaml --weights ''
开始训练:
训练中:
训练结束:
这里训练结束后,最重要的是拿到权重文件:runs/train/exp4/weights/best.pt
下一步需要用自己训练的数据集来做目标检测就要用到它。
5、使用自己训练的数据集来做目标检测
使用下面的命令来制定权重文件做目标检测:
python detect.py --source ./data/images/bus.jpg --weights ./runs/train/exp4/weights/best.pt --conf 0.25
执行结果,貌似有点遗憾,居然没识别出来,看来还得再研究研究。
五、OrangePi AIpro开发板总结
整体使用OrangePi AIPro下来,我有几点感受比较强烈,虽然它目前基本能满足我的需求,但我也希望它能越做越好,服务更多的客服,发挥它的最大价值。
有几个优点:
- 有板载Wi-Fi,使得开发板很快就可以具备网络能力;有了网络能力就可以做很多高阶事情,这一点无论是开发过程还是做应用都是给予了开发者很大的便利;
- 有配备调试串口,仅需一根MicroUSB线就可以轻松debug看日志以及登录Ubuntu的shell终端,非常方便进行开发操作;
- 整个板子的布局比较合理,在正常系统运转过程中,噪音也非常小,甚至可以把它完成迷你PC,也不是没可能。
也有几个缺点:
- 算力还是稍微需要再加强加强,我在训练yolov5的coco128数据模型时,使用--batch=16直接就卡死了;这也有可能跟内存大小有关系;整体上说,用它来训练模型可能体验稍差一些;
- 从开发者前瞻的角度上说,我希望板子可以自带一个麦克风输入端子;而不是直接借用3.5mm 耳机接口;
- 电源开关方面,是否可以考虑价格拨码开关或者其他的机械开关,现在一接入Type-C接口的电源适配器,就开始上电跑起来了,体验不是很好。
最后,祝OrangePi AIpro越来越强,在这个AI的时代持续发光发热。