강아지 진드기 레이더 icon LIVE

강아지 진드기 레이더 Dog Tick Finder

강아지 털 속에 숨은 진드기를 카메라 색반전과 온디바이스 AI로 빠르게 찾아주는 앱. 피부·치아 베타 검사와 갤러리 기록까지 한 번에. Spot ticks hidden in a dog's fur using a color-invert camera and on-device AI. Includes beta skin/dental checks and a gallery for vet visits.

영상 Video

스크린샷 Screenshots

진드기 검사 (색반전 카메라) 진드기 검사 (색반전 카메라) 피부·치아 검사 피부·치아 검사 검사 결과 미리보기 검사 결과 미리보기 갤러리에서 검사 갤러리에서 검사 검사 사진 상세 검사 사진 상세 설정 설정 진드기 검사 미리보기 진드기 검사 미리보기

주요 기능 Key Features

🔍

진드기 실시간 검사 Real-time Tick Scan

카메라 화면을 실시간 색반전해 어두운 털을 밝게 바꾸고, TFLite 모델이 진드기 의심 부위를 원형으로 표시합니다. Live color-invert preview makes dark fur bright, and an on-device TFLite model marks suspected ticks.

🩺

피부·치아 검사BETA Skin & Dental CheckBETA

촬영 후 미리보기에서 피부 이상은 빨강, 치석은 주황 폴리곤으로 표시. 드래그·핀치로 직접 편집 가능. After capture, skin abnormalities are marked red and tartar orange; drag/pinch to edit before saving.

📸

갤러리 + 메모 Gallery + Notes

촬영 시점의 AI 분석 결과와 메모가 함께 저장돼, 동물병원에서 수의사에게 정확히 보여줄 수 있습니다. AI results and notes save with each photo — show your vet exactly what you saw.

🔦

플래시 + 8배 줌 Flash + 8× Zoom

두꺼운 털도 플래시로 밝게, 최대 8배까지 당겨서 깊은 부위까지 세밀하게 확인. Light up thick fur and zoom up to 8× to inspect hard-to-reach spots.

🔄

전/후면 + 전체화면 Cameras + Fullscreen

위아래 스와이프로 전·후면 전환. 강아지를 두 손으로 잡아야 할 때는 한 번에 전체화면으로. Swipe to switch front/rear cameras; hide bars when you need both hands.

🌙

다크모드 · 한/영 Dark Mode · KR/EN

시스템 테마·라이트·다크 3종 전환. 한국어·영어 동등 지원으로 글로벌 사용자도 그대로 사용. System/light/dark themes, with first-class Korean and English support.

기술 스택 Tech Stack

왜 이 스택? Why this stack? 강아지 사진은 사적 영역이라 클라우드 AI는 처음부터 배제. TFLite + OpenCV로 모든 추론을 기기에서 처리해 프라이버시·오프라인·비용을 동시에 해결했습니다. Java + View 시스템은 기존 Smart Mirror 프로젝트 7년치 코드 자산을 그대로 재활용하기 위한 선택. 동의자 한정 학습용 업로드만 작은 FastAPI 서버(시놀로지 NAS)로 받습니다. Dog photos are private, so cloud AI was out from day one. All inference runs on-device via TFLite + OpenCV, solving privacy, offline, and cost in one shot. Java + the View system reuses 7 years of code from prior Smart Mirror work. A small FastAPI server on a Synology NAS handles only opt-in training uploads.

아키텍처 Architecture

