首页
/ 从 release_notes 看懂 TensorFlow Object Detection API 演进史:TF2 支持、端侧模型与工具链全景

从 release_notes 看懂 TensorFlow Object Detection API 演进史:TF2 支持、端侧模型与工具链全景

2026-09-06 18:56:32作者:郜逊炳

TensorFlow Object Detection API(下称 OD API)是 tensorflow/models 仓库 research/object_detection 目录下最庞大、影响力最广的检测框架之一。release_notes.md 以时间线的形式记录了它在 2017 年 6 月至 2020 年 9 月间每一次重要版本节点:从 TF2 官方支持、CenterNet / EfficientDet 新架构发布,到 SSDLite + 移动端骨干网络的持续更迭,再到 Context R-CNN 与 Open Images 评测生态的落地。本文以该发布记录为主线,结合仓库中的源码、配置与文档,帮助读者快速建立对 OD API 能力边界、文件组织与演进脉络的整体认知,并在面对 TF1/TF2 不同时代代码时准确找到对应的入口与用法。

这份 release_notes 记录了什么

OD API 的发布记录不是简单的版本号罗列,而是一份"里程碑式的项目编年史"。它覆盖了 API 从最初面向研究的检测模型训练工具,逐步演化为横跨云端(GPU/TPU)、桌面与移动嵌入式设备(CPU/DSP/EdgeTPU)的统一生态的完整过程。其核心价值在于两点:

  1. 能力时间轴:明确标记了每一项新能力"何时可用",例如 instance segmentation 支持于 2018 年 2 月加入、TF2 官方支持于 2020 年 7 月正式落地,读者据此可以判断代码库中某类模型 / 脚本的成熟度与适用时代。
  2. 功能索引:几乎每条发布都附带了配套文档、配置示例或 Colab 的链接,是查找"某项功能怎么用"的最佳导航图。

仓库当前的结构也验证了这些发布并非空谈:例如 model_main_tf2.pyexporter_main_v2.py 等 TF2 入口脚本确实存在于 research/object_detection 根目录,而 samples/configs/configs/tf2/ 下的成百份 pipeline 配置则对应着各次发布提到的模型定义。下面按主题重新组织这份发布历史。

TF2 时代:eager 模式训练、新架构与分布式训练

发布记录中最重要的分水岭是 2020 年 7 月 10 日:OD API 官方宣布正式支持 TensorFlow 2。回顾当时的发布清单,可以发现它奠定了今天 TF2 工作流的全部基础设施。

面向 eager 模式的全新二进制

TF1 时代以 slim 训练管线与 frozen graph 导出为主,TF2 版本则围绕 Keras 子类化模型和 eager 执行重新设计了入口:

  • 训练 / 评估model_main_tf2.py 与基于它的分发封装,配套的本地/云端运行说明见 tf2_training_and_evaluation.md
  • 模型导出exporter_main_v2.py 负责导出 SavedModel 供推理或 Serving 使用;
  • 端侧导出export_tflite_graph_tf2.py 专门导出可被 TFLite Converter 消费的中间图(详见下文移动端章节)。

这些脚本与 TF1 的 train.py / export_inference_graph.py 并存,分别由 tf2.mdtf1.md 等文档指引。发布记录中也明确安抚了存量用户:"如果你是正在使用 TF 1.x 的 OD API 老用户,不用担心,我们同样覆盖到了。"

TF2 兼容模型与"仅维护 TF2 版本"的新架构

发布记录指出:TF2 版本提供了一套基于 Keras 的兼容模型,其中既包括对最流行 TF1.x 模型的迁移——SSD with MobileNet、RetinaNet、Faster R-CNN、Mask R-CNN,也包括两个官方只维护 TF2 实现的新架构:

  1. CenterNet:一种简洁高效的 anchor-free 架构,源于 Zhou 等人的 "Objects as Points" 工作。在仓库中,其实现位于 center_net_meta_arch.py,并在 configs/tf2 目录下提供 centernet_resnet50_v1_fpn_*centernet_hourglass104_* 等完整训练配置。
  2. EfficientDet:通过神经架构搜索发现的 SOTA 模型家族。从源码结构看,其核心组件被拆分为独立模块以支撑 BiFPN 结构——如 ssd_efficientnet_bifpn_feature_extractor.pybidirectional_feature_pyramid_generators.pybifpn_utils.py;配置侧则提供了 ssd_efficientdet_d0d7 共 8 档由小到大的输入分辨率(512x512 至 1536x1536)与 TPU 核数(tpu-8 至 tpu-32)组合,见 configs/tf2

