이미지 형태의 데이터를 배열로 불러와서 이미지를 쌓아 올리는 작업을 할거다.
우선, 함수들에 대해 알아보자.
▪ 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)
- 이미지 한장씩 적절한 크기로 로딩하여 (keras.utils.load_img)

코드해석:
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이다.
'AI > Preprocessing' 카테고리의 다른 글
데이터 정규분포화, 표준화 (0) | 2023.04.11 |
---|---|
라벨 인코딩 vs 원핫 인코딩 (0) | 2023.04.11 |
text preprecessing_numpy.argmax() (0) | 2023.04.03 |
python_폴더(파일) 복사하기 (copytree, copy_tree) (0) | 2023.03.20 |
python_폴더(파일)명 변경하기 (os.rename) (0) | 2023.03.20 |