AI 프로젝트 실습

[AI 앱 만들기] PyQt5로 딥러닝 모델 실행 – DeblurGAN을 활용한 이미지 복원 GUI 앱 개발

게임교수 2025. 4. 22. 07:49
반응형

PyQt5로 딥러닝 모델 실행 – DeblurGAN을 활용한 이미지 복원 GUI 앱 개발

이 글은 인공지능으로 이미지 흔들림을 보정하는 프로젝트의 세 번째 편입니다. 1편에서는 전체 구조를, 2편에서는 DeblurGANv2 모델을 실행하는 실습을 다뤘습니다. 이번에는 실제 데스크탑 GUI 애플리케이션에서 버튼 클릭만으로 딥러닝 모델을 실행하고 이미지를 복원하는 프로그램을 만들어보겠습니다.

프로젝트 개요

이번 글에서 구현할 핵심 기능은 다음과 같습니다:

  • PyQt5로 데스크탑 GUI 구성
  • 사용자가 이미지 파일 선택
  • 버튼 클릭 시 DeblurGAN 모델 실행
  • 복원된 이미지를 GUI에 표시 및 저장

딥러닝 모델이 실제 GUI와 통합되는 과정을 통해 AI 앱의 실용적인 활용법을 익힐 수 있습니다.

필요 패키지 설치

다음 패키지를 설치합니다.

pip install pyqt5 opencv-python torch torchvision pillow

프로그램 전체 구조

image_deblur_gui/
├── gui.py              # PyQt5 GUI 메인 파일
├── deblur_model.py     # DeblurGAN 모델 불러오기 및 추론 코드
├── weights/            # gopro_generator.pth 모델 파일 위치
└── output/             # 복원된 이미지 저장 폴더

모델 처리 모듈: deblur_model.py

딥러닝 모델을 불러와 추론하는 기능을 함수로 분리해 둡니다.

import torch
from torchvision import transforms
from PIL import Image
import numpy as np
import cv2
from models import generator

def deblur_image(image_path, weight_path='weights/gopro_generator.pth'):
    model = generator.GPNet()
    checkpoint = torch.load(weight_path, map_location='cpu')
    model.load_state_dict(checkpoint['model_state_dict'])
    model.eval()

    image = Image.open(image_path).convert('RGB')
    transform = transforms.Compose([
        transforms.Resize((720, 1280)),
        transforms.ToTensor()
    ])
    input_tensor = transform(image).unsqueeze(0)

    with torch.no_grad():
        output = model(input_tensor)
    
    output_image = output.squeeze().permute(1, 2, 0).numpy()
    output_image = (output_image * 255).clip(0, 255).astype(np.uint8)
    return output_image

PyQt5 GUI 메인: gui.py

버튼 클릭 시 모델을 실행하고 복원된 이미지를 출력하는 GUI를 구성합니다.

import sys
import os
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QFileDialog, QVBoxLayout
from PyQt5.QtGui import QPixmap, QImage
import cv2
from deblur_model import deblur_image

class DeblurApp(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('AI 이미지 흔들림 보정')
        self.setGeometry(100, 100, 800, 600)

        self.label = QLabel('이미지를 불러와 주세요', self)
        self.label.setFixedSize(720, 480)

        self.load_button = QPushButton('이미지 불러오기', self)
        self.process_button = QPushButton('보정 시작', self)
        self.process_button.setEnabled(False)

        layout = QVBoxLayout()
        layout.addWidget(self.label)
        layout.addWidget(self.load_button)
        layout.addWidget(self.process_button)
        self.setLayout(layout)

        self.load_button.clicked.connect(self.load_image)
        self.process_button.clicked.connect(self.run_deblurring)

        self.image_path = None

    def load_image(self):
        path, _ = QFileDialog.getOpenFileName(self, '이미지 선택', '', 'Images (*.png *.jpg *.jpeg)')
        if path:
            self.image_path = path
            pixmap = QPixmap(path).scaled(720, 480)
            self.label.setPixmap(pixmap)
            self.process_button.setEnabled(True)

    def run_deblurring(self):
        if self.image_path:
            result = deblur_image(self.image_path)
            output_path = os.path.join('output', 'restored.jpg')
            os.makedirs('output', exist_ok=True)
            cv2.imwrite(output_path, cv2.cvtColor(result, cv2.COLOR_RGB2BGR))
            image = QImage(result, result.shape[1], result.shape[0], QImage.Format_RGB888)
            self.label.setPixmap(QPixmap.fromImage(image).scaled(720, 480))

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = DeblurApp()
    window.show()
    sys.exit(app.exec_())

결과 확인

프로그램을 실행하면 이미지 선택 버튼과 보정 버튼이 표시됩니다. 흔들린 이미지를 선택하고, 보정 시작 버튼을 클릭하면 복원된 이미지가 화면에 출력되며, output 폴더에도 저장됩니다.

다음 글 예고

다음 4편에서는 이 앱을 PyInstaller로 패키징하여 하나의 실행파일로 만들고, 실제 배포 가능한 형태로 만드는 과정을 다룹니다. 설치 없이 실행 가능한 인공지능 앱을 만들 수 있도록 도와드립니다.

마무리

이번 글에서는 딥러닝 모델과 PyQt5 GUI를 통합해 실제 동작하는 흔들림 보정 데스크탑 앱을 만들어보았습니다. 버튼 하나로 AI 모델을 실행하고 이미지가 복원되는 과정을 통해 AI 기술이 어떻게 사용자 중심 앱으로 발전할 수 있는지를 경험할 수 있습니다. 다음 글에서 실행파일로 포장하여 완성된 배포형 프로그램으로 발전시켜보겠습니다.

반응형