车辆ID跟踪与车牌纠正分析

news/2025/12/6 20:34:42/文章来源:https://www.cnblogs.com/alohablogs/p/19307335

在车辆识别算法优化中,“车辆ID跟踪优化”(如纠正、增量识别)是评估车辆识别算法稳定性的核心指标。面对GB级的海量日志,人工排查无异于大海捞针。

分享一个轻量级 Python 分析工具,实现从日志流读取、关键事件提取、结果去重到二次分析的自动化全流程。

🚀 核心功能

  1. 正则捕获:基于状态记忆,锁定同一 车ID 下的 车牌 变化,提取“增量车牌”与“车牌纠正”事件。
  2. 结果去重:利用 (ID, 原车牌, 新车牌) 三元组作为唯一键,在日志刷屏时自动合并重复项,仅保留最后一次出现位置。
  3. 二次分析Levenshtein(编辑距离) 算法(dp),自动识别 ID连续增加且原车牌高度相似 的记录,标记为“ID分裂疑点”。

🛠️ 完整代码实现

import glob
import os
import re
import csvclass LogAnalyzer:def __init__(self):self.records = {}  # 记录每个ID的首次状态 {id: {'plate': str, 'loc': str}}self.conflicts = {}  # 存储去重后的冲突记录# --- 配置区:关注的事件类型 ---self.target_events = ["增量车牌", "车牌纠正"]# ---------------------------self.re_plate = re.compile(r"车牌\[(.*?)\]")self.re_id = re.compile(r"车ID\[(\d+)\]")self.re_event = re.compile(r"事件类型\[(.*?)\]")self.re_pic = re.compile(r"Pic\[(.*?)\]")def run(self):files = glob.glob("*.log")if not files: return print("❌ 未找到日志文件")print(f"📂 扫描 {len(files)} 个文件... (关注事件: {self.target_events})")for fpath in files:self._process_file(fpath)self._export_combined_csv()def _process_file(self, fpath):fname = os.path.basename(fpath)try:with open(fpath, 'r', encoding='utf-8', errors='replace') as f:for i, line in enumerate(f, 1):# 1. 字符串预筛if "车ID[" not in line or "车牌[" not in line: continue# 2. 正则提取核心字段m_id = self.re_id.search(line)m_plate = self.re_plate.search(line)if not (m_id and m_plate): continuecid = int(m_id.group(1))plate = m_plate.group(1)if cid == 0: continue # 忽略初始化IDm_event = self.re_event.search(line)event = m_event.group(1) if m_event else ""m_pic = self.re_pic.search(line)pic = m_pic.group(1) if m_pic else ""# 3. 状态机逻辑if cid in self.records:old = self.records[cid]# 发现ID相同但车牌不同if old['plate'] != plate:if event in self.target_events:# 覆盖更新:保留该变动最后一次出现的行号self.conflicts[(cid, old['plate'], plate)] = {'id': cid,'old': old['plate'],'new': plate,'event': event,'pic': pic,'file': fname,'line': i}else:# 记录新ID的初始状态self.records[cid] = {'plate': plate, 'file': fname, 'line': i}except Exception as e:print(f"❌ 读取 {fname} 出错: {e}")def _levenshtein(self, s1, s2):"""动态规划计算字符串编辑距离,用于相似度比对"""if len(s1) < len(s2): return self._levenshtein(s2, s1)if len(s2) == 0: return len(s1)previous_row = range(len(s2) + 1)for i, c1 in enumerate(s1):current_row = [i + 1]for j, c2 in enumerate(s2):insertions = previous_row[j + 1] + 1deletions = current_row[j] + 1substitutions = previous_row[j] + (c1 != c2)current_row.append(min(insertions, deletions, substitutions))previous_row = current_rowreturn previous_row[-1]def _export_combined_csv(self):output_file = "algorithm_analysis_report.csv"# 按ID排序sorted_rows = sorted(self.conflicts.values(), key=lambda x: x['id'])processed_rows = []id_split_count = 0# --- 结果二次分析 ---for i in range(len(sorted_rows)):current = sorted_rows[i]analysis_note = ""# 逻辑:如果ID连续增加(N, N+1) 且 原车牌编辑距离<=2if i > 0:prev = sorted_rows[i - 1]if current['id'] - prev['id'] == 1:dist = self._levenshtein(current['old'], prev['old'])if dist <= 2:analysis_note = f"⚠️ ID分裂疑点 (与ID {prev['id']} 原牌差异{dist}位)"id_split_count += 1current['analysis'] = analysis_noteprocessed_rows.append(current)# --- 计算看板指标 ---total_unique_cars = len(self.records)div = total_unique_cars if total_unique_cars > 0 else 1correct_cnt = sum(1 for r in processed_rows if r['event'] == "车牌纠正")incr_cnt = sum(1 for r in processed_rows if r['event'] == "增量车牌")total_opt_cnt = len(processed_rows)try:with open(output_file, 'w', newline='', encoding='utf-8-sig') as csvfile:writer = csv.writer(csvfile)writer.writerow(["【算法优化指标看板】"])writer.writerow(["指标项", "数值", "占比/备注"])writer.writerow(["总服务车辆数 (Unique IDs)", total_unique_cars, "-"])writer.writerow(["异常记录总数", total_opt_cnt, f"{(total_opt_cnt / div):.2%} (优化率)"])writer.writerow(["-------------------------", "---", "---"])writer.writerow(["[事件] 车牌纠正", correct_cnt, f"{(correct_cnt / div):.2%}"])writer.writerow(["[事件] 增量车牌", incr_cnt, f"{(incr_cnt / div):.2%}"])writer.writerow(["[分析] ID分裂疑点", id_split_count, "连续ID且原车牌相似"])writer.writerow([]) writer.writerow([])headers = ['车ID', '原车牌', '新车牌', '触发事件', '二次分析结果', 'Pic完整路径', '日志文件名', '行号']writer.writerow(headers)for row in processed_rows:writer.writerow([row['id'],row['old'],row['new'],row['event'],row.get('analysis', ''),row['pic'],row['file'],row['line']])print(f"✅ 报告已生成: {os.path.abspath(output_file)}")print(f"   -> 总车数: {total_unique_cars}, 异常: {total_opt_cnt}, ID分裂疑点: {id_split_count}")except Exception as e:print(f"❌ CSV 生成失败: {e}")if __name__ == "__main__":LogAnalyzer().run()

