文章目录
TFLite Objec Detection IOS 检测核心代码说明
简要说明
本文档面向 IOS 移动端开发人员,主要讲解如何使用 tensorflow lite 在 IOS 设备上实现目标检测,以及在更换检测模型之后如何调整项目中的参数,使其成功运行。
Object Detection
首先需要说明一下目标检测的大致情况,目标检测与图像分类 Image classification 有很大不同。图像分类更着重于输入图片内容是否属于某个特定的类别。以关注“猫”的信息为例,图像分类仅关注图片中是否是一只猫。
而目标检测是指判断输入图像中是否包含某个/些指定类别的目标,一张输入图片的检测结果可能包含一个或多个,如模型可以检测”猫“和”狗“两类,那么输入一张包含 2 只猫 2 只狗的图片,预期结果中会包含 4 条检测结果;如果有,则还要返回其类别、位置、以及对应概率信息。同样以关注“猫”的信息为例,若展示一副阳台上有花草(或其他物品)和猫咪在晒太阳的图片,应该返回猫咪在原图中的位置,即同时携带了“猫”这个类别的信息及“猫”的位置信息。
执行 object detection 所使用的模型
了解到上面目标检测的大致情况后,再说明一下模型,模型即.tflite文件。目标检测涉及到“类别”及“位置”两部分信息,模型的输出自然也包含该两部分信息(还包括一个概率信息,输出的类别位置有多大的概率是准确的)。
关于类别,若任务中涉及特定 5 类,比如手、人脸、水杯等,那么模型不会直接直接输出概念字符如“水杯”,而是用某个数值代表各类,如 0 代表手,1 代表人脸等。这个映射信息在整个训练过程中,一经定义不可随意更改,否则可能出现报错情况。在本项目中,即 labelmap.txt 文件所包含的信息,因此请勿自行对本文件进行任何修改。
关于位置,一般用 4 个数值表示,4 个数值直接或间接地携带了目标中心点在原图中的坐标及目标的宽高信息。
针对特定任务所训练得到的模型,一经定义和完成之后,其输入输出的尺寸、数据类型等均已定好,且**不能改变**,否则报错。如本项目中该检测模型接受输入图像尺寸为 300 × 300,那么就应该保证待检测图像被送入模型识别前被处理为 300 × 300,其他数据类型等情况同理。
代码分析 ModelDataHandler.swift
可以在线或者克隆 github上 tensorflow examples 项目后阅读本文件完整代码。
后文按照先代码段,后说明的顺序。
Line 26
/// Stores one formatted inference.
struct Inference {
let confidence: Float
let className: String
let rect: CGRect
let displayColor: UIColor
}
inference: 模型的训练过程被称为 Training,此处的 inference 是指模型在做推断,即模型已完成被应用的,相近词还有 predict,本项目就是在用训练好的模型做 inference。
那么上述代码段即是在说明模型在预测和推断时的数据结构信息。
confidence: 即前面说明中提及的概率,值在 0~1之间,float,越高代表模型“认为”预测得越好。
className: 即类别信息,代表某数字(或者已和 labelmap 做映射得到具有真实含义的类别名如‘cat’)。
rect: 即位置信息,具体请参考代码中所示 CGRect。
displayColor: 为方便开发人员调试,本项目提供了绘制功能,即将检测到的类别和位置信息用实时画框的方式展示在前端界面。
Line 34
/// Information about a model file or labels file.
typealias FileInfo = (name: String, extension: String)
/// Information about the MobileNet SSD model.
enum MobileNetSSD {
static let modelInfo: FileInfo = (name: "detect", extension: "tflite")
static let labelsInfo: FileInfo = (name: "labelmap", extension: "txt")
}
本段代码即在给定实现目标检测所使用的模型及对应的 labe