brunch

You can make anything
by writing

C.S.Lewis

by 수리향 Feb 23. 2023

ChatGPT에게 코딩을 물어보다 (2)

Feat. 신호처리, 아두이노, 딥러닝

1월에 GPT에게 코딩 문제를 물어보았다가 코딩의 정석을 맞보고 빠르게 좌절했었다.

https://brunch.co.kr/@soori/272

그때 물어본 것은 문제해결력이었는데 이번에는 지식을 이용한 프로그래밍이 가능한지 한번 물어보고 싶었다. 언어는 파이썬이고 분야는 전기전자분야의 영상 및 음성 신호처리다.




1. 28*28 흑백 이미지에 대한 대한 푸리에 변환 프로그램을 만들어줘.


(GPT)

먼저, 푸리에 변환이란 시간/공간 영역의 신호를 주파수 영역으로 변환하는 것을 의미합니다. 따라서 28x28 흑백 이미지에 대한 푸리에 변환을 수행하려면 다음과 같은 단계를 따를 수 있습니다.  

 이미지를 푸리에 변환할 수 있는 형태로 변환합니다. 28x28 이미지를 푸리에 변환하려면 이미지를 28x28의 복소수 배열로 변환해야 합니다.  

    numpy 라이브러리를 사용하여 푸리에 변환을 수행합니다. numpy.fft.fft2() 함수를 사용하여 2차원 푸리에 변환을 수행할 수 있습니다.  

    변환된 결과를 주파수 도메인에서 시간/공간 도메인으로 되돌리기 위해 numpy.fft.ifft2() 함수를 사용합니다.  

    결과 이미지를 시각화합니다.  

따라서, Python 코드로 구현한 푸리에 변환 프로그램은 다음과 같습니다.

위 코드에서는 Pillow 라이브러리를 사용하여 이미지 파일을 열고, numpy 라이브러리를 사용하여 푸리에 변환을 수행하였습니다. 결과 이미지는 matplotlib 라이브러리를 사용하여 시각화하였습니다.

위 코드를 실행하면 원본 이미지와 재구성된 이미지가 나타납니다. 재구성된 이미지는 원본 이미지를 주파수 영역으로 변환한 후, 다시 시간/공간 영역으로 변환한 것입니다. 이를 통해 이미지가 주파수 영역에서 어떤 특징을 가지는지 살펴볼 수 있습니다.




2. 페퍼솔트 잡음 제거 필터 코드를 만들어줘.


(GPT)

Pepper-and-salt noise는 이미지에서 흰색 또는 검은색 노이즈로 나타나는데, 이는 이미지 센서 또는 전송 과정에서 장애가 발생하면 발생할 수 있습니다. 이러한 노이즈를 제거하는 방법 중 하나는 median filter를 사용하는 것입니다. median filter는 이미지에서 픽셀 값의 중간값을 사용하여 노이즈를 제거합니다.

Python과 OpenCV 라이브러리를 사용하여 Pepper-and-salt noise를 제거하는 median filter 코드는 다음과 같습니다.


위 코드에서는 cv2.imread() 함수를 사용하여 이미지 파일을 열고, cv2.medianBlur() 함수를 사용하여 median filter를 적용합니다. 이 함수의 두 번째 인자는 필터 크기입니다. 이 예제에서는 5x5 크기의 필터를 사용하였습니다.

마지막으로, cv2.imwrite() 함수를 사용하여 결과 이미지를 저장합니다.

위 코드를 실행하면 Pepper-and-salt noise가 제거된 이미지가 result.png 파일로 저장됩니다.




