机器学习之数字识别

这是一个基于MNIST数据集的手写数字识别程序演示。程序使用Keras构建了一个简单的CNN模型,包含两个卷积层和池化层,可自动训练或加载已有模型。通过摄像头实时捕捉画面,在画面中央200×200区域识别数字,并显示识别结果及置信度。程序实现了图像预处理(灰度化、缩放、二值化)和实时预测功能,按q键可退出。该演示展示了从模型训练到实际应用的完整流程,适用于课堂演示数字识别的基本原理。

csharp 复制代码
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# ----------------------------------------------------------------------------
# @File     : demo3
# @Time     : 2025/10/20 17:22
# @Author   : CWB
# @Desc     : 
# ----------------------------------------------------------------------------
"""
这里写文件描述...
"""
import cv2
import numpy as np
from tensorflow.keras.models import load_model
from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical

# 1. 加载或训练模型(这里直接用 MNIST 训练一个简单 CNN)
def load_or_train_model():
    try:
        model = load_model("digit_model.h5")
        print("✅ 加载已有模型")
    except:
        print("🔄 训练新模型...")
        (x_train, y_train), (x_test, y_test) = mnist.load_data()
        x_train = x_train.reshape(-1, 28, 28, 1).astype("float32") / 255.0
        x_test = x_test.reshape(-1, 28, 28, 1).astype("float32") / 255.0
        y_train = to_categorical(y_train, 10)
        y_test = to_categorical(y_test, 10)

        from tensorflow.keras.models import Sequential
        from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense

        model = Sequential([
            Conv2D(32, (3,3), activation='relu', input_shape=(28,28,1)),
            MaxPooling2D((2,2)),
            Conv2D(64, (3,3), activation='relu'),
            MaxPooling2D((2,2)),
            Flatten(),
            Dense(64, activation='relu'),
            Dense(10, activation='softmax')
        ])
        model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
        model.fit(x_train, y_train, epochs=3, validation_data=(x_test, y_test))
        model.save("digit_model.h5")
    return model

# 2. 预处理图像:裁剪、缩放、二值化
def preprocess_roi(roi):
    roi_gray = cv2.cvtColor(roi, cv2.COLOR_BGR2GRAY)
    roi_resized = cv2.resize(roi_gray, (28, 28), interpolation=cv2.INTER_AREA)
    roi_blur = cv2.GaussianBlur(roi_resized, (5, 5), 0)
    _, roi_thresh = cv2.threshold(roi_blur, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
    roi_normalized = roi_thresh / 255.0
    return roi_normalized.reshape(1, 28, 28, 1)

# 3. 主函数:打开摄像头,识别数字
def main():
    model = load_or_train_model()
    cap = cv2.VideoCapture(0)

    print("📷 摄像头已打开,按 'q' 退出")

    while True:
        ret, frame = cap.read()
        if not ret:
            break

        # 定义 ROI 区域(中央 200x200)
        x, y, w, h = 100, 100, 200, 200
        cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
        roi = frame[y:y+h, x:x+w]

        # 预处理
        processed = preprocess_roi(roi)
        prediction = model.predict(processed)
        digit = np.argmax(prediction)
        confidence = np.max(prediction)

        # 显示结果
        cv2.putText(frame, f"Digit: {digit} ({confidence:.2f})", (x, y-10),
                    cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)

        cv2.imshow("Digit Recognition", frame)

        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

    cap.release()
    cv2.destroyAllWindows()

if __name__ == "__main__":
    main()

应老师要求,demo一个数字识别的程序,用的是公共数据集,通过摄像头获取并打印数字

相关推荐
2501_948114246 分钟前
2026年大模型API聚合平台技术评测:企业级接入层的治理演进与星链4SAPI架构观察
大数据·人工智能·gpt·架构·claude
小小工匠8 分钟前
LLM - awesome-design-md 从 DESIGN.md 到“可对话的设计系统”:用纯文本驱动 AI 生成一致 UI 的新范式
人工智能·ui
黎阳之光24 分钟前
黎阳之光:视频孪生领跑者,铸就中国数字科技全球竞争力
大数据·人工智能·算法·安全·数字孪生
小超同学你好34 分钟前
面向 LLM 的程序设计 6:Tool Calling 的完整生命周期——从定义、决策、执行到观测回注
人工智能·语言模型
智星云算力1 小时前
本地GPU与租用GPU混合部署:混合算力架构搭建指南
人工智能·架构·gpu算力·智星云·gpu租用
jinanwuhuaguo1 小时前
截止到4月8日,OpenClaw 2026年4月更新深度解读剖析:从“能力回归”到“信任内建”的范式跃迁
android·开发语言·人工智能·深度学习·kotlin
xiaozhazha_1 小时前
效率提升80%:2026年AI CRM与ERP深度集成的架构设计与实现
人工智能
枫叶林FYL1 小时前
【自然语言处理 NLP】7.2.2 安全性评估与Constitutional AI
人工智能·自然语言处理
AI人工智能+1 小时前
基于高精度身份证OCR识别、炫彩活体检测及人脸比对技术的人脸核身系统,为通信行业数字化转型提供了坚实的安全底座
人工智能·计算机视觉·人脸识别·ocr·人脸核身
小敬爱吃饭1 小时前
Ragflow Docker部署及问题解决方案(界面为Welcome to nginx,ragflow上传文件失败,Docker中的ragflow-cpu-1一直重启)
人工智能·python·nginx·docker·语言模型·容器·数据挖掘