diff --git a/2024-10-17.md b/Docs/2024-10-17/2024-10-17.md similarity index 96% rename from 2024-10-17.md rename to Docs/2024-10-17/2024-10-17.md index 62f0dae..04fd105 100644 --- a/2024-10-17.md +++ b/Docs/2024-10-17/2024-10-17.md @@ -9,6 +9,8 @@ ## 下周工作安排 1. 根据组长安排推进工作 + +## 会议记录 洪堃: 1、汇报仓库改Report 2、RK3588部署文档和机器人放在一起Docs里面,提交到UPbot-KingKong, 或者把提交一份专门在UP管理员的Notes仓库。 diff --git a/README.md b/README.md index 94eb979..bdcfbe1 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,2 @@ -# 工作记录 +# 组会汇报记录 diff --git a/工程/Yolov5s部署RK3588/Yolov5s部署RK3588.md b/工程/Yolov5s部署RK3588/Yolov5s部署RK3588.md deleted file mode 100644 index 632435c..0000000 --- a/工程/Yolov5s部署RK3588/Yolov5s部署RK3588.md +++ /dev/null @@ -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,例如git,gcc,g++等。 - -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`。(需要gcc,g++环境,安装即可) -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相关接口去实现硬件编解码。感觉比较难,未尝试 \ No newline at end of file diff --git a/工程/Yolov5s部署RK3588/imgs/yolov5s/image-20240930142733290.png b/工程/Yolov5s部署RK3588/imgs/yolov5s/image-20240930142733290.png deleted file mode 100644 index 672256d..0000000 Binary files a/工程/Yolov5s部署RK3588/imgs/yolov5s/image-20240930142733290.png and /dev/null differ diff --git a/工程/Yolov5s部署RK3588/imgs/yolov5s/image-20240930143123913.png b/工程/Yolov5s部署RK3588/imgs/yolov5s/image-20240930143123913.png deleted file mode 100644 index 80a95ba..0000000 Binary files a/工程/Yolov5s部署RK3588/imgs/yolov5s/image-20240930143123913.png and /dev/null differ diff --git a/工程/Yolov5s部署RK3588/imgs/yolov5s/image-20240930143129692.png b/工程/Yolov5s部署RK3588/imgs/yolov5s/image-20240930143129692.png deleted file mode 100644 index 7b15968..0000000 Binary files a/工程/Yolov5s部署RK3588/imgs/yolov5s/image-20240930143129692.png and /dev/null differ diff --git a/工程/Yolov5s部署RK3588/imgs/yolov5s/image-20240930144426376.png b/工程/Yolov5s部署RK3588/imgs/yolov5s/image-20240930144426376.png deleted file mode 100644 index b2e4921..0000000 Binary files a/工程/Yolov5s部署RK3588/imgs/yolov5s/image-20240930144426376.png and /dev/null differ diff --git a/工程/Yolov5s部署RK3588/imgs/yolov5s/image-20240930144435642.png b/工程/Yolov5s部署RK3588/imgs/yolov5s/image-20240930144435642.png deleted file mode 100644 index b2e4921..0000000 Binary files a/工程/Yolov5s部署RK3588/imgs/yolov5s/image-20240930144435642.png and /dev/null differ diff --git a/工程/Yolov5s部署RK3588/imgs/yolov5s/image.png b/工程/Yolov5s部署RK3588/imgs/yolov5s/image.png deleted file mode 100644 index 1e25a92..0000000 Binary files a/工程/Yolov5s部署RK3588/imgs/yolov5s/image.png and /dev/null differ diff --git a/工程/Yolov5s部署RK3588/模型部署.pptx b/工程/Yolov5s部署RK3588/模型部署.pptx deleted file mode 100644 index ca33eb7..0000000 Binary files a/工程/Yolov5s部署RK3588/模型部署.pptx and /dev/null differ diff --git a/工程/Yolov5s部署RK3588/算法模型在嵌入式平台上的部署.docx b/工程/Yolov5s部署RK3588/算法模型在嵌入式平台上的部署.docx deleted file mode 100644 index 3f791b8..0000000 --- a/工程/Yolov5s部署RK3588/算法模型在嵌入式平台上的部署.docx +++ /dev/null @@ -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]。 -NPU(Neural-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,例如git,gcc,g++等。 - 1. 拉取官方demo:rockchip-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。(需要gcc,g++环境,安装即可) - 在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 265 - -2.4.5 性能 -while true ; do cat /sys/kernel/debug/rknpu/load ; sleep 1 ; done; -pidstat -r -p 1 > memory_data.txt diff --git a/科研/latest.pptx b/科研/latest.pptx deleted file mode 100644 index 45a302b..0000000 Binary files a/科研/latest.pptx and /dev/null differ diff --git a/科研/调研.md b/科研/调研.md deleted file mode 100644 index b9f743e..0000000 --- a/科研/调研.md +++ /dev/null @@ -1,60 +0,0 @@ -# 调研 -看过的如[ASTR(2023)](https://astr2023.github.io "ASTR")、DeepMatcher(2024)、AmatFormer(2023)都是不开源的 - -而开源的如: -* [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. LoFTR:HPatches,视觉定位(InLoc),相对姿态估计(MegaDepth,Scannet) - > 代码上看其实只有 MegaDepth,Scannet相关的,没有 HPatches 和 InLoc 数据集相关的代码 - - -2. DKM :HPatches,视觉定位(InLoc),图像匹配(IMC2022),相对姿态估计(MegaDepth,Scannet) - > 代码上看其实只有 MegaDepth,Scannet相关的,没有 IMC2022 和 InLoc 数据集相关的代码 - -3. ASTR:HPatches,视觉定位(InLoc),相对姿态估计(MegaDepth,Scannet) - > 未开源 - -4. Roma:图像匹配(IMC2022),视觉定位(InLoc),相对姿态估计(MegaDepth,Scannet) - > 代码上看其实只有 MegaDepth,Scannet相关的,没有 IMC2022 和 InLoc 数据集相关的代码 -5. LightGlue:HPatches,视觉定位(Aachen Day-Night),图像匹配(IMC),相对姿态估计(MegaDepth) -6. GlueStick: HPatches,ETH3D,视觉定位(7Scenes,InLoc),相对姿态估计(Scannet) - ---- - -* MegaDepth ,887GB,https://www.cs.cornell.edu/projects/megadepth/ -* Scannet ,1.3TB,需申请,https://github.com/ScanNet/ScanNet#scannet-data ---- -* HPatches ,4.3GB,https://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 ,~15GB,https://www.microsoft.com/en-us/research/project/rgb-d-dataset-7-scenes/ -* ETH3D ,~30GB,https://www.eth3d.net/datasets - - -## 训练 -主要是在MegaDepth,Scannet上。因为论文和代码中很少对其他数据集的提及。 - -Roma 、DKM:在4个 A100ti 上训练大约需要5天 - -LoFTR: 64个 1080ti 上1天 - -DeepMatcher:32个 Tesla V100 - -LightGlue:2个 RTX3090 上两天 + 200GB磁盘存储额外信息(MegaDepth) - -GlueStick: 2个 RTX2080 上10天 - -## 后续 -从小方面的数据集入手,通过paperswithcode网站找到数据集相关的特征匹配方面论文,感觉LigGlue和GlueStick可以尝试着手,后续再细了解下 -