본문 바로가기
IT/머신러닝&딥러닝

[머신러닝/딥러닝] 항공 사진 내 선인장 식별 경진대회 (1)_탐색적 데이터 분석

by vulter3653 2023. 1. 30.

<머신러닝. 딥러닝 문제해결 전략> 3 11장 실습하고 해당 내용 정리한 내용입니다.

 

https://www.kaggle.com/c/aerial-cactus-identification

 

Aerial Cactus Identification | Kaggle

 

www.kaggle.com

1. 경진대회 이해

본 경진대회는 데이터 크기가 작고 난이도도 낮은 플레이그라운드 대회로, 항공 사진에서 선인장을 찾아내는게 목표입니다.

따라 주어진 데이터에는 csv파일에 더해 '이미지 파일'도 제공합니다. 주어진 데이터는 다음과 같습니다.

 

● train.zip : 훈련 이미지 데이터(jpg 형식) 압축 파일

● test.zip : 테스트 이미지 데이터(jpg 형식) 압축 파일

● train.csv : 훈련 이미지 데이터 파일명 및 타깃값(타깃값은 0 또는 1)

● sample_submission.csv : 샘플 제출 파일

 

훈련 이미지, 테스트 이미지 데이터는 압축 파일로 제공합니다. (압축을 풀어서 사용).

train.csv 에는 이미지 파일명(id)과 타깃값(has_cactus) 정보가 기재되어 있습니다.

이미지 파일명(id)은 train.zip에 들어 있는 이미지 데이터의 파일명을 뜻하며,  타깃값은 0 또는 1인데, 0이면 해당 항공 사진에 선인장이 없다는 뜻이고, 1이면 있다는 뜻입니다. 따라목표는 [테스트 이미지 데이터에 선인장이 있을 확률을 예측] 하는 것 입니다.

2. 탐색적 데이터 분석

데이터의 전반적인 양상을 살펴보고 실제 이미지가 어떻게 생겼는지 알아보기 위한 작업입니다.

따라 먼저 데이터를 둘러보고, 다음 타깃값 분포를 알아본 뒤, 마지막으로 이미지 몇 개를 샘플로 출력하고 끝납니다.

01. 데이터 둘러보기

먼저 csv 데이터를 불러옵니다.

import pandas as pd

# 데이터 경로
data_path = '/kaggle/input/aerial-cactus-identification/'

labels = pd.read_csv(data_path + 'train.csv')
submission = pd.read_csv(data_path + 'sample_submission.csv')

불러온 데이터를 살펴보겠습니다.

id 피처는 훈련 데이터의 이미지 파일명입니다. 그리고 has_cactus는 타깃값입니다. 해당 파일명을 가진 이미지가 선인장을 포함하는지 여부를 나타냅니다. 0이면 선인장이 없고, 1이면 있다라는 의미입니다.

 

다음으로 제출 샘플 파일을 살펴보겠습니다.

위와 동일하게 id 피처는 테스트 데이터의 이미지 파일명, has_cactus는 타깃값입니다.

분석 결과
id = 이미지 파일명 (확장자 포함)

02. 데이터 시각화

데이터를 시각화해보겠습니다. 주어진 데이터는 csv 파일과 이미지 파일입니다. csv 파일에는 이미지 파일명과 타깃값밖에 없어서 타깃값만 활용해 그래프를 그려볼 예정입니다. 또한 몇 가지 이미지를 실제로 출력해보겠습니다.

- 타깃값 분포

먼저 파이 그래프를 통해, 타깃값 분포를 보겠습니다.

