Skip to content

flywithu/LightSignal

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

LightSignal

한국 신호등을 인식해 다른 앱 위에 띄워주는 안드로이드 앱 — 내비게이션을 보고 있어도 앞차에 가려진 신호가 바뀌는 걸 놓치지 않게 합니다.

An Android app that detects Korean traffic lights on-device and shows the state as a floating overlay above other apps (e.g. a navigation app). All inference runs locally; no image ever leaves the phone.

이 저장소는 배포 전용입니다. 앱 소스와 학습 파이프라인은 비공개 저장소에서 관리하고, 여기에는 문서와 Releases의 모델 파일만 둡니다.


무엇을 하는가

정지선에 서 있을 때 앞차가 신호등을 가리거나, 내비게이션을 보느라 신호 변경을 놓치는 상황을 줄이는 것이 목적입니다.

  • 온디바이스 추론 — 카메라 프레임이 기기 밖으로 나가지 않습니다. 서버도, 계정도 없습니다.
  • 오버레이 표시 — 홈 버튼을 눌러 내비게이션으로 돌아가도 신호 상태가 화면 위에 계속 떠 있습니다.
  • 정차 중에만 동작 — GPS 속도가 10 km/h 미만일 때만 추론합니다. 주행 중에는 쉬면서 배터리와 발열을 아낍니다. (속도를 아직 모를 때는 신호를 놓치지 않도록 추론을 허용합니다.)
  • 모델 업데이트 — 인식 성능이 개선된 모델이 나오면 앱을 다시 설치하지 않고 교체할 수 있습니다. 받기 전에 항상 물어봅니다.

인식하는 상태는 빨강 · 노랑 · 초록 · 좌회전 네 가지이고, 속도 표지판은 별도 클래스로 학습되어 있지만 신호 상태로는 쓰지 않습니다.


⚠️ 안전 고지

이 앱은 운전자를 대체하지 않습니다. 보조 도구일 뿐이며, 다음을 반드시 이해하고 사용하세요.

  • 신호를 놓치거나 틀리게 인식할 수 있습니다. 특히 비·눈·역광·야간, 아주 먼 신호등, 고가도로 아래 반복 신호등에서 취약합니다.
  • 최종 판단과 책임은 언제나 운전자에게 있습니다. 앱 표시를 근거로 출발하지 마시고, 반드시 직접 신호를 확인하세요.
  • 주행 중 조작하지 마세요. 설정과 신고 기능은 정차 상태에서만 사용하세요.
  • 차량 거치대에 고정해 사용하고, 운전 시야를 가리지 않는 위치에 두세요.

설치

Google Play 스토어에서 배포합니다. 스토어 등록이 끝나면 이 자리에 링크가 올라옵니다. APK를 직접 내려받는 방식(사이드로딩)은 지원하지 않습니다.

Releases에 올라와 있는 파일은 앱이 OTA로 받아가는 모델 파일(model.tflite, model-manifest.json)이며, 앱 설치 파일이 아닙니다.

설치 후 첫 실행에서 아래 권한을 허용해 주세요.

권한 왜 필요한가 없으면
카메라 신호등을 보기 위한 유일한 입력 동작 불가
다른 앱 위에 표시 내비게이션 위에 신호 상태를 띄움 오버레이 없이 앱 안에서만 표시
위치(정확한 위치) GPS 속도로 정차 여부 판단 항상 추론 → 배터리·발열 증가

"다른 앱 위에 표시"는 일반 권한 팝업이 아니라 설정 화면으로 이동해서 켜야 합니다. 앱이 안내해 줍니다.

요구 사양: Android 11 (API 30) 이상, arm64 기기.