당연하지만 답안이 완벽하다. 예전에 영상신호처리 수업을 들을 때 저 과제들을 해결하기 위해 밤을 새웠던 기억이 나는데, 이렇게 쉽고 빠르게 해결하다니 울고 싶다. 사실 내가 어려웠던 부분은 라이브러리를 이용하지 않고 실제 FFT와 필터를 구현하려다 보니 그런 것이었다. 하지만 교수님이 라이브러리 사용을 허가했던 만큼 ChatGPT가 있었다면 5분 안에 과제를 완료했을 것 같다. 그때 나도 라이브러리를 쓰고 싶었는데 인터넷에 아무리 찾아보아도 1차원 신호인 음성신호에 대한 FFT만 있어서 못했던 것이다. 이렇게 예쁘게 자료를 코드를 정리해서 알려주다니... 그동안 고생한 나날들에 눈물이 다 난다.


그 외에 신호처리에 대한 이론적인 부분을 물어보았는데 답변은 완벽했고, 신호처리 분야는 더 물어볼 필요가 없어 보여서 중고등학교 로보틱스 교육에서 사용되는 아두이노에 대해 물어보았다.




3. 아두이노로 미세먼지측정기를 만드는 방법을 알려줘.


(GPT)

아두이노를 이용하여 미세먼지 측정기를 만들기 위해서는 미세먼지 센서와 아두이노 보드가 필요합니다. 다음은 아두이노와 미세먼지 센서를 이용하여 미세먼지 측정기를 만드는 방법입니다.  

    먼저, 아두이노 보드와 미세먼지 센서를 준비합니다.

 아두이노 보드 : Arduino Uno, Arduino Nano 등

 미세먼지 센서 : SDS011, PMS5003, GP2Y1010AU0F 등      

1. 아두이노와 미세먼지 센서를 연결합니다.

 SDS011 센서의 경우, 센서의 VCC와 GND 핀을 아두이노의 5V와 GND에 연결하고, 센서의 RX 핀을 아두이노의 D2 핀에 연결합니다.

 PMS5003 센서의 경우, 센서의 VCC와 GND 핀을 아두이노의 5V와 GND에 연결하고, 센서의 RX 핀을 아두이노의 D2 핀에 연결합니다.

 GP2Y1010AU0F 센서의 경우, 센서의 VCC와 GND 핀을 아두이노의 5V와 GND에 연결하고, 센서의 VO 핀을 아두이노의 A0 핀에 연결합니다.      

2. 미세먼지 측정 코드를 작성합니다.

 SDS011, PMS5003 센서의 경우, 라이브러리를 이용하면 쉽게 측정값을 읽어올 수 있습니다.

 SDS011 라이브러리 : https://github.com/ricki-z/SDS011

 PMS5003 라이브러리 :  https://github.com/fu-hsi/PMS

3. GP2Y1010AU0F 센서의 경우, 아날로그 핀을 이용하여 측정값을 읽어올 수 있습니다.

 예제 코드 : https://playground.arduino.cc/Main/GP2Y1010AU0F/

4. 측정된 미세먼지 값을 시리얼 모니터에 출력하거나 LCD 디스플레이 등으로 표시합니다.  

5. 원격으로 미세먼지 측정값을 확인하려면, Wi-Fi 모듈을 추가하여 IoT 기기로 만들 수 있습니다.


Wi-Fi 모듈 : ESP8266, ESP32 등

예제 코드 :

https://www.instructables.com/id/ESP8266-Particle-MQTT-Real-time-Air-Quality-Monitor/



보면서 느낀 것은, 이제 교사들이 수업 자료를 만들 필요도 없다. 게다가 센서 별 라이브러리 위치도 알려주고 예제 코드도 준다. Wifi 모듈이 있는 경우 MQTT 서버를 이용한 예제 코드까지 주다니 이런 감사할 때가...


그렇다면 센서를 특정해 준다면 코드까지 짜줄까? 인체감지센서 중 가장 대중적인 것을 하나 골라서 물어보았다.




4. PIR HC-SR501 인체모션감지센서와 아두이노를 이용해 침입자를 보면 부저가 울리도록 설계해 줘.


(GPT)

PIR HC-SR501 인체모션감지센서와 아두이노를 이용하여 침입 감지 시 부저를 울리는 코드는 다음과 같습니다.


