일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Flexbox Froggy
- spring 환경설정
- SQL
- 객체지향프로그래밍
- Hooks
- 자바스프링
- SQL 연산자
- 스프링
- 자바 스프링
- 노마드코더
- Eclipse
- Flex Box 기본
- spring
- numpy
- SQL 명령어
- 플랙스박스기본
- REACT
- HTML5
- ubuntu
- 오산대맛집
- 이클립스
- 환경설정
- 타입
- java설치
- 리액트
- 람다식
- SQL 문제
- node.js
- 관계형데이터베이스
- java spring
- Today
- Total
이것저것
딥러닝 - 이미지 데이터 전처리 및 학습(1) 본문
캐글에서 Dogs vs Cats 파일을 받았다
링크는 아래에
https://www.kaggle.com/c/dogs-vs-cats/data
program을 작성해서 이미지로부터 pixel data를 추출해서 CSV파일로 만들어보자
마치 MNist data 처럼 CSV파일을 만들것이다.
이미지를 흑백으로 처리하고 이것을 numpy와 pandas를 이용해서 CSV 파일로 저장할 것이다.
CNN을 사용해서 이미지 파일 학습하기 전에
Anaconda 세팅을 먼저해야한다
아래를 참고하면된다
[기초기초기초!!/Python] - Anaconda 사용해서 python 사용하기
위에서 설치했던 것들을 import해준다
import numpy as np
import pandas as pd
from PIL import Image
import matplotlib.pyplot as plt
import cv2 as cv
from sklearn import utils
from tqdm.notebook import tqdm
import os
이제 이미지파일을 불러와서 변환해주는 작업을 진행하자
# 1. 경로 설정
train_dir = 'C:/Jupyter_home/data/cat_dog/train/'
# 2. 라벨링 함수 정의
def labeling(img):
class_name = img.split('.')[0] # cat.0.jpg => ['cat', '0', 'jpg']
if class_name == 'cat': return 0
elif class_name == 'dog': return 1
# 3. 데이터 저장을 위한 리스트 초기화
# 변수 2개를 설정하자
x_data = [] # pixel data를 담는다.
t_data = [] # target(label)을 담는다.
# 4. 이미지 데이터 및 라벨 데이터 생성
# 그림이 들어있는 경로안의 모든 이미지파일들을 반복하면서 데이터를 추출한다.
for img in tqdm(os.listdir(train_dir),
total=len(os.listdir(train_dir)),
position=0,
leave=True):
# 각 파일의 이름으로 label을 설정하자
label_data = labeling(img) # cat은 0, dog은 1
# print("현재 파일의 레이블", label_data)
# 5. 이미지 처리
# 이미지에 대한 픽셀데이터를 가져와야한다.
path = os.path.join(train_dir,img)
# c:/jupyter_home/data/cat_dog/train/cat.o.jpg를 IMREAD_GRAYSCALE 흑백으로 가져와라
img_data = cv.resize(cv.imread(path, cv.IMREAD_GRAYSCALE), (80,80))
print(type(img_data), img_data.shape)
# plt.imshow(img_data, cmap='gray')
plt.show()
# 6. 리스트에 데이터 추가
t_data.append(label_data)
x_data.append(img_data.ravel()) # 2차원을 1차원으로 바꿔주는 ravel()
# 1. 경로 설정
학습에 사용될 이미지들이 저장된 디렉터리의 경로를 train_dir 변수에 저장한다.
# 2. 라벨링 함수 정의
labeling 함수는 이미지 파일의 이름을 입력받아 파일 이름에 따라 클래스 라벨을 반환하는 함수이다.
파일의 이름이 cat으로 시작하면 0을 dog로 시작하면 1을 반환한다.
# 3. 데이터 저장을 위한 리스트 초기화
x_data는 각 이미지의 픽셀 데이터를 저장할 리스트이다.
t_data는 각 이미지에 해당하는 라벨(0 or 1)을 저장할 리스트이다.
# 4. 이미지 데이터 및 라벨 데이터 생성
os.listdir(train_dir)을 사용하여 train_dir 디렉터리 안의 모든 파일명을 가져온다.
각 파일명에 대해 labeling 함수를 호출하여 라벨을 결정하고 label_data에 저장한다.
# 5. 이미지 처리
현재 파일의 경로를 생성한다.
OpenCV를 사용하여 이미지를 흑백으로 불러오고, (80,80) 크기로 리사이즈한다.
불러온 이미지 데이터의 타입과 형태를 출력한다.
# 6. 리스트에 데이터 추가
label_data를 t_data 리스트에 추가
이미지 데이터(img_data)를 1차원으로 변환한 후, x_data 리스트에 추가한다.
# 이렇게 만든 x_data와 t_data를 이용해서 DataFrame을 만들 것이다.
# 1.
t_df = pd.DataFrame({
'label': t_data
})
# 2.
x_df = pd.DataFrame(x_data)
# 3.
display(x_df.head())
# 1. 라벨 데이터에 대한 DataFrame 생성
t_data 리스트는 각 이미지에 대한 라벨(0 or 1)을 포함하고 있다
이 데이터를 사용해 label이라는 열 이름을 가진 DataFrame을 생성한다.
즉, t_df는 각이미지에 대응하는 라벨을 가지고 있는 DataFrame이라는 뜻이다.
# 2. 픽셀 데이터에 대한 DataFrame 생성
x_data 리스트는 각 이미지의 픽셀 데이터를 1차원 배열로 저장하고 있다.(위에 # 6. 참고)
이 데이터를 사용하여 Data Frame을 생성한다. 이 때, 각 이미지의 픽셀 데이터는 DataFrame의 각 행에 해당한다.
따라서 x_df의 각 행은 하나의 이미지에 대한 픽셀 정보를 담고 있고, 각 열은 이미지의 각 픽셀에 해당한다.
# 3. x_df의 상위 5행 출력
알고 있겠지만 head()는 DataFrame의 상위 5행을 반환한다.
x_df가 제대로 픽셀 데이터의 형태인지 확인하기위해 출력해보는 코드이다.
# 만들어진 두개의 DataFrame을 합친다!
# 1.
df = pd.merge(t_df, x_df, left_index=True, right_index=True)
# DataFrame의 상위 12,500개는 고양이, 하위 12,500개는 멍멍이의 데이터가 들어가 있다!
# 그래서 데이터를 랜덤하게 섞어줄것이다
# 2.
shuffled_df = utils.shuffle(df)
# 3.
display(shuffled_df.head())
# 1. 두 DataFrame 합치기
pd.merge()는 pandas에서 제공하는 함수로, 두 DataFrame을 특정 조건에 따라 합칠때 사용하는 함수이다.
left_index=True와 right_index=True는 두 DataFrame을 행 인덱스 기준으로 합치겠다는 의미이다. 즉, 각각의 DataFrame의 인덱스가 일치하는 행끼리 합친다는 뜻이다.
결과적으로 df는 t_df의 label 열과 x_df의 모든 열을 포함하는 새로운 DataFrame이 된다.
# 2. 데이터 랜덤하게 섞기
utils.shuffle()은 데이터를 랜덤하게 섞어주는 함수이다.
여기서 utils는 sklear.utils이다. 맨위에 import 부분을 보면 확인 할 수 있다.
랜덤하게 섞는 이유는 위에서부터 12,500개가 고양이이고 아래의 12,500개가 강아지 데이터이기 때문에 순차적인 데이터 구성은 학습과정에서 모델이 평향될 수 있으므로 섞어주는 것이 중요하다.
shuffled_df는 이렇게 섞인 결과를 저장한 새로운 DataFrame이다.
# 3. 위의 # 3번과 같으므로 생략한다.
# 이렇게 만들어진 DataFrame을 파일로 저장하면된다.
shuffled_df.to_csv('C:/Jupyter_home/data/cat_dog/train.csv', index=False)
# CSV 파일로 변환
to_csv는 Pandas의 DataFrame에서 제공하는 메서드로, 해당 DataFrame의 내용을 CSV파일로 저장하는데 사용한다.
C:/~~에는 파일이 저장될 곳의 경로를 지정해준다.
index=False는 CSV 파일에 저장할 때 인덱스를 포함하지 않도록 설정하는 옵션이다. 이 옵션이 설정되지 않으면 기본적으로 인덱스가 CSV 파일에 같이 저장된다. 여기서는 데이터만 저장하고 인덱스는 저장하지 않기 위해 index=False로 지정했다.
글이 너무 길어져서.이미지 학습에 대해서는 다음 글에 정리할 예정이다
'Python' 카테고리의 다른 글
(1) Pycharm에서 Flask 사용하기 (2) | 2023.11.22 |
---|---|
딥러닝 - 이미지 데이터 전처리 및 학습(2) (2) | 2023.11.02 |
Anaconda 사용해서 python 사용하기 (2) | 2023.11.01 |
Numpy 기본 설명 2(복습용으로 적는 설명) (2) | 2023.10.31 |
Python 개발환경, Numpy 기본 설명 1(복습하면서 적는 설명) (2) | 2023.10.21 |