라즈베리 파이로 텐서플로와 OpenCV를 활용한 숫자 인식기 만들기
손글씨 숫자를 인식하는 딥 컨볼루션 신경망을 훈련하고, 파이 카메라, OpenCV, 텐서플로를 사용하여 라즈베리 파이에 배포하는 방법을 알아보세요.
개요
이 프로젝트에서는 데이터 준비와 모델 훈련(노트북)에서부터 파이 카메라를 이용한 실시간 숫자 인식까지 전체 AI 파이프라인을 다룹니다. 이 솔루션은 이미지 조작을 위해 Scikit-Learn과 OpenCV 3.3을, 딥러닝 구성 요소로는 Keras(텐서플로 백엔드)를 사용합니다.
MNIST 데이터셋(28×28 픽셀 그레이스케일 숫자 이미지 6만 장 훈련용, 1만 장 테스트용)을 사용합니다. 파이 카메라로 촬영한 이미지는 훈련된 네트워크에 입력되기 전에 이 형식에 맞게 전처리됩니다.
네트워크 아키텍처는 표준 컨볼루션 스택과 10개의 뉴런을 가진 완전 연결 출력 레이어로 구성되며, 각 뉴런은 0~9까지의 숫자 하나를 나타냅니다.
모델 훈련이 완료되면 가중치를 라즈베리 파이로 전송합니다. 가벼운 파이썬 스크립트가 프레임을 캡처하고, 그레이스케일 변환, 임계값 처리, 리사이징, 반전 등을 적용한 후 추론을 수행합니다.
하드웨어 설정
시연을 위해 파이 카메라를 간이 홀더(단일 숫자에 초점을 유지하는 간단한 핸드헬드 장치)에 장착했습니다. 실제로는 고정 마운트나 소형 인클로저를 사용하면 안정성이 향상됩니다.
소프트웨어 설치
라즈베리 파이에서 파이썬 가상 환경을 생성하고 필수 라이브러리를 설치하세요. 아래 명령어는 작동하는 라즈베리 파이 OS와 파이썬 3.7+이 있다고 가정합니다.
source ~/.profile
workon cv
python PiCameraApp.py --picamera 1
텐서플로 설치
pip install tensorflow
Keras 설치
pip install keras
OpenCV 3.3 설치
OpenCV는 라즈베리 파이에서 완전한 최적화를 활성화하기 위해 소스에서 컴파일해야 합니다. 단계별 가이드는 PyImageSearch에서 확인할 수 있습니다.
https://www.pyimagesearch.com/2017/09/04/raspbian-stretch-install-opencv-3-python-on-your-raspberry-pi/
마지막으로 NumPy 최적화가 포함된 PiCamera 라이브러리를 설치하세요:
pip install "picamera[array]"
모델 훈련
노트북에서 훈련 스크립트를 실행하세요(GPU가 있으면 더 좋습니다). 스크립트는 Keras에서 CNN을 정의하고, 컴파일하고, MNIST 데이터로 훈련하고, 성능을 검증한 후 가중치를 model_weights.h5에 저장합니다.
python Train_MNIST.py
NVIDIA GPU가 있다면 GPU 지원 텐서플로와 CUDA 드라이버를 설치하여 훈련을 가속화하세요. GPU가 없어도 프로세스는 완료되지만 더 오래 걸립니다.
훈련 후 model_weights.h5를 scp나 WinSCP로 파이에 전송하세요.
실시간 숫자 인식
파이에서 인식 스크립트를 실행하세요. 프로그램은 t 키를 누르면 프레임을 캡처하고 q 키로 종료합니다. 정확도는 주로 조명, 각도, 필기체 선명도에 따라 달라집니다. 깨끗하고 고대비 숫자에서 일반적으로 95% 이상의 정확도를 달성합니다.
이미지 전처리 파이프라인
- RGB 프레임을 NumPy 배열로 캡처
- 그레이스케일로 변환(두 색상 채널 제거)
- 픽셀 값을 8비트 부호 없는 정수(0~255)로 스케일링
- Otsu 임계값 처리로 깨끗한 흑백 이미지 생성
- 28×28 픽셀로 리사이즈(MNIST 입력 형태)
- 색상 반전으로 숫자가 검은 배경에 흰색으로 표시되게 함(훈련 데이터와 일치)
- 이미지를 평탄화하여 로드된 모델에 입력
모델은 길이 10의 확률 벡터를 출력합니다. 가장 높은 확률을 가진 인덱스가 예측된 숫자입니다.
핵심 요약
이 예제는 데이터 준비, 모델 훈련, 배포, 단일 보드 컴퓨터에서의 추론까지 완전한 엔드투엔드 워크플로를 보여줍니다. 코드는 GitHub에서 확인할 수 있으며, 누구나 실험하거나 시스템을 확장할 수 있습니다.
참고 자료
출처: AI Digit Recognition with PiCamera