LLM) LLAVA 13b로 caption(설명) 또는 table 텍스트 데이터 생성해보기

2024. 7. 30. 02:08관심있는 주제/LLM

 

llava라는 모델이 나와서 이미지 데이터만으로 테이블을 만들거나 caption을 생성한다는 것이 매력적인 것 같아 실험을 해봅니다.
 
자원이 없다 보니 개인 노트북에서 cpu로 돌리면서 결과를 하나하나 얻다 보니, 매우 오래 기다렸지만, 나름 유의미한 것 같아 공유드립니다.
 
아시다시피 한국 사람이다보니, 영어의 결과보다는 한국어로 결과를 얻고 싶었고, llava는 아무래도 영어를 주력 언어로 학습하다 보니, 학습을 시켜 아하나?라는 생각이 들었습니다.
 
하지만 그렇게 자원도 학습할 데이터도 없다 보니, 현재는 불가능하다 생각이 들었습니다. 그리고 번역기 성능이 좋다면, 오픈된 도메인 환경에서는 크게 문제 되지 않을 수도 있다는 생각이 들어서 deep_translator를 사용하여 번역하여 한국어로 결과를 얻는 작업을 진행해봤습니다
 
그래서 다음과 같은 흐름도로 작업이 진행되었습니다.
- ollama를 사용하였고, 거기서 llava:7b  (4.7GB)  - Q4_0 를 우선 사용해 봤는데, 결과가 좋지 않아서 llava:13b  (7.4GB) - Q4_0를 사용해서 진행하였습니다.
 
실제로 llava:13b 정도는 써야 이미지를 잘 보고 생성하는 것 같습니다.
 

ollama run llava:7b

 

흐름도

 

결과

 
아래는 13b 결과물 먼저 공유드립니다.

이미지번역 전 결과번역 결과


테이블
 Certainly! Here is the table extracted from the image and formatted in markdown:

```
| Bank Loan | Monthly Lease | Down Payment | Interest Rate | Total Interest | Total Paid Over 48 Months | Insurance |
|-------------|--------------|---------------|----------------|--------------------|---------------------------|-----------|
| Ford Fusion | $625          | $0            | 3.9%             | $1,785              | $34,560                   | $1,000    |
| Honda Civic | $625          | $0            | 3.9%             | $1,785              | $34,560                   | $1,000    |
| Mazda 3       | $625          | $0            | 3.9%             | $1,785              | $34,560                   | $1,000    |
| Toyota Yaris | $625          | $0            | 3.9%             | $1,785              | $34,560                   | $1,000    |
| Volkswagen Golf | $625          | $0            | 3.9%             | $1,785              | $34,560                   | $1,000    |
```

Please note that the values are approximate and may not be exact due to the resolution of the image provided.
틀림없이! 다음은 이미지에서 추출되어 마크다운 형식으로 지정된 테이블입니다.

````
| 은행대출 | 월간 임대 | 계약금 | 이자율 | 총 이자 | 48개월 동안 지불한 총액 | 보험 |
|---------------|---------------|---------------|---- -----------|---------|--- ---------|------------|
| 포드 퓨전 | $625 | $0 | 3.9% | $1,785 | $34,560 | $1,000 |
| 혼다 시빅 | $625 | $0 | 3.9% | $1,785 | $34,560 | $1,000 |
| 마쓰다 3 | $625 | $0 | 3.9% | $1,785 | $34,560 | $1,000 |
| 토요타 야리스 | $625 | $0 | 3.9% | $1,785 | $34,560 | $1,000 |
| 폭스바겐 골프 | $625 | $0 | 3.9% | $1,785 | $34,560 | $1,000 |
````

해당 값은 대략적인 값이며 제공된 이미지의 해상도로 인해 정확하지 않을 수 있습니다.

로고
"Cool Cat Hacking the Digital World""디지털 세계를 해킹하는 쿨캣"

그림 설명
 The image displays a colorful pyramid diagram titled "Bloom's Taxonomy." This educational framework is divided into six levels, each representing a different cognitive skill or process: Remembering, Understanding, Applying, Analyzing, Evaluating, and Creating.

