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星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。