영리의 테크블로그

AI 이미지 생성 프로젝트 ( AI Seller ) - [1] / ComfyUI 본문

dev/AISeller

AI 이미지 생성 프로젝트 ( AI Seller ) - [1] / ComfyUI

영리0 2024. 10. 7. 01:18

프로젝트 GitHub

https://github.com/YoonJae00/AI-IMGREMOVE

 

저번에 하였던 광고 모델 생성 프로젝트는 FastAPIReact를 사용하였음. FastAPI를 선택한 이유는 다음과 같음:

  • Mediapipe로 모델을 불러와서 읽는 역할이 파이썬 라이브러리임.
  • 이 모델을 FastAPI로 바로 구현하기 위해서 사용함.

ComfyUI와 Node.js(Express) 사용

하지만 ComfyUI/generate 엔드포인트에 Prompt를 들고 요청하면 자동으로 돌아가기 때문에 굳이 FastAPI를 쓸 필요가 없다고 느껴, 가볍고 JS 문법을 활용한 Node.js(Express)를 사용해 보기로 함.

(바로 ComfyUI로 통신할까라는 생각도 했지만, 추후 시큐리티 적용과 DB 적용을 위해 따로 백엔드 서버를 두었음.)

엔드포인트 설정

먼저 Front에서 요청 보낼 엔드포인트를 뚫어주었음.

app.post('/uploads', upload.array('photos', 10), async (req, res) => {  
try {  
console.log('업로드된 파일들:');  
req.files.forEach((file, index) => {  
console.log(`파일 ${index + 1}:`, file.originalname);  
});

// 생략....

} catch (error) {  
console.error('오류 발생:', error);  
if (!res.headersSent) {  
res.status(500).send('파일 처리 중 오류가 발생했습니다.');  
}  
}  
});

엔드포인트를 뚫으면서 발생한 에러 상황

  1. 최대 10개까지 한 번에 요청할 수 있게 만들었는데, 엔드포인트로 10개를 한 번에 보내야 할까, 1개씩 10번을 보내야 할까?
  2. Node.js 서버와 ComfyUI 서버의 통신 과정 문제.

해결 과정

  1. 1개씩 10번 보내면 UX 상 진행도를 볼 수 있어서 추진하려 했으나, HTTP 요청이 10번이면 서버에 부담이 갈 위험이 있어 10개를 한 번에 보내는 쪽으로 구현함.
  2. Node.js에서 이미지를 먼저 ComfyUI로 업로드해야 함.
    • 반복문을 돌려서:
      1. /upload 엔드포인트로 이미지 전송.
      2. ComfyUI의 Prompt의 이미지 filename을 이미지의 filename으로 변경.
      3. ComfyUI /generate 엔드포인트로 요청.
      4. temp 파일에 저장.
      5. 반복문을 전부 다 돌리면 zip 파일로 압축.

여기까지는 문제점이 없었음.

하지만 3 -> 4 과정에서 이미지 생성 시간이 보통 4~6초 정도 걸리는데, ComfyUI에서 이미지 주소값만 먼저 반환하여 이미지가 생성이 안 되었는데 리턴 파일을 받으려는 오류가 발생함.

해결 방법

Ping 기법을 사용하여 1초마다 ComfyUI에 이미지가 생성되었는지 요청하고, 전부 만들어졌으면 temp 파일로 집어넣는 과정으로 구현함.

 

해결 완료

 

결론

초안 개발이 완료되었으므로 쇼핑몰 운영하던 지인들의 단톡방에 먼저 공유 후 피드백을 받을 예정임.