📊 输出报告示例

生成的 algorithm_analysis_report.csv 结构清晰,直接可用 Excel 打开:

【算法优化指标看板】
指标项 数值 占比/备注
总服务车辆数 (Unique IDs) 1500 -
异常记录总数 15 1.00% (优化率)
[事件] 车牌纠正 12 0.80%
[事件] 增量车牌 3 0.20%
[分析] ID分裂疑点 1 连续ID且原车牌相似
车ID 原车牌 二次分析结果 ...
1689771065 闽D8R333 ⚠️ ID分裂疑点 (与ID 1689771064 原牌差异1位)

💡 总结

该工具通过流式处理解决了大文件读取的内存瓶颈,利用编辑距离解决了 ID 拖尾的识别难题。它不仅是一个日志提取脚本,更是一个算法质量评估的自动化基准工具。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/990517.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

需求的分层

目录一、最核心的:什么是“概念”,什么是“需求”概念 / 方向(Concept)而需求(Requirement)必须满足三件事:1. 有清晰边界(Scope)2. 有可验证条件(Acceptance Criteria)3. 有系统间的规范定义(Contract)二…

12.5 程序员修炼之道:从小工到专家 第7章 在项目开始之前 - GENGAR

本内容聚焦项目启动前的关键准备工作,围绕需求管理、问题解决、决策判断及规范工具使用展开。 在需求管理上,需摒弃 “贪多求全” 的思维,不盲目搜集需求,而是深挖核心需求并打磨,与用户共情思考。制定需求文档时…

1pcs 3pcs是啥

1pcs 3pcs是啥1 pcs / 3 pcs 是制造业、电子业、物流里最常见的英文缩写: ✅ pcs = pieces(件、个) 所以:1 pcs = 1 个 / 1 件3 pcs = 3 个 / 3 件完全就是数量单位,跟中文的“个、只、件”一样。📦 常见用法示…

红旗HS6 PHEV更换轮胎推荐:2025年用户满意度高的方案

红旗HS6 PHEV更换轮胎推荐:2025年用户满意度高的方案为解决红旗HS6 PHEV车主在“红旗HS6 PHEV更换轮胎推荐”上的选择难题——既要化解混动车型自重高导致的承载与湿地制动隐忧,又要满足电车对静谧性的极致追求,还要…