At the bottom of the pyramid, the "Remembering" level involves recalling facts and basic concepts. The next level up is "Understanding," which requires comprehending ideas and interpreting information. Above that is "Applying," where learners use acquired knowledge to solve problems or complete tasks.

The middle of the pyramid represents the "Analyzing" level, which involves breaking down complex information into smaller parts and understanding their relationships. The next level up is "Evaluating," where individuals assess the value or quality of information based on criteria.

At the top of the pyramid is "Creating," which involves generating new ideas or products using knowledge and skills acquired through the previous levels. This framework is commonly used in education to guide instructional design and assessment strategies.
이미지는 "블룸의 분류법"이라는 제목의 다채로운 피라미드 다이어그램을 보여줍니다. 이 교육 프레임워크는 6단계로 나뉘며, 각각 다른 인지 기술이나 프로세스를 나타냅니다. 기억, 이해, 적용, 분석, 평가, 창조.

피라미드의 맨 아래에 있는 "기억" 단계는 사실과 기본 개념을 회상하는 것을 포함합니다. 그 위의 단계는 "이해"로, 아이디어를 이해하고 정보를 해석해야 합니다. 그 위의 단계는 "적용"으로, 학습자가 습득한 지식을 사용하여 문제를 해결하거나 작업을 완료합니다.

피라미드의 중간은 "분석" 단계를 나타내며, 복잡한 정보를 더 작은 부분으로 나누고 그 관계를 이해하는 것을 포함합니다. 그 위의 단계는 "평가"로, 개인이 기준에 따라 정보의 가치나 품질을 평가합니다.

피라미드의 맨 위에 있는 "창조"는 이전 단계를 통해 습득한 지식과 기술을 사용하여 새로운 아이디어나 제품을 생성하는 것을 포함합니다. 이 프레임워크는 교육에서 일반적으로 교육 설계와 평가 전략을 안내하는 데 사용됩니다.

그림 설명
 The image shows a hand-drawn diagram with various elements connected to each other, representing different aspects of work or project management. At the top, there is a cloud labeled "PM" which stands for Project Manager. From this central point, three main branches extend outward:

1. Task Myth: This branch has two sub-branches: "Daily tasks" and "Google Calendar." The "Daily tasks" sub-branch includes items such as "Reading," "Appointments," and "Progress tracking." The "Google Calendar" sub-branch shows an icon of a calendar with the Google logo.

2. Project Myth: This branch has two sub-branches: "Goals & Objectives" and "Resources." The "Goals & Objectives" sub-branch includes items like "Reading," "Appointments," and "Progress tracking." The "Resources" sub-branch shows an icon of a clipboard with papers, suggesting documentation or resources.

3. Second Brain: This branch has two sub-branches: "Reading" and "Ideas." The "Reading" sub-branch includes items such as "Google Calendar," "Appointments," and "Progress tracking." The "Ideas" sub-branch shows an icon of a light bulb, symbolizing ideas or creativity.

The diagram is colorful with various colors used to differentiate between the different elements. It appears to be a personalized system for organizing tasks, projects, and resources within a professional context.

이미지는 서로 연결된 다양한 요소가 있는 손으로 그린 다이어그램을 보여주며, 이는 작업 또는 프로젝트 관리의 다양한 측면을 나타냅니다. 맨 위에는 프로젝트 관리자를 의미하는 "PM"이라는 레이블이 붙은 구름이 있습니다. 이 중심점에서 세 개의 주요 브랜치가 바깥쪽으로 확장됩니다.

1. 작업 신화: 이 브랜치에는 "일상 작업"과 "Google 캘린더"라는 두 개의 하위 브랜치가 있습니다. "일상 작업" 하위 브랜치에는 "읽기", "약속", "진행 상황 추적"과 같은 항목이 포함됩니다. "Google 캘린더" 하위 브랜치에는 Google 로고가 있는 캘린더 아이콘이 표시됩니다.

2. 프로젝트 신화: 이 브랜치에는 "목표 및 목적"과 "리소스"라는 두 개의 하위 브랜치가 있습니다. "목표 및 목적" 하위 브랜치에는 "읽기", "약속", "진행 상황 추적"과 같은 항목이 포함됩니다. "리소스" 하위 브랜치에는 문서 또는 리소스를 암시하는 종이가 있는 클립보드 아이콘이 표시됩니다.

