uni-.scss的文件里定义样式变量
前言无论是我们执行yolov5/yolov8模型我们训练结果得到一个best.pt文件作为已经训练好的模型我们都要将其部署到板端本章节是笔者在部署瑞芯微RV1106时所整理的笔记。
主体思路best.pt - best.onnxbest.onnx-best.rknn将其部署到瑞芯微RV1106的板端
best.pt - best.onnx首先我找到了luckfox的官网RKNN | LUCKFOX WIKI下载源码 git clone https://github.com/airockchip/yolov
git配置环境conda pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple create -n yolov5_onnx python
8将pt文件转换为onnxpython export.py --rknpu --weight best.pt当前目录下就有best.onnx
best.onnx - best.rknn接着要进行best.onnx转换成best.rknn首先应该重新创建个环境根据之前安装的#切换环境配置并适配rknn_Toolskit2 git clone https://github.com/rockchip-linux/rknn-toolkit2 #下载rknn_model_zoo.git git clone https://github.com/airockchip/rknn_model_zoo.git #以防后面报错提前安装好库 pip install tf-estimator-nightly
2.
8.
dev2021122109 #根据其python版本选择器package下合适的包 pip install -r rknn-toolkit2/packages/requirements_cp38-
1.
6.
txt -i https://pypi.mirrors.ustc.edu.cn/simple/ #同样的在rknn-toolkit2下安装他的轮子 pip install rknn-toolkit2/packages/rknn_toolkit2-
1.
081f21f4d-cp38-cp38-linux_x86_
whl将best.onnx放到yolov5中的model中python3 convert.py ../model/best.onnx rv1106交叉编译#先克隆其目标文件 git clone https://gitee.com/LuckfoxTECH/luckfox-pico.git适配其环境#配置完成环境后添加权限 chmod x ./build-linux.sh #在rknn_model_zoo目录下执行 ./build-linux.sh -t rv1106 -a armv7l -d yolov5执行成功后就会产生一个install文件将其中的demo传输到板端#给板端添加文件夹权限 chmod x ./rknn_yolov5_demo #板端本地执行 ./rknn_yolov5_demo model/yolov
rknn model/test.jpg将生成的out.png传输到本地查看如果要进行进一步的优化比如说在推理代码中添加其运行时间,修改其main.cc文件// Copyright (c) 2023 by Rockchip Electronics Co., Ltd. All Rights Reserved. // // Licensed under the Apache License, Version
0 (the License); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-
0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an AS IS BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /*------------------------------------------- Includes -------------------------------------------*/ #include stdint.h #include stdio.h #include stdlib.h #include string.h // 新增时间统计相关头文件 #include sys/time.h #include yolov
h #include image_utils.h #include file_utils.h #include image_drawing.h #if defined(RV1106_
#include dma_alloc.hpp #endif /*------------------------------------------- 新增时间统计工具函数 -------------------------------------------*/ // 获取当前时间微秒 static inline uint64_t get_current_time_us() { struct timeval tv; gettimeofday(tv, NULL); return (uint64_t)tv.tv_sec * 1000000 tv.tv_usec; } // 计算耗时并打印单位毫秒保留3位小数 static inline void print_elapsed_time(const char* step_name, uint64_t start_us, uint64_t end_us) { double elapsed_ms (end_us - start_us) /
1
0; printf([TIME] %s: %.3f ms\n, step_name, elapsed_ms); } /*------------------------------------------- Main Function -------------------------------------------*/ int main(int argc, char **argv) { // // 核心修复提前声明所有时间变量避免goto跳过初始化 // uint64_t total_start_us, total_end_us; uint64_t step1_start, step1_end; uint64_t step2_start, step2_end; uint64_t step3_start, step3_end, step3_end_all; uint64_t step4_start, step4_end; uint64_t step5_start, step5_end; uint64_t step6_start, step6_end; uint64_t step7_start, step7_end; uint64_t step8_start, step8_end; uint64_t step9_start, step9_end; // 总耗时统计 total_start_us get_current_time_us(); if (argc !
{ printf(%s model_path image_path\n, argv[0]); return -1; } const char *model_path argv[1]; const char *image_path argv[2]; int ret; rknn_app_context_t rknn_app_ctx; memset(rknn_app_ctx, 0, sizeof(rknn_app_context_t)); // 步骤1初始化后处理统计耗时 step1_start get_current_time_us(); init_post_process(); step1_end get_current_time_us(); print_elapsed_time(Init post process, step1_start, step1_end); // 步骤2初始化YOLOv5模型核心步骤统计耗时 step2_start get_current_time_us(); ret init_yolov5_model(model_path, rknn_app_ctx); step2_end get_current_time_us(); print_elapsed_time(Init YOLOv5 model, step2_start, step2_end); if (ret !
{ printf(init_yolov5_model fail! ret%d model_path%s\n, ret, model_path); goto out; } // 步骤3读取图片统计耗时 image_buffer_t src_image; memset(src_image, 0, sizeof(image_buffer_t)); step3_start get_current_time_us(); ret read_image(image_path, src_image); step3_end get_current_time_us(); #if defined(RV1106_
//RV1106 rga requires that input and output bufs are memory allocated by dma ret dma_buf_alloc(RV1106_CMA_HEAP_PATH, src_image.size, rknn_app_ctx.img_dma_buf.dma_buf_fd, (void **) (rknn_app_ctx.img_dma_buf.dma_buf_virt_addr)); memcpy(rknn_app_ctx.img_dma_buf.dma_buf_virt_addr, src_image.virt_addr, src_image.size); dma_sync_cpu_to_device(rknn_app_ctx.img_dma_buf.dma_buf_fd); free(src_image.virt_addr); src_image.virt_addr (unsigned char *)rknn_app_ctx.img_dma_buf.dma_buf_virt_addr; src_image.fd rknn_app_ctx.img_dma_buf.dma_buf_fd; rknn_app_ctx.img_dma_buf.size src_image.size; #endif // 补充包含RV1106的DMA处理耗时 step3_end_all get_current_time_us(); print_elapsed_time(Read image (include DMA), step3_start, step3_end_all); if (ret !
{ printf(read image fail! ret%d image_path%s\n, ret, image_path); goto out; } object_detect_result_list od_results; // 步骤4模型推理核心步骤统计耗时 step4_start get_current_time_us(); ret inference_yolov5_model(rknn_app_ctx, src_image, od_results); step4_end get_current_time_us(); print_elapsed_time(YOLOv5 inference, step4_start, step4_end); if (ret !
{ printf(inference_yolov5_model fail! ret%d\n, ret); goto out; } // 步骤5结果处理画框打印绘图统计耗时 step5_start get_current_time_us(); // 画框和概率 char text[256]; for (int i 0; i od_results.count; i) { object_detect_result *det_result (od_results.results[i]); printf(%s (%d %d %d %d) %.3f\n, coco_cls_to_name(det_result-cls_id), det_result-box.left, det_result-box.top, det_result-box.right, det_result-box.bottom, det_result-prop); int x1 det_result-box.left; int y1 det_result-box.top; int x2 det_result-box.right; int y2 det_result-box.bottom; draw_rectangle(src_image, x1, y1, x2 - x1, y2 - y1, COLOR_BLUE,
; sprintf(text, %s %.1f%%, coco_cls_to_name(det_result-cls_id), det_result-prop *
; draw_text(src_image, text, x1, y1 - 20, COLOR_RED,
; } step5_end get_current_time_us(); print_elapsed_time(Result process (draw box/text), step5_start, step5_end); // 步骤6保存输出图片统计耗时 step6_start get_current_time_us(); write_image(out.png, src_image); step6_end get_current_time_us(); print_elapsed_time(Write output image, step6_start, step6_end); out: // 步骤7释放后处理统计耗时 step7_start get_current_time_us(); deinit_post_process(); step7_end get_current_time_us(); print_elapsed_time(Deinit post process, step7_start, step7_end); // 步骤8释放模型资源统计耗时 step8_start get_current_time_us(); ret release_yolov5_model(rknn_app_ctx); step8_end get_current_time_us(); print_elapsed_time(Release YOLOv5 model, step8_start, step8_end); if (ret !
{ printf(release_yolov5_model fail! ret%d\n, ret); } // 步骤9释放图片内存统计耗时 step9_start get_current_time_us(); if (src_image.virt_addr ! NULL) { #if defined(RV1106_
dma_buf_free(rknn_app_ctx.img_dma_buf.size, rknn_app_ctx.img_dma_buf.dma_buf_fd, rknn_app_ctx.img_dma_buf.dma_buf_virt_addr); #else free(src_image.virt_addr); #endif } step9_end get_current_time_us(); print_elapsed_time(Release image memory, step9_start, step9_end); // 输出总耗时 total_end_us get_current_time_us(); print_elapsed_time(Total runtime, total_start_us, total_end_us); return 0; }重新编译程序并部署到板端# 激活你的 Conda 环境可选确保依赖一致 conda activate yolov5_rknn #设置编译器前缀核心指向去掉 -gcc 的部分 export GCC_COMPILER/root/arm-rockchip830-linux-uclibcgnueabihf/bin/arm-rockchip830-linux-uclibcgnueabihf # 验证变量是否生效 echo $GCC_COMPILER # 应输出上面的路径 #重新编译程序 ./build-linux.sh -t rv1106 -a armv7l -d yolov5 #推送新程序到板子 adb push 编译后的rknn_yolov5_demo /root/rknn_yolov5_demo/ #在板子上运行 cd /root/rknn_yolov5_demo chmod x ./rknn_yolov5_demo ./rknn_yolov5_demo model/yolov
rknn model/test.jpg彻底解决GCC_COMPILER#
编辑 .bashrc 文件 vim ~/.bashrc #
在文件末尾添加以下内容按 i 进入编辑模式 export GCC_COMPILER/root/arm-rockchip830-linux-uclibcgnueabihf/bin/arm-rockchip830-linux-uclibcgnueabihf #
保存退出按 Esc → 输入 :wq → 回车 #
使配置生效 source ~/.bashrc #
验证生效 echo $GCC_COMPILER # 应输出正确路径 #
重新编译 ./build-linux.sh -t rv1106 -a armv7l -d yolov5
总结本章是笔者在适配RV1106所整理的笔记仅供记录和学习使用希望能给大家带来帮助。
星空mv在线观看免费版中文-星空mv在线观看免费版中文应用