AIVLE TIL ('23.03.20) 3차 미니프로젝트 1일차

cjkangme·2023년 3월 20일
0

에이블스쿨

목록 보기
38/81
post-thumbnail
post-custom-banner

무엇을 했나?

1. 파이썬 파일 시스템을 이용한 파일 처리

  • 이진 클래스별로 나누어져 있는 이미지데이터를 train, valid, test로 분리하고, 분리된 이미지를 불러와 모델링에 사용할 수 있도록 전처리하였다.

zipfile

  • 파이썬의 내장 모듈로, 압축 파일(zip)에 대한 읽기, 쓰기 기능을 제공한다.
  • 처리하고자 하는 압축 파일을 Zipfile 객체로 만들고, 일반적인 파일 처럼 open, close 또는 with 문으로 읽기, 쓰기 작업을 할 수 있다.
# 압축해제
with zipfile.ZipFile(file_path) as zip:
    zip.extractall(path)
  • zip.extractall은 압축된 모든 파일을 해당 경로에 압축한다.
    • 경로를 지정하지 않으면 현재 디렉토리에 압축을 해제한다.
  • zip.extract를 통해 압축파일 내에서 원하는 파일만 압축을 해제할수도 있다.

os

  • 파이썬의 내장 모듈로, 운영체제가 제공하는 기능을 파이썬 코드로 사용할 수 있는 기능을 제공한다.
  • os.getcwd() : 현재 디렉토리의 경로를 반환한다.
  • os.mkdir(path) : 지정한 경로에 폴더를 만든다.
    • os.rmdir(path) : 지정한 디렉토리를 삭제한다. 만약 디렉토리 안에 하나라도 파일이 있을 경우 에러가 발생한다.
    • os.remove(path) : 지정한 경로의 파일을 삭제한다.
  • os.listdir(path) : 지정한 경로에있는 모든 파일과 디렉토리 이름을 리스트에 담아 반환한다.
  • os.rename(src, dst) : src 파일이나 폴더의 이름을 dst로 변경한다.

shutil

  • 파이썬의 내장 모듈로, 파일의 복사, 제거, 이동 등 파일 시스템과 관련한 각종 강력한 기능을 제공한다.

-shutil.copytree(src, dst) : src 디렉토리 전체를 복사하여 dst에 붙여넣는다. dirs_exist_ok=True를 설정하면, dst 경로에 폴더가 이미 있어도 무시하고 붙여넣게 된다.

  • shutil.rmtree(path) : 해당 경로의 디렉토리를 삭제한다. os의 redir과 다른 점은, 해당 디렉토리에 파일이 있어도 무시하고 한꺼번에 삭제한다는 것이다.

random

  • 파이썬의 내장 모듈로 무작위 난수 생성, iterable 자료형에서 값을 샘플링하는 것 등에 사용한다.
  • random.seed(int) : 난수 생성기를 초기화하는 함수이다. 같은 seed에서는 항상 같은 결과가 나오기 때문에, 랜덤 샘플링에서 경우의 수를 고정하고 여러가지 방법을 비교해볼 때 사용할 수 있다. 매개변수를 선언하지 않으면 컴퓨터의 현재 시각이 seed가 된다.
  • random.sample(population, k) : population에서 k개를 무작위로 뽑아 리스트에 담아 반환한다.
# 전체 데이터에서 10%를 뽑아 테스트 데이터 폴더(dst)에 옮기기
test_data_num = round(len(os.listdir(data_path))*0.1)

random.seed(2023)
files = os.listdir(data_path)
test_files = random.sample(files, test_data_num)

for file in test_files:
	shutil.move(src=src+file, dst=dst+file)

2. 케라스를 통한 이미지 데이터 처리

keras.preprocessing.image

tensorflow에서 더이상 사용을 권장하지 않는 모듈이다.

  • 이미지 데이터를 처리할 수 있는 각종 함수를 제공하는 모듈이다.
  • image.load_image() : 불러온 파일을 PIL 인스턴스로 변환하는 함수이다.
    PIL은 파이썬에서 이미지 포맷을 다룰 수 있도록해주는 라이브러리이다.
    - PIL로 변환된 객체를 plt.imshow()를 통해 표시하거나, 다른 함수를 이용하여 변환 등이 가능하다.
  • image.ImageDataGenerator : Data Augmentation을 위한 기능을 제공한다.
    • 변형할 종류, 범위 등을 옵션으로 지정하여 generator 인스턴스를 만들 수 있다.
    • 생성된 제너레이터를 모델 학습시 데이터 대신 지정하면, 메모리에서 Augmentation을 진행하면서 학습 데이터 및 검증 데이터로 이용한다.
from tensorflow.keras.preprocessing.image import ImageDataGenerator

train_datagen = ImageDataGenerator(
    rotation_range = 20,
    zoom_range = [0.7, 1.3],
    width_shift_range=0.2,
    height_shift_range=0.2,
    shear_range=0.2,
    horizontal_flip=True,
    fill_mode='nearest',
    rescale=255
)

valid_datagen = ImageDataGenerator(
    rotation_range = 20,
    zoom_range = [0.7, 1.3],
    width_shift_range=0.2,
    height_shift_range=0.2,
    shear_range=0.2,
    horizontal_flip=True,
    fill_mode='nearest',
    rescale=255
)

train_generator = train_datagen.flow_from_directory(
          train_path, 
          target_size=(280, 280), 
          class_mode='binary'
          )

valid_generator = train_datagen.flow_from_directory(
          val_path, 
          target_size=(280, 280), 
          class_mode='binary'
          )

model.fit(train_generator, 
          epochs=1000, 
          verbose=1, 
          validation_data=valid_generator, 
          callbacks=[es])

keras.utils.img_to_array

  • PIL 인스턴스를 받아 numpy array로 반환하는 함수이다.
  • 아래와 같은 과정을 통해 이미지 파일을 불러와 np.array로 변환할 수 있다.
from tensorflow.keras.preprocessing import image
from tensorflow.keras.utils import img_to_array

img = image.load_img(file, target_size=(img_size, img_size))
array = img_to_array(img)

소감

좋았던 점

  • 이런 미니프로젝트를 할 때마다, 중간에 꼬이고 코드가 난잡해지는 일이 잦았다.
    그러나 이번엔 반복되는 것들은 전부 함수나 변수로 선언하면서 비교적 깔끔한 코드를 작성하였고, 덕분에 중간에 꼬이더라도 쉽게 돌아갈 수 있었다.

  • 2일차 진도는 모델링 과정인데, 아마 시간이 매우 부족할 것으로 생각한다. 그러나 전처리에서 해메지 않고 빠르게 끝낸 덕분에 모델링 과정을 미리 진행할 수 있었다.

아쉬운 점

  • 이번 시간에 다루었던 모듈들에 대해 조금 더 자세히 알고 있어야 할 것 같은데, 필요한 기능만 그때 그때 찾아서 사용하는 수준에 머물렀다.

공부하고 싶은 것

  • PIL 객체 이해, PIL 객체를 통한 이미지 처리 방법

  • split_folders 라이브러리 사용해보기 (코드 한줄로 train, val, test를 나눌 수 있다)

post-custom-banner

0개의 댓글