AI/Preprocessing

이미지들을 배열 데이터셋으로 만들기

oaho 2023. 3. 22. 23:08
반응형

이미지 형태의 데이터를 배열로 불러와서 이미지를 쌓아 올리는 작업을 할거다.
 
우선,  함수들에 대해 알아보자.
 
 

▪  np.expand_dims

차원을 확장해준다.
예시는 아래와 같다.

import numpy as np

# 2차원 배열 생성
arr = np.zeros((280, 280))

# 3차원으로 변경
arr = np.expand_dims(arr, axis=-1)  # 마지막 차원에 1차원 추가
arr = np.repeat(arr, 3, axis=-1)  # 마지막 차원을 3차원으로 확장

print(arr.shape)  # (280, 280, 3)

입력 : 

import numpy as np

x = np.array([1, 2, 3])

print("Original shape of x:", x.shape)

y = np.expand_dims(x, axis=0)

print("Shape of y:", y.shape)

z = np.expand_dims(x, axis=1)

print("Shape of z:", z.shape)

출력 :

Original shape of x: (3,)
Shape of y: (1, 3)
Shape of z: (3, 1)

axis = 0 일 경우,
[[1, 2, 3]]
aixs = 1 일 경우,
[[1],
 [2],
 [3]]
 
비슷한 함수 : np.broadcast_to
 
np.broadcast_to(img_arr, (280, 280, 3))
 
 


 

▪  np.add

NumPy 라이브러리의 함수 중 하나로, 배열의 같은 위치에 있는 요소끼리 덧셈 연산을 수행한다.
사용 방법은 아래와 같다.

import numpy as np
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
c = np.add(a, b)
print(c)  # [5, 7, 9]

결과적으로 [5, 7, 9]라는 배열이 생성되어 출력된다.
 
 
 


 

▪  np.vstack

numpy 라이브러리에서 제공하는 함수로, 여러 개의 행렬을 수직으로 연결할 때 사용한다.
아래는 np.vstack 함수의 사용법 예시다.

import numpy as np

# 두 개의 2x3 행렬 생성
a = np.array([[1, 2, 3], [4, 5, 6]])
b = np.array([[7, 8, 9], [10, 11, 12]])

# 두 개의 행렬을 수직으로 연결하여 새로운 행렬 생성
c = np.vstack((a, b))

print(c)

 
실행 결과:

array([[ 1,  2,  3],
       [ 4,  5,  6],
       [ 7,  8,  9],
       [10, 11, 12]])

2x3 행렬 a와 b를 수직으로 연결한 새로운 4x3 행렬 c를 생성하였다. np.vstack 함수는 괄호 안에 연결할 행렬들을 튜플 형태로 입력하면 된다.
 
 
 

이미지들을 배열 데이터셋으로 만들기

 
요구사항:

  • 모델링을 위해서 이미지 형태로 되어있는 것을 np.array 형태로 데이터셋을 만들어야 한다.
  • 이미지 파일을 불러와 train, valid, test 각각 array 형태로 변환해야한다..
    • 이미지 한장씩 적절한 크기로 로딩하여 (keras.utils.load_img)
      • 이미지가 너무 크면 학습시간이 많이 걸리고, 메모리 부족현상이 발생될 수 있다.
      • array로 변환 (keras.utils.img_to_array, np.expand_dims)

 

 
코드해석:
np.zeros((1, 280, 280, 3)) : 4D형태로 된 배열에 0으로 채워준다.
1. Trainset의 이미지의 주소는  path이고, os.listdir(path)로 리스트 형태를 바꿔주고 for문을 사용해 이미지 하나하나 불러올거다.
2. 이미지 사이즈280*280으로 이미지를 불러온다.
3. 불러온 이미지를 배열 형태로 바꿔준다.
4. 3차원으로 확장 시켜준다.
5. a=0이라면(=for문이 처음이라면) zero에  img_tensor 배열을 넣어준다. => 아직 데이터 한개이기 때문에 (1, 280, 280, 3) 인 형태라서 1개가 아닌 n개의 데이터를 쌓아올려야한다.
6. 그 후부터 arr에 img_tensor를 하나씩 쌓아올린다. =(n, 280, 280, 3)
 
 
🔸 shape = (1, 280, 280, 3) 
 

  • (1): batch size, 즉 입력 데이터의 개수이다. 1개의 데이터가 있음을 의미한다.
  • (280): 이미지의 높이(height)이다.
  • (280): 이미지의 너비(width)이다.
  • (3): 이미지의 채널(channel) 수다. RGB 이미지이므로 채널 수는 3이다.

 

반응형