728x90
๋ฐ˜์‘ํ˜•
SMALL

 

๐Ÿ“ท CNN์„ ํ™œ์šฉํ•œ ์ด๋ฏธ์ง€ ํŠน์ง• ์ถ”์ถœ ์™„์ „ ์ •๋ณต

์•ˆ๋…•ํ•˜์„ธ์š”! ์˜ค๋Š˜์€ ์ธ๊ณต์ง€๋Šฅ์—์„œ ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ ํ•ต์‹ฌ ๊ธฐ์ˆ ์ธ CNN ๊ธฐ๋ฐ˜ ์ด๋ฏธ์ง€ ํŠน์ง• ์ถ”์ถœ์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋”ฅ๋Ÿฌ๋‹ ์ž…๋ฌธ์ž๋ถ€ํ„ฐ ์‹ค๋ฌด ๊ฐœ๋ฐœ์ž๊นŒ์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ์ด๋ก , ๊ตฌ์กฐ, ์‹ค๋ฌด ์ฝ”๋“œ๊นŒ์ง€ ๋ชจ๋‘ ์†Œ๊ฐœํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

1. ์ด๋ฏธ์ง€ ํŠน์ง• ์ถ”์ถœ์ด๋ž€?

์ด๋ฏธ์ง€๋Š” ์ˆ˜๋งŽ์€ ํ”ฝ์…€๋กœ ๊ตฌ์„ฑ๋œ ๊ณ ์ฐจ์› ๋ฐ์ดํ„ฐ์ž…๋‹ˆ๋‹ค. ์ด ๋ฐ์ดํ„ฐ๋ฅผ ์••์ถ•ํ•˜๊ณ  ์˜๋ฏธ ์žˆ๋Š” ์ •๋ณด(์„ , ๋ชจ์–‘, ์งˆ๊ฐ ๋“ฑ)๋งŒ ์ถ”์ถœํ•ด์„œ ๋ฒกํ„ฐ(ํŠน์ง• ๋ฒกํ„ฐ)๋กœ ํ‘œํ˜„ํ•˜๋Š” ๊ณผ์ •์ด ํŠน์ง• ์ถ”์ถœ์ž…๋‹ˆ๋‹ค. ๋จธ์‹ ๋Ÿฌ๋‹/๋”ฅ๋Ÿฌ๋‹ ๋ชจ๋ธ์˜ ์ž…๋ ฅ์œผ๋กœ ์“ฐ๊ธฐ ์œ„ํ•ด ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

2. ์ด๋ฏธ์ง€ ํŠน์ง• ์ถ”์ถœ ๋ฐฉ๋ฒ• ์ข…๋ฅ˜

  • ์ „ํ†ต์ ์ธ ๋ฐฉ๋ฒ•: SIFT, HOG, SURF ๋“ฑ
  • ๋”ฅ๋Ÿฌ๋‹ ๊ธฐ๋ฐ˜ ๋ฐฉ๋ฒ• (CNN)

3. CNN(Convolutional Neural Network)์˜ ๊ฐœ๋…

CNN์€ ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ์— ํŠนํ™”๋œ ๊ตฌ์กฐ๋กœ, ์ด๋ฏธ์ง€์—์„œ ๊ณต๊ฐ„์  ํŒจํ„ด(์—ฃ์ง€, ๋ชจ์„œ๋ฆฌ, ํŒจํ„ด ๋“ฑ)์„ ์ž๋™์œผ๋กœ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค. Conv Layer์™€ Pooling Layer๋ฅผ ๋ฐ˜๋ณตํ•˜๋ฉฐ ์ ์  ์ถ”์ƒ์ ์ธ ํŠน์ง•์„ ๋ฝ‘์•„๋ƒ…๋‹ˆ๋‹ค.

4. CNN ๊ธฐ๋ฐ˜ ํŠน์ง• ์ถ”์ถœ ๋ฐฉ๋ฒ•์˜ ์ข…๋ฅ˜ ๋ฐ ์ •์˜

๊ตฌ๋ถ„ ์ •์˜ ํŠน์„ฑ
1. ConvNet ์ง์ ‘ ๊ตฌ์„ฑ Conv2D์™€ Pooling ๋ ˆ์ด์–ด๋กœ ์ง์ ‘ ๊ตฌ์กฐ ์„ค๊ณ„ ์œ ์—ฐํ•˜๋‚˜ ๋งŽ์€ ํ•™์Šต ๋ฐ์ดํ„ฐ ํ•„์š”
2. ์‚ฌ์ „ํ•™์Šต ๋ชจ๋ธ ์ „์ดํ•™์Šต ResNet, VGG ๋“ฑ ๊ธฐ์กด ๋ชจ๋ธ์—์„œ ์ค‘๊ฐ„์ธต ์ถ”์ถœ ์ ์€ ๋ฐ์ดํ„ฐ๋กœ๋„ ์šฐ์ˆ˜ํ•œ ์„ฑ๋Šฅ
3. Feature Extractor๋กœ CNN๋งŒ ์‚ฌ์šฉ Fully connected layer ์ œ๊ฑฐ, conv feature๋งŒ ์ถ”์ถœ ๋ถ„๋ฅ˜ ๋Œ€์‹  ํŠน์ง• ๋ฒกํ„ฐ๋งŒ ์‚ฌ์šฉ

5. ์‹ค๋ฌด ์˜ˆ์ œ: ์‚ฌ์ „ํ•™์Šต๋œ ResNet์„ ํ™œ์šฉํ•œ ํŠน์ง• ์ถ”์ถœ

from torchvision import models, transforms
from PIL import Image
import torch
import numpy as np

