adjust(*): 调整为规范目录结构

main
刘洪堃 2024-10-17 22:10:27 +08:00
parent 729c063ad3
commit 0847fec95d
13 changed files with 3 additions and 184 deletions

View File

@ -9,6 +9,8 @@
## 下周工作安排 ## 下周工作安排
1. 根据组长安排推进工作 1. 根据组长安排推进工作
## 会议记录
洪堃: 洪堃:
1、汇报仓库改Report 1、汇报仓库改Report
2、RK3588部署文档和机器人放在一起Docs里面提交到UPbot-KingKong, 或者把提交一份专门在UP管理员的Notes仓库。 2、RK3588部署文档和机器人放在一起Docs里面提交到UPbot-KingKong, 或者把提交一份专门在UP管理员的Notes仓库。

View File

@ -1,2 +1,2 @@
# 工作记录 # 组会汇报记录

View File

@ -1,123 +0,0 @@
# Yolov5s部署
实现步骤:
1. 本地: best.pth
2. 本地: best.pth -> best.onnx
2. 本地 Linux: best.onnx -> best.rknn
2. RK3588 Linux: best.rknn 部署在开发板
## 1 获取 best.pth
下载对应版本的yolo5代码训练得到best.pth
https://github.com/ultralytics/yolov5/tree/v6.0
## 2 best.pth 转化为 best.onnx
修改一段代码注意训练阶段不要修改。将yolov5/models/yolo.py文件中class Detect(nn.Module)类的函数forword修改。
![image-20240930142733290](./imgs/yolov5s/image-20240930142733290.png)
修改后将best.pt移动至yolov5/export.py同一文件夹下在命令行调用以下命令
```
python export.py --weights best.pt --img 640 --batch 1 --include onnx
python export.py --weights best.pt --include onnx
```
便可以得到成功转换的模型best.onnx。
(可能会报错说ONNX版本不支持那么就将export.py中parse_opt()函数的--opset参数修改为12)
(也可能报错说不支持SiLU把./models/common.py里的SiLU改成ReLU即可)
## 3 best.onnx 转化为 best.rknn
此处的转换工具只能在Linux系统上运行在linux上下载clone[转换工具rknn-toolkit2](https://github.com/rockchip-linux/rknn-toolkit2)。并配置好相关环境,使用`docker`或直接配置。
1. Docker
根据`rknn-toolkit2\docker\docker_file\ubuntu_18_04_cp36`目录下的`Dockerfile`构建。
2. 直接配置(我所采用的)
2.1 下载conda环境有的话跳过
```
wget -c https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
chmod 777 Miniconda3-latest-Linux-x86_64.sh
sh Miniconda3-latest-Linux-x86_64.sh
```
结束后重启命令行或执行`source ~/.bashrc`。
2.2 创建名为rknntool的python3.8环境,并进入:
```
conda create -n rknntool python=3.8
conda activate rknntool
```
2.3 进入./doc目录
```
pip install -r requirements_cp38-1.5.0.txt
```
2.3进入./ packages目录
```
pip install rknn_toolkit2-1.5.0+1fa95b5c-cp38-cp38-linux_x86_64.whl
```
终端中运行python输入`from rknn.api import RKNN`,不报错即成功。
进入`./examples/onnx/yolov5`将上文得到的best.onnx文件和待预测图片也可以没有复制到此文件夹中修改test.py文件。
![image-20240930143123913](./imgs/yolov5s/image-20240930143123913.png)
![image-20240930143129692](./imgs/yolov5s/image-20240930143129692.png)
修改完后执行`python test.py`这里的test.py构建了一个虚拟的NPU运行环境模拟在RK3588上真实运行的情况。这时在当前文件夹`./example/onnx/yolov5`中可以看到生成的`best.rknn`模型和结果图片result.jpg。
## 4 RK3588 上部署 best.rknn
开发板环境还不完备后面需要什么就安装什么apt install xxx例如gitgccg++等。
1. 拉取官方demo[rockchip-linux/rknpu2](https://github.com/rockchip-linux/rknpu2)到自己的目录下
```
git clone https://github.com/rockchip-linux/rknpu2
```
(注意此步骤不能windows上下载后传到开发板要在开发板上拉取)
2. 进入`/home/lhk/rknpu2/examples/rknn_yolov5_demo`目录。有需要的话则修改下图内容为自己的。![image-20240930144426376](./imgs/yolov5s/image-20240930144426376.png)
3. 将转换后的best.rknn文件放在`model/RK3588`目录下,运行`bash ./build-linux_RK3588.sh`成功后生成install文件夹进入`install/rknn_yolov5_demo_Linux`。需要gccg++环境,安装即可)
4. 在model目录下放入需要推理的图片test.jpg运行`./rknn_yolov5_demo ./model/RK3588/best.rknn ./model/test.jpg`
也可以支持h264、h265、rtsp视频流。例如h264视频流指令:
`./rknn_yolov5_video_demo model/RK3588/best.rknn model/test.h264 264`
## 5 多线程优化(未成功)
执行`cat /sys/kernel/debug/rknpu/load`查看npu的使用情况可以发现虽然有多个npu但是没有全部用上
>使用`while true ; do cat /sys/kernel/debug/rknpu/load ; sleep 1 ; done;`可以持续监控npu使用情况
![alt text](./imgs/yolov5s/image.png)
以前尝试过实现多线程但没成功。推测是编解码相关的问题。同目录PPT中有详细介绍。
### 5.1 找代码解决
参考这个仓库 https://github.com/leafqycc/rknn-cpp-Multithreading通过自己实现多线程把帧率拉到140+。
但是当时拉下代码尝试确实是能使用多核了但是利用率极低推测是编解码相关的问题当时设备环境好像不支持硬件解码多多多次配置ffmpeg后也没有成功。
### 5.2 使官方代码支持多线程
官方代码支持mpp硬件解码但暂未实现多线程。
推测在其基础上自己手动实现多线程即可,但是该源代码风险大也困难,未尝试
### 5.3 使找的代码支持mpp
既然 5.1 中不支持硬件解码,而官方代码是支持的,且设备本就有官方的环境,那可以尝试在 5.1 代码中调用mpp相关接口去实现硬件编解码。感觉比较难未尝试

Binary file not shown.

Before

Width:  |  Height:  |  Size: 184 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 178 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 516 KiB

View File

@ -1,128 +0,0 @@
算法模型在嵌入式平台上的部署
-- -- -- 以RK3588s为例
ROC-RK3588S-PC采用Rockchip RK3588S新一代八核64位处理器最大可配32GB大内存支持8K视频编解码支持NVMe SSD硬盘扩展支持多种操作系统可适用于边缘计算、人工智能、云计算、虚拟/增强现实等领域。
RK3588S是Rockchip全新一代旗舰AIoT芯片采用了8nm LP制程搭载八核64位CPU主频高达2.4GHz集成ARM Mali-G610 MP4四核GPU内置AI加速器NPU可提供6Tops算力支持主流的深度学习框架。参见ROC-RK3588S-PC [HYPERLINK: https://www.t-firefly.com/product/industry/rocrk3588spc]。
NPUNeural-network Processing Units可以说是为了嵌入式神经网络和边缘计算量身定制的但若想调用RK3588s的NPU单元进行推理加速则需要首先将模型转换为.rknn格式的模型。
1、过程概述
这次我们将yolov5模型部署在RK3588s上并使用NPU推理。过程分以下几步
1.使用正确版本v5.0的yolov5进行训练得到pt模型。
2.将pt模型使用yolov5工程中的export.py转换为onnx模型。pt->onnx
3.将onnx模型使用rknn-toolkit2中onnx文件夹的test.py转换为rknn模型。(onnx->rknn)
4.在板子上使用rknpu2工具调用rknn模型实现NPU推理加速。
2、部署过程
2.1、训练yolov5模型(平台windows)
注意需要使用特定版本的yolov5。进入yolov5官网 [HYPERLINK: https://github.com/ultralytics/yolov5]搜索c5360f6e7009eb4d05f14d1cc9dae0963e949213。
找到特定版本的commit。
点击Browse files去到特定版本yolov5源码。
接下来点击download zip注意不要git clone那样还是最新版的yolov5版本。
代码下载好后开始训练自己的pt模型此处实际上是yolov5 5.0版本的工程其中未包含预训练模型yolov5s.pt需要自行下载在releases链接 [HYPERLINK: https://github.com/ultralytics/yolov5/releases]中找到V5.0下载yolov5s.pt
接下来就是配置好yolov5所需的环境用自己的数据集训练yolov5模型得到目标模型best.pt。
2.2 best.pt转换为best.onnx平台windows
修改一段代码注意训练阶段不要修改。将yolov5/models/yolo.py文件中class Detect(nn.Module)类的函数forword修改。
修改后将best.pt移动至yolov5/export.py同一文件夹下在命令行调用以下命令
python export.py --weights best.pt --img 640 --batch 1 --include onnx
便可以得到成功转换的模型best.onnx。
(可能会报错说ONNX版本不支持那么就将export.py中parse_opt()函数的--opset参数修改为12)
(也可能报错说不支持SiLU把./models/common.py里的SiLU改成ReLU即可)
2.3 best.onnx转换为best.rknn平台Linux
此处的转换工具只能在Linux系统上运行在linux上下载clone转换工具rknn-toolkit2 [HYPERLINK: https://github.com/rockchip-linux/rknn-toolkit2]。并配置好相关环境使用docker或直接配置。
Docker
根据rknn-toolkit2\docker\docker_file\ubuntu_18_04_cp36目录下的Dockerfile构建。
直接配置(我所采用的)
2.1 下载conda环境有的话跳过
wget -c https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
chmod 777 Miniconda3-latest-Linux-x86_64.sh
sh Miniconda3-latest-Linux-x86_64.sh
结束后重启命令行或执行source ~/.bashrc。
创建名为rknntool的python3.8环境,并进入:
conda create -n rknntool python=3.8
conda activate rknntool
2.3 进入./doc目录
pip install -r requirements_cp38-1.5.0.txt
进入./ packages目录
pip install rknn_toolkit2-1.5.0+1fa95b5c-cp38-cp38-linux_x86_64.whl
终端中运行python输入from rknn.api import RKNN不报错即成功。
进入./examples/onnx/yolov5将上文得到的best.onnx文件和待预测图片也可以没有复制到此文件夹中修改test.py文件。
修改完后执行python test.py这里的test.py构建了一个虚拟的NPU运行环境模拟在RK3588上真实运行的情况。
这时在当前文件夹./example/onnx/yolov5中可以看到生成的best.rknn模型和结果图片result.jpg。
2.4 RK3588s部署实现NPU加速平台开发板Linux系统
开发板原生是安卓系统如果用户要运行其他操作系统需要使用对应的固件烧写到主板。完整流程及各种开发指南参见RPC-RKL3588S-PC [HYPERLINK: https://wiki.t-firefly.com/zh_CN/ROC-RK3588S-PC/]
2.4.1 换系统
2.4.1.1 准备
需要:
ROC-RK3588S-PC 开发板
固件 [HYPERLINK: https://www.t-firefly.com/doc/download/164.html]
主机本机windows
良好的Type-C 数据线
固件一栏中Ubuntu固件里面版本有点多有简装版和桌面版等。我所下载的是Ubuntu>Ubuntu20.04>Minimal中的ROC-RK3588S-PC_Ubuntu20.04-Minimal-r2407_v1.1.1a_230704.7z压缩包学习用途sb才下Minimal直接桌面版。下载好后解压改名为update.img。
2.4.1.2 安装烧写工具
进入Release_DriverAssistant.zip [HYPERLINK: https://www.t-firefly.com/doc/download/164.html],下载里面部分文件。
解压然后运行DriverAssitant里面的DriverInstall.exe 。为了所有设备都使用更新的驱动,请先选择驱动卸载,然后再选择驱动安装。
然后运行RKDevTool_v3.15_for_window文件夹里的RKDevTool.exe显示如下
2.4.1.3 进入升级模式
先断开电源适配器连接
使用 Type-C 数据线一端连接主机,一端连接开发板
按住设备上的 RECOVERY (恢复)键并保持
接上电源
大约两秒钟后,松开 RECOVERY 键
通过RKDevTool.exe工具可以看到下方提示Found One LOADER Device。上方是啥不管
2.4.1.4 烧写固件
切换至Upgrade Firmware升级固件页。
按Firmware固件按钮打开要升级的固件文件刚刚的update.img。升级工具会显示详细的固件信息。
按Upgrade升级按钮开始升级等待右侧成功完成即可。
此时系统就换完了重新上电后就是以ubuntu系统启动可以连接hdmi进入可视化的命令行操作。
2.4.2 网络配置(平台:开发板系统)
桌面版直接连WIFI或者热点再用本机windows ssh连接Ubuntu Minimal系统开机启动后自动登录到 root 用户,密码为 firefly。其他系统参见ROC-RK3588S-PC [HYPERLINK: https://wiki.t-firefly.com/zh_CN/Firefly-Linux-Guide/first_use.html]。
我所配置的是wifi网络重启后会自动连接。更多种网络配置参见Firefly Linux 开发指南 [HYPERLINK: https://wiki.t-firefly.com/zh_CN/Firefly-Linux-Guide/index.html]。
依次执行图中指令:
最后的指令是nmcli dev wifi connect WIFI名 password WIFI密码
可用ip a指令查看当前的ip地址以及ping指令验证是否网络配置成功。
成功后需要开启ssh服务方便操作开发板参见ubuntu ssh服务 [HYPERLINK: https://blog.csdn.net/qq_16102655/article/details/85340432]
2.4.3 ssh连接平台 windows
注意要与开发板在一个局域网下使用XShell等软件或ssh指令或VSCode等。
1. 使用XShell新建会话
2. 使用ssh指令ssh 要登录的用户@ip地址
例如ssh root@192.168.10.103 [HYPERLINK: mailto:root@192.168.10.103]。然后输入密码即可。
完成后即可在本机操作开发板(可能会有卡顿)。
2.4.4 部署
现在开发板环境还不完备后面需要什么就安装什么apt install xxx例如gitgccg++等。
1. 拉取官方demorockchip-linux/rknpu2 [HYPERLINK: https://github.com/rockchip-linux/rknpu2]到自己的目录下
git clone https://github.com/rockchip-linux/rknpu2
(注意此步骤不能windows上下载后传到开发板要在开发板上拉取)
2. 进入/home/lhk/rknpu2/examples/rknn_yolov5_demo目录。有需要的话则修改下图内容为自己的。
将转换后的best.rknn文件放在model/RK3588目录下运行bash ./build-linux_RK3588.sh成功后生成install文件夹进入install/rknn_yolov5_demo_Linux。需要gccg++环境,安装即可)
在model目录下放入需要推理的图片test.jpg运行./rknn_yolov5_demo ./model/RK3588/best.rknn ./model/test.jpg
能看到命令行中:
在当前文件夹下生成out.jpg例如下
此时完成了单张图片在开发板上的推理。
也可以支持h264、h265、rtsp视频流。
1. 例如h264视频流指令:
./rknn_yolov5_video_demo model/RK3588/best.rknn model/test.h264 264
在当前文件夹下生成out.h264文件。(out.mp4 [HYPERLINK: file:///D:\桌面\rk\out.mp4])
注意需要使用h264码流视频可以使用如下命令转换得到
ffmpeg -i xxx.mp4 -vcodec h264 out.h264
2.例如rtsp视频流指令
./rknn_yolov5_video_demo model/RK3588/best.rknn <RTSP_URL> 265
2.4.5 性能
while true ; do cat /sys/kernel/debug/rknpu/load ; sleep 1 ; done;
pidstat -r -p <PID> 1 > memory_data.txt

Binary file not shown.

View File

@ -1,60 +0,0 @@
# 调研
看过的如[ASTR(2023)](https://astr2023.github.io "ASTR")、DeepMatcher2024、AmatFormer2023都是不开源的
而开源的如:
* [Roma](https://github.com/Parskatt/RoMa "Roma")2024 cvpr也是DKM的作者
* [DKM](https://github.com/Parskatt/DKM "DKM")2023 cvpr
* **[LoFTR](https://zju3dv.github.io/loftr/ "LoFTR")2021 cvpr特征匹配领域比较基石的工作。Roma/DKM也使用其数据集即MegaDepth和Scannet这两个数据集是领域内用得较多的**
> LoFTR的训练/数据集配置 https://github.com/zju3dv/LoFTR/blob/master/docs/TRAINING.md
* [LightGlue](https://github.com/cvg/LightGlue)2023iccv
* [GlueStick](https://github.com/cvg/GlueStick?tab=readme-ov-file): 2023iccv
## 动机
不从整个特征匹配入手,尝试从小的方面切入,比如视觉定位、图像匹配等小方面。
## 数据集
1. LoFTRHPatches视觉定位InLoc相对姿态估计MegaDepthScannet
> 代码上看其实只有 MegaDepthScannet相关的没有 HPatches 和 InLoc 数据集相关的代码
2. DKM HPatches视觉定位InLoc图像匹配IMC2022相对姿态估计MegaDepthScannet
> 代码上看其实只有 MegaDepthScannet相关的没有 IMC2022 和 InLoc 数据集相关的代码
3. ASTRHPatches视觉定位InLoc相对姿态估计MegaDepthScannet
> 未开源
4. Roma图像匹配IMC2022视觉定位InLoc相对姿态估计MegaDepthScannet
> 代码上看其实只有 MegaDepthScannet相关的没有 IMC2022 和 InLoc 数据集相关的代码
5. LightGlueHPatches视觉定位Aachen Day-Night图像匹配IMC相对姿态估计MegaDepth
6. GlueStick: HPatchesETH3D视觉定位7ScenesInLoc相对姿态估计Scannet
---
* MegaDepth 887GBhttps://www.cs.cornell.edu/projects/megadepth/
* Scannet 1.3TB需申请https://github.com/ScanNet/ScanNet#scannet-data
---
* HPatches 4.3GBhttps://github.com/hpatches/hpatches-dataset
* IMC2021 ~50GB 是一个比赛https://www.cs.ubc.ca/research/
image-matching-challenge/2021/
* InLoc ,应该不那么大,但是官方下载链接失效了
* Aachen Day-Night~30GB, https://www.visuallocalization.net/datasets/
* 7Scenes ~15GBhttps://www.microsoft.com/en-us/research/project/rgb-d-dataset-7-scenes/
* ETH3D ~30GBhttps://www.eth3d.net/datasets
## 训练
主要是在MegaDepthScannet上。因为论文和代码中很少对其他数据集的提及。
Roma 、DKM在4个 A100ti 上训练大约需要5天
LoFTR 64个 1080ti 上1天
DeepMatcher32个 Tesla V100
LightGlue2个 RTX3090 上两天 + 200GB磁盘存储额外信息MegaDepth
GlueStick: 2个 RTX2080 上10天
## 后续
从小方面的数据集入手通过paperswithcode网站找到数据集相关的特征匹配方面论文感觉LigGlue和GlueStick可以尝试着手后续再细了解下