1. 목표
개요
이 Codelab에서는 실시간 교통 동영상 영상을 모니터링하는 Vertex AI Vision 애플리케이션을 엔드 투 엔드로 만드는 방법을 중점적으로 다룹니다. 사전 학습된 전문 모델 점유 분석의 내장 기능을 사용하여 다음을 캡처합니다.
- 특정 선에서 도로를 건너는 차량과 사람의 수를 셉니다.
- 도로의 고정된 지역에 있는 차량/사람의 수를 셉니다.
- 도로의 어느 부분에서든 혼잡을 감지합니다.
학습할 내용
- 스트리밍할 동영상을 수집하도록 VM을 설정하는 방법
- Vertex AI Vision에서 애플리케이션을 만드는 방법
- 숙박 인원 분석에서 제공하는 다양한 기능과 사용 방법
- 앱 배포 방법
- 스토리지 Vertex AI Vision의 미디어 창고에서 동영상을 검색하는 방법
- 출력을 BigQuery에 연결하고, SQL 쿼리를 작성하여 모델의 json 출력에서 유용한 정보를 추출하고, Looker Studio에서 실시간으로 결과를 시각화하는 방법
2. 시작하기 전에
- Google Cloud 콘솔의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 만들거나 선택합니다. 참고: 이 절차에서 생성한 리소스를 유지하지 않으려면 기존 프로젝트를 선택하지 말고 프로젝트를 새로 만드세요. 이러한 단계가 완료되면 프로젝트를 삭제하여 프로젝트와 연결된 모든 리소스를 삭제할 수 있습니다. 프로젝트 선택기로 이동
- Cloud 프로젝트에 결제가 사용 설정되어 있어야 하므로 프로젝트에 결제가 사용 설정되어 있는지 확인하는 방법을 알아보세요.
- Compute Engine 및 Vision AI API를 사용 설정합니다. API 사용 설정
서비스 계정 만들기:
- Google Cloud 콘솔에서 서비스 계정 만들기 페이지로 이동합니다. 서비스 계정 만들기로 이동
- 프로젝트를 선택합니다.
- 서비스 계정 이름 필드에 이름을 입력합니다. Google Cloud 콘솔은 이 이름을 기반으로 서비스 계정 ID 필드를 채웁니다. 서비스 계정 설명 입력란에 설명을 입력합니다. 예를 들어 빠른 시작의 서비스 계정입니다.
- 만들고 계속하기를 클릭합니다.
- 프로젝트에 대한 액세스 권한을 제공하려면 서비스 계정에 Vision AI > Vision AI 편집기, Compute Engine > Compute 인스턴스 관리자(베타), 스토리지 > 스토리지 객체 뷰어 † 역할을 부여합니다 . 역할 선택 목록에서 역할을 선택합니다. 역할을 추가하려면 다른 역할 추가를 클릭하고 역할을 각각 추가합니다. 참고: 역할 필드는 서비스 계정이 프로젝트에서 액세스할 수 있는 리소스에 영향을 줍니다. 이러한 역할을 취소하거나 나중에 추가 역할을 부여할 수 있습니다. 프로덕션 환경에서는 소유자, 편집자 또는 뷰어 역할을 부여하지 마세요. 대신 필요에 맞는 사전 정의된 역할 또는 맞춤 역할을 부여합니다.
- 계속을 클릭합니다.
- 완료를 클릭하여 서비스 계정 만들기를 마칩니다. 브라우저 창을 닫지 마세요. 다음 단계에서 사용합니다.
서비스 계정 키 만들기:
- Google Cloud 콘솔에서 만든 서비스 계정의 이메일 주소를 클릭합니다.
- 키를 클릭합니다.
- 키 추가를 클릭한 후 새 키 만들기를 클릭합니다.
- 만들기를 클릭합니다. JSON 키 파일이 컴퓨터에 다운로드됩니다.
- 닫기를 클릭합니다.
- Google Cloud CLI를 설치 및 초기화합니다.
† 이 역할은 Cloud Storage 버킷에서 샘플 동영상 파일을 복사하는 경우에만 필요합니다.
3. 동영상을 스트리밍하도록 VM 설정
점유 분석에서 앱을 만들기 전에 나중에 앱에서 사용할 수 있는 스트림을 등록해야 합니다.
이 튜토리얼에서는 동영상을 호스팅하는 Compute Engine VM 인스턴스를 만들고 VM에서 스트리밍 동영상 데이터를 전송합니다.
Linux VM 만들기
Compute Engine VM 인스턴스에서 동영상을 전송하는 첫 번째 단계는 VM 인스턴스를 만드는 것입니다.
- 콘솔에서 VM 인스턴스 페이지로 이동합니다. VM 인스턴스로 이동
- 프로젝트를 선택하고 계속을 클릭합니다.
- 인스턴스 만들기를 클릭합니다.
- VM의 이름을 지정합니다. 자세한 내용은 리소스 이름 지정 규칙을 참고하세요.
- 선택사항: 이 VM의 영역을 변경합니다. Compute Engine은 각 리전 내의 영역 목록을 무작위로 선택하여 여러 영역에서 사용하도록 권장합니다.
- 나머지 기본 옵션을 수락합니다. 이러한 옵션에 대한 자세한 내용은 VM 만들기 및 시작을 참고하세요.
- 만들기를 클릭하여 VM을 만들고 시작합니다.
VM 환경 설정
VM이 시작된 후 콘솔을 사용하여 브라우저에서 SSH를 통해 VM에 연결할 수 있습니다. 그런 다음 vaictl 명령줄 도구를 다운로드하여 스트림으로 동영상을 수집할 수 있습니다.
VM에 대한 SSH 연결 설정
- 콘솔에서 VM 인스턴스 페이지로 이동합니다. VM 인스턴스로 이동
- 만든 인스턴스 행의 연결 섹션에서 SSH를 클릭합니다. 그러면 새 브라우저 창에서 SSH 연결이 열립니다.
vaictl 명령줄 도구 다운로드
- 브라우저 내 SSH 창에서 다음 명령어를 사용하여 Vertex AI Vision (vaictl) 명령줄 도구를 다운로드합니다.
wget https://github.com/google/visionai/releases/download/v0.0.4/visionai_0.0-4_amd64.deb
- 다음 명령어를 실행하여 명령줄 도구를 설치합니다.
sudo apt install ./visionai_0.0-4_amd64.deb
- 다음 명령어를 실행하여 설치를 테스트할 수 있습니다.
vaictl --help
4. 스트리밍을 위해 동영상 파일 처리
VM 환경을 설정한 후 샘플 동영상 파일을 복사한 다음 vaictl을 사용하여 동영상 데이터를 점유 분석 앱으로 스트리밍할 수 있습니다.
Cloud 콘솔에서 Vision AI API를 활성화하여 시작하세요.
새 스트림 등록
- Vertex AI Vision의 왼쪽 패널에서 스트림 탭을 클릭합니다.
- 등록을 클릭합니다.
- 스트림 이름에 'traffic-stream'을 입력합니다.
- 리전에 'us-central1'을 입력합니다.
- 등록을 클릭합니다.
스트림이 등록되기까지 몇 분 정도 걸립니다.
VM에 샘플 동영상 복사하기
- VM의 SSH-in-browser 창에서 다음 gsutil cp 명령어를 사용하여 샘플 동영상을 복사합니다. 다음 변수를 바꿉니다.
- SOURCE: 사용할 동영상 파일의 위치입니다. 자체 동영상 파일 소스 (예: gs://BUCKET_NAME/FILENAME.mp4)를 사용하거나 샘플 동영상 (gs://cloud-samples-data/vertex-ai-vision/street_vehicles_people.mp4)(사람과 차량이 등장하는 동영상, 소스)을 사용할 수 있습니다.
export SOURCE=gs://cloud-samples-data/vertex-ai-vision/street_vehicles_people.mp4 gsutil cp $SOURCE .
VM에서 동영상을 스트리밍하고 스트림에 데이터를 처리합니다.
- 이 로컬 동영상 파일을 앱 입력 스트림으로 전송하려면 다음 명령어를 사용합니다. 다음과 같이 변수를 바꿔야 합니다.
- PROJECT_ID: Google Cloud 프로젝트 ID입니다.
- LOCATION_ID: 위치 ID입니다. 예를 들면 us-central1입니다. 자세한 내용은 Cloud 위치를 참고하세요.
- LOCAL_FILE: 로컬 동영상 파일의 파일 이름입니다. 예: street_vehicles_people.mp4
- –loop 플래그: 선택사항. 파일 데이터를 반복하여 스트리밍을 시뮬레이션합니다.
export PROJECT_ID=<Your Google Cloud project ID> export LOCATION_ID=us-central1 export LOCAL_FILE=street_vehicles_people.mp4
- 이 명령어는 동영상 파일을 스트림으로 스트리밍합니다. –loop 플래그를 사용하면 명령어를 중지할 때까지 동영상이 스트림에 반복 재생됩니다. 이 명령어를 백그라운드 작업으로 실행하므로 VM이 연결 해제된 후에도 계속 스트리밍됩니다.
- ( 시작에 nohup을 추가하고 끝에 '&'를 추가하여 백그라운드 작업으로 만듭니다.)
nohup vaictl -p $PROJECT_ID \ -l $LOCATION_ID \ -c application-cluster-0 \ --service-endpoint visionai.googleapis.com \ send video-file to streams 'traffic-stream' --file-path $LOCAL_FILE --loop &
vaictl 처리 작업을 시작하고 동영상이 대시보드에 표시되기까지 약 100초가 걸릴 수 있습니다.
스트림 수집을 사용할 수 있게 되면 Vertex AI Vision 대시보드의 스트림 탭에서 트래픽 스트림 스트림을 선택하여 동영상 피드를 볼 수 있습니다.
Google Cloud 콘솔에서 스트림으로 수집되는 동영상의 실시간 뷰입니다. 동영상 크레딧: Pixabay의 엘리자베스 마버 (모자이크 처리 추가)
5. 애플리케이션 만들기
첫 번째 단계는 데이터를 처리하는 앱을 만드는 것입니다. 앱은 다음을 연결하는 자동화된 파이프라인으로 간주할 수 있습니다.
- 데이터 수집: 동영상 피드가 스트림으로 처리됩니다.
- 데이터 분석: 처리 후 AI(컴퓨터 비전) 모델을 추가할 수 있습니다.
- 데이터 저장: 두 가지 버전의 동영상 피드 (원본 스트림과 AI 모델에서 처리한 스트림)를 미디어 웨어하우스에 저장할 수 있습니다.
Google Cloud 콘솔에서 앱은 그래프로 표시됩니다.
빈 앱 만들기
앱 그래프를 채우려면 먼저 빈 앱을 만들어야 합니다.
Google Cloud 콘솔에서 앱을 만듭니다.
- Google Cloud 콘솔로 이동합니다.
- Vertex AI Vision 대시보드의 애플리케이션 탭을 엽니다.
- 추가 만들기 버튼을 클릭합니다.
- 앱 이름으로 traffic-app을 입력하고 지역을 선택합니다.
- 만들기를 클릭합니다.
앱 구성요소 노드 추가
빈 애플리케이션을 만든 후 앱 그래프에 다음 세 노드를 추가할 수 있습니다.
- 처리 노드: 내가 만든 Compute Engine VM 인스턴스에서 전송된 데이터를 처리하는 스트림 리소스입니다.
- 처리 노드: 처리된 데이터에 작용하는 점유 분석 모델입니다.
- 스토리지 노드: 처리된 동영상을 저장하고 메타데이터 저장소 역할을 하는 미디어 웨어하우스입니다. 메타데이터 저장소에는 처리된 동영상 데이터에 관한 분석 정보와 AI 모델에서 추론한 정보가 포함됩니다.
콘솔에서 앱에 구성요소 노드를 추가합니다.
- Vertex AI Vision 대시보드의 애플리케이션 탭을 엽니다. 애플리케이션 탭으로 이동
- Traffic-app 줄에서 그래프 보기를 선택합니다. 그러면 처리 파이프라인의 그래프 시각화가 표시됩니다.
데이터 처리 노드 추가
- 입력 스트림 노드를 추가하려면 사이드 메뉴의 커넥터 섹션에서 스트림 옵션을 선택합니다.
- 열리는 스트림 메뉴의 소스 섹션에서 스트림 추가를 선택합니다.
- 스트림 추가 메뉴에서 새 스트림 등록을 선택하고 스트림 이름으로 traffic-stream을 추가합니다.
- 앱 그래프에 스트림을 추가하려면 스트림 추가를 클릭합니다.
데이터 처리 노드 추가
- 숙박 인원 모델 노드를 추가하려면 사이드 메뉴의 전문 모델 섹션에서 숙박 인원 분석 옵션을 선택합니다.
- 기본 선택사항인 사람 및 차량을 그대로 둡니다.
- 선 교차에 선 추가 다중 점 선 도구를 사용하여 출입하는 자동차나 사람을 감지해야 하는 곳에 선을 그립니다.
- 활성 영역을 그려 해당 영역의 사람/차량을 집계합니다.
- 활성 영역이 그려진 경우 정체를 감지할 수 있도록 체류 시간 설정을 추가합니다.
- (현재 활성 영역과 선 교차는 동시에 지원되지 않습니다. 한 번에 하나의 기능만 사용하세요.)
데이터 저장소 노드 추가
- 출력 대상 (스토리지) 노드를 추가하려면 사이드 메뉴의 커넥터 섹션에서 Vertex AI Vision의 미디어 웨어하우스 옵션을 선택합니다.
- Vertex AI Vision의 미디어 웨어하우스 메뉴에서 웨어하우스 연결을 클릭합니다.
- 웨어하우스 연결 메뉴에서 새 웨어하우스 만들기를 선택합니다. 창고 이름을 traffic-warehouse로 지정하고 TTL 기간을 14일로 둡니다.
- 만들기 버튼을 클릭하여 웨어하우스를 추가합니다.
6. 출력을 BigQuery 테이블에 연결
Vertex AI Vision 앱에 BigQuery 커넥터를 추가하면 연결된 모든 앱 모델 출력이 대상 테이블에 처리됩니다.
자체 BigQuery 테이블을 만들고 앱에 BigQuery 커넥터를 추가할 때 이 테이블을 지정하거나 Vertex AI Vision 앱 플랫폼에서 자동으로 테이블을 만들도록 할 수 있습니다.
자동 테이블 생성
Vertex AI Vision 앱 플랫폼에서 테이블을 자동으로 만들도록 허용하는 경우 BigQuery 커넥터 노드를 추가할 때 이 옵션을 지정할 수 있습니다.
자동 테이블 생성을 사용하려면 다음 데이터 세트 및 테이블 조건이 적용됩니다.
- 데이터 세트: 자동으로 생성된 데이터 세트 이름은 visionai_dataset입니다.
- 테이블: 자동으로 생성된 테이블 이름은 visionai_dataset.APPLICATION_ID입니다.
- 오류 처리:
- 동일한 데이터 세트에 동일한 이름의 테이블이 있으면 자동 생성되지 않습니다.
- Vertex AI Vision 대시보드의 애플리케이션 탭을 엽니다. 애플리케이션 탭으로 이동
- 목록에서 애플리케이션 이름 옆에 있는 앱 보기를 선택합니다.
- 애플리케이션 빌더 페이지의 커넥터 섹션에서 BigQuery를 선택합니다.
- BigQuery 경로 필드는 비워 둡니다.
- 저장소 메타데이터 위치: '점유율 분석'만 선택하고 스트림을 선택 해제합니다.
최종 앱 그래프는 다음과 같이 표시됩니다.
7. 사용을 위해 앱 배포하기
필요한 모든 구성요소로 엔드 투 엔드 앱을 빌드한 후 앱을 사용하기 위한 마지막 단계는 앱을 배포하는 것입니다.
- Vertex AI Vision 대시보드의 애플리케이션 탭을 엽니다. 애플리케이션 탭으로 이동
- 목록에서 트래픽 앱 앱 옆에 있는 그래프 보기를 선택합니다.
- 애플리케이션 그래프 빌더 페이지에서 배포 버튼을 클릭합니다.
- 다음 확인 대화상자에서 배포를 선택합니다. 배포 작업을 완료하는 데 몇 분 정도 걸릴 수 있습니다. 배포가 완료되면 노드 옆에 녹색 체크표시가 나타납니다.
8. 저장소 창고에서 동영상 콘텐츠 검색
동영상 데이터를 처리 앱에 수집한 후 분석된 동영상 데이터를 확인하고, 점유 분석 정보를 기반으로 데이터를 검색할 수 있습니다.
- Vertex AI Vision 대시보드의 웨어하우스 탭을 엽니다. 창고 탭으로 이동
- 목록에서 traffic-warehouse 창고를 찾아 애셋 보기를 클릭합니다.
- 인물 수 또는 차량 수 섹션에서 최소 값을 1로, 최대 값을 5로 설정합니다.
- Vertex AI Vision의 미디어 창고에 저장된 처리된 동영상 데이터를 필터링하려면 검색을 클릭합니다.
Google Cloud 콘솔의 검색 기준과 일치하는 저장된 동영상 데이터 보기 동영상 크레딧: Pixabay의 엘리자베스 마버 (검색 기준 적용)
9. BigQuery 테이블에서 출력 분석
BigQuery로 이동
데이터 세트 선택: visionai_dataset
테이블: APPLICATION_ID (이 경우 traffic-app)를 선택합니다.
테이블 이름 오른쪽에 있는 점 3개를 클릭하고 '쿼리'를 클릭합니다.
다음 쿼리를 작성합니다.
쿼리 1: 분당 각 선을 통과하는 차량 수를 확인하는 쿼리
abc.sql
—- Get list of active marked lines for each timeframe
WITH line_array AS (
SELECT
t.ingestion_time AS ingestion_time,
JSON_QUERY_ARRAY(t.annotation.stats["crossingLineCounts"]) AS lines
FROM
`PROJ_ID.visionai_dataset.APP_ID` AS t
),
—- Flatten active lines to get individual entities details
flattened AS (
SELECT
line_array.ingestion_time,
JSON_VALUE(line.annotation.id) as line_id,
JSON_QUERY_ARRAY(line["positiveDirectionCounts"]) AS entities
FROM line_array, unnest(line_array.lines) as line
)
—- Generate aggregate vehicle count per zone w.r.t time
SELECT
STRING(TIMESTAMP_TRUNC(ingestion_time, MINUTE) ) AS time, line_id,
SUM(INT64(entity["count"])) as vehicle_count
FROM
flattened, UNNEST(flattened.entities) AS entity
WHERE JSON_VALUE(entity['entity']['labelString']) = 'Vehicle'
GROUP BY time, line_id
쿼리 2: 각 영역에서 분당 차량 수를 확인하는 쿼리
—- Get list of active zones for each timeframe
WITH zone_array AS (
SELECT
t.ingestion_time AS ingestion_time,
JSON_QUERY_ARRAY(t.annotation.stats["activeZoneCounts"]) AS zones
FROM
`PROJ_ID.visionai_dataset.APP_ID` AS t
),
—- Flatten active zones to get individual entities details
flattened AS (
SELECT zone_array.ingestion_time, JSON_VALUE(zone.annotation.id) as zone_id,
JSON_QUERY_ARRAY(zone["counts"]) AS entities
FROM zone_array, unnest(zone_array.zones) as zone
)
—- Generate aggregate vehicle count per zone w.r.t time
SELECT
STRING(TIMESTAMP_TRUNC(ingestion_time, MINUTE) ) AS time,
zone_id,
SUM(INT64(entity["count"])) as vehicle_count
FROM flattened, UNNEST(flattened.entities) AS entity
WHERE JSON_VALUE(entity['entity']['labelString']) = 'Vehicle'
GROUP BY time, zone_id
위 쿼리에서 '차량'을 '사람'으로 변경하여 사람 수를 집계할 수 있습니다.
이 Codelab에서는 Query1의 샘플 데이터와 시각화만 보여줍니다. Query2에도 유사한 프로세스를 따를 수 있습니다.
오른쪽 사이드 메뉴에서 '데이터 탐색'을 클릭하고 'Looker Studio로 탐색'을 선택합니다.
'측정기준' 창에서 시간을 추가하고 시간 구성을 날짜-시간으로 변경합니다. '세부 측정기준'에 line_id를 추가합니다.
위 그래프는 각 선을 통과하는 분당 차량/사람의 수를 보여줍니다.
진한 파란색과 연한 파란색 막대는 두 개의 서로 다른 line-id를 나타냅니다.
10. 축하합니다
축하합니다. 실습을 완료했습니다.
정리
이 튜토리얼에서 사용된 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 리소스가 포함된 프로젝트를 삭제하거나 프로젝트를 유지하고 개별 리소스를 삭제하세요.
프로젝트 삭제
개별 리소스 삭제
리소스
https://cloud.google.com/vision-ai/docs/overview
https://cloud.google.com/vision-ai/docs/occupancy-count-tutorial
의견