AIGlasses_for_navigation数据预处理教程:使用Python爬虫构建训练数据集
AIGlasses_for_navigation数据预处理教程使用Python爬虫构建训练数据集你是不是也对那些能帮人导航的智能眼镜感到好奇它们是怎么“看见”路然后告诉你怎么走的其实这背后离不开一个关键步骤给模型“喂”足够多、足够好的训练数据。今天我们就来聊聊怎么用Python爬虫亲手为这类导航模型准备一份“口粮”。简单来说我们要做的就是从公开的地图服务或者仿真环境里自动抓取大量的街景图片并且给这些图片打上“应该往哪走”的标签。这听起来有点复杂但别担心我会带你一步步走完整个过程从写爬虫、应对反爬到清洗数据、转换格式最后得到一个可以直接用来训练模型的数据集。整个过程就像一次有趣的数字探险准备好了吗我们开始吧。1. 准备工作明确目标与搭建环境在开始写代码之前我们得先想清楚两件事我们要什么数据以及我们需要准备哪些工具首先数据目标要明确。对于导航模型比如AIGlasses_for_navigation它通常需要两种核心数据场景图像第一人称视角的街景、路口、室内走廊等图片模拟人眼看到的环境。路径点或方向标签对应每张图片模型应该输出的导航指令比如“向前直行”、“左转30度”、“右前方有障碍物”等。这个标签可能是一个角度值、一个坐标点或者一个简单的动作分类。我们的爬虫任务就是去自动获取大量这样的“图片-指令”配对数据。接下来是工具准备。你需要一个Python环境我推荐使用Python 3.8或以上版本。然后我们通过pip安装几个必不可少的库pip install requests beautifulsoup4 selenium pillow pandas numpy我来简单介绍一下它们的分工requests和beautifulsoup4这对黄金搭档负责从静态网页上抓取数据和解析HTML速度快适合结构简单的页面。selenium当目标网站的数据是通过JavaScript动态加载时比如很多地图服务它就派上用场了。它能模拟真实浏览器操作“看到”完整的页面内容。PIL (Pillow)Python的图像处理库用来处理和保存我们爬取到的图片。pandas和numpy数据处理的利器后续清洗和整理标签数据时会非常方便。安装好这些你的“数字矿工”工具箱就基本齐全了。2. 爬虫实战获取场景图像与路径信息这一节是核心我们将动手编写爬虫。为了覆盖不同情况我会介绍两种常见的方法。2.1 方法一从公开地图API获取街景数据许多在线地图服务提供街景API这是获取高质量、标注准确带有GPS坐标和视角场景图的理想来源。这里以获取静态街景图为例。重要提示在使用任何公开API前请务必仔细阅读其服务条款遵守调用频率限制并尊重版权。通常需要申请一个免费的API密钥。import requests import os import time # 你的API密钥需要去对应平台申请 API_KEY YOUR_API_KEY_HERE # 存储图片的文件夹 SAVE_DIR ./streetview_images os.makedirs(SAVE_DIR, exist_okTrue) def fetch_streetview_image(latitude, longitude, heading, pitch0, fov90, size600x400): 从街景API获取一张指定位置和视角的图片。 参数: latitude, longitude: 经纬度 heading: 相机水平朝向 (0-360度北为0) pitch: 相机垂直角度 (-90到90默认0为水平) fov: 视野范围 (1-120默认90) size: 图片尺寸 # 这里以某个公开地图服务的API端点为例实际需替换 base_url https://maps.googleapis.com/maps/api/streetview params { size: size, location: f{latitude},{longitude}, heading: heading, pitch: pitch, fov: fov, key: API_KEY } try: response requests.get(base_url, paramsparams, timeout10) if response.status_code 200: # 生成唯一文件名包含位置和视角信息便于后续标注 filename fimg_{latitude:.6f}_{longitude:.6f}_{heading}_{pitch}.jpg filepath os.path.join(SAVE_DIR, filename) with open(filepath, wb) as f: f.write(response.content) print(f图片已保存: {filename}) # 返回图片信息和对应的“标签”这里heading就是方向标签 return { file_path: filepath, latitude: latitude, longitude: longitude, heading_label: heading, # 导航方向标签 pitch: pitch } else: print(f请求失败状态码: {response.status_code}) return None except Exception as e: print(f获取图片时出错: {e}) return None # 示例在某个坐标点每隔30度采集一张全景图片 start_lat, start_lon 40.748817, -73.985428 # 示例坐标 data_records [] for angle in range(0, 360, 30): print(f采集朝向 {angle} 度的图片...) record fetch_streetview_image(start_lat, start_lon, angle) if record: data_records.append(record) time.sleep(1) # 礼貌延迟避免请求过快这段代码能帮你围绕一个点采集不同方向的街景。heading参数值可以直接作为这张图片的初始方向标签。更复杂的标签如下一个路径点可能需要根据多个坐标计算得出。2.2 方法二使用Selenium从仿真环境或交互式地图抓取有些数据源比如一些机器人仿真平台如Gazebo、CARLA的Web可视化界面或高度交互的地图网站页面元素是动态生成的。这时就需要selenium出马。from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from PIL import Image import io import base64 def capture_simulation_view(url, save_path, element_selector): 使用Selenium打开一个仿真环境网页并截取特定视图区域的图片。 参数: url: 仿真环境网页地址 save_path: 图片保存路径 element_selector: 要截图的页面元素CSS选择器 # 设置无头浏览器模式不弹出窗口 options webdriver.ChromeOptions() options.add_argument(--headless) options.add_argument(--window-size1920,1080) driver webdriver.Chrome(optionsoptions) # 确保已安装对应ChromeDriver driver.get(url) try: # 等待特定元素加载完成 WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CSS_SELECTOR, element_selector)) ) # 找到视图元素并截图 view_element driver.find_element(By.CSS_SELECTOR, element_selector) screenshot view_element.screenshot_as_png # 用PIL处理并保存 image Image.open(io.BytesIO(screenshot)) image.save(save_path) print(f仿真视图已保存至: {save_path}) # 在实际应用中你可能需要从页面中提取当前位置、目标点等信息作为标签 # 例如position driver.find_element(By.ID, pos-label).text label extract_navigation_label_from_page(driver) # 这是一个需要你实现的函数 return {file_path: save_path, label: label} finally: driver.quit() # 示例假设我们有一个本地运行的简单导航仿真器 # capture_simulation_view(http://localhost:8080/sim, ./sim_capture/step1.jpg, #main-viewport)使用Selenium的关键在于等待页面元素加载完成并准确定位到需要截图或提取数据的位置。你可以通过浏览器开发者工具来查找这些元素的id或class。3. 应对挑战反爬策略与数据清洗爬虫不会总是一帆风顺。这一节我们解决两个常见问题网站不让爬以及爬下来的数据有点“脏”。3.1 常见的反爬措施与应对策略请求频率限制这是最普遍的。对策就是添加延迟和使用代理IP池。import random import time from itertools import cycle # 简单的随机延迟 def polite_delay(min_s1, max_s3): time.sleep(random.uniform(min_s, max_s)) # 使用代理IP示例需自行获取可用代理列表 proxies_list [http://ip1:port, http://ip2:port] proxy_pool cycle(proxies_list) def make_request_with_proxy(url): proxy next(proxy_pool) try: response requests.get(url, proxies{http: proxy, https: proxy}, timeout5) return response except: # 如果代理失败尝试下一个或使用直连 return requests.get(url, timeout5)User-Agent检测网站会检查请求头。我们可以轮换User-Agent来模拟不同浏览器。user_agents [ Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ..., Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 ..., # ... 更多浏览器UA ] headers {User-Agent: random.choice(user_agents)} response requests.get(url, headersheaders)JavaScript渲染如前所述用Selenium或Pyppeteer等工具解决。核心原则保持友好和合法。将延迟设置得合理一些不要对目标服务器造成压力。公开数据是用来促进研究和创新的而不是用来攻击的。3.2 数据清洗与初步整理爬下来的原始数据往往不能直接用我们需要进行清洗。处理破损或无效图片用PIL打开图片如果出错就删除。from PIL import Image import os def validate_images(image_dir): valid_records [] for filename in os.listdir(image_dir): if filename.endswith((.png, .jpg, .jpeg)): filepath os.path.join(image_dir, filename) try: with Image.open(filepath) as img: img.verify() # 验证文件完整性 # 可以添加更多检查如最小尺寸 if img.size[0] 50 and img.size[1] 50: valid_records.append({filename: filename, path: filepath}) else: os.remove(filepath) print(f删除尺寸过小图片: {filename}) except (IOError, SyntaxError) as e: print(f损坏图片已删除: {filename}, 错误: {e}) os.remove(filepath) return valid_records标签整理与格式化将爬取过程中记录的方向、坐标等标签信息整理成结构化的格式如CSV或JSON。import pandas as pd # 假设 data_records 是之前爬取时积累的字典列表 df pd.DataFrame(data_records) # 检查是否有空标签 df df.dropna(subset[heading_label]) # 将标签归一化到模型需要的范围例如角度归一化到[-1, 1] df[heading_normalized] df[heading_label].apply(lambda x: (x % 360) / 180.0 - 1.0) # 保存为CSV文件 df.to_csv(./navigation_dataset/metadata.csv, indexFalse) print(数据标签已保存为 metadata.csv)清洗后你应该得到一个干净的图片文件夹和一个对应的、结构化的标签文件。4. 格式转换构建模型可用的数据集最后一步我们需要把图片和标签打包成模型训练时喜欢读的格式。常见的有两种自定义文件夹CSV或者TFRecord。4.1 方案一简单的文件夹与CSV结构这是最直观的方式适合快速开始和中小型数据集。./navigation_dataset/ ├── images/ # 存放所有图片 │ ├── img_001.jpg │ ├── img_002.jpg │ └── ... ├── metadata.csv # 标签文件 └── dataset_info.json # 可选数据集描述信息metadata.csv的内容类似这样image_path,latitude,longitude,heading,heading_normalized ./images/img_001.jpg,40.748817,-73.985428,0,-1.0 ./images/img_002.jpg,40.748817,-73.985428,30,-0.833 ...在训练时数据加载器会读取CSV的每一行加载对应路径的图片和归一化后的标签。4.2 方案二使用TFRecord格式适用于TensorFlow对于大型数据集TFRecord格式能提供更高效的I/O性能。它把图片数据和标签序列化成二进制文件。import tensorflow as tf def create_tf_example(image_path, label): 将一张图片和其标签转换为一个tf.train.Example with tf.io.gfile.GFile(image_path, rb) as f: img_bytes f.read() # 获取图片尺寸可选但有时有用 img_shape tf.image.decode_image(img_bytes).shape feature { image: tf.train.Feature(bytes_listtf.train.BytesList(value[img_bytes])), label: tf.train.Feature(float_listtf.train.FloatList(value[label])), height: tf.train.Feature(int64_listtf.train.Int64List(value[img_shape[0]])), width: tf.train.Feature(int64_listtf.train.Int64List(value[img_shape[1]])), } return tf.train.Example(featurestf.train.Features(featurefeature)) def convert_to_tfrecord(csv_path, image_base_dir, output_path): 读取CSV文件将整个数据集转换为TFRecord文件 df pd.read_csv(csv_path) with tf.io.TFRecordWriter(output_path) as writer: for _, row in df.iterrows(): img_full_path os.path.join(image_base_dir, row[image_path]) label row[heading_normalized] tf_example create_tf_example(img_full_path, label) writer.write(tf_example.SerializeToString()) print(fTFRecord文件已生成: {output_path}) # 使用示例 # convert_to_tfrecord(./navigation_dataset/metadata.csv, ., ./navigation_dataset/train.tfrecord)生成TFRecord后你就可以在TensorFlow中使用高效的tf.data.TFRecordDataset来加载数据进行模型训练了。5. 总结与下一步走完这一趟你应该已经拥有一个属于自己的、为导航模型准备的初始数据集了。整个过程从确定数据需求开始到用Python爬虫从网络或仿真环境中抓取原始素材接着处理反爬虫机制、清洗无效数据最后整理成模型能直接消化的格式。最关键的是你亲手打通了从数据源头到训练输入的这个完整管道。当然这只是一个起点。数据的质量直接决定了模型性能的天花板。接下来你可以考虑从这几个方向继续深化一是扩大数据多样性去采集更多不同天气雨、雪、雾、不同时间白天、夜晚、不同场景城市、乡村、室内的图片二是提升标签的精细度比如不仅标注前进方向还可以标注场景中的关键物体如交通灯、人行道三是尝试数据增强对现有的图片进行旋转、裁剪、调整亮度等操作能有效增加数据的“厚度”让模型更鲁棒。数据处理的工作有时候会显得繁琐但当你看到自己准备的“食粮”训练出的模型能准确做出判断时那种成就感是非常实在的。希望这篇教程能帮你迈出坚实的第一步。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

