BM1684X开发板快速上手(快速跑通一个yolov5_pipeline_demo)

1. 运行环境要求

  • Ubuntu20.04,一定是20.04
  • SDK版本:SDK230501
    在这里插入图片描述

2. 上位机x86交叉编译

# 下载官方SDK230501
wget https://sophon-file.sophon.cn/sophon-prod-s3/drive/23/06/15/16/Release_230501-public.zip
unzip Release_230501-public.zip
sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu cmake
 
## 创建并指定空的依赖文件夹socsdk
cd Release_230501-public/
mkdir -p soc-sdk
export socsdk=/home/hhhh/Documents/sophon/Release_230501-public/soc-sdk # 需要根据自己的实际绝对路径进行修改
echo $socsdk
 
# ------/Release_230501-public/libsophon_20230605_025400/
cd libsophon_20230605_025400/
tar -zxf libsophon_0.4.8_aarch64.tar.gz
cp -rf libsophon_0.4.8_aarch64/opt/sophon/libsophon-0.4.8/lib ${socsdk}
cp -rf libsophon_0.4.8_aarch64/opt/sophon/libsophon-0.4.8/include ${socsdk}
 
# ------/Release_230501-public/sophon-mw_20230605_032400/
cd ../sophon-mw_20230605_032400/
tar -zxf sophon-mw-soc_0.6.3_aarch64.tar.gz
cp -rf sophon-mw-soc_0.6.3_aarch64/opt/sophon/sophon-ffmpeg_0.6.3/lib/ ${socsdk}
cp -rf sophon-mw-soc_0.6.3_aarch64/opt/sophon/sophon-ffmpeg_0.6.3/include/ ${socsdk}
cp -rf sophon-mw-soc_0.6.3_aarch64/opt/sophon/sophon-opencv_0.6.3/lib ${socsdk}
cp -rf sophon-mw-soc_0.6.3_aarch64/opt/sophon/sophon-opencv_0.6.3/include ${socsdk}
 
# qemu环境的搭建和arm64下依赖的构建 qemu安装依赖的过程中可能会出现问题
# qemu的安装环境  ------/Release_230501-public/rootfs
cd ..
sudo apt-get install -y qemu-user-static debootstrap
#在rootfs文件夹下安装了基于arm64架构的根文件系统
mkdir rootfs && cd rootfs
# qemu中的系统版本为20.04
sudo qemu-debootstrap --arch=arm64 focal .
 
## 进入qemu虚拟环境,以aarch64 架构的模拟环境运行 /bin/bash
sudo chroot . qemu-aarch64-static /bin/bash
 
## 进入qemu 后,安装libeigen3-dev、libgflags-dev、libgoogle-glog-dev、libexiv2-dev
sudo apt-get install -y software-properties-common
sudo apt-add-repository universe
sudo apt-get update
sudo apt-get install -y libeigen3-dev libgflags-dev libgoogle-glog-dev libexiv2-dev
## 退出qemu环境
exit
 
# 设置环境变量
export rootfs=/home/hhhh/Documents/sophon/Release_230501-public/rootfs
export socsdk=/home/hhhh/Documents/sophon/Release_230501-public/soc-sdk
 
# 复制并填充依赖文件
## libgoogle-glog-dev
sudo cp -rf ${rootfs}/usr/lib/aarch64-linux-gnu/libglog* ${socsdk}/lib
sudo cp -rf ${rootfs}/usr/include/glog ${socsdk}/include
## libgflags-dev
sudo cp -rf ${rootfs}/usr/lib/aarch64-linux-gnu/libgflags* ${socsdk}/lib
sudo cp -rf ${rootfs}/usr/include/gflags ${socsdk}/include
## libexiv2-dev
sudo cp -rf ${rootfs}/usr/lib/aarch64-linux-gnu/libexiv2* ${socsdk}/lib
sudo cp -rf ${rootfs}/usr/include/exiv2 ${socsdk}/include
## libeigen3-dev
sudo cp -rf ${rootfs}/usr/include/eigen3 ${socsdk}/include
 
# pipeline-demo编译
cd ../sophon-pipeline_20230605_080800/
tar -xzvf sophon-pipeline_v0.3.7_c9b37f7_20230605.tar.gz
 
cd sophon-pipeline_v0.3.7_c9b37f7_20230605/
## 编译代码
./tools/compile.sh soc ${socsdk}

3.BM1684x开发板demo运行

3.1 编译好的文件与模型文件准备

更多说明文件路径:./Release_230501-public/sophon-pipeline_20230605_080800

需要copy到开发板上:

  1. 将编译好的pipeline-demo release文件:
    ./sophon-ipeline_v0.3.7_c9b37f7_20230605/release.
  2. bmodel:yolov5s_3output_640_int8_4b_BM1684.bmodel
  3. 测试视频的文件:elevator-1080p-25fps-4000kbps.h264

