Pytorch 풍경 이미지분류 알고리즘의 구현¶
- 사용된 데이터셋은 kaggle - Scene Classification이다.
- 해당 데이터셋은 24,335개의 자연경치 사진으로 이루어져 있다.
- 총 6개의 분류를 사용한다. (0 : 빌딩, 1 : 숲, 2 : 빙하, 3 : 산, 4 : 바다, 5 : 거리)
- 각 이미지는 150 x 150의 크기를 가진다.
1. 학습 이미지 알아보기¶
- 학습 이미지를 확인한다.
In [51]:
import os
import pandas as pd
# 파일과 csv를 포함하는 폴더 경로 지정
path = 'D:/workspaces/WinterStudy2022/pytorchPractice/practice1_scene/train-scene classification/'
# 전체 이미지 개수 출력하기
# 파일 os.listdir를 이용하여 디렉토리 내 파일을 리스트화하여 file_list에 저장한다.
file_list = os.listdir(path + 'train/')
print("file_list 확인 : ",file_list[:5])
print("file_list 타입확인 : ", type(file_list))
print('전체 이미지의 개수:', len(file_list))
file_list 확인 : ['0.jpg', '1.jpg', '10.jpg', '100.jpg', '1000.jpg'] file_list 타입확인 : <class 'list'> 전체 이미지의 개수: 24335
In [52]:
# 학습 이미지 확인하기
dataset = pd.read_csv(path + 'train.csv')
print('학습 이미지의 개수:', len(dataset))
print('학습 이미지별 클래스 정보')
dataset.head()
학습 이미지의 개수: 17034 학습 이미지별 클래스 정보
Out[52]:
image_name | label | |
---|---|---|
0 | 0.jpg | 0 |
1 | 1.jpg | 4 |
2 | 2.jpg | 5 |
3 | 4.jpg | 0 |
4 | 7.jpg | 4 |
In [53]:
dataset.tail()
Out[53]:
image_name | label | |
---|---|---|
17029 | 24325.jpg | 4 |
17030 | 24328.jpg | 3 |
17031 | 24329.jpg | 3 |
17032 | 24332.jpg | 5 |
17033 | 24334.jpg | 2 |
Problem 1. 클래스별 학습 이미지 개수 출력¶
- 각 분류별 이미지의 개수를 출력한다.
In [54]:
# groupby를 활용한 데이터셋 확인
classifications = dataset.groupby(by = dataset['label']).count()
classifications
Out[54]:
image_name | |
---|---|
label | |
0 | 2628 |
1 | 2745 |
2 | 2957 |
3 | 3037 |
4 | 2784 |
5 | 2883 |
In [27]:
# 파일 확인
classifications['image_name'].sum()
Out[27]:
17034
2. 특정한 이미지를 불러와 화면에 출력하기¶
- skimage 패키지 설치 :
pip3 install scikit-image
- image 패키지 설치 :
pip3 install image
np.asarray(param)
: param을 array화plt.inswho(param)
: param을 2D 일반 래스터와 같은 이미지로 표시
In [74]:
from skimage.transform import resize
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
# 경로 내 첫 번째 이미지를 호출
img = Image.open(path + 'train/' + file_list[0])
# 이미지를 array화
img = np.asarray(img)
# image를 64 * 64 * 3 형태로 변환
img = resize(img, (64, 64, 3))
print('이미지의 해상도:', img.shape)
# matplotlib을 활용하여 이미지 호출
# 이미지 출력하기
plt.imshow(img)
plt.show()
이미지의 해상도: (64, 64, 3)
3. 학습/검증 데이터셋 나누기¶
- 학습 이미지 데이터를 8(학습) : 2(검증) 데이터로 구분
train_test_split(test_size, train_size, shuffle)
: 데이터를 일정 기준에 따라 분리 (test_size = 테스트 데이터의 비율, train_size = 학습 데이터셋의 비율(default = 1 - test_size, shuffle : 데이터를 분할할 때 자동으로 섞기 진행)
In [80]:
from sklearn.model_selection import train_test_split
# 모든 데이터를 train_dataset과 val_dataset으로 분리하여 저장
train_dataset, val_dataset = train_test_split(dataset, test_size=0.2)
print('학습 데이터셋 크기:', len(train_dataset))
print('검증 데이터셋 크기:', len(val_dataset))
학습 데이터셋 크기: 13627 검증 데이터셋 크기: 3407
Problem2. 학습/검증 데이터셋 구성¶
- 이미지는 별도 폴더 안에 존재함.
- 모든 이미지를 읽어 전체 이미지를 numpy 객체로 구성
- 아래 코드를 참고하여 작성하도록 함
In [ ]:
for index, row in train_dataset.iterrows():
print(index, row['image_name'], row['label'])
In [135]:
temp_list = []
temp_list2 = []
for index, row in train_dataset.iterrows():
temp_img = Image.open(path + 'train/' + train_dataset.loc[index]['image_name'])
temp_img = np.asarray(temp_img)
temp_img = resize(temp_img, (64, 64, 3))
temp_list.append(temp_img)
temp_list2.append(train_dataset.loc[index]['label'])
In [134]:
X_train = np.asarray(temp_list)
In [130]:
X_train.shape
Out[130]:
(13627, 64, 64, 3)
In [138]:
y_train = np.asarray(temp_list2)
In [139]:
y_train.shape
Out[139]:
(13627,)
In [140]:
temp_list3 = []
temp_list4 = []
for index, row in val_dataset.iterrows():
temp_img2 = Image.open(path + 'train/' + val_dataset.loc[index]['image_name'])
temp_img2 = np.asarray(temp_img)
temp_img2 = resize(temp_img, (64, 64, 3))
temp_list3.append(temp_img)
temp_list4.append(val_dataset.loc[index]['label'])
In [142]:
X_test = np.asarray(temp_list3)
X_test.shape
Out[142]:
(3407, 64, 64, 3)
In [143]:
y_test = np.asarray(temp_list4)
y_test.shape
Out[143]:
(3407,)
'전문지식 함양 > TIL' 카테고리의 다른 글
[프로그래머스 겨울방학 인공지능 과정] GAN 이론 기초 (0) | 2022.02.07 |
---|---|
[프로그래머스 겨울방학 인공지능 과정] python 풍경 이미지분류 알고리즘의 구현2 (0) | 2022.01.27 |
[프로그래머스 겨울방학 인공지능 과정] pytorch 예제 살펴보기1 (0) | 2022.01.25 |
[프로그래머스 겨울방학 인공지능 과정] 딥러닝 기초이론 (0) | 2022.01.24 |
[프로그래머스 겨울방학 인공지능 과정] numpy 복습 및 심화문제 (0) | 2022.01.20 |