目标检测 YOLOv5 - ncnn模型的加密 C++实现封装库和Android调用库示例

flyfish

文章目录

  • 目标检测 YOLOv5 - ncnn模型的加密 C++实现封装库和Android调用库示例
    • 前言
    • 模型版本
    • 库的版本
    • 示例程序的编译环境
    • 模型的转换
    • 库的制作
      • 主要接口部分
      • 模型初始化部分
      • 推理的输入输出
      • CMakeList的配置
    • 示例部分

前言

源码下载地址在文章末尾
将模型和重要代码全部封装到库中,生成静态库a或者动态库so,如果是windows下就是lib或者dll。
上层应用程序使用库和一个头文件,对于应用程序开发者,模型和重要代码是不可见的,达到加密的目的。

如需更多的加密方法,请参考nihui的 如何加密ncnn模型
此repo包括C++编写的库qt_android_ncnn_lib和Android调用库示例qt_android_ncnn_example
此代码演示如何模型如何加密的,Android是如何调用的。

模型版本

YOLOV5 6.2

库的版本

该示例部署环境是arm64-v8a,应用于android
opencv4.6.0 下载地址

ncnn20220420 下载地址
这里选的是CPU版本的静态库

代码目录如下

示例程序的编译环境

使用Qt C++开发的Android程序
Qt 6.2.3
Qt Creator 6.0.2
android-ndk-r21e
整个编写代码过程不涉及Java,只有C++
代码目录如下

准备工作

模型的转换

当一个YOLOv5 6.2模型训练完成后
1 先使用该repo导出onnx格式
shaoshengsong/yolov5_62_export_ncnn (github.com)

2 再按照该文档将onnx格式的模型转换为ncnn格式

https://flyfish.blog.csdn.net/article/details/127669328

3 最后ncnn 的 ncnn2mem 工具将ncnn模型转换为 param.bin + bin形式

$ncnn2mem yolov5s_6.2.param yolov5s_6.2.bin yolov5s_6.2.id.h yolov5s_6.2.mem.h

主要使用yolov5s_6.2.id.h 和yolov5s_6.2.mem.h这两个文件

库的制作

以静态库为例
在YOLOv5类的实现文件加入

#include "yolov5s_6.2.id.h"
#include "yolov5s_6.2.mem.h"

这两个文件对上层应用开发者不可见

配置如下

主要接口部分

public:int init(int bgr_rgb,float prob_threshold,float nms_threshold);int inference(const cv::Mat& bgr, std::vector<Object>& objects);cv::Mat draw_objects(const cv::Mat& bgr, const std::vector<Object>& objects);private:ncnn::Net * model_;int bgr_rgb_=0;//输入图片的通道顺序 0:bgr   1:rgbfloat prob_threshold_ = 0.25f;float nms_threshold_ = 0.45f;

模型初始化部分

