Overview
- 넥스트랩 의 소속 팀에서 가장 장기적으로 진행한 중요 프로젝트로, CCTV 등의 카메라에서 획득한 보행자와 번호판 이미지를 대상으로 추적 and/or 번호판 인식 모듈을 서비스화하는 프로젝트
- 납품 사례마다 다양한 요구 사항이 있었는데, 주로 핵심 AI 모듈을 둘러싼 서비스 구조를 비즈니스 로직에 맞춰 설계하고 구현하는 업무를 맡았습니다. 크게 요청에 따라서 task를 수행하는 pull mode와 최대한 빠른 속도로 task를 수행하는 push mode으로 나눌 수 있습니다.
- 다련장 발사대 라는 별명의 SSH tunnel을 통한 배포 및 운영 툴을 만들어서 이 프로젝트에서 2년간 안정적으로 사용했습니다.
Technology
- 컨테이너 단위로 역할을 지정하고 Stage와 GPU 환경을 고려한 docker-compose 개발
- 배포와 관련해서 Nvidia GPU를 컨테이너 내부에서 사용하기 위한 고려 사항들을 알고 있고 실무에 활용해왔습니다. (CUDA version, Container runtime, Container base image, Runtime flags…)
- 컨테이너 별 주요 Failure point를 고려해 Health check 구현
- AI task 관리 기능 개발
- 시스템 일부분에 대한 테스트 또는 운영 지원을 위한 내부용 프론트엔드 구현
- AWS CDK 를 이용해 브랜치 별로 docker compose build를 수행하는 Serverless CI 개발
Progress
납품 케이스 별로 개발 사항들을 정리했습니다.
스마트 횡단보도용 보행자 인식 솔루션
수원시 스마트 횡단보도 사업에 40여대의 Jetson 보드 납품
SSH tunnel 사용 1회차
- 보행자 추적 백엔드 개발 및 배포 총괄
- 신호등 값에 따라서 보행자 추적 결과를 Aggregate해 TCP socket으로 발신하는 컨테이너 개발
- 다련장 발사대 초기 버전으로 40여대의 Jetson 보드에 docker-compose 프로젝트를 배포하고 불안정한 카메라로 인한 운영 이슈에 대응
sequenceDiagram
Control Center->>Express: Signal light
Express->>Redis: Signal light
Express->>Frontend: Signal light
CCTV->>AI: RTST stream
AI->>Frontend: Captured image
AI->>Redis: Inference result
Redis->>Express: Aggrigated inference results by signal light
Express->>Control Center: TCP socket
경찰차용 범죄 차량 단속 시스템
경찰차용 번호판 인식 시스템에 100여대의 Jetson 보드 납품 번호판 인식 솔루션 배포 1회차, push mode SSH tunnel 사용 2회차
- C++ 언어로 산업용 카메라 영상 캡쳐 컨테이너 개발
- ffmpeg으로 실 카메라를 모사하는 Mock 카메라 기능 개발
- mmap 과 Redis hash map을 통해서 Frame buffer와 Frame pointer를 Overhead 없이 다른 컨테이너들에 공유
- 고객사 앱에 임베딩 가능한 UI frame을 렌더링하는 서버 개발
- Node.js를 이용한 TCP Socket & FTP 레거시 프로토콜 개발
- UI frame을 FTP로 제공하는 기능 기능 개발
- TCP socket을 통한 인식 결과 및 현장 사진 전송 기능 개발
- 수배 차량 DB 업로드 기능 개발
- SSH tunnel을 통한 배포 시스템에 Cloud9 IDE 를 연동해 고객사에게 제공
- 번호판 오탐을 보정하는 후처리 기능 개발
- 인증 시험용 로그를 Indexed DB에 적재하는 기능을 탑재한 간이 Frontend 개발
push mode 번호판 인식 처리 과정
sequenceDiagram
par Camera Capture
Camera->>mmap: Frame buffer
Camera->>Redis: Frame pointer
Redis->>AI: Frame pointer
mmap->>AI: Frame buffer
AI->>Nginx: Encoded image
Nginx->>Frontend: Encoded image
and Inference Result
AI->>Redis: Raw inference result
Redis->>Node: Raw inference result
Node->>Frontend: Selected inference result
Node->>Tablet: Refined inference result & encoded imaged
and UI
Tablet->>Node: [FTP] UI frame request
Node->>UI: [HTTP] UI frame request
UI->>Node: [HTTP] UI frame response
Node->>Tablet: [FTP] UI frame response
end
Docker Compose Containers
| docker-compose.yml | docker-compose.mock.yml | |
|---|---|---|
camera |
실제 카메라에서 프레임을 가져와 mmap에 write | ffmpeg으로 동영상에서 프레임을 가져와 mmap에 write |
ai |
(Jetson GPU 필요) | |
| 1. mmap (camera)또는 동영상(video)에서 프레임을 가져와 번호판을 인식해 detection.realtime 채널에 Publish | 1. SQLite에서 적당한 순서로 Select | |
| 2. SQLite DB에 Insert | 2. mmap에서 넘어온 프레임을 SQLite에서 Select | |
node |
1. 소켓 서버 2. Active FTP 서버 1) 타블렛이 UI 이미지 다운로드 2) 타블렛이 수배 데이터 업로드 3. detection.realtime 을 후처리해 detection.stable, detection.single 채널을 Publish | 기본 기능 + nc 컨테이너로 타블렛을 대신할 수 있음 |
ui |
Node의 요청이 있을 때, 구독해서 보유하고 있던 frame 중 최신 것으로 UI 이미지를 합성 | |
nginx |
1. 브라우저가 받아볼 수 있어야 하는 메시지들의 pub/sub(대용량 데이터 처리 가능) | |
| 2. Frontend static file 서버 | ||
redis |
소용량 데이터 위주의 연동의 중심 |
서버형 번호판 인식 시스템
번호판 인식 솔루션 배포 2회차, pull mode
- Nginx 추가 모듈을 이용한 HTTP 애플리케이션 로직 개발
- redis2-nginx-module , redis-nginx-module 등을 Lua scripting으로 연동해 fan-out 패턴 구현
- Vitest 를 이용해 Nginx 설정에 대한 테스트 코드 작성
- redis-streams 라이브러리를 이용해 Python AI worker가 작업을 분배받아 결과 또는 오류를 전파하는 기능 개발
- 서버 모니터링 기능 개발
- 모니터링용 Redis consumer group를 신설해 서버 metrics를 Influx DB에 적재하는 기능 개발 참여
- 요구사항 파악, 모니터링 툴 선정: Kibana , Influx DB , Portainer , RedisInsight
- 하나의 포트에서 모니터링 툴들을 사용할 수 있도록 하는 별도 Nginx를 포함한 Docker Compose 개발
- Redis를 이용한 동적 GPU 할당 기능 개발
- 배포 관련
- 모니터링 스택과 연동이 가능한 서비스용 docker-compose 개발
- 다양한 GPU architecture를 지원하는 AI 컨테이너 Dockerfile 개발
- GitHub repo 브랜치 생성/삭제와 연동되는 AWS CodeBuild pipeline 구성
번호판 인식 요청 처리 과정
sequenceDiagram
Nginx->>tmpfs: Writes HTTP request body to tmpfs path
Nginx->>Redis: XADD tmpfs path
par ALPR Service
Redis-->>ALPR: XREADGROUPS tmpfs path
ALPR-->>Redis: SET HTTP response body
ALPR-->>Redis: LPUSH HTTP response key
Redis->>Nginx: GET HTTP response body
and Monitoring
Redis-->>Admin: XREADGROUPS
Admin-->>Influx DB: Insert Redis queue stats
Nginx-->>Influx DB: Insert Nginx stats
end
주차장 모니터링 솔루션
번호판 인식 솔루션 배포 3회차, push & pull mode
SSH tunnel 사용 3회차
- 300개 이상의 촬영 각도를 이용해서 전주시 야외 주차장의 주차 현황 관리 프로젝트
- 고객사 연동용 REST API 설계
- Ray
cluster를 5대의 물리 서버에 구성해 차량 추적 서비스 구축, 메모리 누수 해결
참조: 아키텍처 PoC repo - Lit element frontend에 S3-compatiable storage를 연동해 운영 상황에서 필요한 데이터 관리 툴 개발
- RTSP 프로토콜 CCTV로부터 캡쳐한 이미지를 S3-compatable storage에 적재하는 ffmpeg, nginx 개발