사용법

  1. 차량 거치대에 폰을 고정하고 후면 카메라가 전방 신호등을 향하게 합니다.
  2. 앱을 실행하면 카메라 화면과 함께 상단에 상태 표시줄(HUD)이 나옵니다.
  3. 홈 버튼을 누르면 카메라가 백그라운드로 넘어가면서 오버레이가 뜹니다. 이제 내비게이션을 띄워도 신호 상태가 위에 계속 보입니다.
  4. 오버레이는 드래그해서 원하는 위치로 옮길 수 있습니다.
  5. 종료하려면 앱으로 돌아와 정지하거나, 알림 영역의 실행 중 알림에서 중지합니다.

HUD 읽는 법

상단 표시줄은 이런 형태입니다.

🟢 인식 중 · GPS 대기 중          1080×1920 · 630ms · 9타일
항목 의미
좌측 색/문구 현재 인식된 신호 상태. 신호가 없으면 "신호등 없음"
GPS 위치 상태. "대기 중"이면 아직 속도를 모르는 것(이때는 계속 추론)
1080×1920 분석에 쓰는 프레임 해상도
630ms 한 프레임 처리에 걸린 시간
9타일 이번 프레임을 몇 조각으로 나눠 훑었는지
모델 v20260727 현재 사용 중인 모델 버전. 내장 모델이면 모델 내장

처리 시간이 갑자기 수십 ms로 뚝 떨어지면 추론이 실제로 돌지 않고 있다는 신호입니다. 정상 범위는 기기에 따라 대략 300~700ms입니다.

인식 실패 신고

신호등을 놓쳤을 때 카메라 화면을 탭하면 그 순간의 프레임이 첨부된 메일 초안이 열립니다. 증상을 한 줄 적어 보내주시면 됩니다.

메일에는 원인을 찾는 데 필요한 정보가 자동으로 담깁니다.

모델 버전, 입력 해상도
이 프레임 분석 해상도, 처리 시간, 타일 수, 검출 수, 판정 상태
동작 상태 인식이 켜져 있었는지 / GPS 속도
기기 앱 버전, 기기 모델, Android 버전

특히 모델 버전이 중요합니다. "신호를 놓쳤다"는 제보만으로는 어느 모델의 문제인지 알 수 없는데, 이 정보가 있으면 바로 특정됩니다. 첨부 파일 이름에도 버전이 들어가서(report_<시각>_v20260727.png) 학습 데이터로 넘어간 뒤에도 출처가 남습니다.

보내주신 사진은 라벨링을 거쳐 다음 학습 데이터로 들어가고, 개선된 모델은 OTA로 다시 배포됩니다.

신고는 사용자가 직접 메일을 보낼 때만 전송됩니다. 앱이 몰래 이미지를 올리는 일은 없습니다.


모델 업데이트 (OTA)

앱은 실행할 때 이 저장소의 최신 릴리스를 확인합니다. 더 새로운 모델이 있으면 먼저 물어봅니다. 사용자가 허락하기 전에는 내려받지 않습니다.

새 신호등 모델 v20260727
크기 5.9 MB · 현재 v20260726

[ 지금 받기 ]  [ 나중에 ]  [ 이 버전 건너뛰기 ]
□ 앞으로 새 모델이 나오면 묻지 않고 받기
  • 나중에 — 이번에만 넘어갑니다. 다음 실행 때 다시 물어봅니다.
  • 건너뛰기 — 이 버전은 다시 묻지 않습니다. 그보다 새 버전이 나오면 그때 다시 물어봅니다.
  • 묻지 않고 받기 — 체크해 두면 이후로는 자동으로 받습니다. 언제든 다시 끌 수 있습니다.

내려받기는 Wi-Fi/데이터를 가리지 않으므로, 데이터 요금이 걱정되면 Wi-Fi에서 받으시길 권합니다.

모델 상태 확인과 설정

현재 쓰고 있는 모델 버전은 카메라 화면 우측 상단에 항상 표시됩니다 — 모델 v20260727, 내장 모델을 쓰는 중이면 모델 내장입니다.

이 칩을 탭하면 모델 설정이 열립니다.

  • 지금 쓰는 모델과 입력 해상도 확인
  • 새 모델을 묻지 않고 받기 켜기/끄기 — 업데이트 창에서 한 번 체크했더라도 여기서 되돌릴 수 있습니다
  • 지금 확인 — 수동으로 새 모델을 찾습니다. 이전에 "건너뛰기"한 버전도 이때는 다시 제안합니다