3. 두 번째 뇌: 이 브랜치에는 "읽기"와 "아이디어"라는 두 개의 하위 브랜치가 있습니다. "읽기" 하위 브랜치에는 "Google 캘린더", "약속", "진행 상황 추적"과 같은 항목이 포함됩니다. "아이디어" 하위 브랜치는 아이디어나 창의성을 상징하는 전구 아이콘을 보여줍니다.

다이어그램은 다양한 색상을 사용하여 다양한 요소를 구분하는 다채롭습니다. 전문적인 맥락에서 작업, 프로젝트 및 리소스를 구성하기 위한 개인화된 시스템인 듯합니다
 The image appears to be a screenshot of a presentation slide, possibly from an academic or research presentation. It features a graphical representation of a scientific concept related to the human body, specifically focusing on the skin and its layers.

At the top of the slide, there is text in Korean that translates to "Penetration depth." This suggests that the slide is discussing how deep substances can penetrate into the skin.

Below this title, there's a diagram with several layers labeled in English: "Epidermis," "Papillary dermis," "Reticular dermis," and "Hypodermis." These labels indicate the different layers of the skin from the outermost layer (epidermis) to the deepest layer (hypodermis).

The diagram is color-coded, with each layer represented by a different color. The epidermis is shown in pink, the papillary dermis in blue, the reticular dermis in green, and the hypodermis in red. This color coding helps to distinguish between the layers.

On the right side of the slide, there are annotations with arrows pointing downwards into the diagram. These arrows seem to indicate the depths at which certain substances can penetrate: "Penetration depth," "Epidermis," "Papillary dermis," and "Reticular dermis." The arrows suggest that these substances can penetrate up to the reticular dermis layer.

The bottom of the slide shows a graph with a pink line representing the concentration of a substance in the skin, which increases as it penetrates deeper into the layers. This graph is likely used to illustrate how the concentration of the substance changes with depth.

Overall, the slide seems to be educational or informative, aiming to explain the concept of skin penetration and the depths at which substances can reach within the skin's layers. The use of color coding and annotations helps to clarify the information presented in the diagram. 
이미지는 학술 또는 연구 프레젠테이션의 프레젠테이션 슬라이드 스크린샷인 것으로 보입니다. 인체와 관련된 과학적인 개념, 특히 피부와 그 층을 중심으로 그래픽으로 표현한 것이 특징입니다.

슬라이드 상단에는 "침투 깊이"로 번역되는 한국어 텍스트가 있습니다. 이는 슬라이드에서 물질이 피부 속으로 얼마나 깊이 침투할 수 있는지에 대해 논의하고 있음을 시사합니다.

이 제목 아래에는 영어로 "Epidermis", "Papillary dermis", "Retular dermis" 및 "Hypodermis"라는 라벨이 붙은 여러 레이어가 있는 다이어그램이 있습니다. 이 라벨은 가장 바깥층(표피)부터 가장 깊은 층(피하)까지 피부의 다양한 층을 나타냅니다.

다이어그램은 색상으로 구분되어 있으며 각 레이어는 서로 다른 색상으로 표시됩니다. 표피는 분홍색, 유두 진피는 파란색, 망상 진피는 녹색, 피하 진피는 빨간색으로 표시됩니다. 이 색상 코딩은 레이어를 구별하는 데 도움이 됩니다.

슬라이드 오른쪽에는 다이어그램 아래쪽을 가리키는 화살표가 있는 주석이 있습니다. 이 화살표는 "침투 깊이", "표피", "유두 진피" 및 "망상 진피"와 같이 특정 물질이 침투할 수 있는 깊이를 나타내는 것으로 보입니다. 화살표는 이러한 물질이 망상 진피층까지 침투할 수 있음을 나타냅니다.

슬라이드 하단에는 피부 내 물질의 농도를 나타내는 분홍색 선이 있는 그래프가 표시되어 있으며, 피부층 깊숙이 침투할수록 농도가 증가합니다. 이 그래프는 물질의 농도가 깊이에 따라 어떻게 변하는지를 설명하는 데 사용될 가능성이 높습니다.