相关新闻

Cosmos-Reason1-7B多场景落地:教育辅导、研发提效、合规审查三大方向详解

Cosmos-Reason1-7B多场景落地:教育辅导、研发提效、合规审查三大方向详解

Cosmos-Reason1-7B多场景落地:教育辅导、研发提效、合规审查三大方向详解 基于NVIDIA Cosmos-Reason1-7B模型开发的本地推理工具,针对逻辑推理、数学计算和编程解答等场景深度优化,纯本地运行保障数据安全 1. 工具核心能力解析 Cosmos-Reaso…

2026/7/5 0:10:45 阅读更多 →
AI净界-RMBG-1.4作品展:动漫风格图像精准分割

AI净界-RMBG-1.4作品展:动漫风格图像精准分割

AI净界-RMBG-1.4作品展:动漫风格图像精准分割 1. 项目简介 AI净界是基于BriaAI开源RMBG-1.4图像分割模型的专业级背景移除工具。这个镜像专门为需要高质量透明背景素材的用户设计,无论是设计师、电商运营者还是内容创作者,都能通过它快速获…

2026/7/5 22:57:14 阅读更多 →
Chord - Ink  Shadow 在计算机组成原理教学中的应用:智能答疑与概念图解

Chord - Ink Shadow 在计算机组成原理教学中的应用:智能答疑与概念图解