与 TF2 一起落地的配套能力

  • COCO 预训练权重:全部模型以 TF2 风格"基于对象的 checkpoint"(object-based checkpoints,即按 Python 对象/变量名组织而非 graph 节点名)提供,可直接加载到 Keras 模型上做微调,模型清单在 tf2_detection_zoo.md
  • Distribution Strategies:模型被设计为可使用同步多 GPU 与 TPU 平台训练,通过 TensorFlow 的 Distribution Strategies 机制实现分布式训练,因此配置文件名中常见 tpu-8 / tpu-32 / gpu-8 之类的后缀。
  • Colab 演示:发布同时提供了演示 eager 训练与推理的 Colab,包括微调入门 eager_few_shot_od_training_tf2_colab.ipynb 与模型库推理 inference_tf2_colab.ipynb

TF2 检测模型走向端侧:TensorFlow Lite 转换链路

2020 年 9 月 3 日的发布为 TF2 OD API 打通了最后一块移动端拼图:TF2 检测模型可转换为 TensorFlow Lite(当时仅支持 SSD 架构)。配套文档 running_on_mobile_tf2.md 完整记录了整条转换链路:

模型输入 / 输出契约

转换后的 TFLite 模型遵循统一接口:1 个 float32 输入张量 image(形状 [1, height, width, 3],需为归一化图像),以及 4 个输出——detection_boxes[1, num_boxes, 4])、detection_classes[1, num_boxes])、detection_scores[1, num_boxes])与 num_boxes。归一化预处理逻辑定义在各 feature extractor 类的 preprocess 方法中(见 models 目录)。

三步转换流程

第一步:导出 TFLite 推理图。在仓库 research/ 目录下执行:

python object_detection/export_tflite_graph_tf2.py \
    --pipeline_config_path path/to/ssd_model/pipeline.config \
    --trained_checkpoint_dir path/to/ssd_model/checkpoint \
    --output_directory path/to/exported_model_directory

该脚本(export_tflite_graph_tf2.py)产出一个中间 SavedModel,供 TFLite Converter 使用,可通过 --help 查看全部可调参数。

第二步:转换为 TFLite。使用 TFLite Converter,注意须走 Python API 的 from_saved_model 路径。若要做后训练量化以获得更小体积与更快定点运算,需要设置如下选项并配合代表性数据集(representative dataset):

converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8,
                                       tf.lite.OpsSet.TFLITE_BUILTINS]
converter.representative_dataset = <...>

第三步:为模型附加 Metadata 并把标签文件打包进模型,方便移动端直接通过 Task Library 消费。

文档还给出了 Android 侧的集成方式:先复制 detect.tflite 到 app 的 assets 目录,再注释掉 gradle 中自动下载模型的脚本避免覆盖,最后按模型类型设置 DetectorActivity.javaTF_OD_API_IS_QUANTIZED 与模型文件名等常量即可。

需要强调的是,TFLite 端侧推理仅支持 SSD 类架构(EfficientDet 除外);CenterNet 属实验性支持,其端侧走法记录在 centernet_on_device.ipynb;面向少量样本微调 + 移动端导出的完整工作流则见 eager_few_shot_od_training_tflite.ipynb

移动端检测模型的骨干网络竞赛(2018—2020)

