ncnn 是一个为手机端极致优化的高性能神经网络前向计算框架。ncnn 从设计之初深刻考虑手机端的部署和使用。无第三方依赖,跨平台,手机端 cpu 的速度快于目前所有已知的开源框架。基于 ncnn,开发者能够将深度学习算法轻松移植到手机端高效执行,开发出人工智能 APP,将 AI 带到你的指尖。ncnn 目前已在腾讯多款应用中使用,如 QQ,Qzone,微信,天天P图等。github 地址:Tencent/ncnn, Demo 地址:YOLOv5_NCNN
深度学习和卷积神经网络,在移动端上的测试,可以了解本文。
支持 YOLOv5s、YOLOv4-tiny、MobileNetV2-YOLOv3-nano、Simple-Pose、Yolact、ChineseOCR-lite、ENet、Landmark106、DBFace、MBNv2-FCN 与 MBNv3-Seg-small 模型,摄像头实时捕获视频流进行检测。
环境准备:macbook,xcode,真机或模拟器。
通过技术选型,前后尝试了Google的MLKit,mediapipe,以及腾讯的ncnn,最终完整实现了ncnn的识别性能。步骤如下。
0 下载官方 Demo
前往 YOLOv5_NCNN 下载官方 Demo,挺大的,主要是模型和算法资源文件,300m 左右。
1 转移资源文件
下载的资源文件,默认目录是在安卓目录下,转到 android_YOLOV5_NCNN\app\src\main\assets目录下,将 .param 和 .bin 文件到 “iOS_YOLOv5NCNN\YOLOv5NCNN\res” 下,重复的资源可以直接跳过。
2 下载 ncnn.framework
从 ncnn官网下载.framework到工程中,
四个版本的区别在于 iOS 默认使用的库不包含 vulkan 和 bitcode,按需索取,本次演示下载单独的7.15m 的普通版本就可。
新版本会报错:
将老版本的 ncnn.framework 和 openmp.framework 彻底删除,然后直接拖入下载并解压的前两者。
3 下载 OpenCV.framework
可以自行编译,也可以前往 OpenCV github 下载编译好的 SDK,直接使用。
NCNN github 地址:Tencent/ncnn
官方 Demo 地址:YOLOv5_NCNN
4 导入所需框架
将上述下载的 opencv, ncnn, openmp 等框架导入工程中。
5 运行
选择所需的算法进行测试。
运行预览如下,不同的算法对应不同的展示结果。
6 导入自己的模型
如果我们训练了自己的模型,可将 .bin 以及 .param 文件添加到文件中,并导入相应路径,同时导入相应的算法 SDK 等。
例如我们打包了算法 SDK humanpose
导入工程后,同时重复步骤 1 ,将 .bin 以及 .param 等资源文件导入工程中。
然后使用代码:
NSString *PARAM_PATH = [[NSBundle mainBundle] pathForResource:@"yourname" ofType:@"param"];
NSString *MODEL_PATH= [[NSBundle mainBundle] pathForResource:@"yourname" ofType:@"bin"];
int r1 = self.pose_detector->GetDetectorNet().load_param([DET_PARAM_PATH UTF8String]);// 0 - success
int r2 = self.pose_detector->GetDetectorNet().load_model([DET_MODEL_PATH UTF8String]);
if(r1 != 0 ||r2 != 0){
NSLog(@"loading failed");
}
创建模型,调用的 - (void)createModel 方法。
需要使用算法,在摄像头图片回调方法 - (void)detectImage:(UIImage *)image中对图片进行编辑。
这里算法返回的为 C++ 的 vector 类型的数据,类似于一些点的集合,而我们需要做的工作就是使用 OC 的绘图 API 或者 OpenCV 本身自带的绘制方法,将点的位置以及连线进行绘制。