전반적으로 이 슬라이드는 피부 침투의 개념과 피부층 내에서 물질이 도달할 수 있는 깊이를 설명하는 것을 목표로 하는 교육적이고 유익한 것으로 보입니다. 색상 구분과 주석을 사용하면 다이어그램에 표시된 정보를 명확하게 하는 데 도움이 됩니다.

 

코드

 
코드는 다음과 같습니다.
 

ollama pull llava:13b

 

from langchain_community.llms import Ollama
from langchain_community.llms.ollama import Ollama
from PIL import Image
import base64
from io import BytesIO
from deep_translator import GoogleTranslator

def convert_to_base64(pil_image: Image):
    buffered = BytesIO()
    pil_image.save(buffered, format="PNG")
    img_str = base64.b64encode(buffered.getvalue()).decode("utf-8")
    return img_str

def load_image(image_path: str):
    pil_image = Image.open(image_path)
    image_b64 = convert_to_base64(pil_image)
    print("Loaded image successfully!")
    return image_b64

def translate(text, target_lang='en'):
    translator = GoogleTranslator(source='auto', target=target_lang)
    return translator.translate(text)

 

llm = Ollama(base_url="http://localhost:11434",
              model="llava:7b",
            #   model="llava:13b",
              temperature=0.01,
              top_p=0.9
              )
              
             
img_paths = ['./img/table2.png', './img/blooms_taxonomy.png', './img/pkm.png']
for img_path in img_paths :
    image_b64 = load_image(img_path)

    prompt = '''
    Generate the Detailed Caption using Image
    '''.strip()
    resp = llm.invoke(prompt, images=[image_b64])
    print(resp)
    translated_text = translate(resp, target_lang='ko')
    print(translated_text)  # Outputs: Hello

    print("="*20)

 

프롬프트

 
프롬프트는 다음과 같습니다.
 

프롬프트 구분프롬프트 
자세한 캡션 생성 Generate the Detailed Caption using Image
자세한 캡션 생성  2 Generate the Detailed Caption using Image. Please provide a detailed description of the contents within the image.
그림 자세한 설명Generate the Detailed Description using Image. Please provide a detailed description of the contents within the image, and interpret the image, explaining its key elements and what they signify.
테이블 생성I have an image that contains a table. I want to convert this table from the image into a markdown table format that I can use in a .md file. Please extract the table from the image and provide it in markdown format. Make sure to generate the values accurately.

 

결과를 보고 느낀 점

  • 테이블 생성
    • 경량화된 버전으로 해서 그런 지 몰라도 성능이 좋지 않음
    • gpt-4o 랑 1 대 1 비교를 할 수는 없지만 gpt-4o는 정확하게 뽑는 것을 확인함.
    • table 생성하는 것에 있어서는 성능이 떨어지는 것 같아 보인다.
  • 캡션 생성
    • 테이블에 대한 캡션 생성에서는 환각현상이 있었지만, 화질이 좋은 이미지 기준으로는 이미지를 잘 설명하는 정보를 얻을 수 있을 것으로 기대함
  • 그래프 해석
    • 프롬프트 이슈일지는 몰라도, 그래프에 대한 해석을 자세하게 해주지 않고 대략적인 정보로만 요약해서 정리되는 경우가 생성됨.
  • 번역 결과
    • 어색한 표현은 존재하지만, 정보를 뽑는 것에서는 크게 정보 손실은 없어 보임

 
 
 

출처
https://medium.com/@fbanespo/unlocking-visual-narratives-a-deep-dive-into-llavas-image-captioning-with-ai-664b0b3bd207Unlocking Visual Narratives: A Deep Dive into LLaVA’s Image Captioning with AI
https://github.com/ollama/ollama/blob/main/docs/api.mdollama api
https://medium.com/@shivansh.kaushik/implementing-large-multimodal-models-lmm-in-few-lines-of-code-using-langchain-and-ollama-6c08b1c25fddollama llava example 
https://python.langchain.com/v0.2/docs/integrations/llms/ollama/ollama langchain
https://python.langchain.com/v0.1/docs/integrations/chat/ollama/chat ollama langchain

 
 

728x90