RK3308B部署mobilenetv2_ssdlite

news2025/1/20 12:10:37

目录

      • 1. 在PC端运行mobilenetv2_ssdlite模型
        • 1.1 安装NCNN和Opencv
          • 1.1.1 安装NCNN
          • 1.1.2 安装Opencv
        • 1.2 运行mobilenetv2_ssdlite模型
      • 2. 交叉编译部署到RK3308B板子上并运行模型
        • 2.1 交叉编译NCNN和Opencv
          • 2.1.1 交叉编译Opencv
          • 2.1.2 交叉编译ONNX
        • 2.2 交叉编译mobilenetv2_ssdlite模型
        • 2.3 将得到的可执行文件、模型、图片和动态库push到RK3308B
        • 2.4 在板子上运行模型进行识别

  • 目标板:RK3308B
  • PC:Ubuntu 16.04
  • opencv版本:4.7.0 https://opencv.org/releases/
  • ncnn下载:git clone --depth=1 https://github.com/Tencent/ncnn.git
  • 交叉编译器:gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu(下载链接:https://gitlab.com/TeeFirefly/rk3308-linux)
  • mobilenetv2_ssdlite项目:https://github.com/zhouayi/mobilenetv2_ssdlite_ncnn.git
  • 主要参考嵌入式开发板上部署目标检测模型mobilenetv2_ssdlite

1. 在PC端运行mobilenetv2_ssdlite模型

1.1 安装NCNN和Opencv

参考:Ubuntu16.04安装NCNN和Opencv

1.1.1 安装NCNN

安装NCNN的依赖项

sudo apt install build-essential git cmake libprotobuf-dev protobuf-compiler libvulkan-dev vulkan-utils libopencv-dev

安装NCNN

# 下载
git clone --depth=1 https://github.com/Tencent/ncnn.git

cd ncnn
mkdir build-host-gcc-linux
cd build-host-gcc-linux
mkdir install

# 编译
cmake -DNCNN_VULKAN=OFF -D CMAKE_INSTALL_PREFIX=./install ..
make -j8
make install

测试NCNN是否安装成功

cd ../examples
../build/examples/squeezenet ../images/256-ncnn.png
 
## 输出
532 = 0.165951
920 = 0.094098
716 = 0.062193

cd ../benchmark
../build/benchmark/benchncnn 10 $(nproc) 0 0
 
## 输出
loop_count = 10
num_threads = 8
powersave = 0
gpu_device = 0
cooling_down = 1
          squeezenet  min =    2.89  max =    3.19  avg =    2.98
     squeezenet_int8  min =    5.37  max =    8.72  avg =    5.93
           mobilenet  min =    3.75  max =    4.26  avg =    3.91
      mobilenet_int8  min =    5.91  max =    6.08  avg =    5.98
        mobilenet_v2  min =    3.51  max =    4.31  avg =    3.83
        mobilenet_v3  min =    3.09  max =    3.70  avg =    3.22
          shufflenet  min =    3.03  max =    3.26  avg =    3.10
       shufflenet_v2  min =    2.51  max =    2.81  avg =    2.59
             mnasnet  min =    3.42  max =    3.90  avg =    3.66
     proxylessnasnet  min =    3.73  max =    4.26  avg =    3.88
     efficientnet_b0  min =    5.86  max =   10.86  avg =    6.76
   efficientnetv2_b0  min =    6.66  max =    7.58  avg =    7.00
        regnety_400m  min =    7.83  max =   12.75  avg =    8.52
           blazeface  min =    0.89  max =    0.96  avg =    0.91
           googlenet  min =   10.47  max =   11.00  avg =   10.85
      googlenet_int8  min =   19.94  max =   20.60  avg =   20.11
            resnet18  min =    8.22  max =   28.34  avg =   10.50
       resnet18_int8  min =   18.58  max =   53.93  avg =   22.29
             alexnet  min =    8.48  max =   41.33  avg =   14.13
               vgg16  min =   46.46  max =   54.78  avg =   49.38
          vgg16_int8  min =   48.13  max =   61.21  avg =   50.25
            resnet50  min =   19.17  max =   20.06  avg =   19.43
...
1.1.2 安装Opencv

首先从官网下载对应版本的压缩包,并进行解压
在这里插入图片描述
安装Opencv

cd opencv-4.7.0
mkdir build-host-gcc-linux
cd build-host-gcc-linux
mkdir install

# 编译
cmake -D CMAKE_BUILD_TYPE=Release -D OPENCV_GENERATE_PKGCONFIG=ON -D CMAKE_INSTALL_PREFIX=./install ..
make -j8
make install

安装过程还参考了下ubuntu 系统 OpenCV 4 安装教程

环境配置

# 先在/etc/ld.so.conf.d/文件夹下新建一个opencv4.conf文件,然后写入/opencv4.7.0/build-host-gcc-linux/lib
cd /etc/ld.so.conf.d/
sudo touch opencv4.conf
sudo vim opencv4.conf # 将/opencv4.7.0/build-host-gcc-linux/lib写入

# 更新pkg-config
sudo ldconfig

# 编辑bashrc文件,添加下方两条语句
sudo vim /etc/bash.bashrc
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/opencv4.7.0/build-host-gcc-linux/lib/pkgconfig
export PKG_CONFIG_PATH

# 更新环境
source /etc/bash.bashrc
sudo updatadb

测试Opencv是否安装成功

pkg-config --libs opencv4
## 输出
-L/opencv4.7.0/build-host-gcc-linux/lib -lopencv_photo -lopencv_highgui -lopencv_videoio -lopencv_objdetect -lopencv_gapi -lopencv_video -lopencv_ml -lopencv_stitching -lopencv_calib3d -lopencv_features2d -lopencv_dnn -lopencv_flann -lopencv_imgcodecs -lopencv_imgproc -lopencv_core

pkg-config --cflags opencv4
## 输出
-I/opencv4.7.0/build-host-gcc-linux/include/opencv4

opencv_version
## 输出
4.7.0

1.2 运行mobilenetv2_ssdlite模型

修改mobilenetv2_ssdlite_ncnn/CMakeLists.txt文件中NCNN和Opencv的路径

...
else()
    include_directories(
        # 将下面这些修改为你自己的ncnn和opencv相应的路径
        /ncnn/build-host-gcc-linux/install/include/ncnn
        /ncnn/build-host-gcc-linux/install/include
        /ncnn/src
        /opencv4.7.0/build-host-gcc-linux/install/include/opencv4
        /opencv4.7.0/build-host-gcc-linux/install/include/opencv4/opencv2
        /opencv4.7.0/build-host-gcc-linux/install/include
    )
...
else()
    link_directories(
        # 将下面这些修改为你自己的ncnn和opencv相应的路径
        /ncnn/build-host-gcc-linux/install/lib
        /opencv4.7.0/build-host-gcc-linux/install/lib
    )
...

生成可执行文件ssdlite和ssdlite_192x192

zhouying@ubuntu:~/Desktop/mobilenetv2_ssdlite_ncnn$ ./build_host_gcc_linux.sh 
-- The C compiler identification is GNU 5.4.0
-- The CXX compiler identification is GNU 5.4.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/zhouying/Desktop/mobilenetv2_ssdlite_ncnn/build-host-gcc-linux
Scanning dependencies of target ssdlite_192x192
Scanning dependencies of target ssdlite
[ 25%] Building CXX object CMakeFiles/ssdlite_192x192.dir/ssdlite_192x192.cpp.o
[ 50%] Building CXX object CMakeFiles/ssdlite.dir/mobilenetv2ssdlite.cpp.o
[ 75%] Linking CXX executable ssdlite_192x192
[100%] Linking CXX executable ssdlite
[100%] Built target ssdlite
[100%] Built target ssdlite_192x192

运行文件进行识别

# 修改run_demo.sh中的LD_LIBRARY_PATH路径为你的opencv的动态库路径,然后运行该脚本
zhouying@ubuntu:~/Desktop/mobilenetv2_ssdlite_ncnn$ ./run_demo.sh
time of init is 69.75 ms
start evaluate speed...
time of detect is 109.35 ms
15 = 0.97621 at 789.58 102.49 185.49 x 422.15
15 = 0.96929 at 589.56 119.56 220.24 x 433.76
15 = 0.91274 at 183.79 89.89 120.60 x 273.05
15 = 0.91003 at 289.27 138.48 263.19 x 464.86
2 = 0.89248 at 581.45 326.53 209.65 x 326.72
2 = 0.85226 at 286.76 340.52 277.23 x 359.78
2 = 0.64936 at 818.64 279.61 157.07 x 284.42
2 = 0.44616 at 0.00 0.00 0.00 x 0.00
2 = 0.40192 at 397.34 0.00 1722.70 x 0.00
15 = 0.39684 at 0.00 0.00 380.79 x 0.00
2 = 0.36823 at 181.93 0.00 1578.19 x 0.00
time of init is 74.98 ms

能得到识别结果图result.jpg
在这里插入图片描述

2. 交叉编译部署到RK3308B板子上并运行模型

2.1 交叉编译NCNN和Opencv

2.1.1 交叉编译Opencv

主要参考OpenCv4.x + opencv_contrib-4.x交叉编译

使用cmake-gui进行编译,下载cmake-gui命令:sudo apt install cmake-gui

cd opencv4.7.0
mkdir build-aarch64-linux-gnu
cd build-aarch64-linux-gnu
mkdir install
cmake-gui ..

在这里插入图片描述

首先先设置CMAKE_TOOLCHAIN_FILE
在这里插入图片描述
点击Configure
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
修改其中一些配置后再点击Configure

CMAKE_INSTALL_PREFIX /opencv-4.7.0/build/install
勾选BUILD_opencv_world,BUILD_PNG,BUILD_ZLIB,WITH_PNG,WITH_JPEG, WITH_OPENJPEG,OPENCV_ENABLE_NONFREE
取掉勾选BUILD_TESTS,BUILD_PERF_TESTS,BUILD_TIFF

点击Generate
在这里插入图片描述

make -j8
make install
2.1.2 交叉编译ONNX
cd ncnn
mkdir build-aarch64-linux-gnu
cd build-aarch64-linux-gnu
mkdir install
cmake-gui ..

在这里插入图片描述

首先先设置CMAKE_TOOLCHAIN_FILE
在这里插入图片描述
点击Configure
在这里插入图片描述
在这里插入图片描述

会报个错
在这里插入图片描述
在这里插入图片描述
修改下面的配置参数,再点击Configure

取掉勾选NCNN_THREADS,NCNN_SSE2

在这里插入图片描述

点击Generate
在这里插入图片描述

make -j8
make install

2.2 交叉编译mobilenetv2_ssdlite模型

修改mobilenetv2_ssdlite_ncnn/CMakeLists.txt文件中NCNN和Opencv的路径

...
if(${BUILD_SYSTEM} STREQUAL "aarch64-linux-gnu")
    include_directories(
        # 将下面这些修改为你自己的ncnn和opencv相应的路径
        /ncnn/build-aarch64-linux-gnu/install/include/ncnn
        /ncnn/build-aarch64-linux-gnu/install/include
        /ncnn/src
        /opencv-4.7.0/build-aarch64-linux-gnu/install/include/opencv4
        /opencv-4.7.0/build-aarch64-linux-gnu/install/include/opencv4/opencv2
        /opencv-4.7.0/build-aarch64-linux-gnu/install/include
    )
...
if(${BUILD_SYSTEM} STREQUAL "aarch64-linux-gnu")
    link_directories(
        # 将下面这些修改为你自己的ncnn和opencv相应的路径
        /ncnn/build-aarch64-linux-gnu/install/lib
        /opencv-4.7.0/build-aarch64-linux-gnu/install/lib
    )
...

生成可执行文件ssdlite和ssdlite_192x192

# 修改build_aarch64_linux_gnu.sh中的PATH为你的交叉编译器的路径
zhouying@ubuntu:~/Desktop/mobilenetv2_ssdlite_ncnn$ ./build_aarch64_linux_gnu.sh 
-- The C compiler identification is GNU 6.3.1
-- The CXX compiler identification is GNU 6.3.1
-- Check for working C compiler: /home/zhouying/Firefly-RK3308/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc
-- Check for working C compiler: /home/zhouying/Firefly-RK3308/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /home/zhouying/Firefly-RK3308/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-g++
-- Check for working CXX compiler: /home/zhouying/Firefly-RK3308/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-g++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/zhouying/Desktop/mobilenetv2_ssdlite_ncnn/build-aarch64-linux-gnu
Scanning dependencies of target ssdlite_192x192
Scanning dependencies of target ssdlite
[ 25%] Building CXX object CMakeFiles/ssdlite_192x192.dir/ssdlite_192x192.cpp.o
[ 50%] Building CXX object CMakeFiles/ssdlite.dir/mobilenetv2ssdlite.cpp.o
[ 75%] Linking CXX executable ssdlite_192x192
[100%] Linking CXX executable ssdlite
[100%] Built target ssdlite_192x192
[100%] Built target ssdlite

2.3 将得到的可执行文件、模型、图片和动态库push到RK3308B

将板子与PC连接,将模型、可执行文件、图片push到板子上

# 将模型文件push到板子的/data/models路径下
zhouying@ubuntu:~/Desktop/mobilenetv2_ssdlite_ncnn$ adb push models/mbv2_ssdlite /data/models

# 将可执行文件push到板子的/data路径下
zhouying@ubuntu:~/Desktop/mobilenetv2_ssdlite_ncnn$ adb push build-aarch64-linux-gnu/ssdlite /data/

zhouying@ubuntu:~/Desktop/mobilenetv2_ssdlite_ncnn$ adb push images/bicycle.jpg /data/

将opencv的动态库push到板子,NCNN生成的是静态库

zhouying@ubuntu:~/Downloads/opencv-4.7.0/build-aarch64-linux-gnu/install$ adb push lib /data/lib

2.4 在板子上运行模型进行识别

adb shell
# 配置环境
export LD_LIBRARY_PATH=/data/lib
cd data/

# 运行程序
./ssdlite models/mbv2_ssdlite bicycle.jpg
## 输出结果
time of init is 151.85 ms
start evaluate speed...
time of detect is 659.10 ms
15 = 0.97621 at 789.58 102.49 185.49 x 422.15
15 = 0.96929 at 589.56 119.56 220.24 x 433.76
15 = 0.91275 at 183.79 89.89 120.60 x 273.05
15 = 0.91003 at 289.27 138.48 263.19 x 464.86
2 = 0.89248 at 581.45 326.53 209.65 x 326.72
2 = 0.85226 at 286.76 340.52 277.23 x 359.78
2 = 0.64936 at 818.64 279.61 157.07 x 284.42
2 = 0.44617 at 0.00 0.00 839.33 x 0.00
2 = 0.40192 at 0.00 0.00 0.00 x 143.39
15 = 0.39684 at 0.00 0.00 0.00 x 0.00
2 = 0.36823 at 0.00 0.00 0.00 x 0.00

将识别结果push到PC端

zhouying@ubuntu:~/Downloads/opencv-4.7.0/build-aarch64-linux-gnu/install$ adb push /data/result.jpg
972 KB/s (308222 bytes in 0.309s)

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/522922.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

总结850

学习目标: 月目标:5月(张宇强化前10讲,背诵15篇短文,熟词僻义300词基础词) 周目标:张宇强化前3讲并完成相应的习题并记录,英语背3篇文章并回诵 每日必复习(5分钟&#…

深度学习环境配置系列文章(五):配置Docker深度学习开发环境

深度学习环境配置系列文章目录 第一章 专业名称和配置方案介绍 第二章 Anaconda配置Python和PyTorch 第三章 配置VS Code和Jupyter的Python环境 第四章 配置Windows11和Linux双系统 第五章 配置Docker深度学习开发环境 第五章文章目录 深度学习环境配置系列文章目录前言一, Do…

AI工具分享第二期:11款国内外AI绘画提示词工具整理

工具整理自未来百科AI工具箱,更多提示词工具可自行寻找 Midjourney中文教程 Midjourney 学习导航 PromptHero 描述 通过 DALL-E、Stable Diffusion、Midjourney 等 AI 模型搜索数以百万计的艺术图像… PromptDen AI 在线社区促使爱好者联系、协作和分享想法。 …

支付系统设计三:渠道网关设计07-后置处理

文章目录 前言一、订单数据更新1. 领域模型更新服务工厂2. 聚合创建工厂2.1 数据库更新服务2.2 聚合创建工厂 二、限流渠道入队三、异步通知1. 判断是否需要通知2. 组装异步通知报文3. 获取异步通知协议类型3. 异步通知 总结 前言 本篇将继业务处理之后的后置处理逻辑进行介绍&…

瑞吉外卖 - 后台系统退出功能(4)

某马瑞吉外卖单体架构项目完整开发文档,基于 Spring Boot 2.7.11 JDK 11。预计 5 月 20 日前更新完成,有需要的胖友记得一键三连,关注主页 “瑞吉外卖” 专栏获取最新文章。 相关资料:https://pan.baidu.com/s/1rO1Vytcp67mcw-PD…

瑞吉外卖 - 项目介绍(1)

某马瑞吉外卖单体架构项目完整开发文档,基于 Spring Boot 2.7.11 JDK 11。预计 5 月 20 日前更新完成,有需要的胖友记得一键三连,关注主页 “瑞吉外卖” 专栏获取最新文章。 相关资料:https://pan.baidu.com/s/1rO1Vytcp67mcw-PD…

CSS盒子模型、表格标签(table)、表单标签(form)

盒子:页面中所有的元素(标签),都可以看做是一个 盒子,由盒子将页面中的元素包含在一个矩形区域内,通过盒子的视角更方便的进行页面布局 盒子模型组成:内容区域(content)…

Qt扫盲-QScatterSeries理论总结

QScatterSeries理论总结 一、概述二、使用三、扩展四、扩展使用1.创建描述散点图对象2. 对散点图像添加值3. 自定义散点4. 将绘图设备与散点图对象联系5. 设置坐标轴6. 将绘图设备与GUI控件绑定并显示 一、概述 QScatterSeries 类以散点图的形式呈现数据。散点数据在图表上显示…

基于jdk1.8的Java服务监控和性能调优

JVM的参数类型 X参数 非标准参数-Xint: 解释执行-Xcomp: 第一次使用就编译成本地代码-Xmixed: JVM自己来决定是否编译成本地代码 默认使用的是mixed mode 用的不多, 只需要做了解, 用的比较多的是XX参数 XX参数 非标准化参数相对不稳定主要用来JVM调优和Debug Boolean: …

Vivado综合属性系列之一 ASYNC_REG

目录 一、属性简介 二、示例 2.1 工程说明 ​ ​2.2 工程代码 ​ ​2.3 生效确认 一、属性简介 ASYNC_REG属性的作用对象为寄存器,寄存器添加该属性后,即表明寄存器的数据输入口D接收的是来自异步时钟触发器的数据或是该寄存器在一个同步链中属于…

【CSS系列】第九章 · CSS定位和布局

写在前面 Hello大家好, 我是【麟-小白】,一位软件工程专业的学生,喜好计算机知识。希望大家能够一起学习进步呀!本人是一名在读大学生,专业水平有限,如发现错误或不足之处,请多多指正&#xff0…

Uni-app 离线打包 apk

Uni-app 离线打包 apk 1. Android Studio 下载 Android Studio官网 2. HBuilderX下载 HBuilderX下载 3. App离线SDK下载 Android 离线SDK - 正式版 下载后解压文件,将 HBuilder-Integrate-AS 重命名 build-template 并拷贝到一个专门打包用的文件夹下作为打包…

一行代码绘制高分SCI限制立方图

一、概述 Restricted cubic splines (RCS)是一种基于样条函数的非参数化模型,它可以可靠地拟合非线性关系,可以自适应地调整分割结点。在统计学和机器学习领域,RCS通常用来对连续型自变量进行建模,并在解释自变量与响应变量的关系…

抑梯度异常初始化参数(防止梯度消失和梯度爆炸)

这里设置3种参数初始化的对比,分别是:全初始化为0、随机初始化、抑梯度异常初始化。 首先是正反向传播、画图、加载数据所需的函数init_utils.py: # -*- coding: utf-8 -*-import numpy as np import matplotlib.pyplot as plt import sklea…

双层优化入门(3)—基于智能优化算法的求解方法(附matlab代码)

前面两篇博客介绍了双层优化的基本原理和使用KKT条件求解双层优化的方法,以及使用yalmip工具箱求解双层优化的方法: 双层优化入门(1)—基本原理与求解方法 双层优化入门(2)—基于yalmip的双层优化求解(附matlab代码) 除了数学规划方法之外,…

springboot+vue大学生体质测试管理系统(源码+文档)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的大学生体质测试管理系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 💕💕作者&#xf…

how2heap-fastbin_dup.c

不同libc版本的fastbin_dup.c源码有点小区别&#xff1a;主要是有tcache的&#xff0c;需要先填充 以下为有tcache的源码示例&#xff1a; #include <stdio.h> #include <stdlib.h> #include <assert.h>int main() {setbuf(stdout, NULL);printf("This…

诗词·宇宙之梦

宇宙之梦 重力枷锁必将断&#xff0c;携君翱翔万里空。 迷途夜路寻踪迹&#xff0c;一声呼唤莫轻忽。 寻觅中&#xff0c;见红瞳&#xff0c;决不装假觉清白。 黑泽之中君沉沦&#xff0c;放之不下心怎静。 重力终将解开放&#xff0c;卫星翔空自由翱。 重量减半去忧愁&#xf…

RobotFramework+Eclispe环境安装篇

环境安装是学习任何一个新东西的第一步&#xff0c;这一步没走舒坦&#xff0c;那后面就没有心情走下去了。 引用名句&#xff1a;工欲善其事必先利其器&#xff01;&#xff01; Robotframework&#xff1a;一款 自动化测试框架。 Eclipse&#xff1a;一款编辑工具。可以编…

Android MVVN 使用入门

MVVM&#xff08;Model-View-ViewModel&#xff09;是一种基于数据绑定的设计模式&#xff0c;它与传统的 MVC 和 MVP 模式相比&#xff0c;更加适合处理复杂的 UI 逻辑和数据展示。在 Android 开发中&#xff0c;MVVM 通常使用 Data Binding 和 ViewModel 实现。 下面是一个简…