int YOLOv5::init(int bgr_rgb,float prob_threshold,float nms_threshold)
{bgr_rgb_=bgr_rgb;//输入图片的通道顺序 0:bgr   1:rgbprob_threshold_ = prob_threshold;nms_threshold_ = nms_threshold;//reference https://github.com/Tencent/ncnn/wiki/ncnn-load-modelmodel_ = new ncnn::Net();model_->load_param(yolov5s_6_2_param_bin);model_->load_model(yolov5s_6_2_bin);return 0;}

yolov5s_6_2_param_bin 和yolov5s_6_2_bin这两个变量在
yolov5s_6.2.mem.h中原型分别是

static const unsigned char yolov5s_6_2_bin[]
static const unsigned char yolov5s_6_2_param_bin[]

推理的输入输出

ex.input(yolov5s_6_2_param_id::BLOB_images, in_pad);
ex.extract(yolov5s_6_2_param_id::BLOB_output, out);
ex.extract(yolov5s_6_2_param_id::BLOB_353, out);
ex.extract(yolov5s_6_2_param_id::BLOB_367, out);

CMakeList的配置

cmake_minimum_required(VERSION 3.14)
project(yolov5lib LANGUAGES CXX)set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)include_directories(
${CMAKE_SOURCE_DIR}/opencv4.6.0/native/jni/include/opencv2
${CMAKE_SOURCE_DIR}/opencv4.6.0/native/jni/include
${CMAKE_SOURCE_DIR}/ncnn20220420/include
${CMAKE_SOURCE_DIR}/ncnn20220420/include/ncnn)set(STATIC_LIBS${CMAKE_SOURCE_DIR}/opencv4.6.0/native/staticlibs/arm64-v8a/libopencv_calib3d.a${CMAKE_SOURCE_DIR}/opencv4.6.0/native/staticlibs/arm64-v8a/libopencv_gapi.a${CMAKE_SOURCE_DIR}/opencv4.6.0/native/staticlibs/arm64-v8a/libopencv_objdetect.a${CMAKE_SOURCE_DIR}/opencv4.6.0/native/staticlibs/arm64-v8a/libopencv_core.a${CMAKE_SOURCE_DIR}/opencv4.6.0/native/staticlibs/arm64-v8a/libopencv_highgui.a${CMAKE_SOURCE_DIR}/opencv4.6.0/native/staticlibs/arm64-v8a/libopencv_photo.a${CMAKE_SOURCE_DIR}/opencv4.6.0/native/staticlibs/arm64-v8a/libopencv_dnn.a${CMAKE_SOURCE_DIR}/opencv4.6.0/native/staticlibs/arm64-v8a/libopencv_imgcodecs.a${CMAKE_SOURCE_DIR}/opencv4.6.0/native/staticlibs/arm64-v8a/libopencv_stitching.a${CMAKE_SOURCE_DIR}/opencv4.6.0/native/staticlibs/arm64-v8a/libopencv_features2d.a${CMAKE_SOURCE_DIR}/opencv4.6.0/native/staticlibs/arm64-v8a/libopencv_imgproc.a${CMAKE_SOURCE_DIR}/opencv4.6.0/native/staticlibs/arm64-v8a/libopencv_video.a${CMAKE_SOURCE_DIR}/opencv4.6.0/native/staticlibs/arm64-v8a/libopencv_flann.a${CMAKE_SOURCE_DIR}/opencv4.6.0/native/staticlibs/arm64-v8a/libopencv_ml.a${CMAKE_SOURCE_DIR}/opencv4.6.0/native/staticlibs/arm64-v8a/libopencv_videoio.a${CMAKE_SOURCE_DIR}/opencv4.6.0/native/3rdparty/libs/arm64-v8a/libtbb.a${CMAKE_SOURCE_DIR}/opencv4.6.0/native/3rdparty/libs/arm64-v8a/libIlmImf.a${CMAKE_SOURCE_DIR}/opencv4.6.0/native/3rdparty/libs/arm64-v8a/liblibjpeg-turbo.a${CMAKE_SOURCE_DIR}/opencv4.6.0/native/3rdparty/libs/arm64-v8a/liblibtiff.a${CMAKE_SOURCE_DIR}/opencv4.6.0/native/3rdparty/libs/arm64-v8a/libtegra_hal.a${CMAKE_SOURCE_DIR}/opencv4.6.0/native/3rdparty/libs/arm64-v8a/libade.a${CMAKE_SOURCE_DIR}/opencv4.6.0/native/3rdparty/libs/arm64-v8a/liblibopenjp2.a${CMAKE_SOURCE_DIR}/opencv4.6.0/native/3rdparty/libs/arm64-v8a/liblibwebp.a${CMAKE_SOURCE_DIR}/opencv4.6.0/native/3rdparty/libs/arm64-v8a/libcpufeatures.a${CMAKE_SOURCE_DIR}/opencv4.6.0/native/3rdparty/libs/arm64-v8a/liblibpng.a${CMAKE_SOURCE_DIR}/opencv4.6.0/native/3rdparty/libs/arm64-v8a/libquirc.a${CMAKE_SOURCE_DIR}/opencv4.6.0/native/3rdparty/libs/arm64-v8a/libittnotify.a${CMAKE_SOURCE_DIR}/opencv4.6.0/native/3rdparty/libs/arm64-v8a/liblibprotobuf.a${CMAKE_SOURCE_DIR}/opencv4.6.0/native/3rdparty/libs/arm64-v8a/libtbb.a${CMAKE_SOURCE_DIR}/ncnn20220420/lib/libncnn.a)add_library(yolov5lib STATICYOLOv5.cppYOLOv5.hyolov5s_6.2.id.hyolov5s_6.2.mem.h
)
target_link_libraries(yolov5lib PRIVATE  ${STATIC_LIBS})
target_compile_definitions(yolov5lib  PRIVATE YOLOv5_LIBRARY)

编译结果,输出库libyolov5lib.a


其他部分详看

示例部分

提供给示例代码包括一个YOLOv5.h和libyolov5lib.a库
看不到模型了,因为模型已经在libyolov5lib.a文件中

yolov5_.init(1,0.25,0.45); //初始化
std::vector<Object> objects;
yolov5_.inference(orig_img, objects);//推理
cv::Mat ret= yolov5_.draw_objects(orig_img, objects);//结果显示

推理结果存储在objects中,ret用于图像显示。


本文源码地址
https://github.com/shaoshengsong/qt_android_ncnn_lib_encrypt_example

