WildLens: 야외에서 발견한 것을 알려주는 오프라인 필드 노트
요약
WildLens는 야외에서 발견한 사물(식물, 동물 등)을 식별해주는 오프라인 필드 노트 PWA입니다. 기기 내에서 작동하는 오픈 웨이트 비전 모델을 사용하여 사진 업로드 없이도 추측 결과를 제공하며, 사용자 경험에 '관찰'과 '노트 기록'의 요소를 결합했습니다.
핵심 포인트
- 오프라인 우선(Offline-first)으로 설계되어 네트워크 연결이 필요 없습니다.
- 기기 내에서 작동하는 오픈 웨이트 비전 모델을 사용합니다.
- 단순한 식별을 넘어 관찰 과제와 노트 저널링 경험을 제공합니다.
- 사용자에게 '필드 노트' 같은 차분하고 아날로그적인 느낌을 줍니다.
이 내용은 Hacktoberfest 오픈소스 AI 챌린지 주간 1: 풀밭에 발을 디디다 (Touch Grass) 제출물입니다.
제가 만든 것
WildLens는 휴대폰 브라우저에서 작동하는 작은 야외 노트(field notebook)입니다. 카메라를 식물, 새, 동물 또는 곤충에 비추면 무엇을 보고 있는지 추측하여 알려줍니다. 이 식별 과정은 전적으로 기기 내에서 실행되므로 사진이 절대 업로드되지 않으며, 모델 다운로드가 완료되면 신호가 없어도 계속 작동하도록 구축되었습니다.
저는 개발자이기 때문에 사람들에게 화면에서 벗어나게 하는 앱을 만든다는 역설(irony)을 잘 알고 있습니다. 그래서 제가 원했던 것은 화면 사용 시간이 경험의 가장 짧은 부분이 되는 것이었습니다. 산책 중에 무언가를 발견하고, 사진을 찍고, 몇 초 만에 이름을 얻은 다음, 휴대폰을 주머니에 넣는 것입니다. 모든 결과에는 또한 "더 자세히 보기(Look closer)"라는 짧은 프롬프트가 함께 제공되어, 작은 관찰 과제를 통해 사진을 실제 사물을 계속 바라볼 이유로 바꿉니다.
또한, 이 앱이 추측에 의존하는 것을 원하지 않았습니다. WildLens가 확신하지 못할 때는 그렇게 말합니다. 자신감 넘치는 답변 하나를 보여주는 대신 상위 세 가지 추측(top three guesses)을 보여주며, 사진에서 살아있는 대상(living subject)을 찾을 수 없다면 사용자에게 알려줍니다. 위험한 물체에는 안전 관련 메모가 제공되며, 모든 식물에는 하나의 확정된 규칙이 있습니다: 사진만으로 절대 아무것도 먹지 마십시오.
발견한 내용은 사용자 자신의 노트와 선택적으로 근사치 위치(approximate location)와 함께 로컬 필드 저널에 저장할 수 있습니다. 이는 기기에 남아 있으며, 원할 때 내보내거나 지울 수 있습니다.
저는 의도적으로 차분한 느낌을 주었습니다: 양피지 배경, 은은한 녹색, 과학적 이름에는 세리프(serif) 글꼴, 그라디언트 없음. 이것이 주의를 끌기 위해 애원하는 또 다른 앱처럼 느껴지지 않고 노트처럼 느껴져야 합니다.
이 앱은 오솔길이나 정원에 서서 "저게 뭐지?"라고 궁금해했던 모든 사람을 위한 것입니다.
데모
실시간 앱: https://wildlens-57g9.onrender.com/
가장 좋은 성능은 휴대폰에서 발휘됩니다. 앱을 열고 카메라 접근 권한을 허용한 다음, 처음 실행할 때 Wi-Fi를 통해 모델(약 330MB)을 다운로드하게 하세요. 이것은 일회성 다운로드이며, 이후 모델은 브라우저 캐시에 저장됩니다.
야외 사용 후기:
저는 정원에 있는 식물들과 항상 찾아오는 작고 귀여운 고양이를 식별해 보려고 했습니다. 그리고 밖에 나갔을 때도 제가 본 꽃들을 식별하고 저널에 기록했는데, 꽤 잘 작동했고 정말 놀라웠습니다.
코드
GitHub logo Esu05 / WildLens
식물, 새, 동물 또는 곤충을 식별하기 위해 집 밖으로 나가게 하는 차분한 필드 노트 같은 외근용(field notebook) 모양의 모바일 우선, 오프라인 우선 PWA.
WildLens
휴대폰을 식물, 새, 동물 또는 곤충에 비추어 무엇인지 알아내세요. 오픈 웨이트 (open-weight) 비전 모델이 브라우저 내부에서 실행되므로 사진이 기기를 벗어나지 않습니다.
WildLens는 차분한 '필드 노트' 모양을 가진 모바일 우선, 오프라인 우선 PWA입니다. DEV의 '풀잎 냄새 맡기(Touch Grass)' 챌린지에 맞춰 제작되었는데, 이는 밖에 나가 주변에 사는 것들을 자세히 보고 기록할 구실이 됩니다.
주요 기능 (Features)
- 장치 내 식별 (On-device identification). 모델은 WebAssembly를 사용하여 브라우저에서 실행됩니다. 아무것도 업로드되지 않습니다.
- 솔직한 불확실성 (Honest uncertainty). 결과는 확신(confident), 불확실(uncertain, 상위 3개 후보와 그룹에 대한 최적 추측 등 고양이과 같은) 또는 '대상 없음(no subject found)'으로 표시됩니다. 앱은 절대 추측을 강요하지 않습니다.
- 안전 정보 (Safety notes). 위험한 모든 것에 대해 표시됩니다. 식물에는 항상
AI의 핵심은 Imageomics Institute(MIT 라이선스)에서 개발한 개방형 가중치(open-weight) 비전 모델인 BioCLIP입니다. 이 모델은 생명의 나무 전체에 걸친 생물다양성 이미지를 이용해 훈련되었습니다. 저는 Google Colab에서 이 이미지 인코더를 ONNX 형식으로 한 번 내보냈고, 앱은 이를 브라우저에서 ONNX Runtime Web(WebAssembly)을 사용하여 실행합니다. 서버나 API 키가 필요 없습니다.
식별 과정은 다음과 같이 작동합니다. 사진이 중앙 크롭되고 정규화되면, 인코더는 이를 벡터로 변환하고, 이 벡터를 각 종에 대해 미리 계산된 벡터와 비교합니다. BioCLIP은 전체 분류학적 이름(full taxonomic names)에 가장 잘 반응하므로, 작은 빌드 스크립트가 GBIF에서 모든 종을 조회하여 "a photo of"라는 문구와 분류학적 문자열을 임베딩합니다. 이 텍스트 임베딩은 작은 파일로 전송되므로, 휴대폰은 모델의 이미지 부분만 실행하면 됩니다. 소프트맥스(softmax)는 유사도를 확률로 변환하며, "자연이 아닌 것(not nature)" 프롬프트 세트는 종으로 간주되어서는 안 되는 사진들(예: 거실을 게코로 보고하는 경우)을 걸러냅니다. 단일 종이 명확하게 승리하지 못할 때는 점수 계산이 속(genus), 과(family), 목(order), 강(class)별 확률을 합산하여, 잘못된 종보다는 "아마도 이 과일 것이다"와 같이 추론할 수 있게 합니다.
모델 파일은 GitHub에 담기에는 너무 크기 때문에 Hugging Face 모델 저장소에 보관되어 있습니다. 앱은 이를 한 번 다운로드하여 브라우저 캐시에 유지합니다. 앱 자체는 Render의 정적 사이트입니다.
첫 번째 버전은 제대로 작동하지 않았습니다. 저는 Transformers.js를 통해 OpenAI의 CLIP(ViT-B/32, 8-bit)으로 시작했지만, 거의 매번 잘못되었습니다. 레이블 목록을 확장하고, 프롬프트를 재작성했으며, 고양이와 치타를 분리하기 위해 프롬프트 앙상블링(prompt ensembling)을 시도했습니다. 모든 조정이 조금씩 도움이 되었지만, 근본적인 문제—CLIP은 범용 모델이고 BioCLIP은 실제로 생물학 지식을 가지고 있다는 점—는 해결하지 못했습니다.
저를 구한 것은 전체 UI를 하나의 작은 NatureIdentifier 인터페이스 뒤에 숨긴 것이었습니다. 모델을 전환한다는 것은 새로운 식별자 클래스를 추가하고 스코어링을 업데이트하는 것을 의미했으며, 화면에는 아무런 변경도 없었습니다. 이 교체 작업을 거치고 나서야 답변들이 마침내 말이 되기 시작했습니다.
제한점도 솔직하게 밝히고 있습니다. 지구상의 모든 생명체를 아는 것이 아니라 몇백 종의 생물체만 알고 있습니다. (비슷해 보이는 개체들, 작은 갈색 새, 개구리, 풀 등)은 어떤 모델에게나 어려운 부분입니다. 또한 이 앱은 안전 도구가 아니라 노트 보조 도구입니다.
크레딧: BioCLIP (Imageomics Institute), OpenCLIP, ONNX Runtime Web, 분류학(taxonomy)을 위한 GBIF, 그리고 모델 파일 호스팅을 위한 Hugging Face.
오픈 혁신이 중요한 이유
저는 트레일에서 시작했습니다. 신호가 없는 곳에서 하이킹을 한다고 가정해 봅시다. 클라우드 비전 API는 그저 로딩 스피너에 불과합니다. 모델 가중치(model weights)가 공개되어 있었기 때문에, 저는 이 모델을 휴대폰 자체에 올릴 수 있었습니다. 연결이 필요 없고, 사진당 비용도 없으며, 유출될 API 키나 도달할 속도 제한(rate limit)도 없습니다.
프라이버시 역시 매우 중요했습니다. 야생 동물 사진에는 시간과 종종 장소가 담겨 있는데, 이는 제가 통제하지 않는 서버에 놓이고 싶지 않은 바로 그 종류의 데이터입니다. 로컬 모델을 사용하면 사진이 기기를 벗어나지 않습니다.
오픈(Open)이라는 것은 또한 첫 번째 선택이 잘못되었을 때 갇히지 않았다는 것을 의미했습니다. 폐쇄형 API를 사용할 경우,
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기