零基础实战:手把手教你用YOLOv5-Lite在树莓派上搭建数字识别系统(附完整代码与避坑指南)

1. 环境准备与硬件选择

在开始搭建数字识别系统之前,我们需要准备好合适的硬件和软件环境。树莓派作为一款小巧而强大的单板计算机,非常适合运行轻量化的深度学习模型。我推荐使用树莓派4B 4GB版本,它的处理能力足够运行YOLOv5-Lite这样的轻量化模型。

硬件方面,除了树莓派主板,你还需要一个稳定的电源适配器(至少5V/3A),一个高质量的MicroSD卡(建议32GB以上),以及一个散热外壳。树莓派在运行时会产生一定的热量,良好的散热能保证系统稳定运行。摄像头方面,我强烈建议使用免驱USB摄像头而不是树莓派专用的CSI摄像头。USB摄像头不仅线材更长、更灵活,而且方便在电脑上进行测试,排除了硬件兼容性问题。

软件环境准备分为电脑端和树莓派端。电脑端我们主要用来训练模型,树莓派端则用来部署和运行训练好的模型。在电脑上,我们需要安装Python 3.8-3.12之间的版本,推荐使用3.10版本,这个版本在兼容性和稳定性方面表现都很不错。开发工具推荐使用PyCharm社区版,它是完全免费的,而且功能足够我们使用。

# 树莓派系统初始化
sudo apt update
sudo apt upgrade -y
sudo apt install python3-pip python3-venv

2. 数据集制作与增强

数据集的质量直接决定了最终模型的性能。对于数字识别这种相对简单的任务,我们可以通过数据增强技术来大幅扩充数据集规模。我在这里分享一个实用的数据增强方法,可以将单张图片生成256张不同的变体。

首先,我们需要收集基础数字图片。你可以在白纸上用黑色马克笔写下数字1-8,然后拍照保存。每张图片最好背景简洁,数字清晰。有了基础图片后,我们就可以使用下面的代码进行数据增强了:

import cv2
import numpy as np
import os

def augment_digits(image_path, output_dir, num_augment=256):
    """
    数字图像数据增强函数
    image_path: 原始图像路径
    output_dir: 输出目录
    num_augment: 每张图像增强数量
    """
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)
    
    image = cv2.imread(image_path)
    if image is None:
        print(f"无法读取图像: {image_path}")
        return
    
    h, w = image.shape[:2]
    center = (w // 2, h // 2)
    
    for i in range(num_augment):
        # 随机旋转
        angle = np.random.uniform(-30, 30)
        M_rotate = cv2.getRotationMatrix2D(center, angle, 1.0)
        rotated = cv2.warpAffine(image, M_rotate, (w, h), 
                                borderValue=(255, 255, 255))
        
        # 随机仿射变换
        pts1 = np.float32([[w//4, h//4], [3*w//4, h//4], [w//4, 3*h//4]])
        pts2 = np.float32([
            [w//4 + np.random.uniform(-20, 20), h//4 + np.random.uniform(-20, 20)],
            [3*w//4 + np.random.uniform(-20, 20), h//4 + np.random.uniform(-20, 20)],
            [w//4 + np.random.uniform(-20, 20), 3*h//4 + np.random.uniform(-20, 20)]
        ])
        M_affine = cv2.getAffineTransform(pts1, pts2)
        transformed = cv2.warpAffine(rotated, M_affine, (w, h),
                                    borderValue=(255, 255, 255))
        
        # 随机亮度调整
        brightness = np.random.uniform(0.8, 1.2)
        transformed = np.clip(transformed * brightness, 0, 255).astype(np.uint8)
        
        # 保存增强后的图像
        output_path = os.path.join(output_dir, f"aug_{i:03d}.jpg")
        cv2.imwrite(output_path, transformed)
    
    print(f"已完成 {num_augment} 张图像增强")

# 使用示例
augment_digits("digit_3.jpg", "augmented_digits/3", 256)

这个增强方法包含了旋转、仿射变换和亮度调整,能够很好地模拟实际场景中数字可能出现的变化。记得为每个数字创建单独的文件夹存

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值