┌──────────────── Android App (Java) ─────────────────────────┐
│                                                             │
│   CameraX  ──▶  Image Analysis  ──▶  OpenCV (RGB invert)    │
│      │                                       │              │
│      │                                       ▼              │
│      │                                Live Preview          │
│      ▼ (shutter)                                            │
│   PNG cache  ──▶  TFLite Models  ──▶  Polygon Overlay       │
│                   • TickDetector       (editable: drag,     │
│                   • Skin Seg            pinch, tap-delete)  │
│                   • Dental Seg                 │            │
│                                                ▼            │
│                                       [Save] / [Retake]     │
│                                                │            │
│                                                ▼            │
│                                  MediaStore + Room          │
│                                  (photo + note + polyJSON)  │
│                                                │            │
│                  (only if user opted in) ──────┘            │
│                            ▼                                │
│              OkHttp + WorkManager  ── retry · idempotency   │
└────────────────────────────┼────────────────────────────────┘
                             ▼
        ┌────────── Synology NAS (FastAPI) ────────┐
        │  POST /upload    (X-API-Key)             │
        │   → file: /volume1/tickscanner/<Y>/<M>/   │
        │   → DB:   MariaDB (users + photos)       │
        │  Reverse proxy + HTTPS (Let's Encrypt)   │
        └──────────────────────────────────────────┘

앱은 단일 Activity + Fragment hide/show 패턴(ViewPager 미사용)으로 탭 전환 시 카메라 세션을 유지합니다. 진드기·피부·치아 모델은 모두 TFLite로 동일한 추론 파이프라인을 공유하며, 결과 폴리곤은 공용 EditableOverlayView에서 편집됩니다. A single Activity with Fragment hide/show (no ViewPager) keeps the camera session alive across tabs. The tick / skin / dental models share one TFLite inference pipeline, and detection polygons feed into a shared EditableOverlayView for in-place editing.

결정과 트레이드오프 Challenges & Decisions

문제Problem

OpenCV RGBA Mat을 통째로 bitwise_not 하면 알파 채널까지 반전돼 카메라 프리뷰가 전체 투명으로 보이는 버그. Running bitwise_not on a full RGBA Mat inverts the alpha channel too, making the live preview render fully transparent.

접근Approach

채널을 R·G·B·A로 분리해 R/G/B에만 Core.bitwise_not()을 적용한 뒤 다시 merge. 한 줄 분기로 색반전 토글도 가능. Split into R/G/B/A channels, invert only R/G/B, then merge back. The split also makes toggling invert a one-line branch.

결과Result

색반전이 의도대로 보이고 알파는 보존됨. 프리뷰 프레임 처리 비용도 유지. Inversion looks right and alpha stays intact, with no extra cost in the per-frame path.

문제Problem

Google Play의 16KB 페이지 정렬 정책. OpenCV AAR이 구버전 libc++_shared.so를 번들링해 그대로 쓰면 출시 차단. Google Play's 16KB page alignment policy. The OpenCV AAR bundles an older libc++_shared.so, which blocks release builds.

접근Approach

NDK r28 + OpenCV 4.11.0(첫 16KB-aligned 버전)로 통일. NDK의 libc++_shared.sojniLibs/arm64-v8a/로 직접 복사해 정렬 우선 적용. Pin NDK r28 + OpenCV 4.11.0 (first 16KB-aligned release), and copy the NDK's libc++_shared.so straight into jniLibs/arm64-v8a/ so the aligned copy wins.

결과Result

Play 정책 통과. 의존성 업그레이드 정책에 "OpenCV 4.11+ 유지, 16KB 정렬 재확인"을 명시해 회귀 방지. Cleared Play policy. The upgrade policy now pins "OpenCV ≥ 4.11 and re-verify 16KB alignment" to prevent regressions.

문제Problem

학습 데이터를 어떻게 모을지. 웹 스크래핑은 품질·라이선스 불확실하고 사용자 사진은 민감. How to source training data. Web scraping was license-murky and low quality; user photos are sensitive.

접근Approach

웹 스크래핑을 전면 폐기하고 Kaggle/Roboflow 공개 검증 데이터셋만 사용. dataset_finder.py로 검색·triage·다운로드를 자동화하고, SAM으로 bbox→폴리곤 변환 + background 이미지 ~15% 섞어 오탐 억제. Dropped scraping entirely and only use vetted Kaggle/Roboflow datasets. dataset_finder.py automates discovery, triage, and download; SAM converts bbox→polygon, and ~15% background images get mixed in to reduce false positives.

결과Result

라이선스 깔끔, 재학습 파이프라인 재현 가능. 동의자 한정 사용자 사진은 NAS의 별도 영역에 모아 다음 모델 학습에 활용. Clean licensing and a reproducible re-training pipeline. Opt-in user photos pool to a separate NAS area for the next model cycle.

현재 상태 Status

LIVE Google Play 출시 · v1.0.1 · 한국어/영어 동시 운영 Live on Google Play · v1.0.1 · Korean & English

다음: 피부·치아 모델 정확도 v2 학습, 갤러리 캘린더 뷰, 코치마크 리워크. Next: Skin/dental model v2 retrain, calendar view in gallery, coachmark rework.

← 포트폴리오로 돌아가기 ← Back to Portfolio