news 2026/10/2 3:21:49

共享单车时空数据分析实战:从GPS清洗到H3热力图渲染

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
共享单车时空数据分析实战:从GPS清洗到H3热力图渲染

简介:本资源是一套完整可运行的毕业设计项目源码,面向计算机相关专业本科生及前端/后端初学者,聚焦共享单车场景下的时空数据分析与管理功能实现。系统采用Python(Django/Flask类框架)构建后端服务,Vue.js开发响应式前端界面,涵盖数据采集、时空热力图可视化、车辆调度模拟、用户行为分析等核心模块,适合作为毕设选题参考、课程设计或全栈开发实战练习。压缩包共349个文件,含130个Vue组件、91个JavaScript逻辑脚本、46个SVG图标资源、19个Python业务代码文件及配套配置与文档(.env、.gitignore、README.md等),整体体积仅908KB,结构清晰、注释充分,小白亦可快速部署调试。目前已有162人学习下载,项目经导师指导并获99分高分评价,代码完整、无缺失依赖,附带典型页面样式(如waves.css)、环境配置说明及多环境配置文件(development/staging/production),便于理解工程化实践规范。

1. 为什么共享单车的“热力图”总在深夜失灵?——毕业设计里最常被忽略的时空数据陷阱

你调试了三天,地图上单车图标密密麻麻堆在市中心,但一到凌晨2点,所有点位突然集体消失;你用 Vue 渲染的折线图显示日均骑行量稳步上升,可导出 CSV 后发现:凌晨0–5点的数据全为0;你把 Python 聚类结果贴进答辩 PPT,老师问:“这些‘高活跃区’是按什么时间粒度聚合的?周末和工作日混在一起算的?”——当场卡壳。

这不是代码写错了,而是时空数据分析这个环节,在绝大多数基于 Python + Vue 的毕业设计中,被当成“前端展示+后端查库”的装饰性模块,而非独立的数据工程子系统。本项目标题里的“时空数据分析”,不是指用 Folium 画个热力图、用 ECharts 画条时间线,而是要求你真正理解:GPS 时间戳的时区漂移怎么校正、轨迹点稀疏如何影响 OD 对提取、空间网格(如 H3 或 GeoHash)与时间窗口(滑动 vs 固定)如何耦合建模、以及 Vue 前端如何安全承载每秒百级动态点位的渲染压力。

适合谁?正在做毕业设计、手头有真实或模拟的共享单车 GPS 轨迹数据(哪怕只有 1 万条记录)、已搭好基础 Python Web 后端(Flask/Django/FastAPI)和 Vue 3 前端框架、但卡在“数据看起来有,分析不出结论”阶段的同学。本文不讲 Vue 组件怎么写、Python 怎么装,只聚焦时空数据从原始 GPS 点到可交互分析视图的完整链路:清洗→建模→聚合→传输→渲染→验证。所有步骤均可本地复现,最小依赖集仅需pandas,geopandas,h3,fastapi,vue3,无云服务、无第三方 API、无 Docker。


2. 用 Python 把原始 GPS 日志变成时空立方体:清洗、校正与网格化

共享单车原始数据通常以 CSV 或 JSON 格式提供,字段包含bike_id,timestamp,lat,lng,status(骑行中/停放中)。但直接扔进 Pandas 会立刻翻车:时间格式混乱、坐标系混杂(WGS84 vs GCJ02)、大量重复点、离群值(经纬度超出城市范围)、缺失状态标记。这一章解决的是“数据还没进分析流程,就已在门口堵死”的问题。

2.1 时间戳统一:别让 UTC+8 成为你的玄学开关

共享单车设备上报时间多为设备本地时间,但服务器接收时可能自动转为 UTC。常见错误是直接用pd.to_datetime(df['timestamp']),结果发现所有凌晨数据被错位到前一天。正确做法是强制指定时区并转换为北京时间(Asia/Shanghai):

import pandas as pd from datetime import timezone # 假设原始 timestamp 是字符串,格式如 '2023-05-12 14:22:31' df['timestamp'] = pd.to_datetime(df['timestamp'], format='%Y-%m-%d %H:%M:%S') # 关键:先声明原始时间是 UTC,再转换为北京时间 df['timestamp_beijing'] = df['timestamp'].dt.tz_localize('UTC').dt.tz_convert('Asia/Shanghai') # 验证:打印凌晨时段样本 print(df[df['timestamp_beijing'].dt.hour.isin([0,1,2])].head())

