llama3.2-vision

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

  1. Đã chạy được
  2. Đã upload được ảnh và nhận được thông tin
  3. 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.

Comments

No comments yet. Why don’t you start the discussion?

Leave a Reply

Your email address will not be published. Required fields are marked *