위 코드에서 pirPin과 buzzerPin은 사용자가 연결한 실제 핀 번호에 맞게 변경해야 합니다. 또한, 침입이 감지될 때마다 Serial 통신을 통해 메시지를 출력하도록 되어 있습니다. 이 부분은 필요에 따라 삭제하거나 변경할 수 있습니다.




코드까지 완벽하고 부저까지 옵션으로 울리게 해 주다니... 사실 이런 것 가르칠 때 제대로 된 책이 없어서 인터넷 사이트를 뒤지는데 이제 그럴 필요가 없어졌다. 짧게 생각하면 일거리가 줄었지만, 길게 보면 학생들도 자료를 정리해서 알려주는 교사가 필요 없다. 김 빠지지만 이 정도 자료면 유튜브 보면서 혼자서도 충분해 보인다.




5. MNIST 숫자 모델 학습시키는 코드를 만들어줘.


(GPT)

MNIST 숫자 모델을 학습시키는 코드를 만들기 위해서는 몇 가지 라이브러리와 패키지를 설치해야 합니다. 가장 일반적으로 사용되는 라이브러리는 TensorFlow입니다. 다음은 TensorFlow를 사용하여 MNIST 숫자 모델을 학습시키는 간단한 코드입니다.


위 코드에서는 TensorFlow와 Keras를 사용하여 MNIST 데이터를 로드하고, 데이터를 전처리한 후, 여러 개의 레이어로 구성된 신경망 모델을 만들고, 이를 컴파일한 후에 학습시켰습니다. 학습이 끝나면 모델을 평가하고, 정확도를 출력합니다.




예상은 했지만 딥러닝 코드도 잘 짠다. 가장 쉬운 MNIST를 물어보긴 했지만 깔끔하고 군더더기 없다. 성능도 괜찮아서 컨볼루셔닝도 안 하고 정확도가 98%라고 한다. 앞으로 딥러닝 공부는 ChatGPT에게 물어보아야겠다.


참고로 Unity같이 그래픽, 프로그래밍, 쉐이더 등 다양한 기술의 집약체인 게임 개발 엔진에 대한 프로그래밍은 오브젝트 정의부터 GPT에게 전달하기 쉽지 않아서 간단하게 2D 게임을 개발하는 방법에 대해 물어보았는데 Unity 프로젝트를 열고 오브젝트를 만드는 등의 개괄적인 과정을 텍스트로 간단히 설명하는 정도에 그쳤다. 아무래도 유니티 같은 게임 엔진은 프로그래밍만 있는 것이 아니라 복합적인 기술과 사고를 요하기 때문에 GPT도 어려워하는 것 같다.


물론 게임 엔진에 대해서도 AI의 발전이 두드러지는데 '머신러닝 에이전트'를 기반으로 스스로 사고하는 게임 AI가 계속 발전하고 있다.(다행인 건 개발 AI가 아니라서 게임 개발자는 아직 안전하다.) 이미 바둑은 알파고가 평정했으며 유니티에서도 ML-Agent를 지원하고 있다. 에이전트라는 것은 인간의 '선택'이라는 부분을 기계가 따라 함으로써 인간보다 최적을 선택 값을 내기 위해 학습하고 그것을 실전에 적용한다. OpenAI가 사실은 파이썬으로 만든 콘솔게임에 머신러닝을 도입하기 시작한 곳이라서 OpenAI의 에이전트도 곧 어떤 형태로든 유통되지 않을까 하는 생각을 잠시 했다.


현대의 개발은 다양한 기술들이 혼합된 만큼 일부만 GPT에게 맡길 수 있고 아직 인간의 손을 거쳐야 하는 부분이 많은 것 같다. 인간은 다양한 분야를 알고 인공지능들의 결과물을 조합하여 새로운 결과물을 창조해야 하는 것 같다. 근데 문제는 그렇게 다양한 분야를 포괄하기가 쉽지 않다. 학문 간 간섭에 대해서도 배타적인 분위기도 심하고... 하지만 생존이 달리면 결국 인간은 변화할 수밖에 없기 때문에 알아서 잘 진화하지 않을까 싶다.

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari