用 Python 做一个“能用”的AI图片识别(手写数字)
用 Python做一个“能用”的AI图片识别(手写数字)
想写一段真正像“人工智能”的 Python 代码?最经典、最容易跑通的例子就是:图片识别。这篇给你一个精简但完整的方案:用 scikit-learn 训练一个手写数字识别模型(0–9),包含训练、评估、保存与预测。代码短、逻辑清晰,适合快速入门与改造成你自己的项目。
思路概览
我们用现成的 digits 数据集(8×8 灰度图):
- 读取数据集(图片 + 标签)
- 划分训练/测试集
- 训练一个分类器(SVM)
- 评估准确率
- 保存模型
- 加载模型对新图片做预测
可运行代码(训练 + 保存 + 预测)
# -- 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