理想L6更换轮胎推荐:2025年销量突破100万的胎压表现

理想L6更换轮胎推荐:2025年销量突破100万的胎压表现为解决用户在“理想L6更换轮胎推荐”上的选择难题,本文将以资深汽车媒体主编与产品技术分析师的视角,整合全球主流汽车媒体(如《AutoBild》、汽车之家等)的公开…

理想L9更换轮胎推荐:2025年超500万用户力荐的组合

理想L9更换轮胎推荐:2025年超500万用户力荐的组合在高端新能源SUV市场快速演进的背景下,理想L9更换轮胎推荐正成为高净值家庭用户与商务精英的核心关切。理想L9以全尺寸空间、高阶智能驾驶与豪华舒适配置构筑“移动的…

小红书玩疯了!Ai像素级拆解提示词+Nano Banan Pro免费使用教程(附Api接入实战)

大家最近有没有在小红书刷到这种像素级拆解人物的图片?真的玩疯了,有拆解二次元、美女穿搭、玩具手办、游戏角色、乐高玩具....真的万物可拆解。究竟是用什么做的?提示词是什么?今天5分钟教会你。 像素拆解用什么模…

2025.12.6日20:13-harsh无情的;粗糙的

当前已使用内存:MB是340 南京4℃ 霾 今日热点如下 LPL全明星,英国首相花7亿救鱼引争议,元婴集结启程探遗迹,顶级F1车队有多烧钱,鸣潮今州杯S8 Day4,F1阿布扎比历年名场面,Netflix将收购华纳兄弟,黄日华,解析LPL转会后阵…

2.2.STM32-新建工程 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

《软件需求》

目录背景和价值参考资料 背景和价值 软件项目中百分之四十至百分之六十的问题都是在需求分析 阶段埋下的“祸根”(L e ffingwell 1997)。可许多组织仍在那些基本的项目功能上采用一些不 合规范的方法,这样导致的后果…

软件需求分析

目录 在软件工程领域:一种需求分析框架 在软件需求分析中,SERU 是一种用于分解和组织需求的框架模型。‌ ‌S:Subject Area(主题域)‌:指根据业务领域对系统进行划分,旨在保证各业务模块的独立性和低耦合性。 ‌…

2026年网络安全展望:AI加速、攻击面扩张与专业化红队的未来

本文深入探讨了塑造2026年网络安全格局的五大核心趋势:AI普及带来的安全决策变革、攻击面持续扩大对渗透测试的更高要求、医疗设备等关键硬件安全测试需求的激增、应对AI威胁的专业化红队兴起,以及AI武器化如何推动测…

创建图像分类器模型

训练机器学习模型来对图像进行分类,并将模型添加到你的 Core ML App 中。最新英文文章 Creating an Image Classifier Model概览 图像分类器是一种能够识别图像的机器学习模型。在你提供一张图像后,图像分类器会根据…

个人健康系统|健康管理|基于java+Android+微信小代码的个人健康平台设计与完成(源码+数据库+文档)

个人健康系统|健康管理|基于java+Android+微信小代码的个人健康平台设计与完成(源码+数据库+文档)2025-12-06 20:08 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !i…

接入Impala、Hive 的报表、BI、数据中台的国内厂商评价及接口框架

接入Impala、Hive 的报表、BI、数据中台的国内厂商评价及接口框架接入Impala、Hive 的报表、BI、数据中台的国内厂商?建议由CDH迁移到CMP 7.13 平台(类Cloudera CDP,如华为鲲鹏 ARM 版)可以做到无缝切换平缓迁移截…

完整教程:用Python识别图片中的文字(Tesseract OCR)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

完整教程:用Python识别图片中的文字(Tesseract OCR)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

详细介绍:剪贴板监控记:用 Go 写一个 Windows 剪贴板监控器

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

个人健康体系|健康管理|基于java+Android+微信小工具的个人健康系统设计与实现(源码+数据库+文档)

个人健康体系|健康管理|基于java+Android+微信小工具的个人健康系统设计与实现(源码+数据库+文档)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !…

Yolov5 使用手册

YOLOv5 完整入门与实践指南本文从零开始,详细介绍 YOLOv5 的安装、数据准备、模型训练到实际部署的全过程,适合初学者和需要快速上手的开发者。 温馨提示:实际动手操作一次完整的训练流程(数据准备→标注→训练→测…