CircularNet 云推理流水线实战:用 run_images.sh 与 Triton 客户端从 GCS 图片批量推理到 BigQuery 分析

发布时间:2026/9/7 1:19:51
CircularNet 云推理流水线实战:用 run_images.sh 与 Triton 客户端从 GCS 图片批量推理到 BigQuery 分析 CircularNet 云推理流水线实战用 run_images.sh 与 Triton 客户端从 GCS 图片批量推理到 BigQuery 分析【免费下载链接】modelsModels and examples built with TensorFlow项目地址: https://gitcode.com/GitHub_Trending/mode/models本文基于 TensorFlow models 仓库中waste_identification_ml项目CircularNet用于传送带上可回收物识别的实例分割模型的客户端部署文档详解如何以客户端角色调用 Triton 推理服务器对 GCS 存储桶中的图片批量运行推理流水线包括run_images.sh中每个关键参数的作用、screen会话的运行方式以及流水线在源码层面从图片下载、模型推理、目标跟踪到 BigQuery 入库的完整调用链。读完本文你可以独立完成推理客户端的参数配置与启动并准确定位结果图片与 BigQuery 分析表的产出位置。前置条件与整体流程客户端文档start-client.md的前提是Triton 推理服务器已经按照 start-server.md 启动完成。服务器侧由 triton_inference_server.sh 自动完成清理旧的model_repository目录、从 GCS 下载并解压 CircularNet 分割模型包、确保安装了screen然后在一个名为server的 screen 会话中以 Docker 容器方式启动 Tritonnvcr.io/nvidia/tritonserver:25.05-py3镜像并映射 8000/8001/8002 三个端口。服务器会在后台持续运行模型加载成功后状态显示为READY。客户端侧的完整数据流为从 GCS 输入桶下载图片到本地gsutil -m cp -r逐帧调用本地 Triton 服务默认localhost:8000执行检测与实例分割推理在结果图上叠加边界框、掩膜和类别标签后保存基于帧间目标跟踪object tracking统计每个物体在多个画面中出现的次数将跟踪结果写入 BigQuery 表并把标注后的图片上传到 GCS 输出桶流水线结束后自动关机见下文“自动关机”说明。整个客户端逻辑位于 client 目录 中核心文件包括 run_images.sh参数入口、inference_pipeline.py流水线主程序、triton_server_inference.pyTriton HTTP 客户端、big_query_ops.pyBigQuery 管理和 utils.py目录、日志与可视化等工具函数。依赖安装可参考同目录下的 requirements.sh 与requirements.txt。进入客户端目录并编辑 run_images.sh在 VM 实例的 SSH-in-browser 窗口或边缘设备的终端中进入waste_identification_ml项目的client目录cd models/official/projects/waste_identification_ml/Deploy/detr_cloud_deployment/client/该路径以仓库根目录models为起点在仓库内对应 official/projects/waste_identification_ml/Deploy/detr_cloud_deployment/client/。推理流水线用一个脚本来设置推理、后处理和后续数据分析的各项参数。用 Vim 打开它vim run_images.shVim 会显示全部流水线参数。脚本内建了每个参数的说明但最少必须修改以下四项--input_directorypath-to-input-bucket # This should be the path to the input bucket you created containing your # images, e.g. gs://bucket/input-images--output_directorypath-to-output-bucket # Like input, this should be the gcs bucket path to where you want the images # with predictions to write to.--project_idproject-id # The ID of your Google Cloud project housing your gcs bucket, for example, # my-gcp-project.--bq_table_idbigquery-table-id The ID that you want to use for your BigQuery table storing inference results, e.g circularnet_table. If the table already exists BigQuery within your project, the pipeline will either overwrite or append results, depending on how you set the overwrite parameter 保存并退出 Vim按Esc键输入:wq再按Enter。注意创建 GCS 输入/输出存储桶并向其中添加图片的方法参见仓库内的 prediction-pipeline-in-cloud.md 中“Create the Cloud Storage input and output buckets”一节。参数全解脚本示例值与源码对应关系仓库中 run_images.sh 的实际内容是脚本头部先打印每个参数的文档说明然后激活名为myenv的 Python 虚拟环境若$VIRTUAL_ENV为空则报错退出最后调用inference_pipeline.py。当前脚本携带的示例参数为python inference_pipeline.py \ --input_directorygs://recykal/TestData/SmallTestData \ --output_directorygs://recykal/TestData/SmallTestData \ --model_namecn_segmentation_trt_model \ --threshold0.50 \ --search_range_x150 \ --search_range_y20 \ --memory3 \ --project_idwaste-identification-ml-330916 \ --bq_dataset_idcircularnet_dataset \ --bq_table_idtest_table1 \ --overwriteTrue这些参数在 inference_pipeline.py#L46-L82 中通过absl.flags逐一声明含义如下参数文档要求脚本示例值 / 标志默认值作用结合源码--input_directory必须修改gs://输入桶路径存放待推理图片的 GCS 目录主程序会校验其必须以gs://开头否则抛出ValueErrorinference_pipeline.py#L93-L101--output_directory必须修改gs://输出桶路径带预测标注的图片将上传到该 GCS 桶同样要求以gs://开头--model_name按需cn_segmentation_trt_model传给TritonObjectDetector作为向 Triton 服务发起推理请求时的模型名--threshold按需0.50检测置信度阈值predict(confidence_threshold...)中低于该值的框会被过滤--search_range_x/--search_range_y按需150/20对象跟踪中物体在两帧间允许沿 X/Y 方向移动的最大像素数--memory按需3对象丢失多少帧后仍保持被跟踪帧数--project_id必须修改你的 GCP 项目 IDBigQuery 操作使用的项目 ID--bq_dataset_id按需circularnet_dataset标志默认值为Circularnet_dataset存放结果的 BigQuery 数据集 ID--bq_table_id必须修改circularnet_table标志默认值为Circularnet_table存放推理结果的 BigQuery 表 ID--overwrite按需脚本中为True标志默认值为False为True时删除已存在的 BigQuery 表后重建否则表已存在时跳过建表新数据以 append 方式写入其中overwrite的语义可以在 big_query_ops.py#L92-L109 的create_table中逐行验证表已存在且overwriteTrue时先delete_table再重建表已存在且overwriteFalse时直接返回不重建而ingest_data内部通过pandas_gbq.to_gbq(..., if_existsappend)追加写入——这正好对应文档中“overwrite or append取决于overwrite参数”的表述。用 screen 会话启动流水线参数修改完成后进入推理客户端的screen会话screen -R inference运行推理流水线bash run_images.sh如果你想在不中断推理的情况下退出 screen 会话按Ctrl a再按d即可将会话 detach。脚本运行期间还会在client目录下创建logs文件夹保存排查问题所需的日志和模型运行记录。这一点与 utils.py#L82-L111 中setup_logger_and_directories的实现一致它在当前工作目录下创建logs文件夹并以输入桶名为日志文件名初始化一个文件型 logger。源码视角流水线内部实际发生了什么bash run_images.sh背后的调用链集中在inference_pipeline.py的main函数中按顺序执行1. 下载图片并准备目录。utils.setup_logger_and_directories通过gsutil -m cp -r gs://输入目录 .把图片拉到本地创建输入目录名_prediction结果文件夹与logs文件夹。2. 按拍摄时间排序帧。每张图都通过utils.get_image_capture_timeutils.py#L121-L173解析拍摄时间优先从文件名形如..._YYYYMMDD_HHMMSSmmm.ext中解析日期时间失败时回退到 EXIF 的DateTimeOriginal标签再回退到文件修改时间。files_paths则先按文件名中的时间戳排序解析失败时改用natsort自然排序——保证跟踪按真实时间顺序进行。3. 逐帧推理。每张图片调用TritonObjectDetector.predict(image_path, confidence_threshold..., max_boxes100, output_dims(432, 432))。triton_server_inference.py 中该类的预处理流程为OpenCV 读取BGR→RGB→ 缩放到input_size默认 432×432→(pixel/255 - mean)/std做 ImageNet 归一化means[0.485, 0.456, 0.406]stds[0.229, 0.224, 0.225]→ 转成 CHW 并增加 batch 维。推理请求通过 Triton HTTP 客户端发给server_url默认localhost:8000与服务器侧映射的 8000 端口对应读取名为dets、labels、masks的三个输出概率经过 sigmoid 后按 top-kmax_boxes排序并做置信度过滤框由cxcywh转为xyxyn掩膜经最近邻插值放大后二值化坐标与掩膜统一缩放到output_dims本流水线中即 432×432。类别名称则依据 labels50.csv 将类别 ID 映射为可读名称。4. 可视化保存。utils.draw_detections_and_save_image使用 supervision 库的 Mask/Box/Label 三个标注器在 432×432 的缩放图上画出掩膜不透明度 0.4、边界框和“类别 : 置信度”标签并将“原图 | 标注图”左右拼成一张图保存到结果文件夹——这就是输出桶中你能看到的带叠加预测结果图片。5. 特征提取与跟踪。颜色属性通过utils.extract_color_names基于掩膜裁剪每个物体并聚类求主色跟踪则在 300×300 的缩小图上由ObjectTracker完成其search_range、memory即命令行传入的search_range_x/y与memory另有内置的自适应搜索参数adaptive_stop5、adaptive_step0.95见 inference_pipeline.py#L84-L90。跟踪完成后按检测类别名分组计数并写出count.csv。6. 写入 BigQuery 与上传结果图片。BigQueryManager.create_table(overwrite...)建表表结构见 big_query_ops.py#L49-L64particle、source_name、image_name、detection_scores、creation_time、bbox_0~bbox_3、detected_classes、detected_classes_names、detected_colors全部为 REQUIRED 字段随后ingest_data追加写入upload_image_results_to_storage_bucket用gsutil -m cp -r将结果文件夹上传到--output_directory指定的桶并清理本地文件。7. 自动关机。流程末尾会调用utils.shutdown_vm()utils.py#L304-L312等待 60 秒后执行sudo poweroff。也就是说该流水线按“跑完即销毁 GPU 实例”的按需模式设计如果你的 VM 上还有其他工作需要留意这一行为。查看结果与重要注意事项恭喜至此你已完成推理流水线的运行。结果分两处查看输出桶中的标注图片在--output_directory指定的 GCS 桶中可以找到叠加了物体预测结果框、掩膜与标签的图片BigQuery 表进入云项目的 BigQuery 控制台找到你配置--bq_table_id时指定的表预览表数据即可跨所有图片查看整体分析结果每个被跟踪物体的粒子 ID、出现图片、检测分数、边界框、类别与颜色等。重要如果要对同一批图片重跑预测流水线应先删除输出桶中之前生成的图片结果output-bucket避免新旧结果混杂。同时建议配置 GCS 对象生命周期规则来管理图片存储成本。另外提醒两个常见坑其一--input_directory与--output_directory必须是非空且以gs://开头的桶路径否则程序会在启动时直接抛出ValueError其二run_images.sh要求当前目录下已存在名为myenv的虚拟环境激活失败时脚本会打印错误并直接退出。参考文件客户端文档本文主体start-client.md服务器启动文档start-server.md客户端入口脚本run_images.sh流水线主程序inference_pipeline.pyTriton 客户端推理封装triton_server_inference.pyBigQuery 操作big_query_ops.py工具函数目录、日志、时间解析、可视化、关机utils.py服务器启动脚本triton_inference_server.sh项目总览README.md【免费下载链接】modelsModels and examples built with TensorFlow项目地址: https://gitcode.com/GitHub_Trending/mode/models创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考