Chord - Ink & Shadow 在计算机组成原理教学中的应用:智能答疑与概念图解 1. 引言 计算机组成原理这门课,对很多学生来说,就像一座需要翻越的山。CPU流水线、缓存机制、指令周期……这些概念抽象又环环相扣,光靠书本上的文字…

2026/5/17 10:12:48 阅读更多 →

最新新闻

大型系统的依赖管理与解耦

大型系统的依赖管理与解耦

大型系统的依赖管理与解耦在软件工程领域,构建和维护大型系统是一项复杂且持续的挑战。随着业务需求的膨胀和技术的迭代,系统规模如同滚雪球般增长,模块间的耦合度往往也随之悄然攀升。最终,系统可能变得僵化、脆弱且难以演进&…

2026/7/6 1:07:31 阅读更多 →
深入理解Go语言内存模型与优化

深入理解Go语言内存模型与优化

深入理解Go语言内存模型与优化Go语言以其简洁的语法、强大的并发模型和出色的性能,在现代软件开发中占据了重要地位。然而,要真正释放Go程序的潜力,开发者必须深入理解其内存模型,并掌握相关的优化技巧。Go的内存管理虽然由垃圾回…

2026/7/6 1:05:31 阅读更多 →
松下伺服电子齿轮比计算:从脉冲当量到参数设置的 3 个实战案例