目标检测 YOLOv5 - ncnn模型的加密 C++实现封装库和Android调用库示例相关推荐

  1. 目标检测 YOLOv5 - 模型的样子

    目标检测 YOLOv5 - 模型的样子 flyfish 文章目录 目标检测 YOLOv5 - 模型的样子 开始加载模型文件 模型的层 模型的属性 模块的名称以及模块本身 模型的权重 模型权重的名字和权 ...

  2. 目标检测 YOLOv5 - 如何提高模型的指标,提高精确率,召回率,mAP等

    目标检测 YOLOv5 - 如何提高模型的指标,提高精确率,召回率,mAP等 flyfish 文中包括了YOLOv5作者分享的提高模型指标小技巧和吴恩达(Andrew Ng)在做缺陷检测项目( ste ...

  3. 目标检测 YOLOv5 - v6.2版本模型在瑞芯微 Rockchip设备从训练到C++部署实践

    目标检测 YOLOv5 - v6.2版本模型在瑞芯微 Rockchip设备从训练到C++部署实践 flyfish 源码地址 https://github.com/shaoshengsong/rockc ...

  4. 《深度学习与目标检测 YOLOv5》

    <深度学习与目标检测 YOLOv5> flyfish 基础 深度学习基础 - 向量 深度学习基础 - 累加符号和连乘符号 深度学习基础 - 最大似然估计 深度学习基础 - 朴素贝叶斯 深度 ...

  5. 目标检测 YOLOv5 - 卷积层和BN层的融合

    目标检测 YOLOv5 - 卷积层和BN层的融合 即Conv2d和 BatchNorm2d融合 flyfish 为了减少模型推理时间,YOLOv5源码中attempt_load已经包括两层的合并,主要 ...

  6. 目标检测 YOLOv5 anchor设置

    目标检测 YOLOv5 anchor设置 1 anchor的存储位置 1.1 yaml配置文件中例如 models/yolov5s.yaml # anchors anchors:- [10,13, 1 ...

  7. 目标检测 YOLOv5 自定义网络结构

    目标检测 YOLOv5 自定义网络结构(YOLOv5-ShuffleNetV2) flyfish 版本:YOLOv5:v5 具体已经借鉴的自定义网络结构包括 YOLOv5-MobileNetV3 Mo ...

  8. 目标检测 YOLOv5网络v6 0版本总结

    目标检测 YOLOv5网络v6.0版本总结 YOLOv5对比YOLOv4 输入端:在模型训练阶段,提出了Mosaic数据增强.自适应锚框计算.自适应图片缩放等: Backbone网络:融合其它检测算法 ...

  9. 深度学习目标检测YOLOV5的主要过程梳理和工程部署的具体手段

    一.YOLOV5训练数据基本格式以及格式的相互转换(labimg标注数据格式) 1.1 VOC数据格式 基本图片数据集,每张图片对应的.xml标注文件,类别classes.txt文件. 其中.xml的 ...

最新文章

  1. C# 四舍五入round函数使用的代码
  2. [HNOI2007]分裂游戏
  3. Hybris Commerce Product字段名列表
  4. oracle导入初始数据死机,Sqoop导入Oracle数据至hive卡死在hive.HiveImport: Connecting to jdbc:hive2不执行...
  5. 第七季2:MP4v2库的移植与播放实战
  6. ios 画线平滑_iOS 画贝塞尔曲线 连续曲线 平滑曲线 曲线图表
  7. C#LeetCode刷题之#62-不同路径(Unique Paths)
  8. javascript匿名函数及闭包深入理解及应用
  9. cvs数据导入工具 oracle_oracle数据库的导入导出
  10. GBin1推荐:jQuery的滚动插件Waypoints
  11. 关于结构体嵌套的字节大小的问题
  12. IMEI修改(IMEI第十五位验证码的计算)
  13. mysql同时满足升序和降序_mysql中的升序和降序以及一个字段升序和一个字段降序...
  14. VS2019++QT5.12.10+PCL1.11.1+VTK8.2.0+opencv(camke3.18.0)环境搭配及演示实例
  15. ui效果图生成html,四步制作一个高大上的iPhone效果图模版 UI呀-学UI设计网
  16. js代码中for循环里绑定onclick事件报错Uncaught TypeError Cannot set properties of undefined (setting ‘className‘)
  17. 记一次 .NET 某制造业 MES 系统崩溃分析
  18. oracle分组查询取第一条数据,160804、oracle查询:取出每组中的第一条记录
  19. 基于C语言的网络编程笔记分享
  20. 亲测好用!这4个免费的二维码生成器,制作简单易上手

热门文章

  1. 自控力读书笔记:第一章 我要做,我不要,我想要
  2. 帝国CMS教程,使用灵动标签调用上一篇下一篇的文章标题图片的方法
  3. 无线广告屏]无线模块
  4. uva11134 -Fabled Rooks
  5. 一款开源的协作文本编辑器
  6. noip冲刺计划(no regrets,no fear)
  7. 怎么学计算机打字输入,如何学电脑打字?成为打字员
  8. 【总结】1111- 如何搞定Banner背景自动换色的功能?
  9. python 实现轨迹数据可视化
  10. 操作系统春招面试复习之:操作系统概述