
TensorFlow Models 中的 Pix2Seq 目标检测语言建模框架序列词表、数据流水线与训练实战【免费下载链接】modelsModels and examples built with TensorFlow项目地址: https://gitcode.com/GitHub_Trending/mode/models本文基于仓库中的 Pix2Seq 项目文档 展开讲解 Pix2Seq“把目标检测建模为自回归语言建模”的 TensorFlow 2 实现对象如何被量化成离散 token、训练/评估命令如何运行以及 Pix2Seq 模型、任务定义 与 实验配置 的源码级细节。读完本文你可以复现 MS-COCO 上的 Pix2Seq R50 训练与评估流程并理解 token 序列化、噪声框增强与 top-p 自回归推理的实现原理。1. Pix2Seq把检测框当作“词”来生成Pix2Seq论文名A Language Modeling Framework for Object Detection作者 Ting Chen 等2021将目标检测重新表述为一个语言模型问题图像编码器提取视觉特征Transformer 解码器像生成自然语言句子一样逐 token 自回归地“说出”图像中每个物体的坐标与类别。项目文档 README.md 明确说明本目录是论文的 TensorFlow 2 实现官方参考实现由 google-research/pix2seq 提供文档中以外链形式给出此处不再重复。在本仓库TensorFlow Models / Model Garden中Pix2Seq 作为official/projects下的一个标准 project 组织目录结构如下路径职责train.py训练/评估驱动入口解析全局 flags 并调用train_lib.run_experimentconfigs/pix2seq.py词表常量、Pix2Seq/Pix2SeqTask配置 dataclass、pix2seq_r50_coco实验注册dataloaders/pix2seq_input.pyCOCO 数据解析器增强、框量化、序列化、噪声框注入modeling/pix2seq_model.pyPix2Seq与Pix2SeqTransformer主干实现含自回归采样推理modeling/transformer.py专用 Transformer encoder/decoderpositional embedding 加在 query 与 key 上tasks/pix2seq_task.pyPix2SeqTask建图、checkpoint 初始化、loss、评估步与 COCO 指标utils.py序列↔框的编解码、坐标量化/反量化、噪声框工具函数文档同时保留了数据集免责声明页面链接的第三方数据集如 MS-COCO不归 Google 所有或分发使用数据前需自行遵守第三方的许可条款——这也是使用任何 COCO 相关实验的前提。2. 训练与评估命令继承自项目文档2.1 在 MS-COCO 上训练项目文档给出的训练命令为在official/projects/pix2seq目录下执行python3 train.py \ --modetrain \ --experimentpix2seq_r50_coco \ --model_dir$MODEL_DIR \ --config_file./configs/experiments/coco_pix2seq_r50_gpu.yaml2.2 在 MS-COCO 上评估python3 train.py \ --modeeval \ --experimentpix2seq_r50_coco \ --model_dir$MODEL_DIR \ --config_file./configs/experiments/coco_pix2seq_r50_gpu.yaml2.3 命令参数与源码对应关系train.py的 main 函数 的调用链是gin.parse_config_files_and_bindings(FLAGS.gin_file, FLAGS.gin_params)解析 gin 绑定可选train_utils.parse_configuration(FLAGS)把命令行参数与注册实验合并成ExperimentConfig若params.runtime.mixed_precision_dtype非空则调用performance.set_mixed_precision_policy设置mixed_float16/mixed_bfloat16混合精度distribute_utils.get_distribution_strategy(...)依据distribution_strategy/num_gpus/tpu建立分布式策略GPU 多卡或 TPU 均适用task_factory.get_task(params.task)通过注册机制实例化Pix2SeqTask最终交给train_lib.run_experiment执行。文件末尾 L70-L73 将experiment、mode、model_dir标记为必填参数。这些全局 flag 统一在 official/common/flags.py 中定义关键项包括--experiment已注册的实验名指定一个ExperimentConfig工厂--mode枚举值train/eval/train_and_eval/continuous_eval/continuous_train_and_eval等--model_dircheckpoint 与 summary 的输出目录--config_fileYAML/JSON 覆盖文件可传多个覆盖顺序按命令行先后--params_override额外的参数覆盖优先级高于config_file。完整优先级为默认配置 →config_file→params_override--tpu可选 Cloud TPU 地址或grpc://URL。需要说明的一个细节文档命令中引用的./configs/experiments/coco_pix2seq_r50_gpu.yaml并未包含在当前仓库中pix2seq 的 configs 目录 仅有pix2seq.py与其测试。--config_file是可选的覆盖机制而pix2seq_r50_coco实验本身已由 configs/pix2seq.py 中的exp_factory.register_config_factory(pix2seq_r50_coco)完整注册因此去掉--config_file也可用默认注册配置直接运行如需调整批量大小等超参可按上表优先级另行准备 YAML 覆盖文件。3. 实验配置 pix2seq_r50_coco逐参数解读configs/pix2seq.py 中的pix2seq_r50_coco()工厂函数L191-L279注释写明其目标是“复现论文结果”核心数值如下参数取值说明训练/评估 batch size128 / 16train_batch_size/eval_batch_size数据规模118287train/ 5000val常量COCO_TRAIN_EXAMPLES/COCO_VAL_EXAMPLESsteps/epoch118287 // 128 924由COCO_TRAIN_EXAMPLES // train_batch_size推出总训练步数80 × 924 73920train_steps 80 * steps_per_epoch80 epoch验证间隔5 × 924 4620 步validation_interval5 * steps_per_epoch检查点每 epoch 保存一次最多保留 10 个checkpoint_interval/max_to_keep优化器AdamW实验变体epsilon1e-8weight_decay0.05beta_10.9beta_20.95global_clipnorm-1.0不裁剪学习率多项式衰减从1e-4衰减到1e-6power1.0decay_steps80*steps_per_epoch预热线性 warmup2 × 924 1848 步从 0 线性升到初始学习率模型侧配置Pix2Seq dataclassinput_size[640, 640, 3]、hidden_size256、num_heads8、num_encoder_layers6、num_decoder_layers6、vocab_size3000、max_num_instances100以及temperature1.0、top_k0不启用、top_p0.4nucleus 采样阈值。默认 backbone 为 ResNet-50model_id50该实验显式使用backbones.ResNet(model_id50)特征取endpoint_name5即残差主干第 5 阶段输出并启用use_sync_bnTruenorm_momentum0.9, norm_epsilon1e-5以适配多副本同步 BN。数据侧开启随机缩放增强aug_scale_min0.3、aug_scale_max2.0shuffle_buffer_size 10 * train_batch_size。评估标注文件为coco/instances_val2017.json。4. 词表设计与对象序列化检测变语言的关键4.1 共享词表布局configs/pix2seq.py 定义了一个跨任务共享的词表分段结构这是理解整个流水线的起点# Special tokens: [0, 99). # Class tokens: [100, coord_vocab_shift). # Coordinate tokens: [coord_vocab_shift, text_vocab_shift). PADDING_TOKEN 0 FAKE_CLASS_TOKEN 30 # 与 FAKE_TEXT_TOKEN 共用 SEPARATOR_TOKEN 40 INVISIBLE_TOKEN 41 BASE_VOCAB_SHIFT 100 OD_ID 10 # 目标检测任务的任务 IDprompt即[0, 100)为特殊 token其中 10–29 预留给任务 IDOD_ID10表示检测任务[100, coord_vocab_shift)为类别 token[coord_vocab_shift, ...)为坐标 token。默认coord_vocab_shift1000、quantization_bins1000Pix2SeqTask 定义与vocab_size3000的默认词表配套。4.2 yxyxc 序列化与坐标量化dataloaders/pix2seq_input.py 的build_response_seq_from_bbox把每个物体序列化为 5 个 tokeny、x、y、x 四个坐标 token 1 个类别 tokenyxyxc 格式归一化坐标经 utils.quantize 量化round(coord * (bins - 1))并裁剪到[0, bins-1]再整体加上coord_vocab_shift偏移到坐标词表区段类别 token 加BASE_VOCAB_SHIFT100padding 位置label0全部置 0。序列两端各拼接一段 promptbuild_prompt_seq_from_task_id(OD_ID, ...)utils.py生成仅含任务 ID 10 的 1-token 提示。最终input_seq [prompt, 类别被“损坏”的坐标类别序列]教师强制输入类别位置被打扰target_seq [prompt, 真实序列]标签两者都裁剪/补零到max_num_boxes * 5 1长度再错一位input_seq[..., :-1]对target_seq[..., 1:]形成标准的 next-token 监督。4.3 类别损坏class corruption与 token 权重build_response_seq_from_bbox的class_label_corruption参数默认rand_n_fake_cls提供 5 种输入侧类别扰动策略none、rand_cls、real_n_fake_cls、rand_n_fake_cls、real_n_rand_n_fake_cls通过随机在“真实类 / 随机假类 /FAKE_CLASS_TOKEN30”之间选择降低模型对输入类别 token 的过拟合。token 权重则区分三类信号真实框的 4 个坐标权重为 1噪声框的坐标权重为 0不参与监督类别 token 权重为is_real (1-is_real) * noise_bbox_weight函数默认noise_bbox_weight1.0与 Losses 配置 同名字段一致另外在 _parse_train_data 中所有PADDING_TOKEN位置的权重被统一压低到eos_token_weight默认 0.1抑制 padding 对梯度的贡献。4.4 噪声框注入让模型学会“忽略”max_num_instances100意味着每张图最多 100 个对象槽位。当真实框不足 100 个时utils.inject_noise_bbox 调用augment_bbox补齐噪声框噪声分两类Bad bbox由真实框平移shift_bbox或纯随机random_bbox生成类别标为FAKE_CLASS_TOKENDuplicated bbox对真实框做小幅抖动jitter_bboxmax_range0.1的近似重复框。噪声框的标签统一指向假类 token配合 4.3 的权重设计模型在训练中显式学习了“对无对应物体的坐标预测输出低置信度”。5. 数据流水线从 COCO TFRecord 到 token 序列Pix2SeqTask.build_inputstasks/pix2seq_task.py支持两种输入源tfds_name非空时走 TFDetection 数据集工厂否则按file_type默认tfrecord通过input_reader_factory读取decoder 可选simple_decoderTfExampleDecoder或label_map_decoder带 label map解析函数即上文的pix2seq_input.Parser.parse_fn。训练分支_parse_train_dataL61-L160的处理顺序为训练时跳过is_crowdTrue的标注skip_crowd_during_training图像转 float32random_color_jitter强度由aug_color_jitter_strength控制COCO 实验中为 0.0随机水平翻转resize_and_crop_image随机缩放裁剪到output_size由model.input_size[:2]即 640×640 决定框同步变换后重新归一化过滤空框实例重排reorder_object_instances(..., random)随机打乱顺序支持none/area/dist2ori等策略→ 噪声框注入 → 补零到max_num_boxes构建targets/weights/inputs三个张量返回图像用 0.3 灰度背景填充到固定尺寸与_generate_image_mask中0.3背景的判据一致。评估分支_parse_eval_dataL242-L297不做随机增强仅resize_image到输出尺寸保留gt_boxes、is_crowd、image_info等原始信息供 COCO 评测器与坐标回缩使用。6. 模型架构backbone 视觉编码器 自回归解码器6.1 前向流程Pix2Seq.callPix2Seq 模型 由三部分构成backbone 列表、stem 投影/层归一化列表、Pix2SeqTransformer。call中L358-L411对每个图像模态RGB 恒为第一个取backbone(inputs_i)[endpoint_name]特征use_input_as_backbone_featuresTrue时可直接以特征为输入先 dropout再经独立的stem_projectionDense 到hidden_size与stem_lnLayerNorm, eps1e-6拼接 position_embedding_sine对 2D 特征图做行/列累积位置编码sin/costemperature10000提供空间先验训练态与教师强制评估态直接走self._transformer(transformer_inputs, training...)得到整条序列 logits自由推理态则调用transformer.infer(...)传入temperature/top_k/top_p/early_stopping_token做自回归采样。Pix2SeqTransformerL442-L759要点序列位置编码为可学习参数seq_pos_emb长度max_seq_len1max_seq_len max_num_instances * 5 500见 build_model 中max_seq_lenconfig.max_num_instances * 5源码注释亦说明推理时为 prompt 额外 1每个视觉源各有独立的TransformerEncodermlp_ratio4 输出 LayerNorm 投影Dense/LN/单层 MLP最后tf.concat成[B, N*H*W, hidden_size]供解码器交叉注意力解码器TransformerDecoder使用共享的token_embedding作为输入与输出投影矩阵权重绑定outp_embedding inp_embedding配合可选outp_biaslogits 由矩阵乘法直接得到文件头注释声明该模型不支持 Keras 序列化应使用tf.train.Checkpoint通过checkpoint_items属性第一个 backbone 固定命名为backbone以兼容旧 checkpoint与tf.saved_model.save。6.2 自回归推理KV 缓存、top-p 采样与早停Pix2SeqTransformer.inferL609-L759用tf.while_loop实现逐 token 解码首步以完整 prompt任务 ID 10前向填充 KV 缓存之后每步只前向 1 个新 tokenself_attention_mask退化为全 1缓存经tf.tensor_scatter_nd_update增量更新采样前对 logits 做logits / temperature缩放再经 top_logits 做 top-k 截断k0时与 nucleus 截断p1.0时保留累计概率不超过 p 的最小 token 集合不满足者置为-1e10最后tf.random.categorical采样COCO 实验默认top_p0.4、top_k0、temperature1.0early_stopping_token非空时_create_cond_fn 生成停止条件一旦所有序列均已生成该 token 即结束循环并将剩余位置填为该 token源码注释坦承该实现未做 key/value 的进一步优化可缓存变换后的 K/V以牺牲一点推理速度换取可读性。6.3 专用 Transformer 层modeling/transformer.py 的模块 docstring 点明设计差异“the position embeddings are added to the query and key for every self- and cross-attention layer”即位置编码同时作用于 query 与 key与原始 Transformer 只加在输入上的做法不同TransformerEncoder/TransformerDecoder均支持drop_pathstochastic depth、drop_units、drop_att三种正则COCO 实验取 0.1/0.1/0.0。7. 损失函数与 COCO 评估闭环7.1 加权交叉熵build_losses 把labels[targets]one-hot 化维度vocab_size3000对 logitsfrom_logitsTrue计算逐位置 CategoricalCrossentropy再按labels[weights]做加权平均sum(loss * w) / sum(w)最后加上model.losses中的辅助损失如 stem/encoder 的 dropout 类正则若存在。train_step中还会处理混合精度的 loss scaling并按副本数缩放 loss。7.2 从采样 token 回到检测框评估步validation_step以labels[prompt]任务 ID 10为提示、trainingFalse触发自由采样然后utils.decode_object_seq_to_bbox 按 5-token 步长切分每组的第 5 个位置logits[:, 4::5]取类别 logits用掩码把取值限制在类词表区段[BASE_VOCAB_SHIFT, coord_vocab_shift)内做 argmax得到类别与物体得分该位置 softmax 后在预测类上的概率坐标 token 减去coord_vocab_shift后经seq_to_bbox→dequantizebins-1归一还原为[0,1]归一化 yxyx 框再按image_info把框缩放回原图尺寸组装detection_boxes/scores/classes/num_detections/source_id预测字典build_metrics在评估模式构造 COCOEvaluatorannotation_filecoco/instances_val2017.jsoninclude_maskFalseaggregate_logs持续喂入预测与真值reduce_aggregated_logs返回最终 COCO 指标。8. 检查点初始化与多 backbone 扩展Pix2SeqTask.initializeL97-L154提供两级预训练加载并有明确约束全局init_checkpointinit_checkpoint_modulesall/partial/partial模式只要求非平凡匹配否则要求所有对象匹配逐 backbone 的BackboneConfig.init_checkpoint普通 backbone 用tf.train.Checkpoint(backbone...)做弱断言恢复uvit类型则调用其专有的load_checkpoint接口两者不可同时指定且init_checkpoint_modulesbackbone这一旧写法已不再支持直接抛ValueError。从源码结构看Backbone配置同时保留了resnet与uvitVision Transformer两种字段backbones是列表、RGB 恒为第一个encoded_feature_dropout_rates的长度必须与 backbone 数一致——这为多模态RGB 深度等输入预留了扩展点但当前 COCO 实验只使用单一 ResNet-50。9. 引用项目文档给出的论文引用信息article{chen2021pix2seq, title{Pix2seq: A language modeling framework for object detection}, author{Chen, Ting and Saxena, Saurabh and Li, Lala and Fleet, David J and Hinton, Geoffrey}, journal{arXiv preprint arXiv:2109.10852}, year{2021} }10. 小结与实操要点复现路径准备 COCO TFRecordcoco/train*、coco/val*与instances_val2017.json后按第 2 节命令以--experimentpix2seq_r50_coco训练默认配置即 80 epoch、AdamW 多项式学习率 1848 步线性 warmup每 epoch 存一次检查点理解模型的关键在于词表三段式布局特殊/类别/坐标、yxyxc 五元组序列化、输入侧类别损坏 噪声框注入的“鲁棒化”设计以及输出侧按词表区段掩码 argmax 的反解逻辑推理细节top_p0.4的 nucleus 采样是默认设定若需要确定性输出或早停可分别关闭采样或配置early_stopping_token扩展方向多 backbone 列表、uvit 加载路径与use_input_as_backbone_features参数表明该实现面向多模态条件输入做了结构化预留但当前仓库仅验证了 RGB ResNet-50 的检测场景。贡献者名单见 README.md 末尾单元测试可参考 pix2seq_model_test.py、pix2seq_input_test.py 与 pix2seq_test.py。【免费下载链接】modelsModels and examples built with TensorFlow项目地址: https://gitcode.com/GitHub_Trending/mode/models创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考