이전 포스팅에 이어서
2024.10.15 - [코딩/Python_AI] - 로컬에 streamlit 로 llama 3.2 Vision 채팅창 만들기
자동차 번호판을 인식한 결과입니다.
코드 내용은 코드내에 주석으로 설명을 대신합니다.
main.py
import streamlit as st
import requests
import torch
from PIL import Image
from transformers import MllamaForConditionalGeneration, AutoProcessor
from io import BytesIO
from dotenv import load_dotenv
load_dotenv()
# Streamlit 페이지 설정
st.set_page_config(page_title="LLaMA Vision Chat", page_icon="🦙")
@st.cache_resource
def load_model():
model_id = "meta-llama/Llama-3.2-11B-Vision-Instruct"
model = MllamaForConditionalGeneration.from_pretrained(
model_id,
torch_dtype=torch.bfloat16,
device_map={"": 0}
)
processor = AutoProcessor.from_pretrained(model_id)
return model, processor
# 모델 및 프로세서 로드
model, processor = load_model()
# CUDA 사용 가능 여부 확인
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
st.sidebar.write(f"Using device: {device}")
# 사이드바에 이미지 업로드 위젯 추가
uploaded_file = st.sidebar.file_uploader("이미지를 업로드하세요", type=["jpg", "jpeg", "png"])
if uploaded_file is not None:
image = Image.open(uploaded_file)
st.sidebar.image(image, caption="업로드된 이미지", use_column_width=True)
# 메인 페이지 제목
st.title("LLaMA Vision Chat")
# 채팅 기록을 저장할 세션 상태 초기화
if "messages" not in st.session_state:
st.session_state.messages = []
# 채팅 기록 표시
for message in st.session_state.messages:
with st.chat_message(message["role"]):
st.markdown(message["content"])
# 사용자 입력 받기
if prompt := st.chat_input("메시지를 입력하세요..."):
# 이미지가 업로드되었는지 확인
if uploaded_file is None:
st.error("먼저 이미지를 업로드해주세요.")
else:
# 사용자 메시지를 채팅 기록에 추가
st.session_state.messages.append({"role": "user", "content": prompt})
with st.chat_message("user"):
st.markdown(prompt)
# 봇 응답 생성
with st.chat_message("assistant"):
message_placeholder = st.empty()
full_response = ""
messages = [
{"role": "user", "content": [
{"type": "image"},
{"type": "text", "text": prompt}
]}
]
input_text = processor.apply_chat_template(messages, add_generation_prompt=True)
inputs = processor(
image,
input_text,
add_special_tokens=False,
return_tensors="pt",
).to(device)
output = model.generate(**inputs, max_new_tokens=1000)
full_response = processor.decode(output[0], skip_special_tokens=True)
message_placeholder.markdown(full_response)
# 봇 응답을 채팅 기록에 추가
st.session_state.messages.append({"role": "assistant", "content": full_response})
# Streamlit 실행 방법 안내
st.sidebar.markdown("## 실행 방법")
st.sidebar.code("streamlit run main.py")
결과
자동차 번호판을 올리고 차량의 번호판을 알려 달라고 했는데 한글은 인식 못하는 것 같았습니다.
그런데 아래 차량의 사진으로 물어보니 한글까지 인식해 답해 주었습니다.
주차 차단기에서 차량번호 인식은 올라마를 이용해 Llama 3.2 Vision 을 사용하면 간단히 해결될 것 같습니다.
requirements.txt
accelerate==1.2.1
altair==5.5.0
attrs==24.3.0
blinker==1.9.0
cachetools==5.5.0
certifi==2024.12.14
charset-normalizer==3.4.0
click==8.1.8
colorama==0.4.6
filelock==3.16.1
fsspec==2024.12.0
gitdb==4.0.11
GitPython==3.1.43
huggingface-hub==0.27.0
idna==3.10
Jinja2==3.1.5
jsonschema==4.23.0
jsonschema-specifications==2024.10.1
markdown-it-py==3.0.0
MarkupSafe==3.0.2
mdurl==0.1.2
mpmath==1.3.0
narwhals==1.19.1
networkx==3.4.2
numpy==2.2.1
packaging==24.2
pandas==2.2.3
pillow==11.0.0
protobuf==5.29.2
psutil==6.1.1
pyarrow==18.1.0
pydeck==0.9.1
Pygments==2.18.0
python-dateutil==2.9.0.post0
python-dotenv==1.0.1
pytz==2024.2
PyYAML==6.0.2
referencing==0.35.1
regex==2024.11.6
requests==2.32.3
rich==13.9.4
rpds-py==0.22.3
safetensors==0.4.5
six==1.17.0
smmap==5.0.1
streamlit==1.41.1
sympy==1.13.1
tenacity==9.0.0
tokenizers==0.21.0
toml==0.10.2
torch==2.5.1+cu118
torchaudio==2.5.1+cu118
torchvision==0.20.1+cu118
tornado==6.4.2
tqdm==4.67.1
transformers==4.47.1
typing_extensions==4.12.2
tzdata==2024.2
urllib3==2.3.0
watchdog==6.0.0
meta-llama/Llama-3.2-11B-Vision-Instruct 모델을 사용 승인 방법 1. 허깅페이스 사이트에서 회원 가입을 합니다. 2. 허깅페이스 사이트의 상기 모델의 페이지(https://huggingface.co/meta-llama/Llama-3.2-11B-Vision-Instruct) 에서 정보를 입력하고 제출해야 합니다. 3. 조금만 기다리면 사용 승인 메일이 발송되고 사용할 수 있는 권한이 획득됩니다. 코드에서 사용시 허깅페이스 로그인하는 방법 1. huggingface_hub 패키지가 설치되어 있지 않다면 pip install huggingface_hub 명령을 실행하여 설치하고 2. huggingface-cli login 명령을 실행해 아이디 패스워드로 로그인을 합니다. 한번만 해주면 됩니다. * 현재는 올라마에 vision 이미지가 올라와 있어서 ollama pull llama3.2-vision 으로도 처리가 가능합니다. |
LangChain 으로 RAG기반 Wiki 검색 채팅창 만들기 (0) | 2024.12.24 |
---|---|
Python에서 2차원 배열 중 특정 열의 값을 모두 바꾸기 (0) | 2024.10.27 |
FAISS 뷰어 (0) | 2024.10.22 |
BitNet - CPU에서 실행되는 LLM 테스트 하기 (0) | 2024.10.22 |
로컬에 streamlit 로 llama 3.2 Vision 채팅창 만들기 (0) | 2024.10.15 |