2022 인공지능 온라인 경진대회 후기

YeongUk·2022년 6월 21일
1

MachineLearning

목록 보기
2/4
post-thumbnail

안녕하세요. 2022 인공지능 온라인 경진대회에서 소고기 이미지를 통한 등급 분류 과제에 참가한 KoreanBeef팀 입니다.

첫 대회 참여임에도 불구하고 92팀 중 24위라는 뜻 깊은 성과를 낼 수 있었습니다.
하지만 이 과제를 진행하면서 많은 우여곡절이 있었는데 여기서 그 우여곡절에 대해 다루어 보겠습니다.

인공지능 온라인 경진대회??

2022 인공지능 온라인 경진대회는 우수한 기술력을 보유한 인공지능 중소 벤처 기업을 발굴하여 사업화를 지원함으로써 인공지능 기술의 활용과 확산을 촉진 하기 위한 대회입니다. 6월 7일부터 22일까지 2주 조금 넘게 진행되었습니다.

자세히 보기

왜 소고기?

일단 이미지를 하고 싶었다. 이미지는 토지 피복도, 소고기, 항만 구조물, 주차 이동체 객체 검출 이렇게 있었는데 소고기가 지금까지 배웠던 것들을 가장 많이 테스트 할 수 있겠다는 생각으로 하게 되었습니다.

모델 개발 과정

baseline model

베이스라인으로 주어진 모델들은 efficientnetB4, resnet50이 주어졌습니다.
하지만 이보다 훨씬 좋은 사전학습 모델이 많이 있을 것이기에 이를 사용하지 않고 다른 모델들(convnext_l, convnext_xl, regnet, resnet, efficientnet_rwm, spinalnet, efficientnetB7 등)을 적용시키기로 합니다. Optimizer는 wAdam을 썼습니다.

Detectron2

나름 아이디어를 적용했던 아이었다. 89의 늪에서 우리 팀을 구원해줄 효자가 될 아이라고 생각했다. 그렇기에 잦은 오류(polygon 따는 것에서의 오류 등)가 발생함에도 똑바로 키워서 돌려보았으나 역대 최저점...
잦은 삽질에도 불구하고 애지중지 키웠던 트론이가 불효자로 판명나서 이미지 증강을 하기로 했습니다.

이미지 증강

Albumentations

image의 형태를 변환하여야할 때, 보통은 torchvision.transforms를 주로 사용해왔다. 하지만 좀 더 다양한 augmentation을 지원하는 library를 찾던 중 처리속도도 빠르고 기능도 다양한 Albumentations을 사용해봤어요.

import albumentations
import albumentations.pytorch
import albumentations.augmentations

class CowDataset(Dataset):
	def __init__(self, img_folder, dfpath):
    	•••
        self.transform = albumentations.Compose([ 
            albumentations.RandomCrop(160, 160),
            albumentations.OneOf([
                              albumentations.HorizontalFlip(p=1),
                              albumentations.RandomRotate90(p=1),
                              albumentations.VerticalFlip(p=1)            
            ], p=1),
            albumentations.OneOf([
                              albumentations.MotionBlur(p=1),
                              albumentations.OpticalDistortion(p=1),
                              albumentations.GaussNoise(p=1)                 
            ], p=1),
            albumentations.pytorch.transforms.ToTensorV2()
        ])

앙상블

블랜딩

결과 csv들을 모두 더한 다음 평균을 적용시켰습니다.

Soft Voting

#총 7개 결과 중에 4개 이상은 몰아주기 / 4개 미만은 평균값에 소수점 제하고 +1
grade_result=[]
label={'1++':4,'1+':3,'1':2,'2':1,'3':0}
label_index=['3','2','1','1+','1++']
for i in range(df.shape[0]):
  lcnt_df=df.iloc[i,1:].value_counts()
  vot_l = lcnt_df[lcnt_df.values>=4]
  result=0
  if len(vot_l)==0:
    for j,x in enumerate(lcnt_df):
      result+=label[lcnt_df.index[j]]*x
    result_t=int(result/7)+1
    df.loc[i, 'grade'] = label_index[result_t]
  
  else:
    df.loc[i, 'grade'] = vot_l.index[0]

대회 참가 후기

대회를 진행하면서 수많은 삽질을 했고, 그와 동시에 많이 성장할 수 있었다는 생각을 하게 되었습니다.

아쉬웠던 점은 초기 설계 문제를 빨리 파악하지 못해서 시간이 지체되어 augmentation을 많이 해보지 못한게 아쉬움으로 남았습니다.

profile
소통과 배움을 통해 개인이 가진 맹점을 극복하려 노력하고 있습니다.

0개의 댓글