Hi3519DV500移植Yolov8

Hi3519DV500移植Yolov8 木木 2024-11-13 14:28:53 178

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.谢谢

声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
木木
红包 4 1 评论 打赏
评论
3个
内容存在敏感词
手气红包
  • 海思开发板 2024-11-17 11:13:02
    回复
    牛牛牛大神级别
  • 广东小6 2024-11-15 16:24:35
    回复
    大神级别
  • Stranger 2024-11-13 14:32:31
    5.00元
    回复
    学习一下
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
木木
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区