화면의 다른 곳을 탭하면 오류 제보 메일이 열립니다. 모델 칩만 설정으로 연결됩니다.

releases/latest/download/model-manifest.json   ← 앱이 폴링하는 대상
releases/latest/download/model.tflite          ← 실제 모델

model-manifest.json 형식:

{
  "version": 20260727,
  "url": "https://github.com/flywithu/LightSignal/releases/latest/download/model.tflite",
  "sha256": "458c8f1273ae407e6fa8334159a7f6dc29c88a2680b15eae2771105b0bdeffc2",
  "inputSize": 640
}
  • version은 날짜(YYYYMMDD) 정수이고, 설치된 값보다 클 때만 내려받습니다.
  • 내려받은 파일은 sha256이 일치할 때만 설치됩니다. 어긋나면 버리고 쓰던 모델을 유지합니다.
  • inputSize가 640이 아니면 앱 디코더와 맞지 않으므로 거부합니다.
  • 받은 모델을 TFLite가 로드하지 못하면 그 모델을 버리고 APK에 내장된 모델로 되돌아갑니다. 실패한 모델은 체크섬으로 기억해 두었다가 다시 받지 않습니다.

모델 자체에 대한 자세한 내용은 MODEL.md를 보세요.


개인정보

  • 카메라 영상은 기기에서만 처리되고 저장·전송되지 않습니다.
  • 위치는 속도 계산에만 쓰이며 기록하거나 전송하지 않습니다.
  • 네트워크는 모델 업데이트 확인과 내려받기에만 사용합니다. 내려받기는 사용자가 허락한 뒤에만 일어납니다.
  • 인식 실패 신고를 위해 사용자가 직접 메일을 보낼 때만, 그 순간의 프레임 한 장과 위에 적은 진단 정보가 첨부되어 전송됩니다. 위치나 좌표는 포함되지 않습니다.

계정, 로그인, 분석 도구(analytics), 광고가 없습니다.


라이선스 및 출처

모델 가중치 — AGPL-3.0

릴리스에 포함된 model.tfliteUltralytics YOLOv8로 학습했습니다. Ultralytics는 AGPL-3.0으로 배포되며, 그 코드로 학습한 모델에도 같은 라이선스가 적용된다는 것이 Ultralytics의 입장입니다. 따라서 이 저장소의 모델 가중치는 AGPL-3.0을 따릅니다.

AGPL-3.0은 이 모델을 포함해 배포되는 저작물의 소스 공개를 요구할 수 있습니다. 상용 배포를 계획한다면 Ultralytics Enterprise 라이선스를 검토하시기 바랍니다.

학습 데이터 — CC BY 4.0

  • original-korean-traffic-light — © Min Yong Park, Roboflow Universe 제공, CC BY 4.0
  • 여기에 사용자 신고로 수집한 실패 사례 이미지를 추가로 라벨링해 병합했습니다.

사용 라이브러리

구성 요소 라이선스
TensorFlow Lite (LiteRT) Apache-2.0
AndroidX CameraX Apache-2.0
Jetpack Compose Apache-2.0
Ultralytics YOLOv8 (학습 단계) AGPL-3.0
onnx2tf (변환 단계) MIT

문서

이 저장소의 문서(README.md, MODEL.md)는 CC BY 4.0으로 자유롭게 인용·수정하셔도 됩니다.


저장소 구성

저장소 공개 여부 내용
LightSignal (여기) 공개 문서 + 릴리스(APK·모델)
LightSignalSrc 비공개 앱 소스, 학습 노트북, 데이터 파이프라인

버그 신고와 제안은 Issues로 남겨주세요.

About

한국 신호등을 온디바이스로 인식해 다른 앱 위에 띄워주는 안드로이드 앱 - 배포 및 모델 릴리스

Topics

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors