이 글은 전체 기사의 단순화 버전입니다. 재현성을 위해 단순화했으며, 더 자세한 구현 내용은 내 블로그에서 확인하세요. 오른쪽 목차로 기술 세부사항 이동 가능. GitHub 저장소에서 코드 다운로드 가능. 먼저 프로젝트 영상으로 무엇을 하는지 확인하세요.
프로젝트 개요
인간의 색각과 유사하게 빛을 기반으로, RGB 모델은 1,600만 가지 이상의 색상을 3D 공간에 배열합니다. R, G, B 정수값(0~255)이 좌표가 됩니다. 이 모델에서 광학 전자 부품과 머신러닝 메커니즘으로 색상 감지 및 인식을 수행합니다. 핵심은 RGB LED와 CdS 셀(조도 센서)을 외부 빛에서 차폐한 조합입니다. 각각 색상별 빛을 방출하고 물체에서 반사된 강도를 감지합니다.
다층 퍼셉트론 (Multi-Layer Perceptron, MLP)
MLP는 인공신경망의 순전파 구조로 입력층(비신경), 은닉층, 출력층으로 구성. 역전파 알고리즘으로 학습하며 지도학습(예시 기반 학습) 수행.
이 컬러 센서용 신경망은 입력 3개(RGB), 은닉층 1개(뉴런 6개), 출력층 10개 뉴런으로 구성. 출력층 뉴런 수는 클래스 수(색상 10종)와 동일해야 하며 이진화된 출력을 가집니다. 이 튜토리얼에서는 이미 학습된 네트워크를 사용합니다. 학습 단계와 데이터셋詳細は 블로그 전체 글 참조.
색상 인식
학습된 MLP로 공간적으로 분리 가능한 패턴 분류/인식 수행. 학습 중 RGB 색상 공간에 영역을 매핑하여 초평면으로 분리된 각 영역이 한 색상을 대표하도록 합니다. 새로운 RGB 패턴(3D 점)이 어느 영역에 속하는지로 색상 분류.
좋은 일반화를 위해 학습 세트(원하는 출력을 가진 색상 패턴 예시)를 네트워크에 제시해 학습. 본 프로젝트용 학습 세트는 GitHub 저장소에 공개. 신경망에 관심 있다면 직접 학습해 볼 수 있는 플레이그라운드도 개발했으니 활용하세요. 아니면 구현 세부사항으로 건너뛰기.
일반화는 학습 세트가 커버하는 도메인에서 일어나므로 각 성분의 최솟값/최댓값 주의! 이 범위 밖 패턴을 입력하면 올바른 출력 보장 안 됨.
데이터셋(전체 예시) 75개 인스턴스, 0~1 범위. 원래 0~255였으나 255로 나누어 리스케일링. 데이터셋에서 출력층 뉴런 하나만 1, 나머지는 0이 되도록 라벨링. 학습된 네트워크는 실수값 출력하므로 후처리 필요:
실용적으로: 가장 큰 출력을 내는 뉴런을 1로, 나머지를 0으로.
전자 회로
감지 과정은 아트메가328(아두이노 보드)에서 실행되는 연산 회로에서 일어납니다. 아래 회로도 참조.
코드는 공통 애노드 RGB LED 기준. 본인의 RGB LED가 공통 애노드인지 확인하고, 공통 캐소드면 코드 로직 반전 필요.
중요: RGB LED에 저항 1개만 사용. 한 번에 한 색만 켜지므로 공통 애노드에 평균 저항값 연결(게으른 방식, 인정). 정확한 RGB 값 수집을 위해 캐소드 각각에 적정 저항 연결 권장. 내 방식은 패턴 왜곡은 없지만 컴퓨터 화면 색상/인간 눈과 다를 수 있음.
회로도에서 RGB LED와 CdS 셀 인접 배치 이유는 외부 빛 차폐 때문 (구형 흑색 필름 통이 최적). 캘리브레이션(프로그래밍 섹션 설명)과 인식을 위해 필수. 프로젝트 영상에서 차폐 모습 확인.
색상 이론
전자 회로의 색상 지각은 색상 이론 기반. 렌즈 없으므로 불투명하고 무광택 소재 물체만 대상, 정반사(거울 같은 반사) 피하고 난반사 활용. 입사광이 물체 색상 특성에 따라 반사됨. 예: 빨간 빛이 노란 물체에 닿으면 노란색 구성에 빨강이 많으므로 강한 반사. 파란 빛은 노란색에 파랑 성분 적어 약한 반사. RGB 가산 혼합에서 흰색=모든 색 존재, 검은색=모든 색 부재.
CdS 셀로 각 색상별 최대/최소 반사량 측정 가능 → 전자 부품 캘리브레이션 수행. 이는 충실한 감지와 안정적 패턴 감지(이상치 방지)의 핵심. 황금 팁: 캘리브레이션 후 전자 부품(특히 브레드보드 위)이나 차폐용 부품을 절대 만지거나 움직이지 마세요.
프로그래밍
캘리브레이션과 인식 시 컬러 센서는 물체가 RGB LED와 CdS 셀에 노출되면 3회 반복 실행. 1회차: 빨간 빛 조사 → CdS 안정화 대기 → 아날로그 입력 읽어 빨간 반사율 저장. 녹색, 파란색도 동일 반복. 색상 이론 그림이 이 반복 과정 시각적 설명.
캘리브레이션은 위 반복을 2회 수행: 검은색 한번, 흰색 한번. 색상 이론 설명대로 최대/최소 반사(초기 0~1023 범위) 구해 실제 범위 산출, [0, 255](표시용)와 [0, 1](신경망 입력용)로 리스케일링.
조도 센서 안정화 대기 시간은 부품마다 다를 수 있으므로 넉넉히 잡기(내 경우 500ms). 처음에는 크게 잡고 서서히 줄여 불안정 직전까지 테스트 권장.
감지 시 수집된 RGB 값(0~1 범위)을 MLP에 입력해 실제 색상 인식 수행. 아두이노에서 MLP 실행을 위해 Neurona 라이브러리 사용(직접 작성, 아두이노 라이브러리 매니저에서 설치 가능). 자세한 건 이 포스트 참조.
네트워크는 이미 학습 완료돼 프로젝트 코드에 가중치 내장돼 있음. 플레이그라운드에서 학습 후 조정된 가중치를 코드에 임베드해 Neurona로 바로 동작.
테스트
데이터셋에서 일부 색상 추출해 인식 테스트:
그림 밖 숫자는 식별 번호, 안쪽 숫자는 오분류된 색상 번호. 잉크젯 프린터로 복사지에 인쇄한 색상 사용(영상 초반 작은 종이 조각 참조) - 불투명 소재로 색상 감지에 적합.
코드
컬러 센서 프로토타입
아두이노 업로드 코드는 colorSensor 폴더 안에 있습니다. 전자 회로가 위 회로도대로 구성됐고 Neurona 라이브러리가 아두이노 라이브러리 매니저에서 정상 설치됐는지 확인하세요.