도배 하자 유형 분류 AI 경진대회

아이디어 공유

2023.04.10 21:23 3,787 Views

데이터셋을 보며 느낀점과 적용할 수 있겠다고 생각한 아이디어를 공유합니다.


1. 데이터분석

>>> df['label'].value_counts()

훼손 1405

오염 595

걸레받이수정 307

꼬임 210

터짐 162

곰팡이 145

오타공 142

몰딩수정 130

면불량 99

석고수정 57

들뜸 54

피스 51

창틀,문틀수정 27

울음 22

이음부불량 17

녹오염 14

가구수정 12

틈새과다 5

반점 3

Name: count, dtype: int64

- '반점' class가 가장 적고, '훼손' class가 가장 많았습니다.

- class imbalance가 생각보다 심한 데이터셋이네요.

2. 데이터 증강 기법

Albumentations에는 다양한 augmentation 기법들이 존재합니다.

데이터셋을 분석했을 때, HorizentalFlip은 필수로 사용하는 것이 좋을 것 같고,

shift나 scale의 경우 하자가 없는 이미지가 나올 수 있으니 파라미터를 잘 조정해서 사용하는 것이 좋을 것 같습니다.

이외에도 추가적으로 사용하면 좋을 것 같은 augmentation기법들을 적용해보는것이 좋을 것 같습니다.

+) '걸레받이수정'과 '꼬임', 그리고 '몰딩수정' 데이터를 rotate 또는 verticalflip을 하면 구분을 못하게 되네요. rotate와 verticalflip은 안넣는것이 좋겠습니다.


3. stratifiedkfold 사용

class imbalance를 확인하고 stratifiedkfold를 사용했는데, f1-score가 0.1~0.2에서 머물렀습니다. 이유는 잘 모르겠지만, baseline의 train_test_split을 그대로 사용하는 것이 좋을 것 같습니다.

+) 데이터 추가 및 augmentation 방법을 사용하였을 때, straitifiedkfold 적용시에도 비슷한 score가 나왔습니다.

    voting 방법을 사용하지 않는다면 train_test_split 방법을 그대로 사용해도 나쁘지 않을 것 같습니다.

+) 대회에서 제공된 데이터셋의 갯수가 적고 class imbalance도 심하기 때문에 split을 한다면 train set과 valid set의 비율을 거의 비슷하게 해야할 것 같습니다.


4. Loss 사용

baseline에서 사용하는 CrossentropyLoss 이외에도 FocalLoss나 Asymmetricloss를 사용해보았지만, 오히려 성능이 감소했습니다.

class imbalance만 너무 신경쓰는 것은 지양해야할 것 같습니다.(아닐 수도.....)

+) 여러 augmentation 방법을 사용하고 난 후 FocalLoss를 사용하였을 때 성능이 증가하였습니다.


5. 학습 속도 향상

CustomDataset class를 수정하여 학습 속도를 향상하였습니다.

RAM에 데이터셋을 미리 load하는 방법입니다. 학습 속도가 약 2배정도 향상했습니다.

코드는 코드 공유 게시판에 업로드 하였습니다.

(공유했던 코드는 이미지 처리 분야에서는 보장되지 않는 randomness로 인해 사용하면 안되는 방법입니다 ㅠㅠ)

로그인이 필요합니다
0 / 1000
이세의인공지능
2023.04.10 22:10

저는 데이터 증강 기법에서 상하반전과 과도한 회전에 대한 리스크가 존재하지 않을까 추측하고 있습니다. 
데이터를 훑어보니 각도와 상하 요소가 존재하는 클래스도 있지 않을까 싶었습니다.
늘 그렇듯 도메인에 대한 이해를 하기 위해 도배 하자 유형부터 간단하게 읽어보고 있습니다. 유형을 나눈 기준이 무엇인지 알 수 없어서요!

EISLab_이희원
2023.04.10 22:33

아 다시 살펴보니 '꼬임'과 '걸레받이수정', '몰딩수정'이 회전시키면 구분을 못할 수 있겠네요.
저도 유형 파악 중인데, 파악된다면 Object detection도 적용시킬 수 있을것 같습니다.

이세의인공지능
2023.04.11 00:09

저는 segmentation을 통한 천장 벽 등의 분리는 어떨까도 생각은 하고 있습니다.. crack과 같은 문제에 대해선 detection보단 segmentation을 쓰는게 좋았던 기억이 있어서요! 좋은 의견 공유 감사합니다.

벵자민
2023.04.10 23:29

의견 공유 감사합니다.
rotate와 verticalflip은 안넣는것에 동의합니다. 
데이터 크롤링해서 추가하는게 가장 중요할거같네요 

설빙더아이스
2023.04.11 19:03

"사용에 법적 제약이 없으며, 누구나 변경, 재배포할 수 있는 공개된 외부 데이터 사용 가능" 이라고 적혀있는데 그러면 인터넷에 올라온 저작권 없는 사진 정도면 사용 가능할까요?

ixxi
2023.05.02 19:02

혹시 이미지 크롤링은 어디서 하시려는 건가요?? 저는 크롤링이 불법이라 불가능할거라 생각했었어요.

벵자민
2023.05.02 19:14

저희도 공식적으로 가져올만한 사이트를 찾지못해 따로 크롤링은 진행하지않았습니다. 혼란을 드려 죄송합니다.
대회에서 추가로 공지해준 정의에 맞게끔 다시 데이터 라벨 수정이 필요할거같긴합니다. 
개인적인 생각인데 몇몇 데이터들은 그냥 실제 사용자가 하자 신청 앱(?)을 통해 전달한 그대로를 제공한거같더라구요. 

설빙더아이스
2023.04.12 03:48

좋은 아이디어 공유 감사합니다. Flip이나 rotate와 같은 augmentation을 해줄 때 문제가 생길 것 같은 데이터는 변형 전후 사진을 모두 포함시켜 학습하는 것은 어떨까요? 추론이 아닌 학습에는 크게 상관 없지 않을까 하는 생각이 듭니다

EISLab_이희원
2023.04.13 01:40

삭제된 댓글입니다

EISLab_이희원
2023.04.13 01:40

train_test_split을 통해 split할 때, train과 valid set 각각에 동일한 데이터가 할당될 수 있어, overfitting 문제가 발생합니다.

설빙더아이스
2023.04.13 13:48

train_test_split을 해준 후에 Dataset, DataLoader에 넣게 되면 그 문제를 해결할 수 있을 것 같습니다!