이미지 합치기(속도)

이준우·2024년 3월 8일

visualization

목록 보기
1/1

이미지를 합치는 이유는 여러가지 이유가 있다.

  • 데이터 증강
  • 멀티모달
  • 파노라마
  • 객체 감지
  • 시각화

등등 다양한 task에서 사용된다. 오늘은 이미지를 합칠 때 속도 측면에서의 코드를 분석해보려고 한다.

우선 3가지 유형의 코드를 소개하려고 한다. (간단한 MNIST_Fashion Dataset으로 실험을 진행했다.)

해당 데이터들은 손글씨 MNIST 데이터와 마찬가지로

  • train_images.shape = (60000, 28, 28)
  • test_images.shape = (10000, 28, 28)
    로 이루어져 있다.
# 첫번 째

import matplotlib.pyplot as plt
import time

start = time.time()
# 5개의 train image를 하나로 합치는 과정
train_v = train_imgaes[:5].transpose(1, 0, 2).reshape(28, -1)
end = time.time()

print(f"걸린 시간 : {end - start}")

plt.imshow(train_v)
plt.show()

# 두번 째

import matplotlib.pyplot as plt
import numpy as np
import time

start = time.time()
train_v = np.hstack(train_images[:5])
end = time.time()

print(f"걸린 시간 : {end - start}")

plt.imshow(train_v)
plt.show()

# 세번 째

import matplotlib.pyplot as plt
import numpy as np
import time

start = time.time()
train_v = np.concatenate([train_images[0], train_images[1], train_images[2], train_images[3], train_images[4]], axis = 0).reshape(5, 28, 28).reshape(28, -1)

print(f"걸린 시간 : {end - start}")

plt.imshow(train_v)
plt.show()

세 가지 모두 동일한 결과를 보여주는 것을 알 수 있다.

코드를 비교하기 전에 생각할 것이 있다.

  • 코드는 간결해야 한다.
  • 라이브러리를 불러와서 사용해야 하는 경우에는 python에서 제공하는 function, method과 속도 비교가 필요하다.

우선 2번과 3번을 비교해보자.

2번의 경우 numpy 의 hstack을 사용했다. hstack은 horizontal stack(수평으로 쌓는다)를 의미한다. 일반적으로 vstack과 비교된다.

3번의 경우에는 numpy의 concatenate를 사용했다.

만약, 두 배열이 있다면 합치는 것을 의미한다.

또한, 여기에는 reshape을 두번 사용하여 계산량이 늘어나고 속도도 늘어나게 된다.

따라서 2번과 3번을 비교한다면 2번을 사용하는 것이 옳다.

이제 1번과 2번을 비교해보자.

1번의 경우 python의 메소드인 transpose를 사용한다. 2번의 경우에는 numpy의 hstack을 사용한다.

만약, 동일한 결과를 낸다면 외부 라이브러리를 불러오는 것이 아니라 python의 내장 method를 사용하는 것이 좋다. 더 빠른 속도를 낼 수 있다.

다만, numpy의 경우 너 많은 다차원 배열이나 광범위한 수학 계산이 들어간다면 더 빠를 수도 있다. 따라서 여러 test를 진행하여 무엇이 더 좋은 방법인지 판단하는 것이 좋다.

profile
멋진 인생을 살기 위한 footprint

0개의 댓글