ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

TensorFlow examples:在 iOS 上构建 Classification-by-Retrieval 零训练图像分类器的完整指南

TensorFlow examples:在 iOS 上构建 Classification-by-Retrieval 零训练图像分类器的完整指南 示例工程【免费下载链接】examplesTensorFlow examples项目地址https://gitcode.com/gh_mirrors/exam/examples点击查看免费下载本篇指南基于 tensorflow/examples 仓库中的 iOS 示例应用文档带你从环境准备、Bazel 编译到真机运行完整搭建一个基于 Classification-by-RetrievalCbR基于检索的分类技术的 Image Classifier Builder 应用。读完本篇你不仅能在 iOS 设备上编译并运行该 Demo还能深入理解它如何把相册中的少量图片在秒级时间内训练成可实时推理的 TFLite 分类模型——整个过程无需反向传播训练。什么是 Classification-by-Retrieval无需训练的分类器仓库顶层 CbR 说明文档 给出了这项技术的定位Classification-by-retrieval 提供了一条创建神经网络分类器的捷径完全绕开了计算开销巨大的反向传播训练。它支持两种极端用法Few-shot 场景每个类别最少只需一张图片就能生成一个轻量级移动模型海量类别场景可以构建能识别数万甚至更多类别的端侧模型例如官方用该技术构建过可识别数万地标的移动模型。典型的图像识别做法是构建神经网络分类器并用大量训练数据通常数千张以上训练它而检索式方法则使用一个预训练的特征提取器图像嵌入模型配合基于最近邻搜索的特征匹配。检索式方法的可扩展性和灵活性更强类别数量可以非常大例如超过 100 万类且增删类别无需任何额外训练每个类别最少只需一条训练数据本质上等效于 few-shot 学习。其代价是需要额外的基础设施支持且使用体验不如普通分类模型直观。CbR 把图像检索层烘焙进神经网络模型内部从而无需训练就能创建一个 TensorFlow 分类模型。从 顶层 README 的原理描述看检索层由两部分组成最近邻匹配组件Nearest neighbor matching本质上是一个全连接层其权重就是索引数据训练图片归一化后的嵌入向量。两个归一化向量的点积余弦相似度与平方 L2 距离呈线性关系负系数因此该全连接层的输出与最近邻匹配结果等效结果聚合组件Result aggregation最近邻匹配是针对每条训练样本而非每个类别给出结果的因此在匹配层之上为每个类别叠加一个选择层selection layer再对选择结果做聚合如取最大值最后拼接成单一输出向量。这些检索层不是训练出来的而是直接从训练数据索引数据计算得到。你可以选择一个最适合业务域的基座嵌入模型本 iOS Demo 使用的是在 ImageNet 上训练的 MobileNet V3 特征向量模型generic 且高效适合端侧对应模型资源在构建时以imagenet-mobilenet_v3_small_100_224-feature_vector的名称打包进 App。iOS 示例应用概览该 Demo目标名ImageClassifierBuilder的工作流程是从设备照片库Photo Library中选择若干相册以相册名称作为类别标签几秒钟内生成一个 TFLite 分类模型图片数量较少时立即用摄像头对实物进行实时分类测试——把相机对准你刚才训练过的物体观察分类效果。App 同时支持把生成的.tflite模型以文件形式导出分享这一点体现在 Info.plist 中它声明了自定义文档类型com.tensorflow.lite.swift.ImageClassifierBuilder.tfliteUTTypeTagSpecification 中 MIME 类型为application/octet-stream扩展名为tflite并配有一组专属文档图标TFLite_22/44/64/320.png。环境要求按 iOS README 的说明需要满足iOS 14.0 及以上的设备注意当前 ios/BUILD 中MINIMUM_OS_VERSION 15.0即构建目标实际声明的最低系统版本为 iOS 15.0以 BUILD 文件为准Xcode 12.5 及以上有效的 Apple Developer ID真机构建和签名需要Xcode 命令行工具执行xcode-select --install安装。如果是全新安装需要先把 Xcode 应用运行一次并同意许可协议。另外README 特别指出该 Demo 依赖摄像头必须在真实 iOS 设备上运行你可以在 iPhone 模拟器上构建并启动 App但会抛出Camera not found异常。构建与运行模拟器构建克隆仓库到本地工作站$ git clone https://gitcode.com/gh_mirrors/exam/examples进入 Classification-by-Retrieval 示例目录$ cd examples/lite/examples/classification_by_retrieval使用 Bazel 为模拟器构建$ bazel build -c opt --configios_x86_64 ios:ImageClassifierBuilder构建目标ios:ImageClassifierBuilder在 ios/BUILD 中由三个部分构成ios_application目标Bundle ID 为com.tensorflow.lite.swift.ImageClassifierBuilder仅适配 iPhone 家族、swift_library目标编译ImageClassifierBuilder/*.swift全部 Swift 源码、以及objc_library目标编译*.m/*.mm的 Objective-C/C 桥接层并依赖 C 库//lib:model_builder。真机构建先从 Apple 获取一个移动配置描述文件mobile provisioning profile可参考 Apple 官方开发者文档为描述文件创建符号链接$ ln -s path/to/your/profile.mobileprovision ProvisioningProfile.mobileprovision取消 ios/BUILD 中所有ProvisioningProfile.mobileprovision的注释。在 BUILD 文件里ios_application的provisioning_profile :ProvisioningProfile.mobileprovision与文件末尾的exports_files([ProvisioningProfile.mobileprovision])都指向该符号链接用以下命令为真机构建$ bazel build -c opt --configios_arm64 ios:ImageClassifierBuilder安装到设备后需要授予 App 使用摄像头和照片库的权限。Info.plist 中已声明了相应的用途描述字符串NSCameraUsageDescriptionThis app uses the camera to let you test models.和NSPhotoLibraryUsageDescriptionThis app uses your selection of albums from the Photos Library to train models.这是 iOS 系统弹出权限对话框的前提。源码深入训练是如何在设备内完成的Demo 的秒级训练并非玄学其调用链从 Swift 层一直贯通到 C 库全部发生在设备本地。1. Swift 层从相册收集标签化的训练数据ModelTrainer.swift 中的trainModel(metadata:on:)是整个流程的入口核心步骤调用prepareImages(from:)遍历用户选中的每个PHAssetCollection相册用PHAsset.fetchAssets(in:options:)拉取图片资产以相册的本地化标题作为该相册所有图片的标签图片会被请求为 640x480、aspectFill填充的图像再以jpegData(compressionQuality: 1)全质量 JPEG 写入NSTemporaryDirectory()临时目录得到(labels, imagePaths)两个等长列表调用 ObjC 桥接的ModelTrainingUtils.trainModel(...)真正构建模型模型写盘后通过Classifier(modelURL:)读回labelmap得到不同标签的数量并记录模型文件大小最终生成一个Model对象供列表页展示。2. ObjC 桥接层调用 C ModelBuilderModelTrainingUtils.mm 实现了trainModel(name:description:author:version:license:labels:imagePaths:outputModelPath:)头文件 ModelTrainingUtils.h 中声明。它强制了若干前置条件五项元数据名称、描述、作者、版本、许可证均不能为空labels.count imagePaths.count且labels.count 2——即至少需要 2 张带标签图片才能建模。其内部逻辑从主 Bundle 中定位嵌入模型文件imagenet-mobilenet_v3_small_100_224-feature_vector.tflite填入ImageEmbedderOptions通过ModelBuilder::CreateFromImageEmbedderOptions(...)创建构建器调用SetMetadata(...)写入模型元数据并附带{model_type.txt, IMAGE_CLASSIFIER}关联文件逐张处理训练图片UIImage解码 →cbr_asNewPixelBuffer转为CVPixelBuffer→ 提取 RGBA8888 原始数据 →CreateFromRgbaRawBuffer(...)构造 TFLite Task API 的FrameBuffer→ 调用model_builder-AddLabeledImage(label, *frame_buffer)调用model_builder-BuildModel()生成ExternalFile带完整元数据的.tflite内容用flatbuffers::SaveFile(..., binarytrue)写盘。3. C 核心ModelBuilder 的三阶段 API真正的免训练建模逻辑封装在 lib/model_builder.h 的tflite::examples::cbr::ModelBuilder类中实现在同目录 model_builder.cc检索层的 TFLite 算子构建由 tflite_cbr_builder.h / tflite_cbr_builder.cc 负责。其设计是典型的多步累积 一次性落库CreateFromImageEmbedderOptions(options)从嵌入模型选项初始化内部同时持有ImageEmbedder实例、原始FlatBufferModel和TfLiteCbRBuilderSetMetadata(name, description, author, version, license, associated_files)填充元数据在BuildModel()返回时一次性写入模型AddLabeledImage(label, frame_buffer)对单张图片提取特征向量embedding并与标签配对累积需对每张训练图片调用一次BuildModel()利用累积的标签与特征向量完成检索层最近邻匹配 按类别聚合的构建产出直接可用于 ImageClassifier Task API含元数据的模型以ExternalFileproto 形式返回file_content字段承载模型字节。若累积的带标签图片少于 2 张返回absl::FailedPreconditionError成功构建后ModelBuilder会自动重置可继续构建下一个模型。从 ios/BUILD 的依赖清单看该 C 层直接链接了 TensorFlow Lite Support 的 C Task APIimage_classifier、image_embedder及配套的frame_buffer、classifications_proto_inc、image_embedder_options_proto_inc等目标外加flatbuffers运行时与 Abseilabsl/status、absl/strings等这正是ModelBuilder与推理端Classifier共用同一套底层 API 的原因。4. 实时推理加载自建模型并分类Classifier.mm 封装了推理侧initWithModelURL:用ImageClassifierOptions指定刚生成的.tflite路径ImageClassifier::CreateFromOptions(...)加载模型——由于模型自带元数据含 labelmap无需外部标签文件classifyPixelBuffer:将摄像头帧的CVPixelBuffer转为 RGBA8888FrameBuffer后调用Classify(...)把ClassificationResult转成 Objective-C 的Label名称 分数数组一个值得注意的细节是PostProcessClassifications因为 CbR 模型的检索层会对每一张训练样本输出一个分数同一类别的多张图片会产生多条同名标签所以后处理按分数降序遍历、只保留每个标签的第一次出现即该类别的最高分合并同类标签后再返回给 UI模型列表页展示的元数据名称、描述、作者、版本、许可证和标签列表则通过GetMetadataExtractor()的GetModelMetadata()与GetAssociatedFile(labelmap.txt)从模型内置元数据中提取。实践要点与适用边界最低图片数量源码中labels.count 2的前置断言与BuildModel()少于两张图片返回FailedPreconditionError 的约束一致即每个模型至少需要 2 张带标签图片可以同属不同类别版本差异README 文本写的是 iOS 14.0而 ios/BUILD 中MINIMUM_OS_VERSION为15.0真机部署时应以 BUILD 声明的系统版本为下限模拟器限制仅能构建和启动无摄像头会触发Camera not found实时测试必须在真机完成符号链接未就绪时的行为真机构建依赖ProvisioningProfile.mobileprovision符号链接与 BUILD 中相关注释的取消两者缺一不可适用场景按 顶层 README 的归纳CbR 特别适合机器学习教学演示、快速原型验证以及中小商家无需采集海量数据即可构建自定义商品识别应用的场景由于检索层只是计算而非训练所得更换或扩充类别的成本极低。整套示例的代码分布清晰iOS 端 Swift UI相册选择、模型列表、摄像头实时分类等视图位于 lite/examples/classification_by_retrieval/ios/ImageClassifierBuilder/跨语言桥接ObjC/ObjC与 C 核心构建库位于 lite/examples/classification_by_retrieval/lib/配合本指南中的构建命令即可完整复现照片库选图 → 秒级建模 → 摄像头实时验证的零训练分类闭环。赞分享示例工程【免费下载链接】examplesTensorFlow examples项目地址https://gitcode.com/gh_mirrors/exam/examples点击查看免费下载相关推荐TensorFlow Lite Classification-by-Retrieval免训练构建少样本图像分类器的技术解析TensorFlow Lite Classification by Retrieval免训练构建少样本图像分类器的技术解析 Classification by示例工程TensorFlow Lite图像分类模型训练与部署完整指南TensorFlow Lite图像分类模型训练与部署完整指南 TensorFlow Lite图像分类技术让移动端AI应用开发变得前所未有的简单 这个强大文档教程知识库终极TensorFlow-Examples多GPU分布式训练完整指南终极TensorFlow Examples多GPU分布式训练完整指南 TensorFlow Examples是面向初学者的TensorFlow教程和示例项目示例工程机器学习上一篇突破帧率枷锁WaveTools工具箱实现鸣潮120FPS极致体验全攻略下一篇emby-unlockedEmby高级功能的本地化解锁方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表