위시켓 PID 155061 · Flutter iOS 파일럿

타이포그래픽 QR
TwinCode Scanner

기존 Flutter Android 앱의 iOS 미동작 원인을 분석하고,
카메라 실시간 스캔·갤러리 스캔·히스토리·플래시를 추가한
iOS 전용 TFLite 파이프라인으로 완전 재구현했습니다.

🔍 스캐너 데모 ✏️ TwinCode 생성기

iOS에서 왜 동작하지 않았나

파일럿에서 추가 구현한 기능

📷
iOS 전용 실시간 스캔
camera 패키지 + tflite_flutter 직접 조합. BGRA8888/YUV420 포맷 변환, 3프레임 스로틀링으로 OOM 방지.
🖼
갤러리 스캔
image_picker로 저장된 이미지에서도 TwinCode 인식. detectFromBytes() API 신규 추가.
🕐
스캔 히스토리
SharedPreferences 기반 로컬 저장. 최근 50건, 타임스탬프, URL 클릭 오픈 지원.
🔦
플래시 토글
어두운 환경에서 FlashMode.torch로 카메라 플래시 사용. 아이콘으로 상태 표시.
📳
햅틱 피드백
디코딩 성공 시 HapticFeedback.mediumImpact() 진동으로 즉시 알림.
🧪
단위 테스트
classId 매핑, Reed-Solomon 0~2개 오류 정정을 dart test로 자동 검증.

실기기 검증 결과

iPhone SE 3세대(A15 Bionic, iOS 17)에서 Flutter 앱을 직접 빌드·설치해 검증했습니다. CoreML(Apple Neural Engine) 위임 모드로 추론이 동작하며 Android CPU delegate와 다른 클래스 분포를 보이는 것을 로그로 확인했습니다.

항목 결과 비고
Flutter 빌드 (iOS 14.0+) ✅ 성공 CocoaPods 1.16.2, Xcode 16
YOLO TFLite 모델 로드 ✅ 성공 tflite_flutter 0.12, CoreML 위임
카메라 실시간 추론 ✅ 동작 CoreML(ANE) max_conf 0.97+
TwinCode 디코딩 (정상 조명) ✅ 성공 2회 이내 안정 디코딩
갤러리 이미지 스캔 ✅ 성공 image_picker 권한 포함
원본 iOS 미동작 원인 확인 ✅ 정적분석·수정 소스코드 정적 분석으로 ultralytics_yolo CoreML-only 원인 특정 후 수정

TwinCode 디코더 기술 개선

원본 5단계 오류 복구 전략에 Pass 6·7을 추가해 7단계 다중 패스 아키텍처로 확장했습니다. CoreML 추론의 클래스 혼동 패턴을 실측 로그에서 분석하고 혼동 맵으로 정리해 패스마다 순서 있게 후보를 확장합니다.

1️⃣
Pass 1–4: 빠른 경로
원본 시퀀스 → RS 직접 디코딩, runner-up 스왑, 단일 오류 위치 교체, 단일 혼동 오류 교체를 순서대로 시도해 대부분의 경우를 빠르게 처리합니다.
5️⃣
Pass 5: 멀티프레임 후보
10프레임 신뢰도 가중 투표 결과로 생성된 후보 조합(최대 8개 위치)을 시도합니다. 프레임 누적이 많을수록 정확도가 올라갑니다.
6️⃣
Pass 6: 불확실 위치 혼동 확장
투표 결과 불확실한 위치(candidates ≥ 2)에만 혼동 맵을 적용해 조합을 생성합니다. 확실한 위치까지 혼동을 적용하던 구버전(flex 위치 18–19개)에서 5–9개 수준으로 탐색 범위를 감소.
7️⃣
Pass 7: k-부분집합 열거
CoreML '2' 클래스 과예측 등 만장일치 혼동 위치를 k=0,1,2,3 부분집합으로 교체 시도합니다. 예산 상한(150,000회)으로 지연 없이 동작.
🗺️
혼동 맵 실측 확장
디바이스 로그에서 CoreML 오분류 패턴(26→24/15/11, 3→17, 7→11/15/23 등 10개 클래스)을 실측해 혼동 맵에 반영했습니다.
📊
iOS vs Android 차이 분석
iOS CoreML/ANE는 classId 26('2') 과예측 경향이 있는 반면 Android CPU delegate는 이 편향이 낮습니다. 플랫폼별 혼동 맵 분리 적용이 가능한 구조로 설계.

웹 데모 둘러보기

🔍
스캐너 데모
샘플 TwinCode 이미지를 선택하면 10프레임 멀티프레임 안정화 + Reed-Solomon 디코딩 과정을 시각화합니다.
데모 열기 →
✏️
TwinCode 생성기
URL을 입력하면 Reed-Solomon ECC가 적용된 5×5 TwinCode를 즉시 생성·다운로드할 수 있습니다.
생성기 열기 →

기술 스택

Flutter 3.32 Dart 3.9 tflite_flutter 0.12 ultralytics_yolo 0.1.46 (Android) camera 0.11 iOS 14.0+ CocoaPods image_picker shared_preferences Reed-Solomon GF(256) Base32 YOLO v8 CoreML (ANE) / CPU 2-thread