본문 바로가기

카테고리 없음

autoencoder, feature concatenate, Global Average Pooling

import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms
from torch.utils.data import DataLoader
from torch.utils.data import Dataset, DataLoader
import os
from PIL import Image

class CustomImageDataset(Dataset):
    def __init__(self, img_dir, transform=None):
        self.img_dir = img_dir
        self.img_names = os.listdir(img_dir)
        self.transform = transform

    def __len__(self):
        return len(self.img_names)

    def __getitem__(self, idx):
        img_path = os.path.join(self.img_dir, self.img_names[idx])
        image = Image.open(img_path).convert('RGB')
        if self.transform:
            image = self.transform(image)
        return image

# 데이터 로딩 및 전처리
data_path = "C:\\Users\\intern2024\\Desktop\\train\\unlabeled\\M1"
transform = transforms.Compose([transforms.Resize((224, 224)), transforms.ToTensor()])
dataset = CustomImageDataset(data_path, transform=transform)
dataloader = DataLoader(dataset, batch_size=32, shuffle=True)

# 모델 정의
class ConvAutoencoder(nn.Module):
    def __init__(self):
        super(ConvAutoencoder, self).__init__()
        
        # Encoder layers
        self.encoder = nn.Sequential(
            nn.Conv2d(3, 32, kernel_size=3, stride=2, padding=1),
            nn.ReLU(),
            nn.Conv2d(32, 64, kernel_size=3, stride=2, padding=1),
            nn.ReLU(),
            nn.Conv2d(64, 128, kernel_size=3, stride=2, padding=1),
            nn.ReLU(),
            nn.Conv2d(128, 256, kernel_size=3, stride=2, padding=1),
            nn.ReLU(),
            nn.Conv2d(256, 512, kernel_size=3, stride=2, padding=1),
            nn.ReLU(),
        )
        
        # Decoder layers
        self.decoder = nn.Sequential(
            nn.ConvTranspose2d(512, 256, kernel_size=3, stride=2, padding=1, output_padding=1),
            nn.ReLU(),
            nn.ConvTranspose2d(256, 128, kernel_size=3, stride=2, padding=1, output_padding=1),
            nn.ReLU(),
            nn.ConvTranspose2d(128, 64, kernel_size=3, stride=2, padding=1, output_padding=1),
            nn.ReLU(),
            nn.ConvTranspose2d(64, 32, kernel_size=3, stride=2, padding=1, output_padding=1),
            nn.ReLU(),
            nn.ConvTranspose2d(32, 3, kernel_size=3, stride=2, padding=1, output_padding=1),
            nn.Sigmoid(),
        )

    def forward(self, x):
        x = self.encoder(x)
        x = self.decoder(x)
        return x

# 모델 생성
model = ConvAutoencoder()

# 손실 함수 및 최적화 알고리즘 설정
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)

# 학습 시작
num_epochs = 10  # 학습 횟수
for epoch in range(num_epochs):
    for data in dataloader:
        img = data
        output = model(img)
        loss = criterion(output, img)
        
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
    
    print(f'Epoch: {epoch+1}, Loss: {loss.item()}')

torch.save(model.state_dict(), 'model.pth')

import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms
from torch.utils.data import DataLoader
from torch.utils.data import Dataset, DataLoader
import os
from PIL import Image
import scipy.io
from scipy.io import savemat
import numpy as np
import scipy.io as sio

class ConvAutoencoder(nn.Module):
    def __init__(self):
        super(ConvAutoencoder, self).__init__()
          
        # Encoder layers
        self.encoder = nn.Sequential(
            nn.Conv2d(3, 32, kernel_size=3, stride=2, padding=1),
            nn.ReLU(),
            nn.Conv2d(32, 64, kernel_size=3, stride=2, padding=1),
            nn.ReLU(),
            nn.Conv2d(64, 128, kernel_size=3, stride=2, padding=1),
            nn.ReLU(),
            nn.Conv2d(128, 256, kernel_size=3, stride=2, padding=1),
            nn.ReLU(),
            nn.Conv2d(256, 512, kernel_size=3, stride=2, padding=1),
            nn.ReLU(),
        )

        # Decoder layers
        self.decoder = nn.Sequential(
            nn.ConvTranspose2d(512, 256, kernel_size=3, stride=2, padding=1, output_padding=1),
            nn.ReLU(),
            nn.ConvTranspose2d(256, 128, kernel_size=3, stride=2, padding=1, output_padding=1),
            nn.ReLU(),
            nn.ConvTranspose2d(128, 64, kernel_size=3, stride=2, padding=1, output_padding=1),
            nn.ReLU(),
            nn.ConvTranspose2d(64, 32, kernel_size=3, stride=2, padding=1, output_padding=1),
            nn.ReLU(),
            nn.ConvTranspose2d(32, 3, kernel_size=3, stride=2, padding=1, output_padding=1),
            nn.Sigmoid(),
        )

    def forward(self, x):
        x = self.encoder(x)
        return x  # Decoder 부분 제거

