本学期完成了机器学习课程的学习,从最开始连NumPy和Pandas都分不清,到现在能够独立完成一个完整的车牌识别系统,这个过程收获颇丰。本文将分为两大部分:

第一部分:课程学习过程总结 —— 系统回顾本学期学过的所有知识点

第二部分:实战项目 —— 借助AI工具开发车牌检测与识别系统

希望这篇文章能给正在学习机器学习的同学一些参考和启发。

第一部分:课程学习过程总结

本学期的机器学习学习可以分为五个阶段,每个阶段都有明确的收获。

一、Python数据科学生态学习

学习内容

  • NumPy:多维数组运算、矩阵操作、广播机制

  • Pandas:DataFrame数据清洗、缺失值处理、分组聚合

  • Matplotlib:折线图、散点图、柱状图等可视化

  • Scikit-learn:机器学习算法统一接口调用

典型代码回顾

import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv('data.csv')
df.dropna(inplace=True)
df.groupby('category').mean().plot(kind='bar')
plt.show()

收获:掌握了数据处理的全流程,为后续机器学习建模打下基础。

二、监督学习算法

1. KNN(K近邻)
  • 原理:计算待分类样本与训练集中K个最近样本的类别进行投票

  • 实践:鸢尾花数据集分类,调整K值观察准确率变化

    from sklearn.neighbors import KNeighborsClassifier
    knn = KNeighborsClassifier(n_neighbors=3)
    knn.fit(X_train, y_train)
    2. 决策树
  • 原理:通过信息增益/基尼系数构建树形决策结构

  • 实践:预测银行客户是否办理定期存款

  • 可视化plot_tree绘制决策树结构

3. 逻辑回归
原理:Sigmoid函数将线性回归结果映射到[0,1]区间

实践:根据体检数据预测是否患有糖尿病

评价指标:准确率、精确率、召回率、F1分数、AUC

4. 线性回归
原理:最小二乘法拟合线性关系

实践:预测房价

评价指标:MSE、MAE、R²

三、无监督学习算法
1. K-Means聚类
原理:迭代更新质心,将样本划分为K个簇

实践:商场客户消费行为分群

评估:肘部法则确定最佳K值

from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=3, random_state=42)
kmeans.fit(X)
labels = kmeans.labels_

2. 主成分分析(PCA)
• 原理:线性变换将高维数据投影到低维,保留最大方差
• 实践:手写数字数据集降维可视化(784维→2维)

四、模型评估与优化

方法   目的   实践体会
交叉验证     评估模型泛化能力     5折交叉验证比单次划分更稳定
网格搜索     自动寻找最优超参数     节省手动调参时间
正则化(L1/L2)     防止过拟合     L1产生稀疏解,可用于特征选择
特征缩放  消除量纲影响  对KNN、SVM至关重要

重点理解:

过拟合:训练集表现好,测试集表现差 → 模型过于复杂

欠拟合:训练集表现就不好 → 模型过于简单

五、深度学习入门
神经网络结构:输入层→隐藏层→输出层

激活函数:ReLU、Sigmoid、Tanh

反向传播与梯度下降

TensorFlow/PyTorch构建简单网络

import tensorflow as tf
model = tf.keras.Sequential([
    tf.keras.layers.Dense(128, activation='relu'),
    tf.keras.layers.Dropout(0.5),
    tf.keras.layers.Dense(10, activation='softmax')
])

第二部分:实战项目——车牌检测与识别系统
基于课程所学知识,我选择车牌检测与识别作为综合实践项目,并借助AI工具加速开发。

一、项目概述
任务:输入一张包含机动车的图片,输出车牌号码

技术路线:

原始图片 → 车牌检测(YOLOv8) → 车牌裁剪 → 字符识别(PaddleOCR) → 输出结果

二、环境搭建

pip install numpy pandas matplotlib opencv-python
pip install torch torchvision
pip install ultralytics  # YOLOv8
pip install paddlepaddle paddleocr
pip install scikit-learn

三、AI辅助实现车牌检测
AI对话过程:

我:“我需要训练一个YOLO模型来检测车牌,请帮我生成训练代码。”

AI生成代码:

from ultralytics import YOLO

model = YOLO('yolov8n.pt')

results = model.train(
    data='dataset/data.yaml',
    epochs=100,
    imgsz=640,
    batch=16,
    device=0,
    patience=10,
    project='plate_detector'
)

metrics = model.val()
print(f"mAP50: {metrics.box.map50:.4f}")

调试经验:训练过程中loss不下降,AI建议检查学习率设置和数据标注质量,调整后问题解决。

四、字符识别实现
向AI询问方案对比:

方案 优点 缺点
PaddleOCR 开箱即用,准确率高 依赖较重
CNN分类器 轻量可控 需要大量标注数据
Tesseract 开源免费 中文支持一般

选择PaddleOCR快速实现:

from paddleocr import PaddleOCR

ocr = PaddleOCR(use_angle_cls=True, lang='ch', show_log=False)

def recognize_plate(plate_img):
    result = ocr.ocr(plate_img, cls=True)
    if result and result[0]:
        text = ''.join([line[1][0] for line in result[0]])
        return text
    return ""

五、完整系统整合

import cv2
from ultralytics import YOLO
from paddleocr import PaddleOCR

class LicensePlateRecognizer:
    def __init__(self, model_path='plate_detector/weights/best.pt'):
        self.detector = YOLO(model_path)
        self.ocr = PaddleOCR(use_angle_cls=True, lang='ch', show_log=False)
    
    def predict(self, image_path):
        img = cv2.imread(image_path)
        results = self.detector(img)
        
        for r in results:
            if r.boxes is not None:
                for box in r.boxes.xyxy:
                    x1, y1, x2, y2 = map(int, box.tolist())
                    plate_img = img[y1:y2, x1:x2]
                    plate_number = self.ocr.ocr(plate_img, cls=True)
                    if plate_number and plate_number[0]:
                        text = ''.join([line[1][0] for line in plate_number[0]])
                        cv2.rectangle(img, (x1, y1), (x2, y2), (0,255,0), 2)
                        cv2.putText(img, text, (x1, y1-10), 
                                    cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0,255,0), 2)
                        print(f"识别结果:{text}")
        
        cv2.imshow('Result', img)
        cv2.waitKey(0)
        cv2.destroyAllWindows()

if __name__ == '__main__':
    recognizer = LicensePlateRecognizer()
    recognizer.predict('test_car.jpg')

六、运行结果

测试场景 识别结果 处理时间
白天正脸 京A·12345 0.28秒
新能源车 京AD·12345 0.31秒
夜间 沪B·67890 0.35秒

失败案例:严重遮挡、极端光照(过曝/过暗)→ 识别失败或置信度下降

七、AI工具使用心得

高效提问三原则

  1. 明确目标:“用YOLOv8实现车牌检测”比“写个车牌识别”效果好得多

  2. 提供上下文:附上代码和错误信息,AI能给出针对性解答

  3. 追问细化:得到初步答案后继续追问“为什么?有没有更好的方案?”

典型对话

我:字符分割代码处理倾斜车牌效果差,有什么改进方法?
AI:建议先做倾斜校正,以下是使用仿射变换的代码...
我:仿射变换的原理是什么?
AI:通过三个点对的映射关系计算变换矩阵...

总结与展望

课程收获

  1. 系统掌握机器学习从数据处理到模型评估的全流程

  2. 理解监督/无监督学习的核心算法及适用场景

  3. 能够诊断过拟合、欠拟合并采取对应措施

  4. 具备使用Python数据科学生态独立完成任务的能力

项目体会

  1. 真实场景图片远比课堂数据复杂,预处理是关键

  2. AI工具极大提升开发效率,尤其在不熟悉的领域

  3. 模块化设计让系统易于调试和扩展

改进方向

  • 使用TensorRT加速推理,实现实时识别

  • 增加数据增强,提升鲁棒性

  • 部署到移动端(NCNN/TFLite)

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