Skip to main content

사내 AI 서비스 활용 POC

· 7 min read
Haekyu Cho
Software Engineer

커머스 플랫폼에 적용할만한 AI서비스들을 뽑아서 notebook으로 사업, 기획팀에 데모 발표 자료

개발 환경

  • Package Manager : Poetry
  • Python 3.11
  • 엑셀 변환, sqlite3 : Pandas
  • Jupyter Notebook
  • 터미널 프로그레스 : tqdm
  • lint & formatter : Ruff
  • AI 오픈소스 모델
    • openai-whisper : voice to text
    • pyannote : 화자 분리
    • paddleOCR : ocr
    • langchain, langgraph, streamit : RAG 구현
    • Ollama : 로컬 서빙(엑사원 3.5, 임베딩 모델)
  • AI Driven 개발 : Cursor AI 활용, .cursorrules 작성

POC

OCR

  • 이미지에서 텍스트 추출
  • 텍스트 위치 정보 추출
# 프로토 타이핑 코드
import json
import os
from pprint import pprint

import cv2
import numpy as np
from paddleocr import PaddleOCR
from PIL import Image


def get_random_color():
c = tuple(np.random.randint(0, 256, 3).tolist())
return c


def draw_ocr_bbox(image, boxes, colors):
print(colors)
box_num = len(boxes)
for i in range(box_num):
box = np.reshape(np.array(boxes[i]), [-1, 1, 2]).astype(np.int64)
image = cv2.polylines(np.array(image), [box], True, colors[i], 2)
return image


def inference(
img: Image.Image, lang, confidence
): # -> tuple[Image, list[list[str | Any | tuple[Any, ...]]]]:
ocr = PaddleOCR(
use_angle_cls=True,
lang=lang,
rec_thresh=0.1,
use_gpu=False,
use_mp=True,
cls_thresh=0.1,
det_db_unclip_ratio=2.0,
det_box_thresh=0.5,
det_model_dir=f"./models/det/{lang}",
cls_model_dir=f"./models/cls/{lang}",
rec_model_dir=f"./models/rec/{lang}",
)
# img_path = img.name
img2np = np.array(img)
result = ocr.ocr(img2np, cls=True)[0]
pprint(result)

# rgb
image = img.convert("RGB")
boxes = [line[0] for line in result]
txts = [line[1][0] for line in result]
scores = [line[1][1] for line in result]

final_result = [
dict(boxes=box, txt=txt, score=score, _c=get_random_color())
for box, txt, score in zip(boxes, txts, scores)
]
# score < 0.5 제거
final_result = [item for item in final_result if item["score"] > confidence]

im_show = draw_ocr_bbox(
image,
[item["boxes"] for item in final_result],
[item["_c"] for item in final_result],
)
im_show = Image.fromarray(im_show)
data = [
[json.dumps(item["boxes"]), round(item["score"], 3), item["txt"]]
for item in final_result
]
return im_show, data


import glob
import os

from IPython.display import display
from PIL import Image

# 맥에서 메모리 관련 이슈
os.environ["FLAGS_use_cuda_managed_memory"] = "false"

# jpg, jpeg 파일 찾기
image_files = glob.glob("*.jpg") + glob.glob("*.jpeg")

# 각 이미지 표시
for image_file in image_files:
print(image_file)

img = Image.open(image_file)
lang = "ch" # korean, en, ch, jp
confidence = 0.5

im_show, data = inference(img, lang, confidence)
display(im_show)
  • 중국산 오픈소스인 paddleOCR를 활용하여 테스트 진행
  • macbook m4 pro에서 2메가 이미지 ocr처리 속도 1초 이내 응답
  • GPU 서버 없이 서비스 가능함
  • 영어, 중국어는 품질이 굉장히 좋으나 한국어 처리가 부족함

OCR

이미지 인페인팅

  1. AI 지우개
  2. AI 영역 선택

이미지 배경제거

  • 오픈소스 rembg로 구현
  • 일반 서버에서 구동 가능
  • macbook m4 pro에서 2메가 이미지 ocr처리 속도 1초 이내 응답
