用 Python 做一个“能用”的AI图片识别(手写数字)

用 Python做一个“能用”的AI图片识别(手写数字)

想写一段真正像“人工智能”的 Python 代码?最经典、最容易跑通的例子就是:图片识别。这篇给你一个精简但完整的方案:用 scikit-learn 训练一个手写数字识别模型(0–9),包含训练、评估、保存与预测。代码短、逻辑清晰,适合快速入门与改造成你自己的项目。


思路概览

我们用现成的 digits 数据集(8×8 灰度图):

  1. 读取数据集(图片 + 标签)
  2. 划分训练/测试集
  3. 训练一个分类器(SVM)
  4. 评估准确率
  5. 保存模型
  6. 加载模型对新图片做预测

可运行代码(训练 + 保存 + 预测)

# -- coding: utf-8 --
import joblib
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report, accuracy_score
from sklearn.svm import SVC

def train_save(model_path="digits_svm.joblib"): digits = datasets.load_digits() X, y = digits.data, digits.target # X: (n_samples, 64)

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.25, random_state=42, stratify=y
)

clf = SVC(kernel="rbf", gamma="scale", C=3.0)
clf.fit(X_train, y_train)

y_pred = clf.predict(X_test)
print("Accuracy:", round(accuracy_score(y_test, y_pred), 4))
print(classification_report(y_test, y_pred))

joblib.dump(clf, model_path)
print("✅ saved:", model_path)

def load_predict(model_path="digits_svm.joblib"): clf = joblib.load(model_path) digits = datasets.load_digits()

# 随机取几张测试图片来演示预测
for idx in [0, 10, 50, 100]:
    x = digits.data[idx].reshape(1, -1)
    pred = clf.predict(x)[0]
    print(f"Index {idx} | True={digits.target[idx]} | Pred={pred}")

if name == "main": train_save() load_predict()


这算“人工智能”吗?

算。因为它做了 AI 的核心流程:从数据中学习规律。训练过程不是写死规则,而是让模型自己找到“像 3 的像素分布”和“像 8 的像素分布”之间的差异。你可以把它理解为:模型学会了一套“数字外观特征”,以后遇到新图片就能判断它更像哪个数字。


怎么改成识别你自己的图片?

关键是把你的图片处理成和训练数据一致的输入形状:

  • digits 用的是 8×8 灰度图(64 个像素)
  • 你的图片要:灰度化 → 缩放到 8×8 → 拉平为 64 维向量

如果你未来要识别真实手机拍的手写数字,建议升级为:

  • 更大的 MNIST(28×28)数据集
  • 或用 CNN(卷积神经网络)效果更好

小结

这篇代码虽然短,但已经具备“可落地 AI”的完整闭环:训练 → 评估 → 保存 → 加载 → 推理。你可以用同样框架把任务换成:验证码识别、商品图片分类、缺陷检测(需要更强数据与模型)。

评论 0