# 1. ์ด๋ฏธ์ง€ ์ „์ฒ˜๋ฆฌ
transform = transforms.Compose([
    transforms.Resize((224, 224)),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406],
                         std=[0.229, 0.224, 0.225])
])

# 2. ์ด๋ฏธ์ง€ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
img = Image.open("cat.jpg").convert("RGB")
img_tensor = transform(img).unsqueeze(0)  # ๋ฐฐ์น˜ ์ฐจ์› ์ถ”๊ฐ€

# 3. ๋ชจ๋ธ ๋กœ๋”ฉ ๋ฐ ํŠน์ง• ์ถ”์ถœ (fc ์ œ๊ฑฐ)
resnet = models.resnet50(pretrained=True)
feature_extractor = torch.nn.Sequential(*list(resnet.children())[:-1])
feature_extractor.eval()

# 4. ํŠน์ง• ๋ฒกํ„ฐ ์ถ”์ถœ
with torch.no_grad():
    features = feature_extractor(img_tensor)
    features = features.view(features.size(0), -1)  # Flatten
    print("ํŠน์ง• ๋ฒกํ„ฐ shape:", features.shape)

6. CNN ํŠน์ง• ์ถ”์ถœ ๋ฐฉ์‹๋ณ„ ์žฅ๋‹จ์ 

๋ฐฉ๋ฒ• ์žฅ์  ๋‹จ์ 
์ง์ ‘ ๊ตฌ์„ฑ ์ž์œ ๋กœ์šด ์„ค๊ณ„, ๋„๋ฉ”์ธ ๋งž์ถค ๊ฐ€๋Šฅ ๋งŽ์€ ๋ฐ์ดํ„ฐ์™€ ์‹œ๊ฐ„ ํ•„์š”
์‚ฌ์ „ํ•™์Šต ๋ชจ๋ธ ๋น ๋ฅธ ์ ์šฉ, ์†Œ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋กœ ๊ฐ€๋Šฅ ์œ ์—ฐ์„ฑ ๋ถ€์กฑ, ๋ชจ๋ธ ํฌ๊ธฐ ํผ
Conv layer๋งŒ ์‚ฌ์šฉ ํŠน์ง• ์ถ”์ถœ์— ์ตœ์ , ๋‹ค์šด์ŠคํŠธ๋ฆผ์— ํ™œ์šฉ ์‰ฌ์›€ ๋ถ„๋ฅ˜๊ธฐ ์ง์ ‘ ์„ค๊ณ„ ํ•„์š”

7. ๊ธฐํƒ€ ์‹ค๋ฌด ํŒ

  • โ— ๋ฐ์ดํ„ฐ ์ •๊ทœํ™”: ๋ฐ˜๋“œ์‹œ ํ•™์Šต๋œ ๋ชจ๋ธ์— ๋งž๋Š” ํ‰๊ท /ํ‘œ์ค€ํŽธ์ฐจ ์‚ฌ์šฉ
  • ๐Ÿ“ฆ ํŠน์ง• ๋ฒกํ„ฐ ์ €์žฅ: ๋ฒกํ„ฐ๋ฅผ .npy ๋“ฑ์œผ๋กœ ์ €์žฅ ํ›„ ๋ณ„๋„ ๋ถ„์„ ์ถ”์ฒœ
  • ๐Ÿง  ํด๋Ÿฌ์Šคํ„ฐ๋ง, ์œ ์‚ฌ๋„ ๋ถ„์„: ์ถ”์ถœ๋œ ๋ฒกํ„ฐ๋กœ ๊ตฐ์ง‘ํ™”๋‚˜ ๊ฒ€์ƒ‰ ์‹œ์Šคํ…œ ๊ตฌํ˜„ ๊ฐ€๋Šฅ
  • ๐Ÿ’ก ์‹œ๊ฐํ™” ๋„๊ตฌ: t-SNE, PCA ๋“ฑ์œผ๋กœ ๋ฒกํ„ฐ ๋ถ„ํฌ๋ฅผ ์‹œ๊ฐํ™”ํ•˜๋ฉด ์œ ์šฉํ•จ

8. ๋งˆ๋ฌด๋ฆฌ

CNN์€ ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ๊ฐ€์žฅ ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ๋‹จ์ˆœํ•œ ๋ถ„๋ฅ˜๋ฅผ ๋„˜์–ด์„œ, CNN์˜ ์ค‘๊ฐ„ ์ถœ๋ ฅ๊ฐ’(ํŠน์ง• ๋ฒกํ„ฐ)์„ ํ™œ์šฉํ•˜๋ฉด ์ถ”์ฒœ ์‹œ์Šคํ…œ, ๊ฒ€์ƒ‰ ์—”์ง„, ๊ตฐ์ง‘ํ™”, ์ด์ƒํƒ์ง€ ๋“ฑ ๋‹ค์–‘ํ•œ ์˜์—ญ์œผ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ค๋Š˜ ์†Œ๊ฐœํ•œ ์ฝ”๋“œ๋Š” ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ๋„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋‹ค์–‘ํ•œ ์‚ฌ์ „ํ•™์Šต ๋ชจ๋ธ์„ ํ™œ์šฉํ•ด ๋” ๋„“์€ ์ž‘์—…์— ์‘์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ๊ธ€์—์„œ๋Š” ์ถ”์ถœํ•œ ํŠน์ง• ๋ฒกํ„ฐ๋ฅผ ํ™œ์šฉํ•œ ์œ ์‚ฌ ์ด๋ฏธ์ง€ ๊ฒ€์ƒ‰ ์‹œ์Šคํ…œ๋„ ๋‹ค๋ค„๋ณผ๊ฒŒ์š”!

728x90
๋ฐ˜์‘ํ˜•
LIST

+ Recent posts