LỆNH:
ollama pull llama3.2-vision
Khi tải về thì model (của llama3.2-vision) sẽ lưu ở :
CÀI ĐẶT
pip install fastapi uvicorn ollama pillow
ollama pull llama3.2-vision
import base64
import io
from fastapi import FastAPI, File, UploadFile, HTTPException
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel
import ollama
from PIL import Image
app = FastAPI(
title="Llama 3.2 Vision API",
description="API for image analysis using Llama 3.2 Vision model via Ollama",
version="1.0.0"
)
# CORS middleware để cho phép các request từ nhiều nguồn
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
class ImageAnalysisRequest(BaseModel):
"""Mô hình yêu cầu phân tích hình ảnh"""
image: str # base64 encoded image
prompt: str = "Mô tả chi tiết những gì bạn thấy trong hình ảnh này"
def decode_base64_image(base64_str):
"""Giải mã hình ảnh từ base64"""
try:
# Loại bỏ tiền tố data URL nếu có
if "base64," in base64_str:
base64_str = base64_str.split("base64,")[1]
# Giải mã base64
image_bytes = base64.b64decode(base64_str)
image = Image.open(io.BytesIO(image_bytes))
return image
except Exception as e:
raise HTTPException(status_code=400, detail=f"Lỗi giải mã hình ảnh: {str(e)}")
@app.post("/analyze-image/")
async def analyze_image(request: ImageAnalysisRequest):
"""
Endpoint phân tích hình ảnh sử dụng Llama 3.2 Vision
- Nhận hình ảnh base64 và prompt
- Trả về kết quả phân tích từ mô hình
"""
try:
# Giải mã hình ảnh
image = decode_base64_image(request.image)
# Chuyển đổi PIL Image thành bytes
img_byte_arr = io.BytesIO()
image.save(img_byte_arr, format='PNG')
img_byte_arr = img_byte_arr.getvalue()
# Gọi Ollama để phân tích hình ảnh
response = ollama.chat(
model='llama3.2-vision',
messages=[
{
'role': 'user',
'content': request.prompt,
'images': [img_byte_arr]
}
]
)
return {
"status": "success",
"analysis": response['message']['content']
}
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@app.post("/upload-and-analyze/")
async def upload_and_analyze(
file: UploadFile = File(...),
prompt: str = "Mô tả chi tiết những gì bạn thấy trong hình ảnh này"
):
"""
Endpoint tải lên và phân tích hình ảnh trực tiếp
- Nhận file hình ảnh và prompt
- Trả về kết quả phân tích
"""
try:
# Đọc nội dung file
contents = await file.read()
image = Image.open(io.BytesIO(contents))
# Chuyển đổi PIL Image thành bytes
img_byte_arr = io.BytesIO()
image.save(img_byte_arr, format='PNG')
img_byte_arr = img_byte_arr.getvalue()
# Gọi Ollama để phân tích hình ảnh
response = ollama.chat(
model='llama3.2-vision',
messages=[
{
'role': 'user',
'content': prompt,
'images': [img_byte_arr]
}
]
)
return {
"status": "success",
"analysis": response['message']['content']
}
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)
CLIENT
import requests
import base64
# Đọc hình ảnh và mã hóa base64
with open('image.jpg', 'rb') as image_file:
encoded_image = base64.b64encode(image_file.read()).decode('utf-8')
# Gọi API
response = requests.post('http://localhost:8000/analyze-image/', json={
'image': encoded_image,
'prompt': 'Mô tả chi tiết những gì bạn thấy trong hình ảnh này'
})
print(response.json())
KẾT LUẬN
- Đã chạy được
- Đã upload được ảnh và nhận được thông tin
- Tuy rằng không quá sâu, nhưng có thể bổ sung thêm một số service để khai thác thông tin ảnh.