이는 ONS 코로나바이러스 빠른 지표(예: 교통 카메라 활동 - 2020년 9월 10일)의 일부로 Office for National Statistics Data Science Campus Blog에 게시된 교통 카메라 분석 프로젝트와 기본 방법론의 공개 저장소입니다. 이 프로젝트는 확장 가능한 솔루션을 구현하기 위해 Google Compute Platform(GCP)을 활용했지만 기본 방법론은 플랫폼에 구애받지 않습니다. 이 저장소에는 GCP 지향 구현이 포함되어 있습니다.
코로나바이러스 빠른 속도 표시기(Coronavirus Faster Indicator)에 대해 생성된 출력 예가 아래에 나와 있습니다.
이동성과 행동의 변화하는 패턴을 실시간으로 이해하는 것은 코로나바이러스(COVID-19)에 대한 정부 대응의 주요 초점이었습니다. 데이터 과학 캠퍼스는 사회적 거리두기 수준을 추정하는 방법에 대한 통찰력을 제공하고 봉쇄 조건이 완화됨에 따라 사회와 경제의 회복을 추적할 수 있는 대체 데이터 소스를 탐색해 왔습니다.
교통 카메라는 교통 전문가와 대중이 인터넷을 통해 전국 여러 지역의 교통 흐름을 평가할 수 있도록 하는 광범위하고 공개적으로 사용 가능한 데이터 소스입니다. 교통 카메라가 생성하는 이미지는 공개적으로 이용 가능하고 해상도가 낮으며 사람이나 차량을 개별적으로 식별할 수 없습니다. ANPR(자동 번호판 인식) 또는 교통 속도 모니터링을 위해 공공 안전 및 법 집행에 사용되는 CCTV와는 다릅니다.
이미지에 설명된 대로 파이프라인의 주요 단계는 다음과 같습니다.
이미지 수집
잘못된 이미지 감지
객체 감지
정적 객체 감지
결과 개수 저장
그런 다음 개수를 추가로 처리(계절 조정, 결측값 대치)하고 필요에 따라 보고서로 변환할 수 있습니다. 주요 파이프라인 단계를 간략하게 검토하겠습니다.
사용자는 일련의 카메라 소스(웹 호스팅 JPEG 이미지)를 선택하고 사용자에게 URL 목록으로 제공합니다. Transport for London에서 공개 이미지를 얻기 위한 예제 코드와 Newcastle University의 Urban Observatory에서 직접 NE 교통 데이터를 가져오는 전문 코드가 제공됩니다.
다양한 이유(시스템 오류, 현지 운영자에 의한 피드 비활성화 등)로 인해 카메라를 사용하지 못할 수 있으며 이로 인해 모델에서 가짜 개체 수를 생성할 수 있습니다(예: 작은 덩어리가 먼 버스처럼 보일 수 있음). 이러한 이미지의 예는 다음과 같습니다.
지금까지 이러한 이미지는 모두 단순한 배경색과 오버레이된 텍스트로 구성된 매우 합성적인 이미지 패턴을 따랐습니다(자연 장면 이미지와 비교). 이러한 이미지는 현재 색상 심도를 줄이고(유사한 색상을 함께 스냅) 단일 색상이 차지하는 이미지의 가장 높은 부분을 살펴봄으로써 감지됩니다. 임계값을 초과하면 이미지가 합성이라고 판단하고 결함이 있는 것으로 표시합니다. 인코딩으로 인해 다음과 같은 다른 오류가 발생할 수 있습니다.
여기서는 camrera 피드가 중단되었으며 마지막 "라이브" 행이 반복되었습니다. 이미지의 맨 아래 행이 위의 행과 일치하는지(임계값 내에서) 확인하여 이를 감지합니다. 그렇다면 위의 다음 행에서 일치 여부를 확인하는 방식으로 행이 더 이상 일치하지 않거나 행이 부족해질 때까지 계속됩니다. 일치하는 행 수가 임계값을 초과하면 이미지가 유용한 데이터를 생성할 가능성이 낮으므로 결함이 있는 것으로 플래그가 지정됩니다.
다양한 이미지 제공업체는 카메라를 사용할 수 없음을 표시 하는 다양한 방법을 사용합니다. 우리의 감지 기술은 사용되는 몇 가지 색상, 즉 순수 합성 이미지에 의존합니다. 보다 자연스러운 이미지를 사용하면 당사의 기술이 작동하지 않을 수 있습니다. 대안은 실패한 이미지의 "라이브러리"를 유지하고 유사성을 찾는 것입니다. 이는 보다 자연스러운 이미지에서 더 잘 작동할 수 있습니다.
객체 감지 프로세스는 뉴캐슬 대학의 Urban Observatory에서 제공하는 사전 훈련된 Faster-RCNN을 사용하여 정적 객체와 움직이는 객체를 모두 식별합니다. 이 모델은 영국 북동부의 교통 카메라 이미지 10,000개에 대해 훈련되었으며 ONS 데이터 과학 캠퍼스에서 추가 검증을 거쳐 모델이 영국의 다른 지역의 카메라 이미지와 함께 사용할 수 있음을 확인했습니다. 자동차, 밴, 트럭, 버스, 보행자, 자전거 타는 사람, 오토바이 타는 사람 등의 개체 유형을 감지합니다.
활동 탐지를 목표로 하고 있으므로 시간 정보를 사용하여 정적 개체를 필터링하는 것이 중요합니다. 이미지는 10분 간격으로 샘플링되므로 가우시안 혼합과 같은 전통적인 비디오 배경 감지 방법은 적합하지 않습니다.
물체 감지 중에 분류된 보행자와 차량은 정적으로 설정되며 배경에도 나타나는 경우 최종 카운트에서 제거됩니다. 아래 이미지는 정적 마스크의 결과 예를 보여줍니다. 여기서 이미지(a)의 주차된 차량은 정적 마스크로 식별되어 제거됩니다. 추가적인 이점은 정적 마스크가 허위 경보를 제거하는 데 도움이 될 수 있다는 것입니다. 예를 들어, 이미지 (b)에서 쓰레기통은 물체 감지에서 보행자로 잘못 식별되지만 정적 배경으로 필터링됩니다.
이미지에 결함이 있거나 이미지가 누락된 경우 결과는 테이블, 스키마 기록 카메라 ID, 날짜, 시간, 개체 유형(자동차, 밴, 보행자 등)별 관련 개수로 간단히 저장됩니다.
처음에 시스템은 확장성을 지원하기 위해 클라우드 네이티브로 설계되었습니다. 그러나 이로 인해 진입 장벽이 발생합니다. 클라우드 제공업체에 계정이 있어야 하고 인프라를 보호하는 방법 등을 알아야 합니다. 이를 염두에 두고 독립 실행형 시스템에서 작동하도록 코드를 백포팅했습니다. (또는 "로컬 호스트") 관심 있는 사용자가 자신의 랩탑에서 시스템을 간단히 실행할 수 있도록 합니다. 이제 두 구현 모두 아래에 설명되어 있습니다.
이 아키텍처는 단일 머신이나 클라우드 시스템에 매핑될 수 있습니다. 우리는 Google Compute Platform(GCP)을 사용하기로 선택했지만 Amazon Web Services(AWS)나 Microsoft의 Azure와 같은 다른 플랫폼도 비교적 동등한 서비스를 제공합니다.
시스템은 손상을 일으키지 않고 반복적으로 호출할 수 있는 독립형, 상태 비저장 코드인 "클라우드 기능"으로 호스팅됩니다. 이는 기능의 견고성을 높이기 위한 핵심 고려 사항입니다. 일일 및 '10분마다' 처리 버스트는 GCP의 스케줄러를 사용하여 조정되어 원하는 일정에 따라 GCP Pub/Sub 주제를 트리거합니다. GCP 클라우드 기능은 주제에 대해 등록되며 주제가 트리거될 때마다 시작됩니다.
차량과 보행자를 감지하기 위해 이미지를 처리하면 나중에 시계열로 분석할 수 있도록 객체 수가 데이터베이스에 기록됩니다. 데이터베이스는 데이터 수집과 시계열 분석 간의 데이터를 공유하여 결합을 줄이는 데 사용됩니다. 우리는 데이터 시각화를 위한 Data Studio와 같은 다른 GCP 제품에서 폭넓게 지원되는 BigQuery를 데이터베이스로 GCP 내에서 사용합니다. 로컬 호스트 구현에서는 일일 CSV를 비교하여 저장하여 특정 데이터베이스나 기타 인프라에 대한 종속성을 제거합니다.
GCP 관련 소스 코드는 cloud
폴더에 저장됩니다. 이는 이미지를 다운로드하고, 이를 처리하여 객체 수를 계산하고, 수를 데이터베이스에 저장하고 (매주) 시계열 분석을 생성합니다. 모든 문서와 소스 코드는 cloud
폴더에 저장됩니다. 아키텍처 개요와 스크립트를 사용하여 GCP 프로젝트 공간에 자체 인스턴스를 설치하는 방법은 Cloud README.md를 참조하세요. 프로젝트를 GitHub에 통합하여 로컬 GitHub 프로젝트에 대한 커밋에서 자동으로 자동 배포 및 테스트 실행을 활성화할 수 있습니다. 이는 Cloud README.md에도 문서화되어 있습니다. 클라우드 지원 코드는 chrono_lens.gcloud
모듈에도 저장되어 cloud
폴더의 Cloud 함수 코드와 함께 명령줄 스크립트가 GCP를 지원할 수 있도록 해줍니다.
독립형 단일 머신("localhost") 코드는 chrono_lens.localhost
모듈에 포함되어 있습니다. 단일 머신을 사용하고 chrono_lens.localhost
의 각 Python 파일이 GCP의 Cloud Functions에 매핑되기는 하지만 프로세스는 GCP 변형과 동일한 흐름을 따릅니다. 자세한 내용은 README-localhost.md를 참조하세요.
이제 GCP 및 로컬 호스트 구현 모두 최소한 일부 로컬 설치가 필요하다는 점을 고려하여 시스템을 설치하기 위한 다양한 단계와 전제 조건을 설명합니다.
격리된 작업 환경을 허용하려면 가상 환경을 생성하는 것이 좋습니다. 좋은 작업 환경의 예로는 conda, pyenv 및 poerty가 있습니다.
종속성은 요구 requirements.txt
에 이미 포함되어 있으므로 pip를 통해 설치하십시오.
pip install -r requirements.txt
실수로 비밀번호를 커밋하는 것을 방지하려면 중요한 정보가 저장소에 도착하기 전에 git 커밋이 처리되지 않도록 사전 커밋 후크를 사용하는 것이 좋습니다. 우리는 https://github.com/ukgovdatascience/govcookiecutter의 사전 커밋 후크를 사용했습니다.
요구 사항.txt를 설치하면 이제 git에 연결해야 하는 사전 커밋 도구가 설치됩니다.
pre-commit install
...그러면 .pre-commit-config.yaml
에서 구성을 가져옵니다.
참고 check-added-large-files
사전 커밋 테스트의 최대 kB 크기는 .pre-commit-config.yaml
에서 RCNN 모델 파일 /tests/test_data/test_detector_data/fig_frcnn_rebuscov-3.pb
추가할 때 일시적으로 60Mb로 증가합니다. . 그런 다음 제한은 합리적인 "정상" 상한으로 5Mb로 되돌아갑니다.
실수로 이미 존재하는 것이 없는지 확인하기 위해 계속하기 전에 모든 파일에 대해 스윕을 실행하는 것이 좋습니다.
pre-commit run --all-files
그러면 기존 문제가 모두 보고됩니다. 그렇지 않으면 후크가 편집된 파일에서만 실행되므로 유용합니다.
이 프로젝트는 주로 클라우드 인프라를 통해 사용하도록 설계되었지만 클라우드의 시계열 업데이트 및 로컬 액세스를 위한 유틸리티 스크립트가 있습니다. 이러한 스크립트는 scripts/gcloud
폴더에 있으며, 각 스크립트는 이제 별도의 다음 섹션에서 설명됩니다. 자세한 내용은 scripts/gcloud/README.md
에서 확인할 수 있으며, 선택적 가상 머신에서의 사용은 cloud/README.md
에 설명되어 있습니다.
비클라우드 사용은 scripts/localhost
폴더의 스크립트로 지원되며 독립 실행형 시스템에서 chrono_lens
시스템을 사용하는 방법에 대한 자세한 내용은 README-localhost.md
에 설명되어 있습니다. 스크립트 사용에 대한 추가 정보는 scripts/localhost/README.md
에서 찾을 수 있습니다.
스크립트는 chrono_lens
폴더의 코드를 사용합니다.
버전 | 날짜 | 메모 |
---|---|---|
1.0.0 | 2021-06-08 | 공개 저장소의 첫 번째 릴리스 |
1.0.1 | 2021-09-21 | 분리된 이미지, 텐서플로우 버전 범프에 대한 버그 수정 |
1.1.0 | ? | 독립형 단일 머신에 대한 제한된 지원이 추가되었습니다. |
잠재적인 향후 작업 영역이 여기에 제시되어 있습니다. 이러한 변경 사항은 조사되지 않을 수도 있지만, 우리가 고려한 잠재적인 개선 사항을 사람들에게 알리기 위해 여기에 있습니다.
현재 GCP 인프라를 생성하는 데 bash 쉘 스크립트가 사용됩니다. 개선 사항은 Terraform과 같은 IaC를 사용하는 것입니다. 이렇게 하면 런타임 환경이나 메모리 한도가 변경될 때 Cloud Build 트리거를 수동으로 제거하고 다시 생성할 필요 없이 Cloud 함수 구성 변경이 단순화됩니다.
현재 디자인은 모델이 완성되기 전에 이미지를 획득하는 초기 사용 사례에서 비롯되므로 분석된 이미지만이 아닌 사용 가능한 모든 이미지가 다운로드됩니다. 수집 비용을 절약하려면 수집 코드가 분석 JSON 파일을 대조 확인하고 해당 파일만 다운로드해야 합니다. 이러한 소스를 더 이상 사용할 수 없거나 새로운 소스를 사용할 수 있게 되면 경고가 발생해야 합니다.
NETravelData의 야간 이미지 채우기는 NETravelData 이미지의 약 40%를 새로 고치는 것으로 보입니다. 숫자가 매일 필요한 경우 정기적 새로 고침의 이점이 줄어들므로 Cloud 함수 distribute_ne_travel_data
제거될 수 있습니다.
http async
에서 PubSub로 이동 초기 디자인에서는 새 모델을 테스트할 때 수동으로 작동하는 스크립트(즉, batch_process_images.py
를 사용합니다. 성공 여부와 처리된 이미지 수를 보고합니다. 이를 위해 Cloud 함수는 결과를 반환하므로 잘 작동합니다. 그러나 더 효율적인 아키텍처는 비동기 호출의 현재 계층 구조(두 개의 추가 함수를 사용하여 확장하는 것)보다는 단일 작업자 함수에 의해 소비되는 PubSub 대기열에 작업을 추가하는 distribute_json_sources
및 processed_scheduled
함수와 함께 내부적으로 PubSub 대기열을 사용하는 것입니다. ).
Newcastle University의 Urban Observatory는 우리가 사용하는 사전 훈련된 Faster-RCNNN을 제공했습니다(로컬 복사본은 /tests/test_data/test_detector_data/fig_frcnn_rebuscov-3.pb
에 저장되어 있음).
데이터는 Open Government License 3.0에 따라 라이센스가 부여된 North East Urban Traffic Management and Control Open Data Service에서 제공됩니다. 이미지의 출처는 Tyne and Wear Urban Traffic Management and Control입니다.
북동부 데이터는 Newcastle University의 Urban Observatory에서 추가 처리 및 호스팅됩니다. 이들의 지원과 조언에 감사드립니다.
데이터는 TfL에서 제공되며 TfL Open Data에 의해 제공됩니다. 데이터는 Open Government Licence 버전 2.0에 따라 라이센스가 부여됩니다. TfL 데이터에는 OS 데이터 © Crown 저작권 및 데이터베이스 권리 2016 및 Geomni UK 지도 데이터 © 및 데이터베이스 권리(2019)가 포함되어 있습니다.
이 프로젝트에는 다양한 타사 라이브러리가 사용됩니다. 이는 종속성 페이지에 나열되어 있으며, 그 기여에 감사드립니다.