관리 메뉴

클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지

비전 에이전트 1 - 지능 에이전트로서 비전 에이전트와 PyQt를 이용한 사용자 인터페이스 본문

인공지능/컴퓨터 비전

비전 에이전트 1 - 지능 에이전트로서 비전 에이전트와 PyQt를 이용한 사용자 인터페이스

huenuri 2024. 11. 11. 20:39

저녁식사 후 6단원 학습을 시작해보려고 한다. 많이 하면 2시간 정도 할 수 있을 것 같다. 할 수 있는 데까지 해보자.

 

시작하기 전에

컴퓨터 비전이 쓸모 있으려면 환경과 상호작용을 해야 한다. 아래 그림에 있는 배달 드론, 공장 조립 라인에서 불량품을 거르는 검사 시스템, 상차림을 인식하여 다이어트 조언을 하는 스마트폰 앱은 환경과 활발히 상호작용한다.

 

 

컴퓨터 비전이 환경과 상호작용하게 하려면 환경에서 영상을 획득하는 기능과 처리한 결과에 따라 환경에 영향을 미치는 기능을 적절하게 추가해야 한다. 이번 장에서는 사용자 인터베이스를 붙여 환경과 상호작용할 수 있도록 확장한다.


 

 

 

지능 에이전트로서 비전 에이전트

경제학은 사람을 합리적 에이전트로 바라본다. 이 관점은 사람을 항상 최적의 의사결정을 하려 노력하는 주체로 본다. 합리적 에이전트라는 개념을 컴퓨터에 적용하면 지능 에이전트가 된다.

 

지능 에이전트는 비전, 자연 언어 처리, 지식 표현, 학습, 초론 등의 기능을 종합적으로 발휘해야 한다. 이 책에서는 비전에 특화된 지능 에이전트를 비전 에이전트라 부른다. 

비전 에이전트가 환경과 제대로 상호작용하려면 인식한 결과에 따라 로봇을 움직이거나 자동차의 브레이크와 조향 장치를 조작하는 데까지 확장되어야 한다. 환경에 영향을 미치는 물리적 장치를 액추에이터라고 한다. 

 


 

 

 

 

PyQt를 사용한 사용자 인터페이스

비전 프로끄램을 비전 에이전트로 확장하려면 적절한 그래픽 사용자 인터페이스(GUI)를 추가해야 한다. 파이썬에서 GUI 프로그래밍은 tkinter 또는 PyQt 모듈을 사용한다. 여기서는 PyQt를 사용한다. 아나콘다를 설치하면 PyQt가 포함되므로 별도로 설치할 필요는 없다.

 

 

PyQt 기초 프로그래밍

다음 프로그램은 PyQt를 이용한 간단한 GUI 프로그램이다. 처음 만나는 GUI 프로그램이니 코드를 살펴보기 전에 프로그램을 실행하여 제대로 동작하는지 먼저 확인하자. 프로그램을 실행하면 <짧게 삑>, <길게 삑>, <나가기>라는 3개의 버튼을 가진 윈도우가 뜬다. 마우스로 <짧게 삑> 버튼을 클릭하면 0.5초 동안 소리가 나고 <길게 삑> 버튼을 클릭하면 3초 동안 삑 소리가 난다.

 

