[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]
&
출력을 통한 윤곽선 검출 결과 확인
⬇️ 출력 결과
📌 실습 결과
⬇️
성공적으로 윤곽선 검출을 수행할 수 있었음