第3章:Python基础速通

说实话,很多同学一上来就问我:「老师,端到端自动驾驶是不是得把Python学到精通才行?」我的回答是:不用。你只需要掌握四个核心模块——语法基础、NumPy矩阵运算、Matplotlib画图、OpenCV图像处理。这四样东西,就像司机的方向盘、油门、刹车和后视镜,缺一不可。

我个人习惯把这一章叫做「工具箱搭建」。你不需要成为Python专家,但得会用工具。咱们直接开干。

3.1 Python语法速览——够用就行

Python语法其实很简单。我见过太多人花三个月啃语法书,结果写代码时还是卡在列表推导式上。没必要。你只需要掌握以下几点:

  • 变量与类型:int、float、str、list、dict、tuple。记住,Python是动态类型,不用声明变量类型。
  • 控制流:if-elif-else、for循环、while循环。够用。
  • 函数定义:def 关键字,参数可以设默认值。
  • 列表推导式:这玩意儿写起来很爽,比如 [x**2 for x in range(10)]。

核心原则:先写出来,再优化。别一开始就追求「Pythonic」。

举个例子。我在项目中经常需要读取一堆图片路径,然后过滤出jpg格式的。新手可能会写个for循环加if判断。但用列表推导式,一行搞定:

image_paths = ['img1.jpg', 'img2.png', 'img3.jpg']
jpg_files = [p for p in image_paths if p.endswith('.jpg')]
print(jpg_files)  # ['img1.jpg', 'img3.jpg']

嗯,这里要注意:列表推导式虽然简洁,但别嵌套太深。超过两层,可读性就下降了。我曾经在代码review时看到过四层嵌套的推导式,那简直是灾难。

3.2 NumPy与矩阵运算——自动驾驶的数学基础

自动驾驶里到处都是矩阵。图像是矩阵,点云是矩阵,神经网络里的权重也是矩阵。NumPy就是处理这些东西的神器。

我个人习惯把NumPy的核心操作分成三类:

  1. 创建数组:np.array()、np.zeros()、np.ones()、np.random.randn()
  2. 形状操作:reshape、transpose、squeeze、expand_dims
  3. 数学运算:矩阵乘法(@或np.dot)、逐元素运算、广播机制

避坑指南:我曾经在写感知模块时,因为忘记检查矩阵维度,导致矩阵乘法报错。调试了整整两个小时才发现是shape不匹配。所以,每次做矩阵运算前,先打印一下 .shape 属性。

来看一个实际例子。假设你有一个3x3的相机内参矩阵K,和一个3xN的3D点云坐标矩阵P。你想把3D点投影到2D图像平面:

import numpy as np

# 相机内参矩阵 (3x3)
K = np.array([[500, 0, 320],
              [0, 500, 240],
              [0, 0, 1]])

# 3D点云坐标 (3xN),假设有4个点
P = np.array([[1, 2, 3, 4],
              [5, 6, 7, 8],
              [1, 1, 1, 1]])

# 投影到2D
pixel_coords = K @ P  # 矩阵乘法
print(pixel_coords.shape)  # (3, 4)

你看,一行代码就完成了投影。这就是NumPy的魅力。

广播机制也是个大杀器。比如你想给所有像素值加上一个偏置:

image = np.random.randn(480, 640, 3)  # 模拟一张RGB图像
bias = np.array([0.1, 0.2, 0.3])      # 每个通道的偏置
image_corrected = image + bias        # 广播自动匹配维度

为什么会这样?因为NumPy会自动把bias的形状从(3,)广播到(480, 640, 3)。省去了写循环的麻烦。

3.3 Matplotlib数据可视化——让数据说话

做自动驾驶,你天天都要看数据。点云长什么样?检测框画得准不准?损失函数收敛了没?这些都得靠可视化。

Matplotlib是Python最经典的绘图库。我常用的就三个功能:

  • plt.plot():画折线图,适合看loss曲线
  • plt.imshow():显示图像,适合看图片和热力图
  • plt.scatter():画散点图,适合看点云投影

注意:在Jupyter Notebook里,记得加一行 %matplotlib inline,否则图不会显示。我刚开始用的时候经常忘记,还以为代码写错了。

举个例子。训练一个模型后,你想看看loss曲线:

import matplotlib.pyplot as plt

epochs = list(range(1, 11))
train_loss = [2.5, 1.8, 1.2, 0.9, 0.7, 0.5, 0.4, 0.3, 0.25, 0.2]
val_loss = [2.6, 1.9, 1.4, 1.1, 0.9, 0.8, 0.7, 0.6, 0.55, 0.5]

plt.plot(epochs, train_loss, label='Train Loss')
plt.plot(epochs, val_loss, label='Val Loss')
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.legend()
plt.title('Training and Validation Loss')
plt.show()

嗯,这里要注意:如果val_loss在某个epoch后开始上升,而train_loss还在下降,那就是过拟合了。赶紧加正则化或者早停。

3.4 OpenCV图像处理入门——自动驾驶的眼睛

OpenCV是计算机视觉的瑞士军刀。在自动驾驶里,你用它来读取图像、做预处理、画检测框、做图像变换。

我个人觉得,新手掌握以下五个函数就够了:

函数 作用 常用场景
cv2.imread() 读取图像 加载摄像头或数据集图片
cv2.resize() 缩放图像 统一输入尺寸给神经网络
cv2.cvtColor() 颜色空间转换 BGR转RGB、转灰度图
cv2.rectangle() 画矩形框 可视化检测结果
cv2.warpAffine() 仿射变换 图像旋转、平移、裁剪

来看一个完整的例子。假设你有一张道路图片,你想在上面画一个检测框:

import cv2
import numpy as np

# 读取图像(注意OpenCV默认是BGR格式)
img = cv2.imread('road.jpg')
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

# 画一个检测框:左上角(100, 200),右下角(300, 400),绿色,线宽2
cv2.rectangle(img_rgb, (100, 200), (300, 400), (0, 255, 0), 2)

# 显示图像
plt.imshow(img_rgb)
plt.axis('off')
plt.show()

避坑指南:我曾经在项目中直接用cv2.imshow()显示图像,结果发现颜色不对。后来才意识到OpenCV默认是BGR顺序,而Matplotlib用的是RGB。所以记得用cv2.cvtColor()转一下。

图像缩放也是高频操作。神经网络通常要求输入固定尺寸,比如224x224或640x640:

img_resized = cv2.resize(img_rgb, (224, 224))
print(img_resized.shape)  # (224, 224, 3)

你想想看,如果不用OpenCV,自己写循环去缩放图像,那得多慢?

本章知识体系

下面这张图总结了本章的核心内容。你可以把它当作一个快速索引:

Python基础速通 Python语法 变量·循环·函数 NumPy 矩阵·广播·运算 Matplotlib 折线·图像·散点 OpenCV 读取·缩放·绘图 数据预处理 坐标变换 结果可视化 图像处理 四者结合 = 端到端自动驾驶的编程基础

好了,这一章的内容就到这里。你不需要一次性记住所有函数,先有个印象就行。后面每一章都会反复用到这些工具,用着用着就熟了。

可可精品资料库