Oll Correct 2024-04-15 16:54 采纳率: 100%
浏览 6
已结题

如何进行手写数字图片的切割与识别?

假设我训练集和验证集用的是MNIST数据集,神经网络模型是LeNet-5,能识别一张图片上面有一个数字,现在我想实现下图中这种效果(一张图片上多个数字识别分类),这种效果能被实现吗?需要用到哪些知识?SVM还是yolo,目前尝试了轮廓提取法、SVM分类器,没弄出来

img


图片来源网络

  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-15 16:54
    关注

    引自免费微信小程序:皆我百晓生

    要实现多数字图像的识别,你需要采用一种可以检测和分类多个对象的方法。在计算机视觉中,这种方法通常被称为目标检测。对于手写数字识别,一个常用的深度学习框架是YOLO (You Only Look Once),它是一种实时的目标检测算法。不过,你也可以选择其他的检测方法,比如SSD (Single Shot MultiBox Detector) 或者 Faster R-CNN。

    首先,确保你已经安装了必要的库,包括OpenCV、TensorFlow 和 Keras。如果你还没有安装,可以通过以下命令安装:

    pip install opencv-python
    pip install tensorflow
    pip install keras
    

    接下来,我们将使用Keras构建一个基于YOLOv3的轻量级模型,因为YOLOv3模型对于速度和准确性都有很好的平衡。这里我们不从头开始训练YOLO模型,而是使用预训练的权重文件。你可以在这里下载预训练的YOLOv3模型及其配置文件:https://pjreddie.com/darknet/yolov3/

    为了处理MNIST数据集,我们需要对其进行一些调整,以便适应YOLO模型的输入要求。YOLO模型通常接受416x416像素大小的图像作为输入。因此,你需要将MNIST图像resize到这个尺寸,并且可能需要对数据进行归一化。

    以下是实现这个功能的Python代码示例:

    import cv2
    import numpy as np
    from keras.models import load_model
    from PIL import Image
    
    # 加载YOLOv3模型和配置文件
    model_path = 'yolov3.weights'
    cfg_path = 'yolov3.cfg'
    classes_path = 'coco_classes.txt'
    
    with open(classes_path, 'r') as f:
        classes = [line.strip() for line in f.readlines()]
    
    model = load_model(model_path)
    layers_names = model.get_layer('yolo_darknet').output.name
    
    # 定义YOLO层的输出边界框
    def get_yolo_boxes(boxes, scores, img_shape):
        boxes, scores, classes, valid_detections = tf.image.combined_non_max_suppression(
            boxes=tf.reshape(boxes, (tf.shape(boxes)[0], -1, 1, 4)),
            scores=tf.reshape(scores, (tf.shape(scores)[0], -1, 1)),
            max_output_size_per_class=50,
            max_total_size=50,
            iou_threshold=0.45,
            score_threshold=0.25
        )
        boxes = boxes.numpy()
        scores = scores.numpy()
        classes = classes.numpy()
        valid_detections = valid_detections.numpy()
    
        boxes *= np.array([img_shape[1], img_shape[0], img_shape[1], img_shape[0]])
        return boxes, scores, classes, valid_detections
    
    # 将图像转换为YOLO模型所需的格式
    def preprocess_image(image_path):
        image = Image.open(image_path).convert('RGB')
        image = image.resize((416, 416))
        image_array = np.array(image)
        image_array /= 255.
        image_array = np.expand_dims(image_array, axis=0)
        return image_array
    
    # 识别图像中的数字
    def detect_numbers(image_path):
        image_array = preprocess_image(image_path)
    
        # 使用YOLO模型预测
        output = model.predict(image_array)
        boxes, scores, classes, valid_detections = get_yolo_boxes(*output, img_shape=image_array.shape[:2])
    
        # 绘制边界框和标签
        result_image = image.copy()
        for i in range(valid_detections.sum()):
            if classes[i] == '0' or classes[i] == '1' or classes[i] == '2' or classes[i] == '3' or classes[i] == '4' or \
                    classes[i] == '5' or classes[i] == '6' or classes[i] == '7' or classes[i] == '8' or classes[i] == '9':
                x, y, w, h = tuple(boxes[i].astype(np.int))
                cv2.rectangle(result_image, (x, y), (x+w, y+h), (0, 255, 0), 2)
                cv2.putText(result_image, classes[i], (x, y - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
    
        return result_image
    
    # 测试函数
    detected_image = detect_numbers('your_mnist_image.jpg')
    cv2.imshow('Detected Numbers', detected_image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    your_mnist_image.jpg替换为你要检测的多数字图像路径。这段代码会加载预训练的YOLOv3模型,并对图像进行检测,然后绘制出边界框并标注出检测到的数字。

    注意,YOLO模型并不是专门针对手写数字设计的,所以可能会有一些误报。为了提高精度,你可能需要微调YOLO模型,使其更专注于手写数字的识别,这涉及到更多的计算资源和时间。另外,你还可以考虑使用其他目标检测技术,如Faster R-CNN或SSD,它们在精确度方面可能表现得更好。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 5月12日
  • 已采纳回答 5月4日
  • 创建了问题 4月15日

悬赏问题

  • ¥15 三星S21U手机,安卓14系统,ui6.1,模块问题
  • ¥15 短剧的sdk在哪里接入
  • ¥15 求:可不可以提供一些 在国内可以用,低代码不要太难 在电脑上可以下载的 制作app的软件
  • ¥60 找人回答kibana8.14.3二次集成开发,自定义插件ui导航栏如何设置
  • ¥15 fluke高精度万用表8845A型号测交流电压一直跳动,且去掉输入后显示不归零
  • ¥15 不同模型怎么用同一个shader
  • ¥15 安卓启动没有ais proxy与v4l2的log打印
  • ¥15 go怎么读取mdb文件里面的数据
  • ¥60 Matlab联合CRUISE仿真编译dll文件报错
  • ¥15 脱敏项目合作,ner需求合作