3.2 run_demo(yolov5为例)

修改cameras_yolov5.json
在这里插入图片描述

cd ${SOPHON_PIPELINE_YOLOV5}
# 增加文件权限
chmod +x yolov5s_demo
# ./soc/yolov5s_demo --help 查看命令行帮助信息
# 以arm SoC 1684x yolov5s模型为例。若需要使用🚀模型,需要设置参数:--tpu_kernel_module_path=./libbm1684x_kernel_module.so
./soc/yolov5s_demo --config=./cameras_yolov5.json

3.3 result

在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
A: 首先,需要安装CUDA和CUDNN的相关库,并下载yolov5的代码仓库。然后,按照以下步骤来编写部署在nvidia开发板上的yolov5模型推理代码。 1. 导入必要的头文件 ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <dirent.h> #include <errno.h> #include <fcntl.h> #include <unistd.h> #include <sys/stat.h> #include <sys/types.h> #include <sys/time.h> #include <cuda_runtime_api.h> #include <cublas_v2.h> #include <curand.h> #include <cudnn.h> #include "darknet.h" ``` 2. 定义模型类和相关参数 ```c typedef struct{ network net; float *output; float *input; cudaStream_t stream; } yolov5; #define BATCH 1 #define DEVICE 0 #define NMS_THRESH 0.45 #define CONF_THRESH 0.25 #define CLASS_NUM 80 #define ANCHOR_NUM 3 #define INPUT_H 640 #define INPUT_W 640 #define CLASS_NAME_FILE "./coco.names" #define WEIGHTS_FILE "./yolov5s.weights" ``` 3. 加载模型 ```c void load_model(yolov5 *model, char *classes_path, char *weights_path){ // 加载类别名 char **names = get_labels(classes_path); // 加载模型 model->net = parse_network_cfg(cfg_path); if(weights_path){ load_weights(&model->net, weights_path); } // 设置输入层 model->input = (float *)calloc(model->net.batch * model->net.inputs, sizeof(float)); cudaMalloc((void **)&model->output, model->net.batch * model->net.outputs * sizeof(float)); cudaStreamCreate(&model->stream); set_batch_network(&model->net, BATCH); model->net.layers[model->net.n - 1].classes = CLASS_NUM; model->net.layers[model->net.n - 1].anchor_num = ANCHOR_NUM; model->net.layers[model->net.n - 1].confidence_thresh = CONF_THRESH; model->net.layers[model->net.n - 1].nms_thresh = NMS_THRESH; model->net.layers[model->net.n - 1].mask = (int *)calloc(ANCHOR_NUM, sizeof(int)); for(int i = 0; i < ANCHOR_NUM; i++) model->net.layers[model->net.n - 1].mask[i] = i; srand(time(NULL)); } ``` 4. 推理函数 ```c void yolov5_inference(yolov5 *model, char *img_path){ // 加载图片 image img = load_image_color(img_path, 0, 0); // 缩放图片 image sized = resize_image(img, INPUT_W, INPUT_H); // 将数据写入输入层 fill_cuda_data(sized.data, INPUT_H * INPUT_W * 3, model->input, INPUT_H * INPUT_W * 3 * BATCH, model->stream); // 进行推理 forward_network(&model->net, model->input); // 获取输出结果 get_network_boxes(&model->net, img.w, img.h, CONF_THRESH, model->net.layers[model->net.n - 1].mask, 0, 1, model->output, 1, &model->net.layers[model->net.n - 1], model->net.classes, model->net.outputs, 1); // 进行非极大值抑制 do_nms_sort(model->net.hold_cpu, model->net.hold_gpu, model->net.batch, model->net.layers[model->net.n - 1].classes, model->net.layers[model->net.n - 1].w, model->net.layers[model->net.n - 1].h, model->output, model->net.layers[model->net.n - 1].nms, CLASS_NUM, NMS_THRESH); // 输出结果 draw_detections(img, model->net.hold_cpu, model->net.darknet_gpu, model->net.layers[model->net.n - 1], CLASS_NUM, names, WINDOW_WIDTH, WINDOW_HEIGHT, 0); } ``` 5. main函数 ```c int main(int argc, char **argv){ yolov5 model; // 加载模型 load_model(&model, CLASS_NAME_FILE, WEIGHTS_FILE); // 进行推理 yolov5_inference(&model, argv[1]); // 释放资源 cudaFree(model.input); cudaFree(model.output); cudaStreamDestroy(model.stream); free_network(model.net); return 0; } ``` 以上就是用C语言编写的在nvidia开发板上部署yolov5模型推理代码。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吉均

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值