release_notes 中有一条清晰的连续主线:SSD + SSDLite 与不断进化的移动端骨干网络组合,几乎每轮发布都在相同/相近延迟约束下刷新精度。仓库 samples/configs 中成对存在的配置文件即为这些组合的直接证据:

  • 2018-04-02,MobileNet V2 + SSDLite:据发布记录,比 MobileNet V1 SSD 在 Google Pixel 手机 CPU 上同精度下快约 35%。对应 ssdlite_mobilenet_v2_coco.config
  • 2019-10-15,MobileNet V3 SSDLite:发布 large 与 small 两档——V3-Large 同 mAP 下比 V2 SSDLite 快约 27%,V3-Small 同 mAP 下比 depth-multiplier 缩减的 MnasNet SSDLite 快约 37%。对应 ssdlite_mobilenet_v3_large_320x320_coco.configssdlite_mobilenet_v3_small_320x320_coco.config
  • 2019-11-13,MobileNetEdgeTPU SSDLite:面向 EdgeTPU 的骨干,据记录在 Google Pixel 4 上同延迟下比 MobileNetV2 SSDLite 高约 10% mAP。对应 ssdlite_mobilenet_edgetpu_320x320_coco.config 及其量化版。
  • 2020-05-07,MnasFPN head:将神经架构搜索得到的特征金字塔 head 用于移动检测,对应 ssd_mobilenet_v2_mnasfpn_shared_box_predictor_320x320_coco_sync.config
  • 2020-05-19,MobileDets:面向手机 CPU、DSP 与 EdgeTPU 三平台的高性能模型家族,据发布记录在 EdgeTPU 与 DSP 上相对 MnasFPN 最高可提速约 2 倍;三个平台均发布了模型定义、COCO14 预训练 checkpoint 与 fp32/uint8 两种精度的 TFLite 模型。
  • 2020-06-26,MobileDet GPU 骨干 + SSDLite:面向边缘 GPU(如 NVIDIA Jetson Xavier),据记录在相近延迟下比 MobileNetV2 SSDLite 高约 17% mAP。仓库中可见 CPU/DSP/EdgeTPU/GPU 四平台配置:ssdlite_mobiledet_gpu_320x320_coco_sync_4x4.config 等。

这些记录揭示了一个方法论:在移动端,评测的重心往往不是单点最高精度,而是"在可比延迟下的 mAP 增益",这也是配置文件(如输入分辨率 320x320、depth-multiplier 等)共同约束的产物。若需更早的移动端基线,可回溯 ssdlite_mobilenet_v1_coco.config

Context R-CNN:用未标注时序上下文提升检测精度

2020 年 6 月 17 日的发布引入了极具特色的 Context R-CNN:它通过 attention 机制把"上下文图像"(例如静态相机在时间上邻近帧的画面)的特征整合进检测过程,从而提升精度——关键前提是这些上下文图像无需标注

发布记录给出了在野生动物监测数据集 Snapshot Serengeti 上的实证:结合长达一个月的图像上下文后,Context R-CNN 比单帧基线高出 17.9% mAP,比基于 3D 卷积的 S3D 基线高出 11.2% mAP;并且它能利用某台新部署相机未标注帧的时序上下文来提升该相机的检测表现,增强模型的泛化能力。

配套文档 context_rcnn.md 详述了完整数据管线,可分为四步(均基于 Apache Beam,可本地运行也可上 Dataflow 集群):

  1. 从图像集 + COCO-CameraTraps 风格 JSON 生成 TFRecord——关键是为每张图记录 location ID 与拍摄时间,以界定"上下文组";
  2. 对仅有图像级标签的数据,用预训练检测模型(如 MegaDetector)生成弱监督边界框,与图像级类别标签匹配;
  3. 用预训练模型为每张图像抽取并保存上下文特征(导出时需附加 detection_features 输出并在配置中开启 output_final_box_features: true);
  4. 将每个上下文组的特征聚合为上下文记忆库(memory bank),默认产出数据效率更高的 TfSequenceExample(上下文特征每组只存一份而非每图一份),随后需在 train/test input reader 中把 input_type 设为 TF_SEQUENCE_EXAMPLE

训练侧的核心差异在于模型配置中新增 context_config,例如:

context_config {
      max_num_context_features: 2000
      context_feature_length: 2057
    }

仓库提供了完整样例配置 context_rcnn_resnet101_snapshot_serengeti_sync.config 与测试用配置 context_rcnn_camera_trap.config;实现侧由 context_rcnn_meta_arch.pycontext_rcnn_lib.py 支撑,分 TF1/TF2 两个版本(*_tf1_test.py / *_tf2_test.py 各自独立)。因模型同时接收图像与上下文特征,导出时需用 --use_side_inputs 显式声明 side inputs 的形状、名称与类型(例如 --side_input_shapes 1,2000,2057/1 --side_input_names context_features,valid_context_size --side_input_types float,int)。交互式上手可直接运行 Colab 教程 context_rcnn_tutorial.ipynb

Open Images 生态:评测协议、数据工具与专用模型

