FarbeDex: a colour picker that only works outside (and never needs the internet)
밖에서만 작동하고 인터넷도 필요 없는 컬러 피커, FarbeDex
FarbeDex는 야외 사진에서 팔레트를 추출해 저장하는 오프라인 Android 앱입니다. 색 추출은 OKLab 기반 k-means로 처리하고, Gemma 3와 MobileCLIP은 색 이름 짓기와 장면 판별을 맡습니다. 저장한 색은 CSS, Tailwind, JSON 등으로 내보냅니다.
- 주제
AI 요약
FarbeDex는 야외에서 마주친 색을 포착해 디자인 작업에 쓰도록 만든 Android 앱입니다. 앱 카메라로 풍경을 찍으면 장면에서 최대 7개 색과 각 색이 차지하는 비율을 보여줍니다. 색 추출과 장면 판별, 이름 생성은 휴대전화에서 실행하므로 인터넷 연결이나 계정이 필요하지 않습니다. 사진을 가져오는 기능은 없으며, 손떨림과 새로 촬영했는지 확인하고 모델로 화면이나 실내 사진을 걸러냅니다.
색 추출과 도감 구성
색 추출에는 AI 모델 대신 OKLab 색 공간의 k-means 군집화를 씁니다. OKLab은 사람이 느끼는 색 차이를 반영하도록 설계된 색 공간입니다. 같은 사진을 넣으면 같은 팔레트가 나오며, 색은 151개 항목으로 나뉩니다. 중립색 7개와 16개 색상 계열, 3단계 명도, 3단계 채도 구간으로 구성합니다. 개발자는 sRGB 색 공간 전체를 훑는 테스트로 151개 항목을 모두 실제로 얻을 수 있는지 확인했습니다.
희귀도는 자연에서 해당 색을 얼마나 자주 볼 수 있는지에 따라 정합니다. 초록과 회색은 흔하고 선명한 파랑과 보라색은 드물다는 기준을 적용합니다. 등급별 항목 수는 Common 42개, Uncommon 42개, Rare 37개, Legendary 21개, Mythical 9개입니다. 한 번 촬영할 때마다 사용자가 색 두 개를 골라 도감에 추가합니다. 희귀 색에는 특별 공개 연출이 붙고, 각 색에는 400분의 1 확률로 금색 테두리와 반짝임, 직접 만든 짧은 음악이 적용됩니다.
작은 모델의 역할을 제한합니다
Gemma 3 270M은 llama.cpp로 휴대전화에서 실행하며, 모델 파일은 253MB입니다. 새 색의 이름과 팔레트의 한 단어 분위기, 인터페이스에서 팔레트를 쓰는 팁을 생성합니다. 개발자는 모델에 자유 형식 문장을 맡기지 않습니다. JSON Schema를 문법으로 컴파일해 출력 형식을 제한하고, 어떤 색에 이름을 붙일지도 지정합니다. 모델이 색 이름을 잘못 붙이지 않도록 색상 단어는 생성 대상에서 제외합니다. 예를 들어 모델은 ‘Rooftop Morning’처럼 분위기 있는 이름을 쓰고, 앱이 실제 색상명인 ‘Blue’를 덧붙입니다.
생성한 이름은 길이와 중복 여부, 금칙어를 검사합니다. 검증에 실패하면 이유를 붙여 한 번 더 요청하고, 다시 실패하면 ‘Vivid Pale Blue’ 같은 기본 이름을 씁니다. 따라서 이름 생성이 실패해도 앱 사용이 멈추지 않습니다.
장면 판별에는 MobileCLIP-S0을 ONNX Runtime으로 실행합니다. 이 모델은 사진이 실제 야외 장면인지, 무엇이 담겼는지 판단합니다. 텍스트 인코더를 휴대전화에 싣는 대신 개발자가 미리 만든 라벨 임베딩을 함께 배포합니다. 기기에서는 이미지 임베딩 하나를 계산한 뒤 라벨과의 내적을 비교합니다. 화면과 집 안 풍경이 확실할 때만 거부하도록 해 발코니와 옥상, 화분은 촬영 대상으로 인정합니다. 색과 맞지 않는 사물 이름도 배제합니다.
구현 과정에서 고친 판별 오류
MobileCLIP의 int8 양자화 버전은 해변과 호수, 사바나 사진까지 화면으로 분류했습니다. 개발자는 23MB 크기의 fp16 파일로 바꿔 문제를 해결했습니다. 발코니와 옥상 사진이 실내로 거부되던 문제에는 기본적으로 촬영을 허용하고, 화면이나 실내라고 확신할 때만 거부하도록 판정 방향을 바꿨습니다. 하늘을 ‘fern’으로 부르던 오류는 사물별 프롬프트를 늘리고, 이름이 사진의 실제 색과 맞는지 확인하는 규칙을 추가해 고쳤습니다.
오프라인 사용과 내보내기
두 모델의 파일 크기는 합쳐서 276MB이며, 비행기 모드에서도 실행합니다. 사진은 업로드하지 않고 앱이 요청하는 권한은 카메라뿐입니다. 포착한 팔레트는 이미지 카드, HEX, CSS 사용자 지정 속성, Tailwind 색상 설정, JSON 디자인 토큰으로 내보낼 수 있습니다. WCAG 대비표는 팔레트의 색 조합 가운데 본문 텍스트에 쓸 수 있는 조합을 표시합니다. 저장소에는 프롬프트와 라벨, 판정 기준이 공개되어 있으며, 프로젝트는 279개 테스트를 통과합니다.
원문: dev.to / 번역·요약: Trawling