Data/코드 리뷰

[Happy_whale] EffNet Embedding cos Distance

neulvo 2022. 4. 7. 18:34
 

🐬Whales&Dolphins: EffNet Embedding cos Distance

Explore and run machine learning code with Kaggle Notebooks | Using data from multiple data sources

www.kaggle.com

HappyWhale 2022 케글 공모전의 코드.

담고 있는 내용이 많고 좋은 것 같아서 리뷰해보고자 한다.

 

라이브러리 import 및 색상 설정.

 

Wandb에 login하는 코드이다.

Wandb는 AI 학습 Tracking 및 시각화 서비스를 제공하는 사이트인데

이번 코드를 통해서 알게 되었다.

 

plot에 text를 출력해주는 함수.

v와 h는 vertical, horizontal

np.ndenumerate는 배열의 다차원 index와 그 값을 리턴하는 함수.

 

위에서 부터 차례로, dataset을 W&B artifactory에 저장해주는 함수.

W&B 환경에 data table을 만들고 유형에 따라 plot을 만들어주는 함수.

W&B 환경에 data table을 만들고 히스토그램을 만들어주는 함수.

 

train 데이터를 부르고 이름이 잘못 기재된 데이터의 이름을 변경해주었다.

species 끝을 잘라서 dolphin과 whale을 나눠주는 class 칼럼을 만들어주었다.

image 명과 결합해서 path를 만들어주었다.

그리고 데이터 프레임을 뽑아보았다.

 

wandb 환경을 initiate 해주었다.

individual_id(개체 고유값)을 기준으로 value_counts()해주었고

전체값과 위에서 1000개를 뽑은 값을 각각 저장해주었다.

15587개의 고유 개체가 있으며

개체의 등장 횟수는 최대 400 번, 최소 1 번이다.

histogram과 barplot을 만들어주었다.

histogram에서는 arrow로 특정 지점을 찍어 text를 출력해주었고

barplot에서는 axhspan에 색상을 입히고 특정 text를 출력해주었다.

 

위 코드의 결과들과 W&B에 plot과 hist를 만들어주는 코드.

wand.finish()로 project를 닫아주었다.

 

전체 데이터에서의 whale과 dolphin의 비율을 뽑아 시각화해주었다.

whale과 dophin 내에서 species에 따른 등장 횟수를 시각화해주었다.

 

W&B에 plot을 만들어주었다.

 

벨루가의 id 별 등장 횟수를 시각화한 자료와 상위 20개의 id 중에서 Species 별 그 등장 횟수를 시각화한 자료.

top_species에서 head를 20으로 뽑았는데 plot에서는 Top 10 IDs로 text를 써놨다.

일단, 말하고자 하는 내용은 bottlenose_dophin, minke_whale, humpback_whale,fin_whale 등에서

등장 횟수가 많은 개체들이 존재한다는 것.

그리고 Beluga는 800개가 넘는 고유 개체가 있지만 대부분이 10 번 아래로 등장하기 때문에

개별 개체의 count가 높은 것으로 잡히지 않았다는 것이다.

그런데 humpback_whale이나 fin_whale의 등장 횟수가 400이 넘지 않는데

histogram에서 count가 400을 넘는 것으로 보이는 Beluga가 plot에서 잡히지 않은 것은 의아하다.

살펴보니, 내가 잘못 이해했었다.

x축이 등장 횟수여서 1번 등장한 개체가 400 개가 넘는다는 뜻이었다.

 

W&B에 hist와 plot을 만들어주었다.

위의 자료와 같은 name으로 프로젝트를 끝마치기 위해 여기서 wandb.finish() 해준 모습이다.

 

species 에서 sample 개수 만큼 뽑아 image를 출력해주는 함수.

wadb.log()로 W&B에 기록해주었다.

 

특정 individual의 image를 sample 개수만큼 보여주는 함수.

 

imagesize 함수를 사용해 width와 height를 불러오고

그 곱을 dimension 칼럼 아래 저장해주었다.

그리고 Species의 Image size 분포를 시각화하였다.

 

Species의 dimension을 시각화하였다.

fraisers_dolphin, pygmy_killer_whale, dusky_dolphin 등의 dimension이 낮은 것을 확인할 수 있다.

 

train과 test 셋의 이상한 사진들을 직접 뽑았다고 한다.

 

위의 사진이 gray_whale로 분류되어서 해당 individual_id의 개체 사진을 뽑아보았다.

73개의 샘플 이미지들이 있어서 위의 사진이 없더라도 큰 영향을 끼치지 않을 것 같다.

 

전처리 부분이다. Cosine Distance를 기반으로 Image Similarity를 뽑을 것인데 그를 위한 준비 과정이다.

image의 확장자를 제거하여 target 데이터를 만들어주고

unique key 값을 가지는 mapping을 만들어주었다.

그리고 train 데이터 프레임에 merge해주었다.

그 후, Kfold를 적용하여 key값에 따라 fold를 나눠주었다.

 

test_images 폴더에서 test image를 부른 후 데이터 프레임을 만들어주었다.

그리고 로컬에 저장하고 W&B에 저장해주었다.

 

모델 학습을 위한 import, device 설정.

파라미터 설정.

샘플 데이터 추출. (전체 데이터 학습은 여기서 하지 않았다.)

 

albumentations 패키지를 활용해서 image를 변형해주는 함수.

이를 통해 data augmentation도 할 수 있다.

데이터 셋에서 image를 변형해주고 torch.tensor로 전달해주는 클래스.

dataset을 만든 후, DataLoader에 넣어 배치를 만들어주었다.

EfficientNet의 pretrained 모델을 불러오는 클래스.

load한 모델에 img를 전달.

그리고 모델 initiate.

__init__() 생성자 메서드 아래에 super로 같은 생성자를 둔 것은 찾아보니

부모 module에서 물려준 인자를 남겨주기 위한 파이썬 2의 문법이라 한다.

안해주면 덮어쓰기 되서 새로 추가한 성질들만 남는다고 한다.

 

batch를 돌며 embedding과 targets 값을 저장해주었다.

그리고 이 값들을 concatenate 해주었다.

local에 저장하고 W&B artifact에 저장해주었다.

 

cosine_similarity를 계산해주는 함수.

individual_key가 1인 데이터 샘플을 뽑아서 그 embeddings을 가져온 다음,

cosine_similarity를 계산해주었다.

mask는 metrix의 아래쪽 삼각형만 보겠다는 의미.

sns.heatmap()으로 시각화해주었다.

 

이런 식으로 나온다.

wandb.finish()로 프로젝트를 닫아주었다.

데이터셋 이미지로 학습하지 않았기 때문에 similarity score가 낮게 나온다.

728x90