코스포 x 데이콘 자동차 충돌 분석 AI경진대회 채용

데이터셋 전처리 & 현재 적용한 아이디어 & 학습 속도 향상 방법 공유(Public 0.65823)

2023.02.10 23:36 3,270 Views

제가 6개월 간 데이콘에서 주관한 대회를 참가하며 얻은 노하우를 공개합니다.

이 대회 뿐만 아니라 타 대회에서도 적용할 수 있는 개념들도 넣어보았습니다.


Class 분리

데이터셋의 label을 crash와 ego-involve, weather과 timing으로 분리 하였습니다.

  • crash : 전체 데이터에 대해 학습을 진행하였습니다.


  • ego-evolve : crash가 no(label이 0)인 데이터를 제외하고 학습을 하였습니다. batch size를 8로 설정하였을 때 f1이 0.72가 최대였습니다.
  • 이세님이 제안하신 ego + crash 방법을 적용하여 학습 중에 있습니다.


  • weather : weather에 대한 label을 'Snowy', 'Rainy'로 나누었습니다.
  • 데이터는 label이 0인 데이터를 제외한 데이터로 학습을 하였습니다.
  • Snowy 모델 : Snowy이면 1, 아니면 0(Snowy 데이터 포함)
  • Rainy 모델 : Rainy이면 1, 아니면 0(Rainy 데이터 포함)
  • Snowy보다 Rainy에 대한 정확도가 높아, 나중에 label 통합 시에 Rainy와 Snowy가 둘 다 True라면 더 높은 정확도를 보여준 모델을 우선으로 하도록 하였습니다.
  • 위 방법으로 학습 시 정확도 감소 -> multi-class classification으로 진행하는 편이 좋음


  • timing : label이 0인 데이터를 제외한 데이터로 학습을 진행하였습니다.


Train / Valid 데이터셋 분리

  • scikit-learn의 StratifiedKFold을 사용하였습니다.
  • 이 방법은 Cross-validation을 통해 데이터셋이 불균형한 경우에도 높은 정확도를 낼 수 있습니다.


Class weights 계산

  • 현 대회의 데이터셋처럼 class imbalance하다면, class weights를 계산하여 Loss에 할당하는 방법이 있습니다.
  • 직접 계산하는 방법도 있지만, 저는 편의를 위해 scikit-learn의 compute_class_weight 모듈을 사용하고 있습니다.


FocalLoss 적용

  • focalLoss가 Object detection에만 적용 가능한 것으로 알고 있었지만, 다른 분께서 토크 글로 classification에도 적용이 가능하다는 것을 알려주셔서 적용하였습니다.
  • [FocalLoss 코드]

class FocalLoss(nn.Module):

  def __init__(self, weight=None, gamma=2, reduction='mean'):

    super(FocalLoss, self).__init__()

    self.weight = weight

    self.gamma = gamma

    self.reduction = reduction


  def forward(self, inputs, targets):

    ce_loss = F.cross_entropy(inputs, targets, weight=self.weight, reduction=self.reduction)

    pt = torch.exp(-ce_loss)

    focal_loss = ((1-pt)**self.gamma * ce_loss).mean()

    return focal_loss

  • Train function에서 criterion = FocalLoss().to(device)로 사용하시면 됩니다.
  • FocalLoss 논문에서 gamma = 2로 설정하는 것이 성능이 가장 좋다고 하였습니다.


데이터셋 RAM 업로드

  • RAM 뿐만 아니라 VRAM에도 데이터셋 업로드가 가능합니다.
  • 단순히 데이터 증폭(또는 normalize)를 하여 RAM(VRAM)에 업로드하는 것도 됩니다.
  • Model에 데이터를 집어 넣어 feature을 업로드 하는 것도 되지만, image 데이터셋은 불가능합니다.(RAM이 1TB 이상이면 가능)
  • [RAM 업로드 코드]

class CustomDataset(Dataset):

  def __init__(self, video_path_list, label_list):

    self.video_path_list = video_path_list

    self.label_list = label_list

    self.frames_list = []


    for video in tqdm(self.video_path_list):

      sub_frames = []

      cap = cv2.VideoCapture(video)

      for aa in range(CFG['VIDEO_LENGTH']):

        _, img = cap.read()

        img = cv2.resize(img, (CFG['IMG_SIZE'], CFG['IMG_SIZE']))

        img = img / 255.

        sub_frames.append(img)

      frame_torch = torch.FloatTensor(np.array(sub_frames)).permute(3, 0, 1, 2)                <-- .to(deivce)를 하면 VRAM에도 업로드 됩니다.

      self.frames_list.append(frame_torch)

     

  def __getitem__(self, index):

    frames = self.frames_list[index]

     

    if self.label_list is not None:

      label = self.label_list[index]

      return frames, label

    else:

      return frames

     

  def __len__(self):

    return len(self.video_path_list)

  • 현 대회 데이터셋을 올렸을 때, 학습 속도가 약 2배 향상되었습니다.
  • 현 대회 데이터셋을 기준으로 img size가 128로 설정하였을 때, RAM 환경이 최소 64GB 이상 되어야 합니다.
  • 이 대회에서는 VRAM 업로드는 불가능 합니다.



아직 딥러닝에 입문한지 6개월 밖에 되지 않았고, 독학으로 시작하였기 때문에 기초가 많이 부족합니다.

더 열심히 공부하여 더 많은 노하우를 공유할 수 있도록 하겠습니다!!

로그인이 필요합니다
0 / 1000
이세의인공지능
2023.02.11 01:42

거의 우승자 솔루션 보는 느낌이네요... 대단합니다..ㄷㄷ

낰낰교수
2023.02.11 18:09

독학으로 6개월에 이정도시라니 좋은 글 너무 잘봤습니다

이전 글
대회 일정 및 채점 기준
Competition - 스마트 공장 제품 품질 상태 분류 AI 온라인 해커톤
Likes 5
Views 1,899
Comments 4
2년 전
현재 글
데이터셋 전처리 & 현재 적용한 아이디어 & 학습 속도 향상 방법 공유(Public 0.65823)
Competition - 코스포 x 데이콘 자동차 충돌 분석 AI경진대회 채용
Likes 25
Views 3,270
Comments 2
2년 전
다음 글
혹시 lg aimers 수료증은 언제쯤 나올까요?
Competition - 스마트 공장 제품 품질 상태 분류 AI 온라인 해커톤
Likes 3
Views 2,536
Comments 1
2년 전