이미지 생성 및 분석을 위한 GPT-4 사용 방법
Published on
인공지능 분야에서 GPT-4의 도래는 텍스트 이상의 능력을 갖춘 인공지능 연구의 큰 발전을 의미하며, 이는 이미지 생성 및 분석의 계기를 마련합니다. 본 글은 GPT-4의 다각적인 기능에 대해 자세히 소개하며, 이미지 처리 및 생성 기능에 대한 포괄적인 가이드를 제공합니다.
GPT-4란?
GPT-4(Generative Pre-trained Transformer 4)는 OpenAI에서 개발한 AI 모델의 고급 버전입니다. GPT-4는 사람과 유사한 텍스트의 이해력과 생성력을 강화한 점으로 주목받지만, GPT-4의 특장점은 이미지와의 상호작용 능력입니다. 이는 설명에 따라 이미지를 생성하는 기능(GPT-4 Vision 또는 GPT-4V), 이미지 내용 분석, 그리고 사진에 포착된 텍스트를 읽는 기능을 포함합니다. 이러한 다양한 응용 분야에서 GPT-4V는 강력한 도구로 작용합니다.
GPT-4의 이미지 기능 이해하기
GPT-4의 이미지 기능인 GPT-4 Vision 또는 GPT-4V는 문장의 설명을 기반으로 이미지를 처리하고 생성하는 능력을 갖추고 있습니다. 이는 사용자가 이미지를 업로드하여 분석하거나 모델에게 새로운 이미지 생성을 요청할 수 있다는 의미입니다. 그림 작업, 콘텐츠를 위한 시각화 생성, 이미지에서 정보 추출 등의 작업에 GPT-4V는 다양한 과제를 처리할 수 있는 기능을 갖추고 있어 GPT-4 모델 스위트에 강력한 추가 기능으로 작용합니다.
GPT-4로 이미지 생성하기
GPT-4를 사용하여 이미지를 생성하는 것은 간단합니다. 사용자는 원하는 이미지에 대한 자세한 설명을 입력하면 모델이 해당 이미지를 생성합니다. 이 기능은 특히 아티스트, 디자이너 및 콘텐츠 제작자들이 직접 그림 또는 디자인 기술이 필요 없이 아이디어를 시각화할 수 있는 데에 유용합니다. 또한 텍스트 기반 콘텐츠와 조화를 이루는 시각적 자료를 생성하여 전체 사용자 경험을 향상시킬 때에도 귀중한 도구입니다.
GPT-4의 이미지 분석 기능 활용하기
이미지 생성 외에도, GPT-4는 사진 내용을 분석하고 해석할 수 있습니다. 이는 이미지 내의 텍스트 판독, 객체 인식 및 장면 이해 등을 포함합니다. 이 기능을 사용하려면 사용자는 이미지를 플랫폼에 업로드하면, GPT-4가 분석 결과에 기반한 통찰력을 제공합니다. 시각적 장애인을 위한 텍스트 읽기와 같은 이미지 기반 연구, 데이터 추출 및 접근성 향상과 관련된 작업에 이 기능은 특히 유용합니다.
GPT-4 Vision의 실용적인 응용 분야
GPT-4의 이미지 기능은 다양한 응용 분야에 사용될 수 있습니다. 교육 분야에서는 시각적 자료를 생성하거나 역사적 사진을 분석하여 대화식 학습을 촉진할 수 있습니다. 마케터들은 GPT-4를 사용하여 캠페인용 흥미로운 시각 자료를 생성하거나 소비자 사진을 분석할 수 있습니다. 또한 창작 산업에서 GPT-4는 초기 개념 생성이나 피드백에 기반하여 기존 시각 자료를 수정하는 데에 도움을 줄 수 있습니다.
GPT-4V와 RAG를 결합하여 의복 매치메이커 앱 만들기
의복 매치메이커 앱 주피터 노트북에 오신 것을 환영합니다! 이 프로젝트는 옷의 이미지를 분석하고 색상, 스타일, 유형과 같은 주요 특징을 추출하는 GPT-4V 모델의 강력한 기능을 보여줍니다. 저희 앱의 핵심은 OpenAI에서 개발한 이 고급 이미지 분석 모델에 기반한 것으로, 입력된 의복 특징을 정확하게 식별할 수 있게 합니다.
GPT-4V는 자연어 처리와 이미지 인식을 결합한 모델로, 텍스트와 시각적인 입력을 바탕으로 이해하고 응답을 생성할 수 있습니다.
GPT-4V 모델의 능력을 바탕으로 우리는 사용자에게 알맞은 추천을 제공하기 위해 사용자 정의 매칭 알고리즘과 RAG 기법을 활용하여 지식 베이스에서 관련 아이템을 검색합니다. 이 알고리즘은 색상 호환성과 스타일 일관성과 같은 요소를 고려하여 적합한 추천을 제공합니다. 이 노트북을 통해, 의복 추천 시스템을 구축하는 이러한 기술의 실용적인 응용을 보여주고자 합니다.
GPT-4 Vision + RAG(검색 증강 생성)의 결합은 다음과 같은 여러 장점을 제공합니다:
- 문맥 이해: GPT-4 Vision은 입력 이미지를 분석하고 객체, 장면 및 활동과 같은 문맥을 이해할 수 있습니다. 이는 인테리어 디자인, 요리, 교육 등 다양한 도메인에서 더 정확하고 관련성 높은 제안이나 정보를 제공할 수 있도록 합니다.
- 풍부한 지식 베이스: RAG는 GPT-4의 생성 능력과 다른 분야의 대량의 정보에 접근하는 검색 구성 요소를 결합합니다. 이는 역사적 사실부터 과학적 개념까지 다양한 지식 기반에 따라 제안이나 통찰력을 제공할 수 있음을 의미합니다.
- 사용자 정의화: 이 접근법은 다양한 응용 분야에서 특정 사용자의 필요나 선호도에 맞게 쉽게 맞춤화할 수 있습니다. 아트 분야에서 추천을 사용자의 취향에 맞게 조정하거나 학생의 학습 레벨에 따라 교육 콘텐츠를 제공하는 등, 시스템을 개인 맞춤형 경험을 전달하기 위해 적응할 수 있습니다.
GPT-4 Vision + RAG 접근법은 생성 및 검색 기반 AI 기술의 강점을 활용하여 다양한 패션 관련 응용 분야에 강력하고 유연한 솔루션을 제공합니다.
환경 설정
먼저 필요한 종속성을 설치한 후, 라이브러리를 가져오고 나중에 사용할 일부 유틸리티 함수를 작성합니다.
### code block translation starts ###
%pip install openai --quiet
%pip install tenacity --quiet
%pip install tqdm --quiet
%pip install numpy --quiet
%pip install typing --quiet
%pip install tiktoken --quiet
%pip install concurrent --quiet
### code block translation ends ###
### code block translation starts ###
import pandas as pd
import numpy as np
import json
import ast
import tiktoken
import concurrent
from openai import OpenAI
from tqdm import tqdm
from tenacity import retry, wait_random_exponential, stop_after_attempt
from IPython.display import Image, display, HTML
from typing import List
client = OpenAI()
GPT_MODEL = "gpt-4-vision-preview"
EMBEDDING_MODEL = "text-embedding-3-large"
EMBEDDING_COST_PER_1K_TOKENS = 0.00013
### code block translation ends ###
### markdown translation starts ###
### Creating the Embeddings
# 지식 베이스를 설정하고 그에 대한 임베딩을 생성함으로써 지식 베이스를 설정합니다. 데이터 폴더 내의 'sample_styles.csv' 파일을 사용합니다. 이것은 '약 44K'개의 항목을 포함한 더 큰 데이터셋의 샘플입니다. 또한, 이 단계는 기본 제공 벡터 베이스를 사용하여 대체될 수도 있습니다. 예를 들어, [여기 cookbooks 중 하나](https://github.com/openai/openai-cookbook/tree/main/examples/vector_databases)를 따라하여 벡터 베이스를 설정할 수 있습니다.
### markdown translation ends ###
### code block translation starts ###
styles_filepath = "data/sample_clothes/sample_styles.csv"
styles_df = pd.read_csv(styles_filepath, on_bad_lines='skip')
print(styles_df.head())
print("Opened dataset successfully. Dataset has {} items of clothing.".format(len(styles_df)))
### code block translation ends ###
### markdown translation starts ###
Now we will generate embeddings for the entire dataset. We can parallelize the execution of these embeddings to ensure that the script scales up for larger datasets. With this logic, the time to create embeddings for the full `44K` entry dataset decreases from ~4h to ~2-3min.
### markdown translation ends ###
```python
## Batch Embedding Logic
# Simple function to take in a list of text objects and return them as a list of embeddings
@retry(wait=wait_random_exponential(min=1, max=40), stop=stop_after_attempt(10))
def get_embeddings(input: List):
response = client.embeddings.create(
input=input,
model=EMBEDDING_MODEL
).data
return [data.embedding for data in response]
# Splits an iterable into batches of size n.
def batchify(iterable, n=1):
l = len(iterable)
for ndx in range(0, l, n):
yield iterable[ndx : min(ndx + n, l)]
# Function for batching and parallel processing the embeddings
def embed_corpus(
corpus: List[str],
batch_size=64,
num_workers=8,
max_context_len=8191,
):
# Encode the corpus, truncating to max_context_len
encoding = tiktoken.get_encoding("cl100k_base")
encoded_corpus = [
encoded_article[:max_context_len] for encoded_article in encoding.encode_batch(corpus)
]
# Calculate corpus statistics: the number of inputs, the total number of tokens, and the estimated cost to embed
num_tokens = sum(len(article) for article in encoded_corpus)
cost_to_embed_tokens = num_tokens / 1000 * EMBEDDING_COST_PER_1K_TOKENS
print(
f"num_articles={len(encoded_corpus)}, num_tokens={num_tokens}, est_embedding_cost={cost_to_embed_tokens:.2f} USD"
)
# Embed the corpus
with concurrent.futures.ThreadPoolExecutor(max_workers=num_workers) as executor:
futures = [
executor.submit(get_embeddings, text_batch)
for text_batch in batchify(encoded_corpus, batch_size)
]
with tqdm(total=len(encoded_corpus)) as pbar:
for _ in concurrent.futures.as_completed(futures):
pbar.update(batch_size)
embeddings = []
for future in futures:
data = future.result()
embeddings.extend(data)
return embeddings
# Function to generate embeddings for a given column in a DataFrame
def generate_embeddings(df, column_name):
# Initialize an empty list to store embeddings
descriptions = df[column_name].astype(str).tolist()
embeddings = embed_corpus(descriptions)
# Add the embeddings as a new column to the DataFrame
df['embeddings'] = embeddings
print("Embeddings created successfully.")
markdown translation starts
임베딩 생성하기:
다음 줄은 sample clothes dataset
의 임베딩을 생성합니다. 이 작업은 처리에 약 0.02초가 소요되며, 결과를 로컬 .csv
파일에 기록하는 데 또한 약 30초가 소요됩니다. 이 작업은 $0.00013/1K
토큰으로 가격이 매겨진 text_embedding_3_large
모델을 사용합니다. 데이터셋에 약 1K개의 항목이 포함되어 있으므로, 다음 작업은 약 $0.001
가 소요됩니다. 전체 데이터셋인 44K
개의 항목으로 작업하려는 경우 이 작업은 약 2-3분 동안 소요되며, 대략 $0.07
이 소요됩니다.
자체임베딩 생성을 진행하고 싶지 않은 경우, 미리 계산된 임베딩 데이터셋을 사용합니다. 이 셀을 건너뛰고 다음 셀에 있는 코드의 주석을 제거하면 됩니다. 이 작업은 데이터를 모두 메모리에 로드하는 데 약 1분이 소요됩니다.
markdown translation ends
generate_embeddings(styles_df, 'productDisplayName')
print("Writing embeddings to file ...")
styles_df.to_csv('data/sample_clothes/sample_styles_with_embeddings.csv', index=False)
print("Embeddings successfully stored in sample_styles_with_embeddings.csv")
# styles_df = pd.read_csv('data/sample_clothes/sample_styles_with_embeddings.csv', on_bad_lines='skip')
# # Convert the 'embeddings' column from string representations of lists to actual lists of floats
# styles_df['embeddings'] = styles_df['embeddings'].apply(lambda x: ast.literal_eval(x))
print(styles_df.head())
print("Opened dataset successfully. Dataset has {} items of clothing along with their embeddings.".format(len(styles_df)))
Building the Matching Algorithm
이 섹션에서는 데이터프레임에서 유사한 항목을 찾기 위해 코사인 유사도 검색 알고리즘을 개발합니다. 이를 위해 사용자 지정 코사인 유사도 함수를 활용할 것입니다. sklearn
라이브러리는 내장된 코사인 유사도 함수를 제공하지만, 최근 SDK 업데이트로 인해 호환성 문제가 발생하여 우리만의 표준 코사인 유사도 계산을 구현하게 되었습니다.
이미 벡터 데이터베이스를 설정한 경우에는 이 단계를 건너뛸 수 있습니다. 대부분의 표준 데이터베이스에는 검색 기능이 내장되어 있으며, 이 가이드에서 설명하는 후속 단계를 간단하게 해결합니다. 그러나 우리는 일정한 임계값이나 지정된 일치 항목 수와 같은 특정 요구 사항을 충족하기 위해 일치 알고리즘을 맞춤화할 수 있다는 것을 보여주고자 합니다.
find_similar_items
함수는 네 개의 매개변수를 받습니다:
embedding
: 일치 항목을 찾고자 하는 임베딩입니다.embeddings
: 최상의 일치 항목을 찾기 위해 검색할 임베딩의 목록입니다.threshold
(선택적): 이 매개변수는 일치 항목으로 간주되기 위한 최소 유사도 점수를 지정합니다. 높은 임계값은 더 가까운 (더 좋은) 일치 항목을 가져오고, 낮은 임계값은 더 많은 항목을 반환할 수 있지만, 처음의embedding
과는 덜 일치할 수도 있습니다.top_k
(선택적): 이 매개변수는 주어진 임계값을 초과하는 항목의 수를 결정합니다. 이는 제공된embedding
에 대한 가장 높은 점수를 가진 일치 항목들입니다.
def cosine_similarity_manual(vec1, vec2):
"""두 벡터 사이의 코사인 유사도를 계산합니다."""
vec1 = np.array(vec1, dtype=float)
vec2 = np.array(vec2, dtype=float)
dot_product = np.dot(vec1, vec2)
norm_vec1 = np.linalg.norm(vec1)
norm_vec2 = np.linalg.norm(vec2)
return dot_product / (norm_vec1 * norm_vec2)
def find_similar_items(input_embedding, embeddings, threshold=0.5, top_k=2):
"""코사인 유사도를 기반으로 가장 유사한 항목을 찾습니다."""
# 입력 임베딩과 다른 모든 임베딩 사이의 코사인 유사도 계산
similarities = [(index, cosine_similarity_manual(input_embedding, vec)) for index, vec in enumerate(embeddings)]
# 임계값 이하의 유사도 제외
filtered_similarities = [(index, sim) for index, sim in similarities if sim >= threshold]
# 유사도 점수에 따라 필터링된 유사도 정렬
sorted_indices = sorted(filtered_similarities, key=lambda x: x[1], reverse=True)[:top_k]
# 상위 k개의 가장 유사한 항목 반환
return sorted_indices
def find_matching_items_with_rag(df_items, item_descs):
"""입력 항목 설명을 기반으로 코사인 유사도에 따라 가장 유사한 항목을 찾습니다."""
# 데이터프레임에서 임베딩 선택
embeddings = df_items['embeddings'].tolist()
similar_items = []
for desc in item_descs:
# 입력 항목에 대한 임베딩 생성
input_embedding = get_embeddings([desc])
# 코사인 유사도에 따라 가장 유사한 항목 찾기
similar_indices = find_similar_items(input_embedding, embeddings, threshold=0.6)
similar_items += [df_items.iloc[i] for i in similar_indices]
return similar_items
분석 모듈
이 모듈에서는 gpt-4-vision-preview
를 활용하여 입력 이미지를 분석하고, 자세한 설명, 스타일 및 유형과 같은 중요한 기능을 추출합니다. 분석은 간단한 API 호출을 통해 수행되며, 분석할 이미지의 URL을 제공하고 모델에게 관련 기능을 식별하도록 요청합니다.
모델이 정확한 결과를 반환하도록 하기 위해 우리는 다음과 같은 기술적인 기법을 사용합니다:
-
출력 형식 지정: 미리 정의된 구조의 JSON 블록을 반환하도록 모델에 지시합니다. 이 구조는 다음과 같은 구성 요소로 이루어져 있습니다:
items
(str[]): 간결한 제목을 나타내는 문자열 목록입니다. 각 항목은 스타일, 색상 및 성별을 포함한 의류 항목에 대한 제목입니다. 이러한 제목은 원래 데이터베이스의productDisplayName
속성과 유사합니다.category
(str): 주어진 항목을 가장 잘 나타내는 범주입니다. 모델은 원래 스타일 데이터프레임에 있는 모든 고유articleTypes
목록에서 선택합니다.gender
(str): 항목이 의도된 성별을 나타내는 레이블입니다. 모델은[Men, Women, Boys, Girls, Unisex]
옵션 중에서 선택합니다.
-
명확하고 간결한 지시사항:
- 항목 제목에 포함되어야 할 내용과 출력 형식에 대해 명확한 지시사항을 제공합니다. 출력은 JSON 형식이어야 하지만, 일반적으로 모델 응답에 포함되는
json
태그를 제외해야 합니다.
- 항목 제목에 포함되어야 할 내용과 출력 형식에 대해 명확한 지시사항을 제공합니다. 출력은 JSON 형식이어야 하지만, 일반적으로 모델 응답에 포함되는
-
원샷 예시:
- 기대하는 출력을 더 명확히 하기 위해 모델에 입력 설명 예시와 해당 예시에 대한 출력을 제공합니다. 이로 인해 사용된 토큰 수 (따라서 호출 비용)이 증가할 수 있지만, 모델을 안내하는 데 도움이 되고 전체적인 성능이 향상됩니다.
이러한 구조적 접근을 통해 우리는 gpt-4-vision-preview
모델에서 정확하고 유용한 정보를 얻어 데이터베이스에 대한 분석 및 통합에 활용하는 것을 목표로 합니다.
def analyze_image(image_base64, subcategories):
response = client.chat.completions.create(
model=GPT_MODEL,
messages=[
{
"role": "user",
"content": [
{
"type": "text",
"text": """의류 항목의 이미지를 제공하면 해당 항목을 분석하고 "items", "category" 및 "gender"와 같은 필드로 구성된 JSON 출력을 생성합니다.
패션 트렌드, 스타일 및 성별 기호 등을 이용하여 아웃핏을 완성하는 정확하고 관련성 높은 제안을 제공하세요.
items 필드는 이미지 내 항목과 잘 어울리는 항목들의 리스트여야 합니다. 각 항목은 스타일, 색상 및 성별 정보가 포함된 의류 항목의 제목입니다."""
이 목록의 유형 중에서 카테고리를 선택해야 합니다: {subcategories}.
이 목록의 성별 사이에서 선택해야 합니다: [Men, Women, Boys, Girls, Unisex]
사진의 아이템 설명을 포함하지 마세요. 출력에서 `json` 태그를 포함하지 마세요.
예시 입력: 검은 가죽 재킷을 나타내는 이미지.
예시 출력: {"items": ["여성용 흰색 반팔 티셔츠", "화이트 캔버스 스니커즈", "여성용 검정 스키니 진"], "category": "자켓", "gender": "여성"}
""",
},
{
"type": "image_url",
"image_url": {
"url": f"data:image/jpeg;base64,{image_base64}",
},
}
],
}
],
max_tokens=300,
)
# 응답에서 관련 특징 추출
features = response.choices[0].message.content
return features
샘플 이미지로 프롬프트 테스트
프롬프트의 효과를 평가하기 위해 데이터셋의 일부 이미지를 로드하여 테스트해보겠습니다. "data/sample_clothes/sample_images"
폴더에서 여러 스타일, 성별 및 유형의 이미지를 사용할 것입니다. 아래는 선택한 샘플 이미지들입니다:
2133.jpg
: 남성용 셔츠7143.jpg
: 여성용 셔츠4226.jpg
: 캐주얼한 남성용 프린트 티셔츠
이 다양한 이미지로 프롬프트를 테스트하여, 다양한 의류 아이템과 액세서리의 다른 특징을 정확하게 분석하고 추출하는 능력을 평가할 수 있습니다.
.jpg 이미지를 base64로 인코딩하는 유틸리티 함수가 필요합니다
import base64
def encode_image_to_base64(image_path):
with open(image_path, 'rb') as image_file:
encoded_image = base64.b64encode(image_file.read())
return encoded_image.decode('utf-8')
# 이미지 경로 설정 및 테스트 이미지 선택
image_path = "data/sample_clothes/sample_images/"
test_images = ["2133.jpg", "7143.jpg", "4226.jpg"]
# 테스트 이미지를 base64로 인코딩
reference_image = image_path + test_images[0]
encoded_image = encode_image_to_base64(reference_image)
# DataFrame에서 고유한 서브카테고리 선택
unique_subcategories = styles_df['articleType'].unique()
# 이미지 분석 수행하고 결과 반환
analysis = analyze_image(encoded_image, unique_subcategories)
image_analysis = json.loads(analysis)
# 이미지와 분석 결과 출력
display(Image(filename=reference_image))
print(image_analysis)
다음으로, 이미지 분석의 출력을 처리하고 데이터셋에서 일치하는 항목을 필터링하여 표시합니다. 아래는 코드의 내용입니다:
-
이미지 분석 결과 추출:
image_analysis
딕셔너리에서 아이템 설명, 카테고리 및 성별을 추출합니다. -
데이터셋 필터링:
styles_df
DataFrame을 필터링하여 이미지 분석에서 추출한 성별 (또는 유니섹스)과 분석된 이미지와 동일한 카테고리의 아이템만 포함합니다. -
일치하는 항목 찾기:
find_matching_items_with_rag
함수를 사용하여 필터링된 데이터셋에서 분석된 이미지에서 추출한 설명과 일치하는 항목을 찾습니다. -
일치하는 항목 표시: 일치하는 항목의 이미지를 표시하기 위해 HTML 문자열을 생성합니다. 아이템 ID를 사용하여 이미지 경로를 구성하고, 각 이미지를 HTML 문자열에 추가합니다. 마지막으로,
display(HTML(html))
을 사용하여 노트북에서 이미지를 렌더링합니다.
이 셀은 이미지 분석 결과를 사용하여 데이터셋을 필터링하고 분석된 이미지의 특징과 일치하는 항목을 시각적으로 표시하는 방법을 효과적으로 보여줍니다.
# 분석 결과에서 관련 기능 추출
item_descs = image_analysis['items']
item_category = image_analysis['category']
item_gender = image_analysis['gender']
# 동일한 성별 (또는 유니섹스)이고 다른 카테고리의 아이템만 사용하여 데이터 필터링
filtered_items = styles_df.loc[styles_df['gender'].isin([item_gender, 'Unisex'])]
filtered_items = filtered_items[filtered_items['articleType'] != item_category]
print(str(len(filtered_items)) + " Remaining Items")
# 입력 아이템 설명과 가장 유사한 아이템 찾기
matching_items = find_matching_items_with_rag(filtered_items, item_descs)
# 일치하는 항목 표시 (이미지 분석의 각 설명에 대해 2개의 항목이 표시됩니다)
html = ""
paths = []
for i, item in enumerate(matching_items):
item_id = item['id']
# 이미지 파일 경로
image_path = f'data/sample_clothes/sample_images/{item_id}.jpg'
paths.append(image_path)
html += f'<img src="{image_path}" style="display:inline;margin:1px"/>'
# 일치하는 항목 설명 출력
print(item_descs)
# 이미지 표시
display(HTML(html))
가드레일
GPT-4V와 같은 대형 언어 모델(Large Language Model, LLM)을 사용할 때 "가드레일(guardrails)"은 모델의 출력이 원하는 매개변수나 경계 내에 있는지 확인하기 위해 설정된 메커니즘 또는 검사를 의미합니다. 특히 복잡하거나 뉘앙스가 있는 작업을 다룰 때, 가드레일은 모델의 출력 품질과 관련성을 유지하는 데 중요합니다.
가드레일의 중요성은 다음과 같습니다:
- 정확성: 모델의 출력이 입력과 정확하고 관련성 있도록 보장합니다.
- 일관성: 비슷한 또는 관련된 입력을 다룰 때 모델의 응답을 일관되게 유지합니다.
- 안전성: 모델이 유해하거나 불적절한 콘텐트를 생성하지 않도록 방지합니다.
- 맥락적 관련성: 모델의 출력이 사용되는 작업이나 도메인에서 맥락적으로 관련성이 있는지 보장합니다. 우리의 경우, 우리는 GPT-4V를 사용하여 패션 이미지를 분석하고 원래의 의상에 잘 어울리는 아이템을 제안합니다. 보호막을 구현하기 위해 우리는 결과를 정확화할 수 있습니다: GPT-4V에서 초기 제안을 얻은 후, 원본 이미지와 제안된 아이템을 모델로 다시 보낼 수 있습니다. 그런 다음 GPT-4V에게 각 제안된 항목이 실제로 원래 의상과 잘 어울리는지 평가하도록 요청할 수 있습니다.
이를 통해 모델은 피드백이나 추가 정보에 기초하여 스스로의 출력을 수정하고 조정할 수 있습니다. 이러한 보호막을 구현하고 자체 교정 기능을 활성화함으로써, 패션 분석과 추천의 맥락에서 모델의 출력의 신뢰성과 유용성을 향상시킬 수 있습니다.
이를 용이하게 하기 위해, 우리는 LLM에게 제안된 항목이 원래 의상과 일치하는지에 대한 "예" 또는 "아니오"로 답할 수 있는 간단한 질문을 하는 프롬프트를 작성합니다. 이 이진 응답은 정화 과정을 간소화하고 모델로부터 명확하고 실행 가능한 피드백을 보장하는 데 도움이 됩니다.
def check_match(reference_image_base64, suggested_image_base64):
response = client.chat.completions.create(
model=GPT_MODEL,
messages=[
{
"role": "user",
"content": [
{
"type": "text",
"text": """ 두 가지 다른 옷의 이미지가 제공됩니다.
목표는 두 이미지의 옷이 함께 잘어울리는지를 결정하는 것입니다.
첫 번째 이미지는 기준 아이템(사용자가 다른 아이템과 맞추려고 하는 아이템)입니다.
두 번째 아이템이 기준 아이템과 잘 어울리는지를 결정해야 합니다.
답변은 "answer", "reason" 두 가지 필드를 포함하는 JSON 출력이어야 합니다.
"answer" 필드는 두 아이템이 서로 잘 어울릴 때 "yes" 또는 "no"가됩니다.
"reason" 필드는 답변에 대한 추론의 간단한 설명이어야 합니다. 2개 이미지의 설명은 포함하지 마십시오.
출력에 ```json``` 태그를 포함하지 마십시오.
""",
},
{
"type": "image_url",
"image_url": {
"url": f"data:image/jpeg;base64,{reference_image_base64}",
},
},
{
"type": "image_url",
"image_url": {
"url": f"data:image/jpeg;base64,{suggested_image_base64}",
},
}
],
}
],
max_tokens=300,
)
# 응답에서 관련 기능을 추출합니다.
features = response.choices[0].message.content
return features
마지막으로, 위에서 식별된 아이템 중 실제로 의상에 어울리는 항목을 결정합시다.
# 생성된 이미지의 고유 경로를 선택합니다.
paths = list(set(paths))
for path in paths:
# 테스트 이미지를 base64로 인코딩합니다.
suggested_image = encode_image_to_base64(path)
# 아이템이 일치하는지 확인합니다.
match = json.loads(check_match(encoded_image, suggested_image))
# 이미지와 분석 결과를 표시합니다.
if match["answer"] == 'yes':
display(Image(filename=path))
print("아이템이 일치합니다!")
print(match["reason"])
우리는 초기 잠재적인 항목 목록이 더 정제되어 의상과 잘 어울리는 보다 커러레이티드된 선택으로 결과를 얻게 되었습니다. 또한, 모델은 각 항목이 왜 좋은 조합으로 간주되는지에 대한 설명을 제공하여, 의사 결정 과정에 대한 가치있는 통찰력을 제공합니다.
리뷰
이 튜토리얼에서는 GPT-4와 Vision 및 기타 머신러닝 기술을 패션 도메인에 적용해 보았습니다. 의류 이미지를 분석하고 관련된 특징을 추출하며 이 정보를 사용하여 원래 의상과 어울리는 일치 항목을 찾는 방법을 보여주었습니다. 보호막과 자체 보정 메커니즘을 구현함으로써, 모델의 제안을 정확하고 맥락에 맞게 다듬었습니다.
이 접근 방식은 다음과 같은 현실 세계에서 실용적으로 사용할 수 있습니다:
- 맞춤형 쇼핑 어시스턴트: 소매업체는이 기술을 사용하여 고객에게 맞춤형 의상 추천을 제공하여 쇼핑 경험을 향상시키고 고객 만족도를 높일 수 있습니다.
- 가상 옷장 애플리케이션: 사용자는 자신의 의류 항목 이미지를 업로드하여 가상 옷장을 만들고 기존 조각과 일치하는 새로운 항목에 대한 제안을받을 수 있습니다.
- 패션 디자인 및 스타일링: 패션 디자이너와 스타일리스트는이 도구를 사용하여 다양한 조합과 스타일을 실험할 수 있으며, 창의적인 과정을 간소화할 수 있습니다.
그러나 염두에 둘 사항 중 하나는 비용입니다. LLM 및 이미지 분석 모델의 사용은 비용이 발생할 수 있으므로 특히 폭넓게 사용되는 경우에는 비용 효과를 고려하는 것이 중요합니다. gpt-4-vision-preview
의 가격은 1000 토큰 당 $0.01
입니다. 이는 256px x 256px 이미지에 대해 $0.00255
입니다.
종합적으로,이 가이드는 패션과 AI의 교차점에서 더 많은 맞춤형 및 지능적인 패션 추천 시스템을 개발하고 탐구하기 위한 기초가 됩니다.
결론
GPT-4의 이미지 처리 및 생성에 대한 확장은 AI 개발에서 중요한 이정표입니다. GPT-4의 비전 능력을 활용하는 방법을 이해함으로써 사용자는 이전에 불가능하다고 생각되던 방식으로 AI의 능력을 활용하여 이미지를 생성하고 분석할 수 있습니다. 창의적, 교육적 또는 분석적 목적을 위해, GPT-4는 디지털 세계에서 시각적 요소를 통합하여 내용의 생성과 이해를 향상시키는 새로운 가능성을 엽니다.