- Stella v273.0.0.21은 Meta 스마트 안경 컴패니언 앱 안에 얼굴 검출·정렬·임베딩·로컬 DB·벡터 인덱스·저장 경로·알림 표면을 잇는 기기 내 얼굴 인식 장치를 품고 있음
- 기존 핸들러를 테스트 사진으로 직접 호출하자 얼굴 검출, 2048차원 생체 임베딩 생성, 로컬 인덱스 검색, 일치 시 Android 알림 "Person recognized" 발송까지 동작함
- SCRFD, KPSAligner, SFace 등 세 ExecuTorch 모델이 NMLML로 내려오며, SFace는 얼굴을 2048개 숫자 임베딩으로 변환하는 역할을 맡는 구성임
- RLDrive의 person_profiles/objects.db는 vec0 float[2048] 코사인 검색을 쓰고, 일치 없음 경로는 NameTagsPending/에 잘라낸 얼굴 .jpg와 .emb 지문을 저장함
- 기본 미등록 계정에서는 "Connections" 카드와 대상 프로필 화면이 보이지 않으며 Meta의 얼굴 네임스페이스 데이터 푸시도 관찰되지 않아, 배포 여부와 시점이 핵심 미확인 사항으로 남음
범위와 한계
- 대상 앱은 Meta 스마트 안경 컴패니언 앱 Stella의 Android 빌드 com.facebook.stella v273.0.0.21임
- 앱 안에는 얼굴 모델 3개, 로컬 DB 스키마, 모델 출력과 맞는 코사인 유사도 벡터 인덱스, 생체 기록을 디스크에 준비하는 쓰기 경로, 알림 표면, 사용자용 "Connections" 위젯이 함께 존재함
- 테스트 사진으로 기존 핸들러를 직접 호출하자 파이프라인이 끝까지 실행되어 얼굴을 검출하고 2048차원 임베딩을 만든 뒤 로컬 인덱스를 검색함
- 기본 미등록 계정에서는 사용자용 UI가 나타나지 않았고, 알림 딥링크가 여는 화면도 v273 빌드에 없었으며, 관련 DB로 Meta가 신원 데이터를 서버 푸시하는 흐름도 테스트 계정에서 관찰되지 않음
- 현재 일반 사용자에게 Meta가 몰래 사람을 식별한다는 근거가 아니라, 그런 기능을 수행할 완성된 장치가 기기에 조립되어 있고 Meta가 게이트로 막아둔 상태라는 구분이 핵심임
모델 스택
자산 이름
파일
크기
역할
| android_facerec_scrfd |
SCRFD.pte |
3.4 MB |
이미지에서 얼굴 검출 |
| android_facerec_kps_aligner |
KPSAligner.pte |
117 KB |
검출된 얼굴 crop 및 정렬 |
| android_facerec_sface |
SFace.pte |
96 MB |
얼굴을 2048개 숫자 임베딩으로 변환 |
- 세 모델은 Meta의 자산 전달 시스템 NMLML을 통해 Meta에서 다운로드되는 ExecuTorch .pte 자산임
- SCRFD는 InsightFace의 SCRFD, SFace는 Zhong et al. 2021의 SFace, KPSAligner는 키포인트 기반 정렬 계열과 맞닿은 모델군임
- Meta의 SFace 변형은 96 MB와 2048차원 출력으로, 공개 참조의 약 40 MB와 128–512차원보다 큰 형태로 보임
- 얼굴 검출 및 임베딩 모델을 탑재했다는 사실만으로 인식 기능의 증거가 되지는 않으며, 기기 내 얼굴 검출은 프레이밍이나 자동초점에도 쓰일 수 있음
로컬 얼굴 인덱스와 DB 구조
- 실행 파이프라인은 다음 SQLite DB를 읽는 구조임
/data/user/0/com.facebook.stella/files/rldrive/person_profiles/objects.db
- 이 DB는 Meta의 크로스 디바이스 동기화 프레임워크 RLDrive 아래 person_profiles 네임스페이스에 위치하며, 원격에서 채워지도록 설계된 채널임
- 테스트 계정에서는 Meta가 person_profiles에 데이터를 직접 푸시하는 전송이 관찰되지 않았으므로, 관찰된 것은 채널의 존재임
- 핵심 스키마는 사람 정보, 얼굴 정보, 2048차원 벡터 검색 테이블을 나눠 갖는 형태임
CREATE TABLE person (
nodeid INTEGER PRIMARY KEY,
name TEXT,
uri TEXT,
blob BLOB,
deleted INTEGER,
version BLOB
);
CREATE TABLE face (
nodeid INTEGER PRIMARY KEY,
mediaPath TEXT,
personUri TEXT,
blob BLOB,
deleted INTEGER,
uri TEXT,
version BLOB
);
CREATE VIRTUAL TABLE face_mediaPath_vec
USING vec0(mediaPath float[2048] distance_metric=cosine);
- face 행은 personUri로 person을 가리키고, face.mediaPath는 face_mediaPath_vec의 기본 키 역할을 맡음
- 인식은 2048개 숫자 임베딩을 코사인 유사도로 검색한 뒤 person.name과 조인해 알림 문구에 쓰는 흐름임
- vec0는 SQLite를 벡터 유사도 엔진으로 바꾸는 오픈소스 sqlite-vec 확장이고, float[2048] 차원은 앱에 함께 실린 SFace 임베더의 출력 형태와 정확히 맞음
- 스키마는 한 personUri에 여러 face 행을 허용하지만, 실제 배포에서 1:1 또는 1:N 중 어떤 형태를 쓰는지는 미등록 기기에서 보이지 않음
실행 분기와 저장 파일
- 전체 파이프라인을 두 번 실행한 테스트에서 빈 인덱스에 대한 일치 없음 분기와 단일 임베딩을 미리 넣은 일치 분기가 갈라짐
- 일치 없음 분기는 NameTagsPending/에 (uuid.jpg, uuid.emb) 쌍을 쓰고 알림을 보내지 않음
- 일치 분기는 프로덕션 nametags_recognition 채널로 Android 알림을 띄우며, 제목은 "Person recognized", 본문은 "Recognized Michel Foucault"였고 NameTagsPending/에는 아무것도 추가하지 않음
- 인식되지 않은 얼굴은 다음 경로에 저장됨
/data/user/0/com.facebook.stella/files/NameTagsPending/
- 각 인식되지 않은 얼굴은 새 UUID 이름의 .jpg와 .emb 쌍을 만들며, .jpg는 SCRFD와 KPSAligner 출력인 잘라내고 정렬한 얼굴이고 .emb는 2048개 숫자 SFace 지문임
- 디렉터리 모드는 0700이고 재부팅 후에도 유지되며, 쓰기는 일치 없음 분기에서만 발생함
- 검증된 .emb 파일은 8,192바이트 크기, 2048 × float32 big-endian 구조, L2 norm 0.999999, min/max −0.092110 / +0.098950, mean +0.000292 값을 가짐
- (uuid.jpg, uuid.emb) 쌍은 person_profiles/objects.db의 코사인 인덱스가 대조하도록 설계된 것과 같은 형태와 인코딩의 완전한 생체 기록임
알림과 사용자 UI
- Stella는 nametags_recognition이라는 Android 알림 채널을 정의하며, 이름은 "NameTags recognition", 설명은 "Notifications for recognized NameTags connections", 중요도는 heads-up·소리·배지를 동반하는 IMPORTANCE_HIGH임
- 알림 템플릿은 인식 핸들러 안에 하드코딩되어 있으며, 제목은 항상 "Person recognized", 본문은 항상 "Recognized " + name 형태이고 name은 person_profiles/objects.db의 person 테이블에서 옴
- 알림은 탭할 수 있으며, fb-viewapp://name_tags?face_id=<face_id> 형태의 Meta 작성 딥링크로 Stella 내부의 사람 프로필 화면을 열도록 구성됨
- v273에서는 해당 대상 화면을 찾을 수 없고 navigation graph에도 없어, 알림을 탭하면 Stella의 기본 탭으로 이동함
- APK 안에는 "Connections" 섹션 아래 카드가 있으며, 문자열은 "See your connections"와 "Remember the people you met and make new connections."로 하드코딩되어 있음
- 기본 미등록 계정에서는 이 카드가 Glasses 탭에 나타나지 않았고, 테스트 중에는 보이는 상태가 됨
종합
- Stella v273에는 얼굴 검출, 정렬, 임베딩, 벡터 인덱스, 저장소, 쓰기 경로, 알림 표면까지 이어지는 전체 기기 내 얼굴 인식 스택이 존재함
- 끝까지 실행한 파이프라인은 알려진 얼굴을 이름 붙여 알림으로 표시하고, 알려지지 않은 얼굴은 crop과 지문을 디스크에 준비함
- 인덱스 차원, 임베딩 형태, 저장 스키마가 서로 일치하므로 흩어진 죽은 코드가 아니라 일관된 시스템으로 구성되어 있음
- 사용자가 접할 "Connections" 카드와 알림 대상 프로필 화면은 빌드에 없거나 더 깊이 숨겨진 상태임
- 라이브 파이프라인이 쓰는 DB는 Meta가 서버 측에서 채우는 다른 네임스페이스들과 함께 동기화 네임스페이스에 있지만, 테스트 계정에서 얼굴 네임스페이스 푸시는 관찰되지 않음
- 확인되지 않은 내용은 Meta가 현재 사용자에게 낯선 사람을 식별해 주는지, 등록 데이터가 흐르는지, 이 기능이 프로덕션에서 켜져 있는지 여부임
- 2048차원 얼굴 지문과 하드코딩된 "Person recognized" 알림까지 구축·배포·연결한 장치는 공학적 투자이며, 실제 프로덕션 적용 여부와 시점은 Meta가 답해야 할 문제로 남음