본문 바로가기

머신러닝, 딥러닝

AI HUB 이상행동 탐지 데이터 AutoML로 학습시키기 - 1

AutoML로 동작 인식(농구, 축구, 야구 등의 행동의 종류와 그 행동이 시작되는 시간을 인식) 하려면 

동영상 데이터와 데이터 가져오기 파일(JSON 혹은 CSV)가 필요하다.

먼저 동영상 데이터는 AI HUB의 이상행동 CCTV 영상을 받았다.

다 다운받으면 크기가 5테라라;; 3개 레이블에 대해 각각 6개의 상황에 대해 받았다. 이래도 380G....

동영상 사이즈가 3840 X 2160으로 커서 그런데, AutoML의 장점은 가로 사이즈가 1024픽셀을 넘어가면 알아서 줄여준다는(?) 점인 것 같다.

품질이 손상된다는거나 사이즈 줄여준다는거나 그게 그거 아닐까

라벨당 동영상 프레임 100개 이상을 사용하는 게 좋고, 동영상을 1-2초 보고는 학습시킬 수 없다길래 기존에 파일 크기가 너무 커서 4초자리로 자른 학습용 영상 데이터보다 원본 데이터를 사용하기로 했다.

데이터를 GCP 버킷에 올리고 한꺼번에 UNZIP 한다.

 

다음으로 정답 데이터를 준비해야 하는데, 

AI HUB 이상행동 탐지 데이터에 제공되는 XML (이상행동 동영상의 레이블, 시작 시간, 유지 시간, 동영상의 종료 시간, 동영상에 등장하는 행동) 파일은

이런 식인데, ElementTree로 안의 요소들을 뽑아낼 수 있다.

이상행동 - 폭행의 레이블 정보를 추출하려면,

이니 event = root.findall("event")로 안의 정보를 추출하고, 그 다음에 

[x.findtext("eventname"for x in event] 로 <eventname> 으로 둘러싸인 정보를 추출한다.

# 동영상의 전체 시간, 행동의 레이블, 시작 시간, 종료 시간 추출
from xml.etree.ElementTree import parse

# 이상행동일떄
def parsefile(path):
  tree = parse(path)
  root = tree.getroot()

  event = root.findall("event")
  header = root.findall("header")

  endtime = [x.findtext("duration") for x in header]
  starttime = [x.findtext("starttime") for x in event]
  duration = [x.findtext("duration") for x in event]
  event = [x.findtext("eventname") for x in event][0]

  #event = [x.findtext("event") for x in student]
  endlist = endtime[0][3:-2].split(':')
  startlist = starttime[0][3:-2].split(':') # [분, 초] : 시작 시간의 분, 초
  durationlist = duration[0][3:-2].split(':') # [분, 초] : 행동 지속시간의 분, 초

  alltime = int(endlist[0])*60 + int(endlist[1])
  starttime = int(startlist[0])*60 + int(startlist[1]) # 이상 행동 시작 시간 (초)
  end_action_time = starttime + int(durationlist[0])*60 + int(durationlist[1]) # 전체 행동이 끝나는 시간 = getduration... ^^
  return f'{path[:-4]}.mp4, 0, {alltime}, {event}, {starttime}, {end_action_time}'

 

동영상을 불러오는 CSV 파일은 다음과 같은 정보를 포함해야 한다.

VIDEO_URI, TIME_SEGMENT_START, TIME_SEGMENT_END, LABEL, ANNOTATION_SEGMENT_START, ANNOTATION_SEGMENT_END

각각 

1) GCP 스토리지에 있는 비디오 파일의 URI
2) 비디오의 시작 시간
3) 비디오의 종료 시간
4) 레이블
5) 행동의 시작 시간
6) 행동의 종료 시간 이다.

위의 코드에서 그 정보를 추출한다. (ai hub 데이터셋을 사용하니 동영상의 시작 시간은 당연히 0이다.)