搭建自动驾驶RC车:如何将Pi Camera拍摄的图片转为data_test.npz用于神经网络训练?
把自动驾驶RC车的图片转换成data_test.npz的方法
嗨,我来帮你搞定这个问题!不管是处理已经拍好的数百张图片,还是优化现有脚本直接生成训练用的npz文件,我都给你整理好步骤啦。
一、处理已有的direction.jpg图片生成npz文件
如果已经有一堆命名为direction.jpg(比如forward.jpg、left.jpg这类)的图片,咱们可以写个脚本批量读取并转换成numpy数组,再保存成npz格式:
步骤1:导入所需库
首先确保你已经安装了numpy和Pillow(或者用OpenCV也行,这里用Pillow更简单):
pip install numpy pillow
步骤2:批量转换脚本
import numpy as np from PIL import Image import os def images_to_npz(image_dir, output_file="data_test.npz"): # 存储图片数据和对应的标签 images = [] labels = [] # 遍历图片目录里的所有文件 for filename in os.listdir(image_dir): # 只处理jpg文件 if filename.endswith(".jpg"): # 从文件名提取方向标签(比如"forward.jpg"提取"forward") label = filename.split(".")[0] # 读取图片并转换成numpy数组 img_path = os.path.join(image_dir, filename) img = Image.open(img_path).convert("RGB") # 确保是RGB格式 img_array = np.array(img) # 添加到列表 images.append(img_array) labels.append(label) # 转换成numpy数组 images_np = np.array(images) labels_np = np.array(labels) # 保存成npz文件 np.savez(output_file, images=images_np, labels=labels_np) print(f"成功生成{output_file},包含{len(images_np)}张图片和对应标签") # 使用示例:替换成你的图片所在目录 images_to_npz("./rc_car_images")
这个脚本会把所有图片转换成numpy数组,同时提取文件名里的方向作为标签,最后打包成data_test.npz——你可以用np.load("data_test.npz")来加载,里面的images是图片数组,labels是对应的方向标签。
二、优化现有拍照脚本,直接生成npz(更高效)
如果你还在收集数据,其实可以不用先存成大量jpg文件,直接在拍照时把图片数据和标签存在内存里,最后一次性保存成npz,这样能节省磁盘空间和后续转换的时间:
修改你的现有脚本,添加数据收集的逻辑:
#!/usr/bin/env python import pygame import picamera import io import numpy as np from PIL import Image import configuration # 你的配置文件 def interactive_control(): """Runs the interactive control""" setup_interactive_control() clock = pygame.time.Clock() # 初始化数据收集列表 collected_images = [] collected_labels = [] with picamera.PiCamera() as camera: # 可以添加相机配置,比如分辨率 camera.resolution = (640, 480) camera.start_preview() command = 'idle' duty_cycle = configuration.INITIAL_PWM_DUTY_CYCLE while True: up_key, down, left, right, change, accelerate, decelerate, stop = get_keys() print(command) stream = io.BytesIO() camera.capture(stream, format='jpeg', use_video_port=True) # 这里不再存成jpg,而是直接转换成numpy数组 stream.seek(0) img = Image.open(stream).convert("RGB") img_array = np.array(img) collected_images.append(img_array) collected_labels.append(command) # 可以添加一个退出条件,比如按下某个键就保存并退出 if stop: # 假设stop键是退出控制 break stream.flush() clock.tick(1) # 每秒拍一张,和你原来的逻辑一致 # 退出后保存成npz文件 images_np = np.array(collected_images) labels_np = np.array(collected_labels) np.savez("data_test.npz", images=images_np, labels=labels_np) print(f"数据已保存到data_test.npz,共{len(images_np)}条数据") pygame.quit() def setup_interactive_control(): """Setup the Pygame Interactive Control Screen""" # 这里补充你原有的初始化代码,比如pygame初始化 pygame.init() # 其他设置... def get_keys(): """读取按键输入,返回各按键状态""" # 这里补充你原有的按键读取逻辑 keys = pygame.key.get_pressed() up_key = keys[pygame.K_UP] down = keys[pygame.K_DOWN] left = keys[pygame.K_LEFT] right = keys[pygame.K_RIGHT] change = keys[pygame.K_c] accelerate = keys[pygame.K_a] decelerate = keys[pygame.K_d] stop = keys[pygame.K_ESCAPE] # 比如用ESC键停止并保存 return up_key, down, left, right, change, accelerate, decelerate, stop def main(): """Main function""" interactive_control() if __name__ == '__main__': main()
这样修改后,你运行脚本控制车辆时,会实时把图片和方向标签存在内存里,按下停止键(比如ESC)后就会自动生成data_test.npz,不用再单独转换啦。
小提示
- 如果图片分辨率太高,训练时会很慢,你可以在读取或拍照时把图片resize到合适的大小,比如
img = img.resize((128, 96)),这样能减少数据量。 - 标签如果需要转换成数字(比如神经网络常用的one-hot编码),可以在保存前处理:比如用字典把
forward映射成0,left映射成1,以此类推。
内容的提问来源于stack exchange,提问作者Harsh R
相关产品推荐
相关产品推荐