松下伺服电子齿轮比计算:从脉冲当量到参数设置的 3 个实战案例

松下伺服电子齿轮比实战指南:从脉冲当量到参数设置的深度解析在工业自动化领域,伺服系统的精度控制一直是工程师们关注的核心问题。作为松下伺服系统的关键参数之一,电子齿轮比的正确设置直接关系到设备的运动精度和响应速度。本文将从一个全…

2026/7/6 1:05:31 阅读更多 →
V4L2 零拷贝与内存分配机制

V4L2 零拷贝与内存分配机制

在 Linux 嵌入式多媒体与 AI 边缘计算(如 RK3588 平台)中,为了实现极低延迟和降低 CPU 占用,通常需要打通摄像头(Camera)、图像格式转换模块(RGA/GPU)、AI 加速器(NPU&am…

2026/7/6 1:01:30 阅读更多 →
KYC形同虚设?揭秘黑产绕过金融机构身份核验全套手法

KYC形同虚设?揭秘黑产绕过金融机构身份核验全套手法

KYC(Know Your Customer,了解你的客户)并非信贷行业的专属课题,而是数字经济时代每一个需要建立"信任关系"的商业场景所共有的核心命题。无论是金融、电商、出行还是短视频,当平台试图确认"站在对面的究…

2026/7/6 1:01:30 阅读更多 →
Agentic Testing实战:自主AI测试代理架构与实现

Agentic Testing实战:自主AI测试代理架构与实现

# Agentic Testing实战:自主AI测试代理架构与实现## 一、背景与挑战:传统测试自动化的天花板当CI/CD流水线每天触发数百次测试执行,当微服务架构的API变更频率以分钟计,传统基于录制回放或关键字驱动的测试框架逐渐暴露出结构性缺…

2026/7/6 1:01:30 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