# 학습시킨 모델 로드
model = ConvAutoencoder()
model.load_state_dict(torch.load('model.pth'))
model.eval()

class CustomImageDataset(Dataset):
    def __init__(self, img_dir, transform=None):
        self.img_dir = img_dir
        self.img_names = os.listdir(img_dir)
        self.transform = transform

    def __len__(self):
        return len(self.img_names)

    def __getitem__(self, idx):
        img_path = os.path.join(self.img_dir, self.img_names[idx])
        image = Image.open(img_path).convert('RGB')
        if self.transform:
            image = self.transform(image)
        return image, self.img_names[idx]  # 이미지 이름도 반환
        
save_dir = "C:\\Users\\intern2024\\Desktop\\feature_scae\\class1"

# 새로운 이미지셋 로드
new_data_path = r"C:\Users\intern2024\Desktop\new_labeled_data\class1"
transform = transforms.Compose([transforms.Resize((224, 224)), transforms.ToTensor()])
new_dataset = CustomImageDataset(new_data_path, transform=transform)
new_dataloader = DataLoader(new_dataset, batch_size=1, shuffle=False)

with torch.no_grad():
    for idx, (data, img_name) in enumerate(new_dataloader):  # 이미지 이름
        img = data
        output = model(img)
        
        # 첫 번째 차원 제거
        output = np.squeeze(output, axis=0)
        
        # feature_map2의 축 변경
        output = np.transpose(output, (1, 2, 0))
        
        # feature map의 사이즈 출력
        print(f'Feature map size: {output.size()}')

        # 이미지 이름을 기반으로 mat 파일 저장
        npy_file_name = os.path.splitext(img_name[0])[0]  # 확장자 제거
        np.save(os.path.join(save_dir, f'{npy_file_name}.npy'), output.cpu().numpy())

SCAE 
autoencoder에서 feature map 추출

import os
import numpy as np
import scipy.io as sio

# .npy 파일이 있는 두 디렉토리
npy_dir1 = r"C:\Users\intern2024\Desktop\feature_resnet\class1"
npy_dir2 = r"C:\Users\intern2024\Desktop\feature_scae\class1"

# 결과를 저장할 디렉토리
save_dir = r"C:\Users\intern2024\Desktop\feature_fusion\class1"

# 첫 번째 디렉토리 내의 모든 파일 순회
for filename in os.listdir(npy_dir1):
    # .npy 파일만 처리
    if filename.endswith('.npy'):
        # 두 번째 디렉토리에 같은 이름의 파일이 있는지 확인
        if filename in os.listdir(npy_dir2):
            # 두 .npy 파일 불러오기
            feature_map1 = np.load(os.path.join(npy_dir1, filename), allow_pickle=True)
            feature_map2 = np.load(os.path.join(npy_dir2, filename), allow_pickle=True)

            # 두 feature map을 concatenate
            
            concatenated = np.concatenate((feature_map1, feature_map2), axis=2)  
            # channel 차원을 따라 concatenate

            print(concatenated.shape)
            # concatenate한 feature map을 같은 이름의 .mat 파일로 저장
            sio.savemat(os.path.join(save_dir, filename.replace('.npy', '.mat')), {'matrix': concatenated})

feature fusion (concatenate)

 

from keras.layers import GlobalAveragePooling2D, Reshape, Dense
from keras.models import Sequential
import scipy.io
import os
import numpy as np

# 경로 설정
folder_path = r'C:\Users\intern2024\Desktop\feature_fusion\class3'
output_folder_path = r'C:\Users\intern2024\Desktop\gap\class3'

# 모든 mat 파일 목록 가져오기
mat_files = [file for file in os.listdir(folder_path) if file.endswith('.mat')]

# 전체 features를 저장할 리스트
all_features = []

# 7,7,1024 크기의 입력을 받는 모델 생성
model = Sequential()
model.add(Reshape((7,7,1024), input_shape=(7,7,1024)))

# Global Average Pooling 적용
model.add(GlobalAveragePooling2D(keepdims=True)) # 차원 유지

# Fully Connected Layer 추가하여 feature 차원 조절
model.add(Dense(512, activation='relu'))

# 모든 mat 파일에 대해 반복
for file_name in mat_files:
    # mat 파일 로드
    mat_data = scipy.io.loadmat(os.path.join(folder_path, file_name))
    
    # mat 파일에서 features 추출
    features = mat_data['matrix']
    
    # global average pooling
    pooled_features = model.predict(np.expand_dims(features, axis=0))
    pooled_features = np.squeeze(pooled_features, 2)
    
    # pooled_features의 차원 출력
    print(f'Pooled Features Shape: {pooled_features.shape}')
    
    # 새로운 mat 파일로 저장 (파일명 그대로)
    scipy.io.savemat(os.path.join(output_folder_path, file_name), {'matrix': pooled_features})

Global Average Pooling