参数说明:tz_localize('UTC')表示原始时间按 UTC 解释;tz_convert('Asia/Shanghai')将其转换为东八区时间。若原始数据已是北京时间(如数据库存的是DATETIME类型且未设时区),则跳过tz_localize,直接tz_localize('Asia/Shanghai')。血泪经验:务必用.dt.hour检查转换后是否符合业务常识(如早高峰 7–9 点应有峰值),否则后续所有时间聚合都无效。

2.2 空间校正:WGS84 是唯一可信坐标系

国内共享单车数据常含 GCJ02(火星坐标系)偏移,若直接用于距离计算或空间聚合,误差可达 100–500 米。毕业设计无需破解加密算法,但必须明确数据来源:

  • 若数据来自公开数据集(如 UCSD Bike Sharing Dataset),默认 WGS84;
  • 若来自国内企业脱敏数据,大概率是 GCJ02;
  • 若不确定,用geopandas加载后对比百度地图坐标——偏差 > 300 米即为 GCJ02。

处理方案:使用开源库coord-convert(轻量,无 C 依赖)进行批量转换:

pip install coord-convert
from coord_convert.transform import wgs84_to_gcj02, gcj02_to_wgs84 # 若确认为 GCJ02,转回 WGS84 df['lat_wgs84'], df['lng_wgs84'] = gcj02_to_wgs84(df['lat'].values, df['lng'].values) # 创建 GeoDataFrame(必须用 WGS84) import geopandas as gpd from shapely.geometry import Point geometry = [Point(xy) for xy in zip(df['lng_wgs84'], df['lat_wgs84'])] gdf = gpd.GeoDataFrame(df, geometry=geometry, crs='EPSG:4326') # WGS84 CRS

逻辑说明:crs='EPSG:4326'是 WGS84 的标准 CRS 编号,后续所有空间操作(缓冲区、相交、距离)都依赖此设定。若此处 CRS 错误,gdf.buffer(0.001)生成的缓冲区半径单位是“度”,而非“米”,导致聚类完全失效。

2.3 时空网格化:用 H3 替代传统 GeoHash 的三个理由

很多同学用geohash.encode(lat, lng, precision=6)划分区域,但毕业设计中需支撑“某网格内 24 小时骑行量变化”这类分析,GeoHash 的矩形网格在球面投影下存在面积畸变(高纬度网格实际面积远小于低纬度),且无法支持层级聚合(如 zoom 12 → zoom 10)。H3 网格(Uber 开源)是更优解:六边形、等面积、支持父子网格关系、原生支持时空联合索引。

pip install h3
import h3 # 生成 H3 索引(resolution=9 对应约 0.5km²,适合城市级分析) gdf['h3_index'] = gdf.apply( lambda row: h3.geo_to_h3(row['lat_wgs84'], row['lng_wgs84'], resolution=9), axis=1 ) # 添加时间维度:按小时切片(北京时间) gdf['hour_bin'] = gdf['timestamp_beijing'].dt.floor('H') # 构建时空立方体:每个 (h3_index, hour_bin) 是一个单元格 spatiotemporal_cube = gdf.groupby(['h3_index', 'hour_bin']).agg({ 'bike_id': 'count', # 骑行事件数 'status': lambda x: (x == 'in_use').sum() # 骑行中数量 }).rename(columns={'bike_id': 'trip_count', 'status': 'active_bikes'}).reset_index() print(spatiotemporal_cube.head())

参数说明:resolution=9是平衡精度与性能的关键值——分辨率 8(约 1.2km²)易丢失细节,分辨率 10(约 0.1km²)会导致网格数爆炸(单城超千万),毕业设计选 9 最稳妥。dt.floor('H')实现固定窗口(非滑动),避免凌晨跨天计算错误。


3. FastAPI + Vue 3 实现时空数据实时管道:从聚合表到前端图表

Python 后端完成时空立方体构建后,需通过 API 将结构化结果供给 Vue 前端。常见误区是“把整个 DataFrame JSON 序列化返回”,导致前端加载 10MB 数据卡死。本节给出毕业设计可落地的轻量级管道方案:后端按需聚合、前端懒加载、传输压缩。

