多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

intent_recognition:Google Research 基于传感器数据构建用户活动识别模型的完整流水线指南

intent_recognition:Google Research 基于传感器数据构建用户活动识别模型的完整流水线指南 intent_recognitionGoogle Research 基于传感器数据构建用户活动识别模型的完整流水线指南【免费下载链接】google-researchGoogle Research项目地址: https://gitcode.com/gh_mirrors/go/google-research本指南深入讲解intent_recognition目录提供的基于传感器如腕戴式加速度计的机器学习建模工具覆盖从传感器数据采集、MediaPipe 预处理、SequenceExample 转换到 TensorFlow 模型训练与推理评估的完整流水线。读完本文你将掌握该工具的端到端使用方式、各阶段命令行入口与配置文件的编写方法并能基于仓库源码理解 AnnotatedRecordingCollection 数据模型、MediaPipe 处理图模板与标签映射机制的工作原理。流水线总览从传感器数据到活动识别模型intent_recognition是一个创建基于传感器的 ML 模型用于推断用户活动的工具。使用该工具共包含五个阶段每一阶段都有独立可运行的二进制或 Notebook 支撑获取传感器数据将原始传感器数据收集并格式化为AnnotatedRecordingCollection处理Processing使用 MediaPipe 对数据进行滤波、重采样、加窗等预处理转换Conversion将处理后的数据转换为 TensorFlowSequenceExample写入 TFRecord训练Training使用 TensorFlow / Keras 训练活动分类模型推理与指标Inference Metrics用训练好的模型进行推理并评估指标。从仓库结构看这一流水线对应的代码分别位于 conversion/、processing/、sample_configs/ 与 training/ 四个子目录根目录还包含数据模型定义 annotated_recording_collection.proto 和 annotated_recording_collection_utils.cc 等公共工具。数据模型AnnotatedRecordingCollection 的核心概念整个流水线的输入与中间产物都是AnnotatedRecordingCollection简称 ARC其 proto 定义在 annotated_recording_collection.proto。理解这套层级模型是使用工具的前提RecordingCollection一条 trace一段时间内来自不同传感器加速度计、近距传感器、视频流、音频流等的全部记录数据SequenceRecordingCollection 中单一传感器的全部数据由Datapoint或Window加窗后的 Datapoint 集合组成Datapoint某个时刻点的单次传感器读数支持DoubleDatapoint、Int64Datapoint、BoolDatapoint、BytesDatapoint四种测量类型并带有相对base_timestamp的offset时间偏移AnnotationGroup / AnnotationSequence / Annotation对 RecordingCollection 的标注分为两大主题——ground truth 信息事件时间戳、标签与标记、评分者标注与数据衍生结果模型预测、staged model 输出、指标计算产物。AnnotationGroupType枚举区分GROUND_TRUTH与MODEL两类。RecordingCollectionMetadata记录base_timestamp、session_id、user_id并通过MobileCollectionMetadata.session_activity保存该 trace 对应的真实活动名称——这正是模型的监督信号来源。第一阶段获取传感器数据并转换为 AnnotatedRecordingCollection传感器数据必须被收集并格式化为AnnotatedRecordingCollection其中recording_collection字段必须填充。工具提供了一个将ADL 数据集UCI 腕戴加速度计 ADL 识别数据集转换为 ARC 的示例二进制构建命令为bazel run --cxxopt-stdc17 --experimental_repo_remote_exec --define MEDIAPIPE_DISABLE_GPU1 intent_recognition:convert_adl_dataset_to_annotated_recording_collection -- see file for flags对应的实现位于 convert_adl_dataset_to_annotated_recording_collection.cc其命令行参数flags为Flag说明--adl_dataset_dir_pathADL 数据集顶层目录路径--record_output_filename输出 riegeli 文件路径存放转换后的 AnnotatedRecordingCollection 记录从源码可以提炼出该转换器实现的几个关键细节加速度原始值解码DecodeAccel函数将原始整数值映射为 m/s²公式为(-1.5 raw_accel / 63.0 * 3.0) * 9.8067kGravity 9.8067采样率假定以kSamplingRateHz 3232 Hz推算每个数据点的时间偏移offset秒与纳秒即假定 ADL 数据集原始采样率为 32Hz元数据填充每个以Accelerometer-前缀命名的文件对应一个 ARCsession_id从 0 递增user_id从文件名段解析session_activity从文件名中提取Sequence 的type SENSOR、subtype ACCELEROMETER、measurement_dimensionality 3输出格式使用 riegeli 的RecordWriter逐条写出 ARC因此输入/输出文件均为 riegeli records 格式。该二进制可作为如何把自己的传感器数据集改写成 ARC的参考模板替换数据集目录遍历与元数据填充逻辑即可适配新的数据源。第二阶段MediaPipe 处理Processing处理阶段使用 MediaPipe 完成运行命令为bazel run --cxxopt-stdc17 --experimental_repo_remote_exec --define MEDIAPIPE_DISABLE_GPU1 intent_recognition/processing:process_annotated_recording_collection_main -- see file for flags对应入口为 process_annotated_recording_collection_main.cc支持三个 flagsFlag说明--record_input_filename输入 riegeli 文件未处理的 AnnotatedRecordingCollection--record_output_filename输出 riegeli 文件处理后的 AnnotatedRecordingCollection--processing_options_filename处理选项文件路径textproto 格式的ProcessingOptions处理选项的类型定义在 processing_options.proto其关键字段如下字段类型说明processing_graph_filestringDrishti 图模板路径指定预处理方式传感器选择、采样率、加窗等window_sizeint64加窗大小每个窗口的输入样本数sampling_rateint64目标采样率window_strideint64窗口滑动步长padding_strategyenum填充策略取值为WindowCalculatorOptions.PaddingStrategy枚举名minimum_windowsint64最少需要产生的窗口数at_least_one_annotation_with_substringrepeated string要求至少一个标注包含指定子串才保留no_annotations_with_substringrepeated string标注包含指定子串则丢弃exclude_user_idrepeated string按用户 ID 过滤include_session_activity/exclude_session_activityrepeated string按活动名保留/排除二者不可同时使用label_mapping_filesrepeated string标签类映射文件路径filter_label_mapping_namestring用于过滤的映射名称include_class_name/exclude_class_namerepeated string按映射后的类名保留/排除二者不可同时使用min_variance_thresholdfloat方差阈值低于阈值的窗口将被丢弃drop_below_threshold_comparatorenumALL全部参考流低于阈值才丢或ANY任一低于阈值即丢invert_thresholdbool取反阈值逻辑保留低于阈值的窗口处理图模板processing_graph.pbtxtProcessingOptions.processing_graph_file指向一个Drishti 图模板示例为 sample_configs/graph/processing_graph.pbtxt。该模板使用 Jinja 风格的% ... %占位符由BuildDrishtiGraphWithProcessingOptions见 annotated_recording_collection_utils.h将ProcessingOptions中的参数代入生成最终CalculatorGraphConfig。模板中的计算器calculator链完整定义了预处理流程ClassMappingsSidePacketCalculator从label_mapping_files加载类映射输出CLASS_MAPPINGS_PROVIDERside packet映射类型STRING_CLASSFilterAnnotatedRecordingCollectionCalculator第一次按filter_if_sensor_not_present_or_empty: ACCELEROMETER、exclude_user_id、exclude_session_activity、include_session_activity、标注子串等条件过滤 ARCAddClassMappingsCalculator利用 side packet 中的映射为 ARC 添加标注类映射实现见 add_class_mappings_calculator.ccFilterAnnotatedRecordingCollectionCalculator第二次按filter_label_mapping_name与include_class_name/exclude_class_name过滤映射后的类ExtractSensorDataFromAnnotatedRecordingCollectionCalculator提取ACCELEROMETER数据流required_dims: 3重复时间戳策略为RAISE_ERRORPacketResamplerCalculator以%sampling_rate%重采样WindowCalculator按%window_size%、%window_stride%、%window_padding_strategy%、%minimum_windows%加窗参数含义见 window_calculator.protopadding_strategy支持RIGHT_ZERO与RIGHT_LAST_VALUEComputeSampleMagnitudeVarianceCalculator计算窗口幅度方差DropOnThresholdValueCalculator按%min_variance_threshold%、%drop_below_threshold_comparator%、%invert_threshold%丢弃方差过低的窗口实现参考 drop_on_threshold_value_calculator.protoComparator含ANY/ALLinvert_threshold用于反转保留逻辑MergeSensorDataIntoAnnotatedRecordingCollectionCalculator将重采样流与阈值化加窗流合并回 ARC——原始加速度计流标记为ACCELEROMETER加窗流标记为ACCELEROMETER_WINDOWwindow_dims %window_size%SetAnnotatedRecordingCollectionMetadataCalculator回写处理后的元数据输出流名为output。处理主程序为每条输入 ARC 实例化一个 MediaPipeCalculatorGraph启动运行后通过AddOutputStreamPoller(output)收集输出一条输入可产生多条输出记录见 process_annotated_recording_collection_main.cc。运行结束时日志会打印读取与写出的记录条数Num of records read / written。标签映射机制label_mapping_files指向 StringLabelClassMap 类型的 textproto 文件。以示例 standup_chair_labelmap.textproto 为例它定义了名为standup_chair_mapping的映射标签包含子串standup_chair映射为Standup_chair包含Eat映射为Negative包含walk但不包含MODEL映射为Negative其余标签entry无identifier映射为Withdraw。映射不区分大小写。从源码 class_mappings_provider_helpers.h 可以推断类 ID 的分配规则所有target_class_string收集到集合后按字母序排序从 0 开始编号implicit_target_classes中声明的隐式类会被排除。也就是说同一个StringLabelClassMap内的类名顺序决定了最终分类的 label ID训练阶段的标签 ID 与之一一对应。样例处理配置仓库提供了两个可对照的正负样本处理配置2sec_positive_standup_chair.pbtxtwindow_size: 50、sampling_rate: 50、window_stride: 5、padding_strategy: RIGHT_LAST_VALUE、minimum_windows: 1过滤条件为filter_label_mapping_name: standup_chair_mappinginclude_class_name: Standup_chair只保留正类方差阈值min_variance_threshold: 5、drop_below_threshold_comparator: ALL2sec_negative_standup_chair.pbtxt加窗参数相同但include_class_name: Negative且min_variance_threshold: -1实际关闭低方差丢弃。两个配置文件中的processing_graph_file与label_mapping_files均为占位符[path to intent_recognition]/...使用前必须手工替换为 intent_recognition 目录的绝对路径。第三阶段转换为 SequenceExampleTFRecord处理完成后需将 ARC 转换为 TensorFlow 训练所需的SequenceExample运行命令为bazel run --cxxopt-stdc17 --experimental_repo_remote_exec --define MEDIAPIPE_DISABLE_GPU1 intent_recognition/conversion:convert_annotated_recording_collection_to_sequence_example_main -- see file for flags入口为 convert_annotated_recording_collection_to_sequence_example_main.ccflags 如下Flag说明--riegeli_record_input_filename输入 riegeli 文件处理后的 AnnotatedRecordingCollection--tf_record_output_filename输出 TFRecord 文件SequenceExample 序列化字节流转换核心函数ConvertAnnotatedRecordingCollectionToSequenceExample声明见 convert_annotated_recording_collection_to_sequence_example.h实现见 convert_annotated_recording_collection_to_sequence_example.cc生成的 SequenceExample 结构如下Context featuressession_idbytes来自recording_collection.metadata().session_id()mapping_name/labelint64与mapping_name/label/namebytes来自 GROUND_TRUTH 类别的 CLASS_LABEL 标注序列mapping_name即标注源名称派生标注annotation_type DERIVED会生成双向映射特征activity/labelbytes原始session_activitytype/subtype/dimensionalityint64传感器测量维度例如SENSOR/ACCELEROMETER_WINDOW/dimensionalitytype/subtype/window_sizeint64加窗序列的窗口大小例如SENSOR/ACCELEROMETER_WINDOW/window_sizefirst_measurement/timestamp/secondsfloat首个测量值相对时间戳。Feature lists每个非空序列生成type/subtype/floats例如SENSOR/ACCELEROMETER_WINDOW/floats窗口序列按窗口逐个写入 Featureflattenfalse时每个窗口对应一个 feature窗口内的数据按时间×维度排列。主程序逐条读取输入 ARC转换失败如无数据可写时打 WARNING 并跳过最终日志打印读取与写入记录数。第四阶段TensorFlow 模型训练与推理训练使用 TensorFlow仓库提供了可直接在 Colab 中运行的 Notebookintent_recognition_training.ipynb。该 Notebook 的核心工作流为数据准备通过tf.data.TFRecordDataset(FILENAMES)读取 TFRecord解析每个SequenceExample从 context 中提取CLASS_FEATURE_KEY_IDmapping_name/label作为标签、DIM_FEATURE_NAMESENSOR/ACCELEROMETER_WINDOW/dimensionality与WINDOW_SIZE_FEATURE_NAME作为数据形状信息再从 feature list 的DATA_FEATURE_NAMESENSOR/ACCELEROMETER_WINDOW/floats还原出window_size × dims的窗口数组数据划分按 60% 训练、10% 验证、30% 测试的比例PERCENT_TRAIN / PERCENT_VALIDATION / PERCENT_TEST使用train_test_split分层划分DATASET_BATCH_SIZE 32批量化并 shuffle二分类训练keras.Sequential网络Flatten → Dense(40, relu) → Dropout(0.3) → Dense(20, relu) → Dense(1, sigmoid)使用adam优化器与BinaryCrossentropy损失epochs15评估指标含BinaryAccuracy与 TP/FP/TN/FN训练后binary_model.save(SAVED_MODEL_FOLDER)保存多分类训练输出层改为Dense(len(label_ids), softmax)使用SparseCategoricalCrossentropy同样训练 15 个 epoch 并保存。Notebook 顶部参数区定义了输入 TFRecord 文件名列表如正样本positive_with_drop.tfrecord与负样本negative.tfrecord、POSITIVE_DATA_LABEL_NAME Standup_chair等方便替换为自身流水线产物。训练完成后即可用保存的模型对新 trace 进行推理并借助 ARC 中 MODEL 类别的标注组记录预测结果用于指标计算这与数据模型中的AnnotationGroupType.MODEL设计相呼应。仓库速查与流水线对应的关键文件阶段文件数据获取示例转换器convert_adl_dataset_to_annotated_recording_collection.cc数据模型annotated_recording_collection.proto、annotated_recording_collection_sensor_options.proto公共工具annotated_recording_collection_utils.h、annotated_recording_collection_utils.cc处理入口与选项processing/process_annotated_recording_collection_main.cc、processing/processing_options.proto处理图模板sample_configs/graph/processing_graph.pbtxt样例处理配置sample_configs/processing/2sec_positive_standup_chair.pbtxt、sample_configs/processing/2sec_negative_standup_chair.pbtxt标签映射sample_configs/labelmap/standup_chair_labelmap.textproto、processing/string_label_class_map.proto转换入口conversion/convert_annotated_recording_collection_to_sequence_example_main.cc训练 Notebooktraining/intent_recognition_training.ipynb常见问题与注意事项配置文件路径占位符样例 textproto 中processing_graph_file与label_mapping_files的[path to intent_recognition]必须替换为绝对路径否则主程序读取图模板或映射文件会失败参数互斥约束include_session_activity与exclude_session_activity、include_class_name与exclude_class_name不可同时设置proto 注释中明确要求方差阈值丢弃窗口设置min_variance_threshold后处理结果中的窗口可能出现不等间距部分窗口被丢弃转换与训练时需接受这一特性类 ID 由字母序决定同一StringLabelClassMap中目标类按字母序编号调整映射文件会改变训练标签 ID修改后需同步核对 Notebook 中的特征键与标签定义重复时间戳ExtractSensorData...Calculator支持RAISE_ERROR与KEEP_LAST_VALUE两种重复时间戳处理策略默认图模板使用RAISE_ERROR数据存在重复采样时刻时会导致处理报错可按需调整。通过将上述五个阶段串联起来即可基于自定义的传感器数据集构建活动识别模型参照 ADL 转换器生成 ARC → 用 MediaPipe 处理图清洗与加窗 → 转换为 SequenceExample/TFRecord → 在 Colab 中训练 Keras 模型 → 部署推理并计算指标。整个过程的数据格式、参数语义与实现细节均已在上文结合源码逐层展开可直接作为落地实践的参考。【免费下载链接】google-researchGoogle Research项目地址: https://gitcode.com/gh_mirrors/go/google-research创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表