반응형

Stable Diffusion으로 생성한 이미지의 프롬프트(EXIF) 를 확인하려면 Python의 pillow 라이브러리를 사용해야 합니다

pip install pillow

다른 라이브러리들과 같이 사용하는 경우 모든 라이브러리들의 출시 일자를 거의 비슷하게 맞춰주는 것이 오류가 발생할 확률을 줄이는데 도움이 됩니다

필자의 경우 250102에 나온 11.1.0 버전을 사용했습니다

 

출시 일자와 버전은 아래의 페이지에서 확인할 수 있습니다

https://pypi.org/project/pillow/#history

import re
from PIL import Image

필요한 라이브러리들을 가져옵니다

re 라이브러리는 정규 표현식(Regular Expressions) 을 줄인것입니다

프롬프트를 추출하는데 사용합니다

 

def ExtractEXIFParameters(image):
    img = Image.open(image)
    metadata = img.info.get('parameters', '')
    print(metadata)

image = './image_file.png'
ExtractEXIFParameters(image)
# {문자열}\nNegative prompt: {문자열}\nSteps: {숫자}, Sampler: {문자열}, CFG scale: {숫자}, 이하 생략

사용하기 편하도록 함수로 만들어줍니다

실행하면 주석에 나온것과 비슷하게 출력될겁니다

만약에 아무것도 출력되지 않는다면 둘 중 하나입니다: png 이미지가 아니거나, 해당 이미지에 EXIF가 없거나

이렇게만 해도 다 확인할 수 있지만 보기에는 상당히 좋지 않습니다

그래서 보기 좋게 바꿔주도록 하겠습니다

 

나누려고 하는데 어디를 기준으로 해야할지 정하기 어렵습니다

필자의 경우 일단은 Prompt, Negative prompt, 그 이외의 값 이렇게 셋으로 나누려고 합니다

Negative prompt에서 항상 있는 문자열은 '\nNegative prompt: ' 가 해당됩니다

그러면 이 문자열을 기준으로 나눈다면 값을 쉽게 나눌 수 있을것입니다

def ExtractEXIFParameters(image):
    # print() 함수를 제외한 이전 코드 이어서 작성
    parameters = re.search(r'^(.*?)\nNegative prompt: (.*?)\n(.*)', metadata, re.DOTALL)
    if (parameters is not None):
        positive_prompt = parameters.group(1).strip()
        negative_prompt = parameters.group(2).strip()
        other_parameters = parameters.group(3).strip()
        
        positive_prompt = re.sub(r'\n+', ', ', positive_prompt)
        negative_prompt = re.sub(r'\n+', ', ', negative_prompt)
        
        return ['Prompt', 'Negative prompt', 'Other parameters'], [positive_prompt, negative_prompt, other_parameters]
    else:
        return [], []

문자열을 나누기 위해서 정규 표현식을 사용했습니다

정규 표현식과 관련해서는 아래의 글들을 보시면 도움이 될겁니다

 

re.search() 함수 https://docs.python.org/3/library/re.html#re.Pattern.search

re.sub() 함수 https://docs.python.org/3/library/re.html#re.Pattern.sub

08-1 정규 표현식 살펴보기 https://wikidocs.net/1642
08-2 정규 표현식 시작하기 https://wikidocs.net/4308
08-3 강력한 정규 표현식의 세계로 https://wikidocs.net/4309

 

위의 글들을 봐도 이해가 잘 안간다면 ChatGPT, Claude와 같은 LLM을 사용하시는걸 추천드립니다

 

이미지에 EXIF가 있다면 parameters에 어떤 값이 들어있게 됩니다

그러면 if() 문은 True가 되어서 실행이 되고 positive_prompt, negative_prompt, other_parameters에 각각에 해당하는 값들이 들어가게 됩니다

만약에 이미지에 EXIF가 없다면 parameters에 어떠한 값도 없어서 if() 문은 False가 되어서 else를 실행하게 됩니다

이 경우에는 이미지에 EXIF가 없기 때문에 빈 배열 2개를 반환해줍니다

 

추가로 가끔 Prompt, Negative prompt에 줄바꿈(\n) 이 있는 경우도 있습니다

Stable Diffusion에서 줄바꿈은 쉼표(, ) 와 동일하게 작동하므로 이를 바꿔주기 위해서 마찬가지로 정규 표현식을 사용해줬습니다

image = './image_file.png'
keys, values = ExtractEXIFParameters(image)

for key, value in zip(keys, values)
    print(key + ': ' + value)

다 입력했으면 한번 실행해봅니다

실행하면 Prompt, Negative prompt, 그 외 기타 값 이렇게 셋으로 나눠져서 잘 출력됩니다

import re
from PIL import Image

def ExtractEXIFParameters(image):
    img = Image.open(image)
    metadata = img.info.get('parameters', '')
    
    parameters = re.search(r'^(.*?)\nNegative prompt: (.*?)\n(.*)', metadata, re.DOTALL)
    if (parameters is not None):
        positive_prompt = parameters.group(1).strip()
        negative_prompt = parameters.group(2).strip()
        other_parameters = parameters.group(3).strip()
        
        positive_prompt = re.sub(r'\n+', ', ', positive_prompt)
        negative_prompt = re.sub(r'\n+', ', ', negative_prompt)
        
        return ['Prompt', 'Negative prompt', 'Other parameters'], [positive_prompt, negative_prompt, other_parameters]
    else:
        return [], []

image = './image_file.png'
keys, values = ExtractEXIFParameters(image)

for key, value in zip(keys, values)
    print(key + ': ' + value)

전체적인 코드는 위와 같습니다

이렇게 하면 Stable Diffusion으로 생성한 이미지의 EXIF를 출력할 수 있습니다

다만 몇 가지 문제점이 있습니다

 

1. png 이미지만 사용 가능

2. 예외문이 없어서 오류가 발생할 수 있음

3. Prompt, Negative prompt 값은 보기 좋게 잘 나오지만 그 외의 값 부분은 보기에 좋지 않음

 

이 부분들은 다음에 해결해보도록 하겠습니다

반응형

'Python > Stable Diffusion EXIF' 카테고리의 다른 글

[Stable Diffusion EXIF] 목차  (0) 2025.03.13

+ Recent posts