3.1 FastAPI 接口设计:只传必要字段,拒绝全量 dump

定义/api/heatmap接口,接收start_time,end_time,resolution(H3 分辨率)参数,返回精简的热力图数据:

# main.py from fastapi import FastAPI, Query from pydantic import BaseModel import json app = FastAPI() class HeatmapResponse(BaseModel): grid_data: list[dict] # [{h3_index: str, value: float, center_lat: float, center_lng: float}] time_range: str @app.get("/api/heatmap", response_model=HeatmapResponse) def get_heatmap( start_time: str = Query(..., description="ISO format, e.g., 2023-05-01T00:00:00"), end_time: str = Query(..., description="ISO format, e.g., 2023-05-01T23:59:59"), resolution: int = Query(9, ge=7, le=10) ): # 1. 过滤时空立方体(假设已加载到内存或缓存) mask = ( (spatiotemporal_cube['hour_bin'] >= pd.to_datetime(start_time)) & (spatiotemporal_cube['hour_bin'] <= pd.to_datetime(end_time)) ) filtered = spatiotemporal_cube[mask].groupby('h3_index')['trip_count'].sum().reset_index() # 2. 计算每个 H3 网格中心点(避免前端计算) filtered['center_lat'], filtered['center_lng'] = zip(*filtered['h3_index'].apply( lambda x: h3.h3_to_geo(x) )) # 3. 只返回前端需要的字段,value 归一化到 0–100 max_val = filtered['trip_count'].max() if len(filtered) else 1 filtered['value'] = (filtered['trip_count'] / max_val * 100).round(1) return { "grid_data": filtered[['h3_index', 'value', 'center_lat', 'center_lng']].to_dict('records'), "time_range": f"{start_time} to {end_time}" }

逻辑说明:接口不返回原始轨迹点,只返回聚合后的网格中心坐标与归一化强度值。h3.h3_to_geo()直接获取六边形质心,比前端用h3-js库再计算快 3 倍。value归一化确保 ECharts 热力图颜色标尺稳定,避免不同日期间色阶跳跃。

3.2 Vue 3 组件:用 Mapbox GL JS 渲染 H3 网格,而非 Canvas 手绘

Vue 项目中,很多同学用echarts-gl或leaflet+ 自定义 SVG 渲染热力图,但 H3 网格需精确六边形填充,Canvas 手绘易变形且性能差。Mapbox GL JS 原生支持 H3 网格渲染,且可通过fill-extrusion实现 3D 柱状效果:

<!-- HeatmapView.vue --> <script setup> import { onMounted, ref } from 'vue' import mapboxgl from 'mapbox-gl' import 'mapbox-gl/dist/mapbox-gl.css' const mapContainer = ref(null) let map = null onMounted(() => { map = new mapboxgl.Map({ container: mapContainer.value, style: 'mapbox://styles/mapbox/streets-v12', center: [116.404, 39.915], // 北京中心 zoom: 12 }) // 添加 H3 网格图层 map.on('load', () => { fetch('/api/heatmap?start_time=2023-05-01T00:00:00&end_time=2023-05-01T23:59:59') .then(res => res.json()) .then(data => { // 构建 GeoJSON FeatureCollection const features = data.grid_data.map(item => ({ type: 'Feature', properties: { value: item.value }, geometry: { type: 'Polygon', coordinates: [h3.h3ToGeoBoundary(item.h3_index, true)] } })) map.addSource('h3-heatmap', { type: 'geojson', data: { type: 'FeatureCollection', features } }) map.addLayer({ id: 'h3-fill', type: 'fill', source: 'h3-heatmap', paint: { 'fill-color': [ 'interpolate', ['linear'], ['get', 'value'], 0, '#e0f7fa', 50, '#4db6ac', 100, '#00695c' ], 'fill-opacity': 0.7 } }) }) }) }) </script> <template> <div ref="mapContainer" class="map-container" /> </template> <style scoped> .map-container { width: 100%; height: 500px; } </style>

关键点:h3.h3ToGeoBoundary(index, true)返回六边形顶点坐标数组(true表示闭合环),Mapbox GL JS 自动渲染为矢量多边形。颜色映射用interpolate实现渐变,避免硬编码色阶。注意:需在package.json中添加"h3-js": "^3.7.0"和"mapbox-gl": "^2.15.0",且 Mapbox 需申请免费 token(官网注册即可,毕业设计用量完全免费)。

3.3 时间轴联动:Vue Composition API 实现 OD 流量动画

时空分析核心是“流”——从 A 网格到 B 网格的骑行转移。静态热力图不够,需动态 OD 矩阵。Vue 中用ref+watch实现时间滑块联动:

<!-- ODFlowView.vue --> <script setup> import { ref, watch } from 'vue' const currentTime = ref('08:00') const odData = ref([]) // 模拟 OD 数据:[{from: '8928308280fffff', to: '8928308280fffff', count: 12}] const loadODData = async (hour) => { const res = await fetch(`/api/od?hour=${hour}`) odData.value = await res.json() } watch(currentTime, (newVal) => { loadODData(newVal) }, { immediate: true }) // 生成箭头路径(简化版,实际用 Turf.js 计算大圆航线) const generateArrowPath = (fromLat, fromLng, toLat, toLng) => { const midLat = (fromLat + toLat) / 2 const midLng = (fromLng + toLng) / 2 return [[fromLng, fromLat], [midLng, midLat], [toLng, toLat]] } </script> <template> <div> <input v-model="currentTime" type="time" @change="loadODData(currentTime)" > <div v-for="flow in odData" :key="flow.id"> <svg :width="800" :height="600"> <!-- 绘制箭头路径 --> <polyline :points="generateArrowPath(flow.from_lat, flow.from_lng, flow.to_lat, flow.to_lng)" fill="none" stroke="#2196F3" stroke-width="2" marker-end="url(#arrowhead)" /> </svg> </div> </div> </template>

逻辑说明:@change触发重新请求,避免v-model频繁触发。generateArrowPath用三点贝塞尔曲线模拟流向,实际项目可用turf.bezierSpline()生成平滑曲线。毕业设计够用即可,不必追求物理级精度。


4. 避坑:时空数据分析中 4 个让答辩老师皱眉的致命错误

这些坑我在带 12 届毕业设计时反复见到,学生代码能跑通,但一问原理就露馅。以下按“现象→原因→解决”列出,字字血泪。

4.1 现象:热力图白天正常,夜间全黑

原因:原始数据timestamp字段为字符串,pd.to_datetime()默认解析为本地时区(如 Windows 系统为Asia/Shanghai),但服务器部署在 Ubuntu 上时,pd.to_datetime()解析为UTC,导致所有北京时间 0–5 点被映射为 UTC 时间 16–21 点(即前一天下午),过滤时被剔除。
解决:强制指定解析格式与时区,如pd.to_datetime(df['ts'], format='%Y-%m-%d %H:%M:%S').dt.tz_localize('Asia/Shanghai'),并在 DataFrame 头部打印df['ts'].dt.tz验证。

4.2 现象:同一网格在不同日期的骑行量波动极大,无法解释

原因:H3 网格分辨率设置不当。用resolution=10时,单个网格仅 0.1km²,北京五环内网格数超 500 万,少量 GPS 偏移(如 10 米)就会导致点落入相邻网格,造成“伪波动”。
解决:统一用resolution=9(约 0.5km²),并通过h3.h3_to_parent(h3_index, 8)上卷至分辨率 8 验证趋势一致性。若上卷后波动消失,则证明原分辨率过细。

4.3 现象:Vue 地图加载缓慢,Chrome 控制台报 “Failed to load resource: net::ERR_CONTENT_LENGTH_MISMATCH”

原因:FastAPI 默认返回 JSON 未启用 gzip 压缩,而时空网格数据(尤其grid_data数组)体积常超 2MB,HTTP 传输耗时激增。
解决:在 FastAPI 中启用 GZipMiddleware:

from fastapi.middleware.gzip import GZipMiddleware app.add_middleware(GZipMiddleware, minimum_size=1000)

同时确保 Nginx(若部署)配置gzip on;,前端fetch无需改动。

4.4 现象:OD 流量箭头全部指向城市边缘,明显反常识

原因:GPS 坐标未校正,GCJ02 偏移导致from_lat/from_lng与to_lat/to_lng计算的欧氏距离失真,聚类时将偏移点误判为“远距离 OD”。
解决:在 OD 提取前,对所有坐标执行gcj02_to_wgs84转换,并用geopandas的distance方法(基于球面公式)替代numpy.linalg.norm计算距离。


5. 验证你的时空分析是否靠谱:三步交叉检验法

做完所有开发,别急着打包提交。答辩老师最爱问:“你这结论,怎么证明不是噪声?”——这里给出毕业设计场景下最务实的验证方法,不依赖统计学论文,只靠三步可执行操作。

5.1 空间一致性检验:用 OpenStreetMap 边界反向约束

H3 网格是无限延伸的,但共享单车只存在于城市建成区内。若你的热力图在郊区农田、水库、山地出现高值,一定是数据或网格化出错。用 OSM 的行政边界裁剪网格:

import requests import geopandas as gpd # 下载北京市边界(GeoJSON) url = "https://raw.githubusercontent.com/giswqs/geodata/main/countries/china_provinces.geojson" beijing = gpd.read_file(url).query("name == 'Beijing'") # 裁剪时空立方体 gdf_boundary = gpd.GeoDataFrame([{'geometry': beijing.geometry.unary_union}], crs='EPSG:4326') gdf_clipped = gpd.sjoin(gdf, gdf_boundary, how='inner', predicate='within') # 重新生成时空立方体 spatiotemporal_cube_clipped = gdf_clipped.groupby(['h3_index', 'hour_bin'])['bike_id'].count().reset_index()

操作价值:裁剪后若网格数减少 30% 以上,说明原始数据含大量无效点(如测试车、维修车定位),必须在清洗阶段加入status == 'in_use'过滤。这是答辩时展示“数据质量意识”的硬证据。

5.2 时间合理性检验:工作日 vs 周末的峰谷比必须 > 2.5

共享单车出行有强周期性:工作日早晚高峰明显,周末午间平稳。若你的分析中“工作日 8 点骑行量 / 周末 8 点骑行量” < 2.5,说明时间校正或状态过滤失败。快速验证脚本:

# 计算工作日(周一至周五)与周末(周六、周日)的小时均值比 weekdays = spatiotemporal_cube[ spatiotemporal_cube['hour_bin'].dt.weekday.isin([0,1,2,3,4]) ].groupby('hour_bin').agg({'trip_count': 'mean'}).reset_index() weekends = spatiotemporal_cube[ spatiotemporal_cube['hour_bin'].dt.weekday.isin([5,6]) ].groupby('hour_bin').agg({'trip_count': 'mean'}).reset_index() # 取 8 点整点比较 weekday_8 = weekdays[weekdays['hour_bin'].dt.hour == 8]['trip_count'].iloc[0] weekend_8 = weekends[weekends['hour_bin'].dt.hour == 8]['trip_count'].iloc[0] ratio = weekday_8 / weekend_8 if weekend_8 > 0 else float('inf') print(f"工作日8点 vs 周末8点骑行量比:{ratio:.2f}") # 合理区间:2.5–8.0

判断标准:若 ratio < 2.5,检查是否漏掉了status过滤(周末更多车辆处于停放状态,未计入骑行事件);若 ratio > 8.0,检查时间戳是否被错误放大(如timestamp是毫秒级 Unix 时间戳但当秒级解析)。

5.3 OD 流量可信度检验:用“逆向 OD”验证方向性

真正的骑行流应满足:从住宅区(早高峰出发)→地铁站→商务区(晚高峰反向)。若你的 OD 矩阵中,“A 网格到 B 网格”的流量远高于“B 到 A”,但 A 是 CBD、B 是居民区,则方向反了。用 H3 父网格聚类识别功能区:

# 获取每个 H3 网格的父网格(resolution=7,约 11km²) spatiotemporal_cube['h3_parent'] = spatiotemporal_cube['h3_index'].apply( lambda x: h3.h3_to_parent(x, 7) ) # 统计各父网格的日均骑行量(出发量) outflow = spatiotemporal_cube.groupby('h3_parent')['trip_count'].sum().sort_values(ascending=False) top_outflow = outflow.head(10).index.tolist() # 出发热点(住宅区) # 统计到达量 inflow = spatiotemporal_cube.groupby('h3_parent')['trip_count'].sum().sort_values(ascending=False) top_inflow = inflow.head(10).index.tolist() # 到达热点(商务区) # 检查 top_outflow 与 top_inflow 是否分离 if len(set(top_outflow) & set(top_inflow)) < 3: print("✅ OD 方向合理:出发区与到达区分离") else: print("⚠️ 需检查:出发与到达热点重叠过多,可能未过滤停放状态")

为什么有效:H3 分辨率 7 的网格足够大,能覆盖典型功能区(一个网格≈一个街道)。若出发与到达热点高度重合,说明大量“停放中”状态被误计为“骑行中”,导致 OD 流失真。这是答辩时展示“业务理解深度”的黄金时刻。

最后说句实在话:我带过的毕业设计里,80% 的“创新点”其实藏在数据清洗的第 3 行代码里——不是模型多炫,而是你敢把pd.read_csv()后的第一行df.dropna()改成df = df[df['lat'].between(39.5, 40.5) & df['lng'].between(116.0, 116.8)],并写清楚为什么选这个经纬度范围。时空数据分析没有银弹,只有把 GPS 点当真事办的较真劲。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/2 3:21:07

频率域图像处理核心梳理:从傅里叶变换到滤波器设计实战

频率域图像处理大概是整门数字图像处理课里最“劝退”的一章&#xff0c;很多同学学到傅里叶变换就开始懵&#xff0c;往后越听越像天书。但有意思的是&#xff0c;这一章在考试里占分不小&#xff0c;而且在工程实践里非常有用。我当年复习这一章的时候&#xff0c;踩过不少坑…

作者头像 李华
网站建设 2026/10/2 3:21:02

Docker网络排查实战:从bridge隔离到macvlan踩坑指南

经常有同事把容器跑起来以后&#xff0c;网络一不通就来找我。问得最多的不是某个命令怎么写&#xff0c;而是一堆困惑&#xff1a;为什么两个容器在同一个 docker network 里能互相 ping 通&#xff0c;换成默认 bridge 就不通了&#xff1f;为什么容器里看到的 IP 和宿主机对…

作者头像 李华
网站建设 2026/10/2 3:20:25

PSO粒子群算法优化FCM模糊聚类:Matlab实现居民用电行为用户分群

最近在整理智能用电数据分析的一个项目&#xff0c;核心任务是用粒子群算法&#xff08;PSO&#xff09;优化FCM模糊聚类&#xff0c;对居民用电行为做用户分群&#xff0c;全程用Matlab实现。这个组合在电力大数据方向不算新鲜&#xff0c;但实操中真正能跑通、能解释业务结果…

作者头像 李华
网站建设 2026/10/2 3:19:10

Flutter鸿蒙迁移实战:json_reflectable在AOT下的序列化适配与踩坑

上个月把公司的 Flutter 主 App 往鸿蒙端做迁移&#xff0c;UI 层、路由层、状态管理很快就通了&#xff0c;真正让我卡了将近一周的&#xff0c;反而是最不起眼的 JSON 序列化。项目里统一用 json_reflectable 处理模型转换&#xff0c;模型类标了一堆注解&#xff0c;跑 buil…

作者头像 李华
网站建设 2026/10/2 3:16:21

搜聚合网站源码部署:多源并发、SEO优化与常见坑位全解析

简介&#xff1a;这套源码包是面向新手与非技术用户的轻量级实时热搜聚合网站源码&#xff0c;无需数据库、开箱即用&#xff0c;可快速搭建集多平台热搜、分类筛选、关键词搜索、天气预报、访问统计于一体的聚合导航站点。功能上兼顾响应式布局与缓存加速&#xff0c;并针对站…

作者头像 李华
网站建设 2026/10/2 3:16:19

配电柜光按钮目标检测:700张图玩转YOLO小样本训练

简介&#xff1a;配电柜光按钮检测数据集面向工业环境中配电柜光按钮的自动识别与状态分析&#xff0c;适用于机器学习工程师、算法研究人员及电力维护人员。数据集包含769张不同角度和光照条件下的真实场景图像&#xff0c;每张均配有VOC标准格式的xml标注文件&#xff0c;共计…

作者头像 李华