共计 1868 个字符,预计需要花费 5 分钟才能阅读完成。
背景介绍
3D 数据标注是计算机视觉和自动驾驶领域的重要基础工作。但在实际项目中,标注团队经常遇到数据下载效率低、文件管理混乱等问题。特别是当需要处理数百 GB 的点云数据时,手动下载和管理几乎不可行。本文将分享如何用 Python 搭建自动化下载管道,解决这些痛点。

技术方案对比
在 Python 生态中,主要有三种网络请求方案:
- requests:同步请求库,简单易用但性能一般
- aiohttp:异步请求库,性能优秀但学习曲线较陡
- 多线程 requests:平衡方案,利用线程池提升吞吐量
对于新手,建议从 requests 开始,掌握基础后再过渡到多线程方案。
核心实现:批量下载脚本
以下是基于 requests 的基础下载脚本,包含关键功能:
import os
import requests
from tqdm import tqdm # 进度条库
def download_file(url, save_path, chunk_size=1024):
"""
下载单个文件并显示进度
:param url: 文件 URL
:param save_path: 本地保存路径
:param chunk_size: 分块大小(KB)
"""
try:
# 创建目录
os.makedirs(os.path.dirname(save_path), exist_ok=True)
# 发起请求
response = requests.get(url, stream=True)
response.raise_for_status() # 检查 HTTP 错误
# 获取文件总大小
total_size = int(response.headers.get('content-length', 0))
# 写入文件并显示进度
with open(save_path, 'wb') as f, tqdm(desc=os.path.basename(save_path),
total=total_size,
unit='B',
unit_scale=True,
) as bar:
for chunk in response.iter_content(chunk_size=chunk_size):
f.write(chunk)
bar.update(len(chunk))
return True
except Exception as e:
print(f"下载失败: {e}")
return False
性能优化:多线程下载
当需要下载大量文件时,单线程会成为瓶颈。下面是改进版的多线程实现:
from concurrent.futures import ThreadPoolExecutor
def batch_download(url_list, save_dir, max_workers=4):
"""
多线程批量下载
:param url_list: 包含 (url, save_name) 的列表
:param save_dir: 保存目录
:param max_workers: 线程数
"""
with ThreadPoolExecutor(max_workers=max_workers) as executor:
futures = []
for url, filename in url_list:
save_path = os.path.join(save_dir, filename)
futures.append(executor.submit(download_file, url, save_path))
# 等待所有任务完成
for future in concurrent.futures.as_completed(futures):
future.result() # 获取结果或异常
数据管理规范
推荐按如下结构组织数据:
dataset_root/
├── raw_data/ # 原始点云文件
│ ├── sequence_01/
│ └── sequence_02/
├── labels/ # 标注文件
│ ├── sequence_01/
│ └── sequence_02/
└── meta/ # 元数据
├── calibration/
└── timestamps/
避坑指南
- 断点续传 :添加
headers={'Range': f'bytes={downloaded_size}-'}实现 - 完整性校验:对比 MD5 哈希值
- 代理设置 :在 requests 中配置
proxies参数 - 超时处理:设置
timeout=(3, 30)(连接 / 读取超时)
延伸阅读
通过这套方案,我们的标注团队将下载效率提升了 8 倍,同时保证了数据的完整性和可追溯性。建议根据实际需求调整线程数和分块大小,找到最佳性能平衡点。
正文完
发表至: 未分类
近三天内
