OpenAI가 공개한 ImageGenCam이라는 오픈소스 프로젝트를 보게 됐다. 라즈베리파이와 3D 프린팅 케이스로 카메라를 조립하면, 사진을 찍는 순간 AI가 그 사진을 완전히 다른 스타일로 재해석해서 돌려주는 물건이었다. 스케치 느낌으로 바꾸거나, 애니메이션 풍으로 그려주거나, 엉뚱한 컨셉으로 변신시켜주는 식.

프로젝트를 보고 나니 “이거 나도 손쉽게 만들어볼 수 있지 않을까” 싶었다. 그래서 라즈베리파이 대신 훨씬 작고 저렴한 ESP32라는 마이크로컨트롤러로 직접 만들어보기로 했다.

왜 ESP32였나

ImageGenCam은 Raspberry Pi Zero 2 W를 쓴다. 리눅스가 도는 미니 컴퓨터라 성능도 좋고, AI API를 직접 호출할 수 있을 만큼 여유가 있다.

내가 ESP32-S3(XIAO ESP32-S3 Sense)로 방향을 바꾼 이유는 단순했다.

  • 손쉽게 만들어보고 싶었다. 라즈베리파이는 리눅스 세팅부터 시작해야 해서 진입장벽이 있는데, ESP32는 아두이노 계열이라 훨씬 가볍게 시작할 수 있다.
  • 가격이 저렴하다. 마이크로컨트롤러라 보드 자체 가격이 훨씬 낮다.
  • 작다. 폴라로이드 느낌의 소형 카메라를 만들고 싶었는데, 파이보다 훨씬 작은 폼팩터가 나온다.
  • 라즈베리파이가 최근 많이 비싸졌다. 예전만큼 접근하기 쉬운 가격이 아니어서, 대안을 찾다가 ESP32 쪽으로 무게가 실렸다.

대신 ESP32는 라즈베리파이만큼 힘이 세지 않다. 그래서 AI 이미지 변환처럼 무거운 작업을 카메라 자체에서 처리할 수는 없다. 이 부분은 클라우드로 사진을 보내고 처리해서 다시 받아오는 구조로 해결했다. 셔터를 누르면 사진이 클라우드로 올라가고, 서버 쪽에서 AI 변환을 마친 뒤 결과가 다시 카메라 화면과 텔레그램으로 돌아오는 식이다. 한 번 왕복하는 데 1분 조금 넘게 걸리지만, 그 대신 유지비를 최대한 아끼는 방향으로 구조를 짰다.

백엔드 쪽에 살짝 팁을 남기자면, 별도로 GPU 서버를 유료로 띄우지는 않았다. 클라우드 무료 티어 서버 하나를 중계 게이트웨이로 세워두고, 그 뒤로 터널을 뚫어서 집에 있는 컴퓨터가 실제 AI 변환(제미나이 API 호출)을 처리하도록 짰다. 이미 갖고 있는 컴퓨팅 자원을 재활용하는 쪽을 택한 셈이다.

실제로 이렇게 바뀐다

말로 설명하는 것보다 실제 예시 하나가 빠르다. 책상 위에 있던 토끼 키링을 찍었더니 이렇게 나왔다.

변환 전 원본 사진 - 책상 위 토끼 키링 AI 변환 후 - 지브리풍 일러스트로 재해석된 토끼

왼쪽이 카메라가 찍은 원본, 오른쪽이 AI가 돌려준 결과다. 같은 프레임인데 완전히 다른 그림이 되어 돌아온다.

가장 어려웠던 건 의외로 모델링이었다

전자 회로나 코드보다 사실 제일 힘들었던 건 3D 프린팅용 케이스 모델링이었다. 카메라 몸체 안에 배터리, 보드, 디스플레이, 버튼까지 다 들어가야 하다 보니 부품 배치를 잡는 것부터가 일이었고, 한 번 설계했다고 끝나는 게 아니라 계속 디테일을 수정해야 했다.

문제는 이 수정 하나하나를 확인하려면 매번 실제로 3D 프린터로 뽑아봐야 한다는 점이었다. 화면상 모델링으로는 딱 맞아 보여도 막상 출력해보면 부품이 안 들어가거나, 나사 구멍 위치가 살짝 어긋나거나, 조립할 때 부품끼리 부딪히는 경우가 계속 나왔다. 그럴 때마다 설계를 조금씩 고치고 다시 뽑아보는 과정을 반복해야 했는데, 프린트 한 번에도 적지 않은 시간이 걸리다 보니 이 사이클 자체가 꽤 오래 걸렸다. 회로나 소프트웨어는 고치고 바로 테스트해볼 수 있는데, 하드웨어 케이스는 그렇게 빠르게 확인할 수가 없어서 답답한 부분이었다.

그래도 이 과정을 몇 차례 반복하고 나니 부품이 딱 맞게 들어가는 케이스가 완성됐다. 배터리 자리, 보드 자리, 디스플레이 자리, 셔터 버튼 자리까지 전부 자리를 잡았고, 뒷판을 열고 닫을 수 있는 구조까지 마무리했다.

화면을 켜면 와이파이가 끊기는 미스터리

하드웨어만큼 발목을 잡은 게 소프트웨어 쪽 버그였다. 뷰파인더용 디스플레이 라이브러리를 초기화하는 순간 와이파이 연결 상태가 깨져버리는 현상을 만났다. 화면은 이렇게 노이즈투성이로 나왔다.

와이파이 끊김 버그 당시 화면 - 노이즈가 낀 뷰파인더 와이파이 끊김 버그 당시 화면 - 색상이 깨진 뷰파인더

더 황당했던 건, 상태값은 끊긴 것처럼 나오는데 실제 통신은 멀쩡히 되고 있었다는 점이다. 근본 원인은 끝내 명확히 못 밝혔고, 결국 “와이파이 상태값을 아예 믿지 않고 업로드가 실패했을 때만 재연결”하는 방식으로 우회했다.

돌이켜보면 전자 부품을 다루는 것보다 케이스 설계 쪽이 훨씬 시간이 오래 걸렸다. 코드는 고치고 바로 컴퓨터에서 결과를 확인할 수 있지만, 케이스는 수정할 때마다 실물로 출력해서 손으로 끼워보는 과정을 거쳐야 검증이 됐다. 부품 하나가 1mm만 어긋나도 조립이 안 되거나 헐렁해지는 경우가 많아서, 치수 하나하나를 실측하고 반영하는 작업을 꽤 여러 번 반복해야 했다.

완성된 결과

여러 번의 수정 끝에 촬영부터 AI 변환, 결과 수신까지 이어지는 전체 흐름이 안정적으로 돌아가는 카메라가 완성됐다. 스타일은 지브리풍, 팝아트, 장난스러운 캐릭터 변신 등 여러 종류를 넣어뒀고, 버튼을 길게 누르면 스타일을 바꿀 수 있다. 셔터를 누르면 화면이 잠깐 멈췄다가 라이브 화면으로 돌아오고, 그 사이 백그라운드에서 AI 변환이 진행돼서 완료되면 알림이 온다.

같은 사진이라도 어떤 스타일을 골랐는지에 따라 완전히 다른 결과물이 나오는 게 이 카메라의 재미다. 회로 문제나 통신 문제보다 오히려 손으로 만지는 케이스 쪽이 시간을 훨씬 많이 잡아먹었다는 게 이번 프로젝트에서 얻은 의외의 교훈이었다. 그래도 결과물을 손에 쥐고 사진을 찍을 때마다, 그 시간이 아깝지 않았다는 생각이 든다.