타깃값 0 (Hasn't cactus)과 1(Has cactus)의 비율이 약 1:3입니다.

- 이미지 출력

다음으로 어떤 이미지가 사용되는지 보겠습니다. 

 

zipfile 모듈의 ZipFile 클래스를 사용하면 zip 파일을 풀 수 있습니다.

from zipfile import ZipFile

# 훈련 이미지 데이터 압출 풀기
with ZipFile(data_path + 'train.zip') as zipper:
    zipper.extractall()
    
# 테스트 이미지 데이터 압출 풀기
with ZipFile(data_path + 'test.zip') as zipper:
    zipper.extractall()

ZipFile()의 파라미터로 zip 파일 경로를 전달합니다. with문으로 할당한 zipper 객체에 extractall()메소드를 호출하면 zip파일의 압춥을 풉니다.

 

다음과 같이 압축이 풀린 파일들은 작업 디렉터리에서 확인할 수 있게 됩니다.

다음 훈련 데이터의 개수와 테스트 데이터의 개수를 확인하기 위해, train 디렉터리와 test 디렉터리에 각각 이미지 파일이 몇 개 있는지 알아보겠습니다.

 

이때 os 모듈을 사용합니다. os.listdir()는 인수로 전달한 경로에 들어 있는 파일들의 이름 전체를 리스트로 반환합니다. 해당 리스트에 len() 함수를 통해 전체 파일의 개수를 세수를 통해 이미지 파일이 몇 개인지 알 수 있습니다.

훈련 데이터는 17,500개이고 테스트 데이터는 4,000개입니다.

 

이제 훈련 이미지 데이터를 몇 개 출력해보겠습니다.

 

이미지 파일을 읽기 이해 OpenCV 라이브러리를 사용합니다. OpenCV는 오픈소스 컴퓨터 비전 라이브러리로, 영상 처리에 자주 사용되는 라이브러리 입니다.

import matplotlib.gridspec as gridspec
import cv2 # OpenCV 라이브러리 임포트

mpl.rc('font', size=7)
plt.figure(figsize=(15, 6))    # ⓐ전체 Figure 크기 설정
grid = gridspec.GridSpec(2, 6) # 서브플롯 배치(2행 6열로 출력)
    
# ⓐ 선인장을 포함하는 이미지 파일명(마지막 12개) 
last_has_cactus_img_name = labels[labels['has_cactus']==1]['id'][-12:]

# ⓑ 이미지 출력 
for idx, img_name in enumerate(last_has_cactus_img_name):
    img_path = 'train/' + img_name                 # ⓒ 이미지 파일 경로 
    image = cv2.imread(img_path)                   # ⓓ이미지 파일 읽기 
    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # ⓔ 이미지 색상 보정 
    ax = plt.subplot(grid[idx])
    ax.imshow(image)                               # ⓕ 이미지 출력

는 타깃값(has_cactus)이 1인 labels 데이터의 마지막 12개 id 값을 last_has_cactus_img_name 변수에 할당합니다. 타깃값 1은 이미지가 선인장을 포함한다는 뜻입니다. id 피처는 이미지 파일명을 나타냅니다. 따라서 이는 선인장을 포함하는 마지막 12개 이미지의 파일명을 할당하는 코드입니다.

 

ⓑ는 last_has_cactus_img_name을 순회하면서 해당 파일명을 가진 이미지를 출력합니다.

 

ⓒ훈련 데이터 디렉터리와 파일명을 합쳐서 이미지 파일의 경로를 구해 ⓓ 이미지를 읽어옵니다.

 

이때 cv2.imread()로 이미지를 읽으면 색상 채널을 BRG(파랑, 초록, 빨강) 순서로 불러옵니다. 하지만 실제 색상은 RGB 순서이므로 채널 순서를 바꿔줘야 합니다. 이때 ⓔ가 채널 순서를 바꿔주는 기능을 수행합니다.

 

ⓕ 마지막으로 이미지를 출력합니다.

 

결과는 아래와 같습니다.

해상도가 많이 떨어져서 육안으로는 선인장인지 명확히 판별하기 어렵지만, 길쭉한 물체가 선인장입니다.

 

선인장을 포함하지 않는 이미지도 출력해겠습니다. has_cactus 피처가 0인 이미지를 추출하면 됩니다. 이 점만 제외하면 앞 코드와 동일합니다.

여전히 해상도가 떨어지지만 앞에서 본 이미지와 다르게 길쭉한 물체가 보이진 않습니다. 즉, 선인장이 없다는 의미입니다.

 

마지막으로 이미지 형상을 출력해보겠습니다.

이미지의 가로 픽셀 수, 세로 픽셀 수, 채널 수가 출력됩니다. 따라  가로, 세로 크기는 32 x 32 이며, 채널은 3개임을 의미합니다. 이때, 채널이 3개인 이유는 제공된 데이터가 빨강(R), 초록(G), 파랑(B)으로 이루어진 컬리 이미지이기 때문입니다.

 

데이터 분석 정리

1. csv 파일의 id 피처는 이미지 파일명입니다. 파일의 경로명만 추가하면 파일의 위치를 바로 얻어올 수 있습니다.

2. 제공된 이미지 파일들은 낮은 해상도의 컬러 이미지(32 x 32 x 3) 입니다.