본문 바로가기
머신러닝 딥러닝

0929 Dogs vs Cats csv 파일로 저장

by 대금부는개발자 2021. 9. 29.
SMALL

 

Deep Learning은 학습 data가 많아야 해요!

→ 현실적으로 이렇게 많은 data를 구하기 힘들어요!!

 

데이터량이 작아요 → 일반적으로 1.000~100.000

 

Dogs vs Cats 예제를 가지고 학습해 보아요→ (실제 이미지)'이진 분류'

→ kaggle에서 data를 내려받아요!

 

고양이 사진 12.500개 → cat. 숫자. jpg

멍멍이 사진 12.500개 → dog. 숫자. jpg

총 25.000장의 image data

 

지금까지 CSV 파일을 이용해서 처리했어요. → 제공된 이미지 file을 이용해 CSV 파일을 만들어 보아요!

 

이 방식의 단점 → 이미지가 너무 많으면 CSV 파일의 크기가 커지고 메모리에 로딩이 안될 수 있어요!

 

CSV 만드는 작업 → local acaconda에서 수행

Deep Learning 수행 → Colab 수행

tqdm → 진행바(ProgressBar) 설치

acaconda prompt → conda install tqdm → conda install -c conda-forge ipywidgets

 

안되면 pip install ipywidgets

 

다양한 이미지 처리

conda install opencv

 

import numpy as np

import pandas as pd

import os #파일이 몇 개 있는지(파일명) 등을 os 기능을 사용해요

import cv2 as cv #open cv 이미지 파일 읽기

from sklearn import utils # sklearn의 shuffle과 같은 기능 사용

from tqdm.notebook import tqdm

 

# 이미지 파일 경로

train_dir = 'C:/python_ML/data/cat_dog/train'

 

 

# 만들어진 CSV의 형식은 MNIST의 train.csv와 같은 형식으로 만들 거예요.

# 첫 번째 column → label( label 0 : cat, label1 : dog) 이렇게 만들 거예요!

# 이미지의 크기는 80 x 80

# 우리의 CSV 파일로 DataFeame을 만들면 shape → (25000, 6401)

 

# 이미지 파일의 이름을 이용해서 해당 이미지의 label을 알아내야 해요!

# cat. 숫자. jpg → 고양이 → label → 0

# dog. 숫자. jpg → 멍멍이 → label → 1로 세팅해보아요!

 

# 이 처리를 하기 위한 함수를 하나 작성해 보아요!

# 예) dog.20.jpg → split 처리 → ['dog', '20', 'jpg'] 리스트로 리턴

# 앞에 dog만 필요 index 0번

def labeling(img):

class_name = img.split('.')[0]

if class_name == 'cat':

return 0

elif class_name == 'dog':

return 1

 

# print(labeling('cat.20.jpg')) # 함수 동작 확인!

 

# label data와 pixel data를 담을 리스트 변수를 선어

x_data = list() # 모든 file의 pixel data

t_data = list() # 모든 file의 list data

 

# tqdm 함수를 이용해서 ProgressBar를 찍으면서 list 이용

# 첫 번째 인자 : train 폴더 안에 있는 모든 파일의 이름(25000개)를 알아야 해요!

# → os.listdir() 해당 폴더 안에 있는 파일들의 이름들을 python list 변환

# 두 번째 인자 : train 폴더 안에 모든 파일의 이름

# position= 시작 위치 처음부터 시작 0

# leave=True 지속적으로 한 칸씩 움직여~갱신 여부

 

# print(os.listdir(train_dir))

for img in tqdm(os.listdir(train_dir),

total=len(os.listdir(train_dir)), # total 전체 파일의 개수 25000개

position=0,

leave=True):

# 파일명을 이용해서 먼저 label을 알아내요!

label_data = labeling(img) # 현재 파일의 label을 알아내요( 0 or 1 )

 

# 파일명에 대한 full path를 만들어요! → 이걸 이용해서 이미지 파일의 pixel data를 추출할 거예요!

# full path : 만약 img가 cat.10.jpg 면 → C:/python_ML/data/cat_dog/train/cat.10.jpg

img_path = os.path.join(train_dir,img) # 파일 경로와 우리의 이미지 data를 이용해 경로 지정

 

# 이미지를 읽어들이면서 흑백으로 변환

# 제각각인 size를 80x80 크기로 변환

img_data = cv.resize(cv.imread(img_path, cv.IMREAD_GRAYSCALE), (80,80)) # 2차원 pixel data

 

x_data.append(img_data.ravel())

t_data.append(label_data)

 

# 이렇게 만든 x_data, t_data를 DataFrame으로 만들어서 CSV 파일로 저장!

 

x_df = pd.DataFrame(x_data)

t_df = pd.DataFrame({ 'label' : t_data }) # dictionary의 key 값이 column 명 # label

display(x_df)

 

# 두 개의 DataFeame을 merge 하면 돼요!

df = pd.merge(t_df, x_df, left_index=True, right_index=True) # index 이용 merge

 

display(df)

 

# file이 순차적으로 cat부터 읽혀요 c가 d 보다 앞 → DataFrame의 행들을 랜덤하게 shuffle

 

shuffled_df = utils.shuffle(df) # sklearn의 shuffle 기능

 

#최종 DataFrame을 CSV 파일로 저장!

shuffled_df.to_csv('C:/python_ML/data/cat_dog/train', index=False)

C:\python_ML\data\cat_dog

shuffled_df.to_csv('C:/python_ML/data/cat_dog/train.csv', index=False)

 

 

LIST

'머신러닝 딥러닝' 카테고리의 다른 글

0930 Image generator  (0) 2021.09.30
0930 cat&dog CNN CSV파일  (0) 2021.09.30
0928 CNN 구현(tf 1.15, tf 2.x)  (0) 2021.09.28
0927 CNN(Convolution Neural Network)  (0) 2021.09.27
0917 CNN 합성곱 신경망  (0) 2021.09.17

댓글