# https://m.childy.co.kr/goods/goods_view.php?goodsNo=1000039717
# https://www.jungoneshop.com/goods/goods_view.php?goodsNo=1000015457&mtn=1%5E%7C%5EBEST%5E%7C%5En
import glob

import PIL.Image
from IPython.display import display
from PIL import Image
from rembg import remove

jpg_files = glob.glob(pathname="*.jpg") + glob.glob("*.jpeg")


def remove_background(input_path: str):
return remove(Image.open(input_path))


removed_list = []

for jpg in jpg_files:
display(Image.open(jpg))
removed_background = remove_background(jpg)
print(removed_background.__class__)
removed_list.append(removed_background)
display(removed_background)

poc3

가상 피팅 : https://app.klingai.com/global/try-on/try-on/new

  1. 실제모델 + 가상 피팅
    1. 모델 : https://www.moomooz.co.kr/products/129200837
    2. 옷 : https://www.firstkid.co.kr/html/product/view.html?productNo=128615519
  2. 가상모델 생성 + 가상 피팅
    1. 옷 : https://www.emotioncastle.com/products/124395229
  3. 영상 : 생성 시간이 매우 김(20분 이상), 고비용
    1. kling ai : https://app.klingai.com/global/image-to-video/frame-mode/new

케이스

  1. 휴먼 모델 이미지가 있을 경우 가상모델 생성 생략, 옷 이미지와 합성
    1. 생성시 프롬프트를 입력받아 모자를 생성, 뒤에 배경을 바다로, 카페로.. 또는 날씨가 화창, 흐린, 눈이 오는데 화창한 등등 샘플 예시
  2. 모델이 없을 경우 가상 모델을 프롬프트로 생성 : 자세한 프롬프트 예제를 제공해야함
    1. 모델을 N개 만들고 하나 선택
    2. 선택된 모델 이미지로 1번 실행

코드 & 결과 확인

AI 상품 등록

  1. 상품등록 페이지 -> AI 상품등록
  2. 휴대폰으로 찍은 사진 업로드
  3. 배경 삭제
  4. (옵션) 이미지 필터링 (밝게, 뚜렷하게, 노이즈 제거, 특정 영역 inpainting)
  5. 상품 정보 추출
  6. 배경 교체
  7. 상품 임시 등록

코드 & 결과 확인

쇼핑몰 AI 분석

  1. 판매통계 분석
  2. gemini 2.0 flash의 경우 multi model(이미지, 텍스트등) 을 지원함 -> 시각적인 막대그래프, 꺽은선등 지원
  3. 쇼핑몰의 니즈에 따라 프롬프트를 변경하여 몰에서 원하는 보고서 양식 생성 가능
  4. 좀 더 기능을 확장한다면?
    1. 어제 가장 많이 팔린 상품은?
    2. 한달간 반품이 가장 많았던 상품은?

코드 & 결과 확인

AI 리뷰 요약(키워드)

  1. LLM을 이용한 키워드 요약
  2. 요약된 키워드와 원본 리뷰 text 매칭
  3. 참고1 참고2
  4. 키워드 추출을 ai 요약이 아닌 쇼핑몰에서 직접 입력하여 추출도 가능한 시나리오

코드 & 결과 확인

상품 문의 AI 문의 대응

  1. 샘플
  2. 어드민
    1. AI아이콘 클릭 -> 자동 답변
    2. 상품 문의 발생시 이벤트 발행 -> AI 자동 답변 -> 어드민 웹푸시 or 모바일 어드민 앱푸시 -> 자동답변 승인
  3. 몰별, 상품별 답변 템플릿화

코드 & 결과 확인

전화상담 TTS, 일대일문의_감정평가

  1. 전화상담 mp3 텍스트 추출 & 요약, AI 평가
  2. COS 1:1 문의 감정 평가
  • OpenAI의 whisper를 활용하여 음성 -> 텍스트 변환
  • macbook pro m4 에서 large모델 실행시 2분 29초 mp3음성파일은 50초 정도 소요됨
  • 화자 분리의 경우 pyannote를 이용하여 분리 가능하며 최종 스크립트를 다시 llm에 요청하여 오타 수정 & 요약

코드 * 결과 확인