[AI]/인공지능 이론 및 실습

[인공지능] Convolution 실습 : Sobel Filter를 활용한 Edge Detection 실습 (Python, Torch)

seom-j 2024. 2. 8. 17:49

 

📌 torch.nn.Conv2D

Conv2D를 활용하여 간단하게 Convolution 연산을 수행할 수 있음

이때 N, C, H, W로 차원을 맞춰야 함에 주의

 

 

📌 Sobel Filter를 활용한 Edge Detection 실습

구글 코랩 환경을 사용하여, Python으로 간단한 Edge Detection 실습을 수행해보고자 함

 

1. 관련 라이브러리 import

from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
import torch.nn as nn

 

2. 이미지 불러오기

img = Image.open("이미지 경로/AI_Image.bmp").convert(mode="L")
pix = np.array(img, dtype = np.uint8)

pix = torch.FloatTensor(pix)

위의 이미지를 활용하였으며, print(pix.shape)의 결과로 torch.Size([630, 1120])을 얻을 수 있음

 

3. Sobel Filter 생성

sobel_x = torch.tensor([[1, 2, 1], [0, 0, 0], [-1, -2, -1]], dtype=torch.float).to(device)
sobel_y = torch.tensor([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]], dtype=torch.float).to(device)

sobel_x의 경우 가로 성분을 찾아주며, sobel_y의 경우 세로 성분을 찾아줌

 

4. conv2d를 활용한 Convolution 수행

img_filtered_x = nn.functional.conv2d(pix.unsqueeze(0).unsqueeze(0), sobel_x.unsqueeze(0).unsqueeze(0), padding=1)
img_filtered_y = nn.functional.conv2d(pix.unsqueeze(0).unsqueeze(0), sobel_y.unsqueeze(0).unsqueeze(0), padding=1)

N, C, H, W의 형식을 맞추어주기 위하여 unsqeeze를 이미지, 필터에 각 두번씩 수행

 

이미지 : [630, 1120] → [1, 1, 630, 1120]

필터 : [3, 3] → [1, 1, 3, 3]

 

5. 가로, 세로 윤곽선 성분 취합

img_filtered = torch.sqrt(img_filtered_x**2 + img_filtered_y**2)

즉, x방향과 y방향의 그래디언트의 크기 연산

 

6. 최종 검출 결과 시각화

plt.imshow(img_filtered.squeeze(), cmap="gray")
plt.show()

2차원 이미지 출력을 위해 결과에 squeeze 수행

이미지 : [1, 1, 630, 1120] → [630, 1120]

&

출력을 통한 윤곽선 검출 결과 확인

 

⬇️ 출력 결과

 

 

📌 실습 결과

⬇️

성공적으로 윤곽선 검출을 수행할 수 있었음