PyQt로 간단한 GUI 만들기(버튼을 클릭하면 삑 소리 들려주기

 

 

 

하지만 이런 오류가 떴다. 오류는 PyQt5 라이브러리가 현재 사용 중인 Python 환경에 설치되지 않았음을 의미한다. 아나콘다에서 이 라이브러리를 설치해야 할 것 같다.


 

 

PyQt 라이브러리 설치하기

 

 

 

 

 

 

 

이제 설치가 모두 되었다.

 

 

 

실행하면 이런 창이 나타나는데, 왼쪽과 오른쪽 버튼을 누르면 소리가 짧게 혹은 길게 간다. 그리고 나가기를 누르면 창이 꺼진다.

 

 

 

하지만 이런 경고창이 7개나 떠서 보기가 싫었다. 어떻게 하면 없앨 수 있을까? 이 경고는 코드 분석 도구가 from PyQt5.QtWidgets import *와 같은 * 임포트를 사용할 때 발생하는 일반적인 경고다. *을 사용해 임포트하면 어떤 이름들이 정의되었는지 코드 분석 도구가 파악하기 어려워지기 때문에 나타나는 경고이다.

 

이를 해결하기 위해서는 필요한 위젯 클래스만 명시적으로 임포트하는 방법을 사용할 수 있다. 예를 들어, QMainWindow, QPushButton, QLabel 등의 위젯만 필요한 경우 다음과 같이 코드를 수정할 수 있다.

 

이렇게 하니 모두 사라졌다.


 

 

코드 분석하기

 

6~27행은 BeepSound 클래스로 객체를 생성하면 자동으로 실행되는 생성자 함수 __init__을 정의했다. 9행은 윈도우 제목 표시줄에 '삑 소리 내기'라고 쓴다. 10행은 윈도우를 환면의 (200,200) 위치에 초기 배치하고 너비와 높이를 각각 500과 100으로 설정하라는 명령이다.

13~16행은 QPushBotton 함수로 버튼 3개와 QLabel 함수로 레이블 1개를 만든다. 버튼과 레이블은 위젯의 일종인데 PyQt는 이들 외에도 QCheckBox, QRadioButton, QComboBox, QLineEdit 등 20여 개의 유용한 위젯을 제공한다.

이때 버튼 객체와 달리 self를 붙였는데 self를 붙이면 멤버 변수가 된다. 멤버 변수는 클래스 어느 곳에서든 접근이 가능하며 클래스로 생성한 객체에서도 접근이 가능하다. 이 프로그램에서는 shortBeepFunction 함수와 longBeepFunction 함수가 label 객체에 접근해야 해서 멤버 변수로 선언한다.


 

 

 

 

OpenCV에 PyQt를 붙여 프로그램 확장하기

이제 OpenCV에 PyQt의 GUI를 붙여 비전 프로그램을 확장해보자. 다음 프로그램은 비디오를 확장하고 비디오에서 프레임을 획득하고 저장하는 간단한 기능을 제공한다.

먼저 프로그램의 큰 주소를 살펴보자. GUI 제작을 지원하는 Video 클래스를 선언한다. 이 클래스의 생성자 함수 __iit_이고 버튼을 클릭하면 실행될 콜백 함수가 4개이다. 콜백 함수는 OpenCV 함수를 여러 군데서 사용한다.

 

 

OpenCV에 PtQt의 GUI 붙이기(비디오에서 프레임을 잡아 저장하기)

 

네 개의 버튼을 지원하는 콜백 함수의 동작을 하나씩 살펴보자. 31행은 videoFunction을 videButton의 콜백 함수로 등록한다. <비디오 켜기>라는 버튼이 클릭되는 순간 videoFunction이 호출되도록 등록한다. 그 외에 프레임 잡기, 프레임 저장, 나가기라는 함수도 콜백 함수로 등록되어 있다.

 

 

 

 

 

 

프레임 저장을 클릭하면 이렇게 저장할 수 있는 공간이 나타난다.


 

 

 

학습을 마치고

원래 어제 저녁에 공부하려던 내용이었는데 얼마나 졸리던지 저녁을 먹자마자 30분도 되지 않아서 잠을 잤다. 그리고 다음날 새벽 2시에 일어나 공부를 시작해 본다. 새벽에 자바스크립트 책도 주문했다. 책이 900쪽도 훨씬 넘는 아주 두껍고 굉장한 책이었다. 목요일까지 컴퓨터 비전을 거의 다 끝마치고 금요일부터는 자바 스크립트 공부에 들어가려고 한다.

남은 3일 동안 정말 열심히 공부해볼 것이다. 

 

GUI 프로그램으로 실행해보니 정말 재미있다.