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的核心操作分成三类:
- 创建数组:np.array()、np.zeros()、np.ones()、np.random.randn()
- 形状操作:reshape、transpose、squeeze、expand_dims
- 数学运算:矩阵乘法(@或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,自己写循环去缩放图像,那得多慢?
本章知识体系
下面这张图总结了本章的核心内容。你可以把它当作一个快速索引:
好了,这一章的内容就到这里。你不需要一次性记住所有函数,先有个印象就行。后面每一章都会反复用到这些工具,用着用着就熟了。
可可精品资料库