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 관리 기능 개발
    • pull mode 에서는 tmpfs 또는 S3-compatable 임시 저장소에 최근 사진만을 적재
    • push mode 에서는 대기열에 요청받은 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회차

enter image description here

  • 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

enter image description here

  • Nginx 추가 모듈을 이용한 HTTP 애플리케이션 로직 개발
  • 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 구성 enter image description here enter image description here

번호판 인식 요청 처리 과정

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 개발