Hi3519DV500移植Yolov8
1.总概述
本文主要是整理海思3519dv500 NPU的代码,把完整操作流程记录,整理demo代码,能完整实现一个demo程序,完成在端侧推理,图片到图片的流程,结果输出展示到图片上面.Demo相关代码路径
hi3519dv500 Yolov8Demo
2.模型转换环境和模型转换移植
2.1 Yolov8环境安装(Conda)python3.7.5
conda create -n yolov8 python=3.7.5
conda actiavate yolov8
2.2 下载Yolov8源代码,安装相关依赖
这部分主要参考SDK目录下文档
Hi3519DV500R001C01SPC011\SVP_PC\SVP_PC\SVP_NNN_PC_V3.0.2.1\SVP_NNN_PC_V3.0.2.1\Sample\samples\samples\2_object_detection\yolo\onnx_model\README_yolov8.md
下载代码
git clone https://github.com/ultralytics/ultralytics.git
cd ultralytics
#这个地方reset主要目的是后面需要打rpn的补丁,需要从这个commit id上打补丁
git reset --hard d3f097314f9478de7f995d4e4b4ccb0c6fbc65d3
安装yolov8依赖
#在ultralytics目录
pip install --upgrade pip
pip install -r requirements.txt #需要打开导出onnx相关的
2.3 打rpn补丁
补丁的路径
Hi3519DV500R001C01SPC011\SVP_PC\SVP_PC\SVP_NNN_PC_V3.0.2.1\SVP_NNN_PC_V3.0.2.1\Sample\samples\samples\2_object_detection\yolo\onnx_model\0001-yolov8-rpn.patch
复制0001-yolov8-rpn.patch到ultralytics目录
执行
#要确定commit id为d3f097314f9478de7f995d4e4b4ccb0c6fbc65d3 否则打补丁失败
git apply --reject 0001-yolov8-rpn.patch
2.4 下载开源模型,导出为onnx
#在ultralytics目录执行python3,然后在执行下面三行
from ultralytics import YOLO
model = YOLO("yolov8n.pt") #这个会从github下载pt权重文件https://github.com/ultralytics/assets/releases/download/v0.0.0/yolov8n.pt
success = model.export(format="onnx", opset=13) #opset需要指定为13
2.5 安装ATC转换工具
atc转工具在sdk目录
Hi3519DV500R001C01SPC011\SVP_PC\SVP_PC\SVP_NNN_PC_V3.0.2.1\SVP_NNN_PC_V3.0.2.1\MindStudio\Ascend-cann-toolkit_6.10.t03spc011b010_linux.x86_64.run
复制MindStudio\Ascend-cann-toolkit_6.10.t03spc011b010_linux.x86_64.run 到虚拟机,因为atc工具依赖python3.7.5环境,和上面yolov8的环境一样,就直接用yolov8的虚拟环境安装,可以指定自己的路径,或者用默认路径,注意下面source的路径需要和你的路径一致
./Ascend-cann-toolkit_6.10.t03spc011b010_linux.x86_64.run --install --install-path=/home/ll/work/code/sda/3519dv500/ascend
source /home/ll/work/code/sda/3519dv500/ascend/ascend-toolkit/svp_latest/x86_64-linux/script/setenv.sh
2.6 模型转换ONNX转om
参考文档
Hi3519DV500R001C01SPC011\SVP_PC\SVP_PC\SVP_NNN_PC_V3.0.2.1\SVP_NNN_PC_V3.0.2.1\Sample\samples\samples\2_object_detection\yolo\README.md
转换命令
source /home/ll/work/code/sda/3519dv500/ascend/ascend-toolkit/svp_latest/x86_64-linux/script/setenv.sh #按实际路径source
atc --dump_data=0 --input_shape="images:1,3,640,640" --input_type="images:UINT8" --log_level=0 --online_model_type=0 --batch_num=1 --input_format=NCHW --output="yolov8n" --soc_version=Hi3519DV500 --insert_op_conf=./insert_op.cfg --framework=5 --compile_mode=0 --save_original_model=true --model="yolov8n.onnx" --image_list="images:./data/image_ref_list.txt"
#insert_op.cfg 直接在yolo这个路径复制
#./data/image_ref_list.txt 也在上面路径直接复制
2.7 视频教程
视频教程地址:https://www.bilibili.com/video/BV18km6YWEVX/
3.OpenCv移植
移植opencv主要目的为了后面Demo里面代码流程,我们SDK使用的glibc的sdk,移植的是nihui大佬整理过的opencv,只需要用的图片read write功能,不需要其它太多的模块,代码地址为https://github.com/nihui/opencv-mobile
移植就参考官网Readme.md即可,非常简单迅速
3.1 下载opencv-mobile
wget -q https://github.com/nihui/opencv-mobile/releases/latest/download/opencv-mobile-4.10.0.zip
unzip -q opencv-mobile-4.10.0.zip
cd opencv-mobile-4.10.0
3.2 交叉编译opencv-mobile
先创建交叉编译工具配置脚本
#toolchains/hi19dv500.cmake
SET(PLATFORM hi19dv500sdk)
SET(CMAKE_C_COMPILER aarch64-v01c01-linux-gnu-gcc)
SET(CMAKE_CXX_COMPILER aarch64-v01c01-linux-gnu-g++)
SET(CMAKE_STRIP aarch64-v01c01-linux-gnu-strip)
SET(CMAKE_ASM_COMPILER ${CMAKE_C_COMPILER})
执行编译
mkdir -p build
cd build
cmake -DCMAKE_TOOLCHAIN_FILE=../toolchains/hi19dv500.cmake \
-DCMAKE_INSTALL_PREFIX=install \
-DCMAKE_BUILD_TYPE=Release \
`cat ../options.txt` \
-DBUILD_opencv_world=OFF ..
make -j
make install
#编译结果在build/install目录下面
3.3 视频教程如下
视频教程地址:https://www.bilibili.com/video/BV1jjmpY7EKL/
4.Demo代码移植
4.1 Demo代码参考文档
Hi3519DV500R001C01SPC011\SVP_PC\SVP_PC\SVP_NNN_PC_V3.0.2.1\SVP_NNN_PC_V3.0.2.1\Sample\samples\samples\2_object_detection\yolo\README.md
Demo代码来源
Hi3519DV500R001C01SPC011\SVP_PC\SVP_PC\SVP_NNN_PC_V3.0.2.1\SVP_NNN_PC_V3.0.2.1\Sample\samples\samples\2_object_detection\yolo\src
4.2 工程构建
基于海思SDK sample构建Cmake工程,主要是把Hi3519DV500_SDK_V2.0.1.1\smp\a55_linux\source\mpp\sample目录下面的Makefile修改为CMake工程,这样就不需要依赖SDK编译,整个工程就比较简单
Cmake依赖模库路径为
1.lib路径
Hi3519DV500_SDK_V2.0.1.1\smp\a55_linux\source\out\lib
2.comm代码路径
测试发现不依赖这些common,好像编译不过,看你是lib的顺序问题,没有仔细研究过,就直接把comm下面的源代码包进来一起编译了
\Hi3519DV500_SDK_V2.0.1.1\smp\a55_linux\source\mpp\sample\common
3.acl推理代码,直接引用
Hi3519DV500R001C01SPC011\SVP_PC\SVP_PC\SVP_NNN_PC_V3.0.2.1\SVP_NNN_PC_V3.0.2.1\Sample\samples\samples\2_object_detection\yolo\src
4.注意代码里面模型的名字和rpn.txt的路径(具体参考git代码)
4.3 Demo代码其它修改点
1.修改输入参数为jpg图片,原本代码输入参数是bin文件,整个bin文件的来源可以查看demo里面的python脚本
## \yolo\script\transferPic.py
把图片转为640*640RGB bin文件
def process(input_path):
try:
if sys.argv[1] == '1':
image_size = 448
elif sys.argv[1] == '2' or sys.argv[1] == '3' or sys.argv[1] == '4':
image_size = 416
elif sys.argv[1] == '5' or sys.argv[1] == '7' or sys.argv[1] == '8' or sys.argv[1] == 'x':
image_size = 640
else:
image_size = 448
input_image = Image.open(input_path)
input_image = input_image.resize((image_size, image_size), resample=Image.BILINEAR)
# hwc
img = np.array(input_image)
# rgb to bgr
img = img[:, :, ::-1]
shape = img.shape
img = img.astype("int8")
img = img.reshape([1] + list(shape))
result = img.transpose([0, 3, 1, 2])
output_name = input_path.rsplit('.', 1)[0] + "_yolov" + sys.argv[1] + ".bin"
result.tofile(output_name)
except Exception as except_err:
print(except_err)
return 1
else:
return 0
修改的C代码为下面,直接把jpg转到内存,送给npu推理
int SampleProcess::PreJpg2BGR(const std::string& input_path) {
cv::Mat frame = cv::imread(input_path);
if (frame.empty()) {
return 1;
}
cv::resize(frame, frame, cv::Size(640, 640));
cv::Mat rgb_image;
cv::cvtColor(frame, rgb_image, cv::COLOR_BGR2RGB);
// 转换为 NCHW 格式
cv::Mat nchw_image;
int height = rgb_image.rows;
int width = rgb_image.cols;
int channels = rgb_image.channels();
// 将输入图像转换为 CHW 格式
cv::Mat chw(height * width * channels, 1, CV_8UC1);
int index = 0;
for (int c = 0; c < channels; ++c) {
for (int h = 0; h < height; ++h) {
for (int w = 0; w < width; ++w) {
chw.at<uchar>(index++) = rgb_image.at<cv::Vec3b>(h, w)[c];
}
}
}
std::memcpy(frame_, chw.data, chw.total() * chw.elemSize());
framesize_ = chw.total() * chw.elemSize();
return 0;
}
2. 编译运行
git clone https://gitee.com/apchy_ll/mm_hi3519dv500-yolo.git
cd mm_hi3519dv500-yolo
./build.sh
cp output -rf ~/work/nfs #cmake会把模型,demo可执行文件,rpn.txt文件都复制到output目录
#在设备执行
./hi19dv500_apps 8 test.jpg
#输出为out_test.jpg
4.4 完整工程路径
https://gitee.com/apchy_ll/mm_hi3519dv500-yolo.git
4.5 视频教程
视频教程地址:https://www.bilibili.com/video/BV1rJmhY7Ebk/
5.谢谢
- 分享
- 举报
-
海思开发板 2024-11-17 11:13:02回复 举报牛牛牛大神级别
-
广东小6 2024-11-15 16:24:35回复 举报大神级别
-
Stranger 2024-11-13 14:32:315.00元回复 举报学习一下
-
浏览量:3253次2023-03-17 10:21:08
-
浏览量:3272次2023-07-12 10:54:09
-
浏览量:2800次2023-03-17 18:38:40
-
浏览量:2355次2023-11-09 16:39:11
-
浏览量:2727次2023-07-13 15:07:51
-
浏览量:2682次2023-03-17 10:25:53
-
浏览量:2700次2023-07-12 17:02:05
-
浏览量:1518次2023-03-20 14:39:03
-
浏览量:2505次2023-03-17 10:04:01
-
浏览量:2927次2023-03-17 09:53:59
-
浏览量:4754次2023-03-20 14:01:27
-
2023-10-18 14:44:59
-
2023-10-10 12:37:57
-
2023-07-22 13:41:13
-
2023-07-21 09:13:37
-
浏览量:5396次2023-03-06 19:47:18
-
浏览量:2538次2023-03-17 10:12:15
-
2023-10-05 22:07:30
-
浏览量:3470次2023-11-10 17:05:37
-
广告/SPAM
-
恶意灌水
-
违规内容
-
文不对题
-
重复发帖
木木
感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明