另一条贯穿发布历史的主线是 Open Images 数据集生态。从 2017 年 11 月(Open Images V3)起,OD API 陆续沉淀了一套评测与数据工具:

架构能力与模型库的持续扩充(2017—2019)

更早期的发布记录则勾勒了 OD API 的功能版图是如何逐步补全的:

  • 2017-06-15,首批可训练检测模型:SSD with MobileNet / Inception V2、R-FCN with ResNet 101、Faster R-CNN with ResNet 101 / Inception ResNet v2,并附 COCO 预训练权重与开箱即用推理 Colab object_detection_tutorial.ipynb。这些仍是今天 samples/configs 中的经典组合(如 faster_rcnn_resnet101_coco.config)。
  • 2017-08-11,Android 端侧运行:Android Detect demo 支持加载 OD API 训练的模型,默认使用 COCO 上训练的 frozen SSD + MobileNet。
  • 2017-10-31 与 2017-11-06,模型库扩充与提速:Faster R-CNN + NASNet-A 特征提取在 COCO test-dev 上达到 43.1% mAP(对应 faster_rcnn_nas_coco.config);模型库重发布提速版本,并新增 COCO 上的 Inception V2 / ResNet-50 Faster R-CNN 与 KITTI 上的 ResNet-101 Faster R-CNN(faster_rcnn_resnet101_kitti.config)。
  • 2018-02-09,实例分割支持:加入 Mask R-CNN 风格的一系列模型,在边界框之外预测掩膜,配置与运行方法见 instance_segmentation.md
  • 2018-04-30,多标签动作检测:发布在 AVA v2.1 上训练的 Faster R-CNN + ResNet-101,将动作分类损失改为逐类 Sigmoid 以处理多标签框(对应 faster_rcnn_resnet101_ava_v2.1.config)。
  • 2018-07-13,一次大规模功能更新:训练从 slim 转向 Estimator 架构;支持 RetinaNet 及其 MobileNet 适配;提出基于 SSD 的新型结构 Pooling Pyramid Network(PPN,配置见 ssd_mobilenet_v1_ppn_shared_box_predictor_300x300_coco14_sync.config);发布多个 TPU 兼容模型(pipeline 配置中有 TPU 兼容注释);支持量化训练(如 ssd_mobilenet_v1_quantized_300x300_coco14_sync.config)。
  • 2018-09-17,大规模类别检测:发布在 iNaturalist 物种检测数据上训练的 Faster R-CNN(ResNet-50/101),据记录在 2854 类上达到约 55% / 58% 的 mean AP@.5。

TF1 时代的模型库汇总于 tf1_detection_zoo.md,训练与评估指南见 tf1_training_and_evaluation.md

如何把这份发布历史变成你的路线图

读完这份 release_notes,建议读者以三条"时间线"对照当前仓库定位自己的需求:

  1. 新项目选型:若面向云端高精度,优先选择 TF2 时代的 CenterNet / EfficientDet / Faster R-CNN 家族,配置在 configs/tf2;若面向移动端,则沿着 SSDLite 骨干谱系(V1 → V2 → V3 → EdgeTPU → MnasFPN → MobileDets → MobileDet GPU)选择与目标硬件(CPU/DSP/EdgeTPU/GPU)匹配的 samples/configs 配置。
  2. 存量代码维护:根据代码使用的训练/导出入口判断其所处时代——出现 model_main_tf2.pyexporter_main_v2.py 即 TF2 链路,出现 slim 训练脚本或 export_inference_graph.py 则属 TF1 链路(但 Context R-CNN 数据生成等工具至今仍复用 export_inference_graph.py,详见 context_rcnn.md)。
  3. 特殊场景:静态相机 / 野生动物监测场景参考 Context R-CNN;Open Images 数据与评测任务则直接沿用 evaluation_protocols.mdchallenge_evaluation.md 提供的协议与工具。

值得提醒的是,release_notes 中各条精度 / 加速比数据均为对应发布时点的官方声明,其评测条件(硬件型号、输入分辨率、batch 等)不尽相同,在横向比较时需回到各模型 zoo 文档与实际配置文件核对细节。把这份发布历史当作"索引",再沿索引进入具体文档与源码,是理解这个庞大代码库最高效的路径。

登录后查看全文
热门项目推荐
相关项目推荐