Skip to content

Commit

Permalink
init
Browse files Browse the repository at this point in the history
  • Loading branch information
hahuyhoang411 committed Jan 22, 2025
1 parent e64d072 commit ea34cd4
Showing 1 changed file with 63 additions and 58 deletions.
121 changes: 63 additions & 58 deletions vi/5_vision_language_models/notebooks/vlm_usage_sample.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,17 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"# Processing images and text with VLMs \n",
"# Xử lý hình ảnh và văn bản với Mô hình Ngôn ngữ Thị giác (VLM)\n",
"\n",
"This notebook demonstrates how to utilize the `HuggingFaceTB/SmolVLM-Instruct` 4bit-quantized model for various multimodal tasks such as:\n",
"- Visual Question Answering (VQA): Answering questions based on image content.\n",
"- Text Recognition (OCR): Extracting and interpreting text in images.\n",
"- Video Understanding: Describing videos through sequential frame analysis.\n",
"Notebook này minh họa cách sử dụng mô hình `HuggingFaceTB/SmolVLM-Instruct` đã được lượng tử hóa **4 bit** cho các tác vụ đa phương thức (multimodal) khác nhau như:\n",
"\n",
"By structuring prompts effectively, you can leverage the model for many applications, such as scene understanding, document analysis, and dynamic visual reasoning."
"- Hỏi đáp bằng hình ảnh (Visual Question Answering - VQA): Trả lời các câu hỏi dựa trên nội dung hình ảnh.\n",
"\n",
"- Nhận dạng văn bản (OCR): Trích xuất và diễn giải văn bản trong hình ảnh.\n",
"\n",
"- Mô tả video: Mô tả video thông qua phân tích khung hình tuần tự.\n",
"\n",
"Bằng cách cấu trúc các lời nhắc (prompt) một cách hiệu quả, bạn có thể tận dụng mô hình cho nhiều ứng dụng, chẳng hạn như hiểu cảnh, phân tích tài liệu và suy luận hình ảnh động."
]
},
{
Expand All @@ -20,12 +23,12 @@
"metadata": {},
"outputs": [],
"source": [
"# Install the requirements in Google Colab\n",
"# Cài đặt các yêu cầu trong Google Colab\n",
"# !pip install transformers datasets trl huggingface_hub bitsandbytes\n",
"\n",
"# Authenticate to Hugging Face\n",
"# Xác thực với Hugging Face\n",
"from huggingface_hub import notebook_login\n",
"notebook_login()\n"
"notebook_login()"
]
},
{
Expand Down Expand Up @@ -76,15 +79,16 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## Processing Images"
"## Xử lý hình ảnh\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's start with generating captions and answering questions about an image. We'll also explore processing multiple images.\n",
"### 1. Single Image Captioning"
"Hãy bắt đầu với việc tạo chú thích và trả lời các câu hỏi về một hình ảnh. Chúng ta cũng sẽ khám phá việc xử lý nhiều hình ảnh.\n",
"\n",
"### 1. Tạo chú thích cho một hình ảnh"
]
},
{
Expand Down Expand Up @@ -149,41 +153,41 @@
}
],
"source": [
"# Load one image\n",
"# Tải một hình ảnh\n",
"image1 = load_image(image_url1)\n",
"\n",
"# Create input messages\n",
"# Tạo các thông báo đầu vào\n",
"messages = [\n",
" {\n",
" \"role\": \"user\",\n",
" \"content\": [\n",
" {\"type\": \"image\"},\n",
" {\"type\": \"text\", \"text\": \"Can you describe the image?\"}\n",
" {\"type\": \"text\", \"text\": \"Bạn có thể mô tả hình ảnh này không?\"}\n",
" ]\n",
" },\n",
"]\n",
"\n",
"# Prepare inputs\n",
"# Chuẩn bị đầu vào\n",
"prompt = processor.apply_chat_template(messages, add_generation_prompt=True)\n",
"inputs = processor(text=prompt, images=[image1], return_tensors=\"pt\")\n",
"inputs = inputs.to(device)\n",
"\n",
"# Generate outputs\n",
"# Tạo đầu ra\n",
"generated_ids = model.generate(**inputs, max_new_tokens=500)\n",
"generated_texts = processor.batch_decode(\n",
" generated_ids,\n",
" skip_special_tokens=True,\n",
")\n",
"\n",
"print(generated_texts)\n"
"print(generated_texts)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2. Comparing Multiple Images\n",
"The model can process and compare multiple images. Let's determine the common theme between two images."
"### 2. So sánh nhiều hình ảnh\n",
"Mô hình có thể xử lý và so sánh nhiều hình ảnh. Hãy xác định chủ đề chung giữa hai hình ảnh."
]
},
{
Expand All @@ -200,36 +204,35 @@
}
],
"source": [
"\n",
"# Load images\n",
"# Tải hình ảnh\n",
"image2 = load_image(image_url2)\n",
"\n",
"# Create input messages\n",
"# Tạo các thông báo đầu vào\n",
"messages = [\n",
" # {\n",
" # \"role\": \"user\",\n",
" # \"content\": [\n",
" # {\"type\": \"image\"},\n",
" # {\"type\": \"image\"},\n",
" # {\"type\": \"text\", \"text\": \"Can you describe the two images?\"}\n",
" # {\"type\": \"text\", \"text\": \"Bạn có thể mô tả hai hình ảnh này không?\"}\n",
" # ]\n",
" # },\n",
" {\n",
" \"role\": \"user\",\n",
" \"content\": [\n",
" {\"type\": \"image\"},\n",
" {\"type\": \"image\"},\n",
" {\"type\": \"text\", \"text\": \"What event do they both represent?\"}\n",
" {\"type\": \"text\", \"text\": \"Chúng đại diện cho sự kiện gì?\"}\n",
" ]\n",
" },\n",
"]\n",
"\n",
"# Prepare inputs\n",
"# Chuẩn bị đầu vào\n",
"prompt = processor.apply_chat_template(messages, add_generation_prompt=True)\n",
"inputs = processor(text=prompt, images=[image1, image2], return_tensors=\"pt\")\n",
"inputs = inputs.to(device)\n",
"\n",
"# Generate outputs\n",
"# Tạo đầu ra\n",
"generated_ids = model.generate(**inputs, max_new_tokens=500)\n",
"generated_texts = processor.batch_decode(\n",
" generated_ids,\n",
Expand All @@ -243,9 +246,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"### 🔠 Text Recognition (OCR)\n",
"VLM can also recognize and interpret text in images, making it suitable for tasks like document analysis.\n",
"You could try experimenting on images with denser text."
"### 🔠 Nhận dạng văn bản (OCR)\n",
"VLM cũng có thể nhận ra và diễn giải văn bản trong hình ảnh, làm cho nó phù hợp với các tác vụ như phân tích tài liệu.\n",
"Bạn có thể thử nghiệm trên các hình ảnh có văn bản dày đặc hơn."
]
},
{
Expand Down Expand Up @@ -277,26 +280,26 @@
"document_image_url = \"https://cdn.pixabay.com/photo/2020/11/30/19/23/christmas-5792015_960_720.png\"\n",
"display(Image(url=document_image_url))\n",
"\n",
"# Load the document image\n",
"# Tải hình ảnh tài liệu\n",
"document_image = load_image(document_image_url)\n",
"\n",
"# Create input message for analysis\n",
"# Tạo thông báo đầu vào để phân tích\n",
"messages = [\n",
" {\n",
" \"role\": \"user\",\n",
" \"content\": [\n",
" {\"type\": \"image\"},\n",
" {\"type\": \"text\", \"text\": \"What is written?\"}\n",
" {\"type\": \"text\", \"text\": \"Nội dung là gì?\"}\n",
" ]\n",
" }\n",
"]\n",
"\n",
"# Prepare inputs\n",
"# Chuẩn bị đầu vào\n",
"prompt = processor.apply_chat_template(messages, add_generation_prompt=True)\n",
"inputs = processor(text=prompt, images=[document_image], return_tensors=\"pt\")\n",
"inputs = inputs.to(device)\n",
"\n",
"# Generate outputs\n",
"# Tạo đầu ra\n",
"generated_ids = model.generate(**inputs, max_new_tokens=500)\n",
"generated_texts = processor.batch_decode(\n",
" generated_ids,\n",
Expand All @@ -310,14 +313,16 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## Processing videos\n",
"## Xử lý video\n",
"Các Mô hình Ngôn ngữ Thị giác (VLM) có thể xử lý video gián tiếp bằng cách trích xuất các khung hình chính (keyframe) và suy luận trên chúng theo thứ tự thời gian. Mặc dù VLM thiếu khả năng nhận biết thời gian thực của các mô hình video chuyên dụng, chúng vẫn có thể:\n",
"\n",
"- Mô tả các hành động hoặc sự kiện bằng cách phân tích các khung hình được lấy mẫu tuần tự.\n",
"\n",
"- Trả lời các câu hỏi về video dựa trên các khung hình chính đại diện.\n",
"\n",
"Visual-Language Models (VLMs) can process videos indirectly by extracting keyframes and reasoning over them in temporal order. While VLMs lack the temporal modeling capabilities of dedicated video models, they can still:\n",
"- Describe actions or events by analyzing sampled frames sequentially.\n",
"- Answer questions about videos based on representative keyframes.\n",
"- Summarize video content by combining textual descriptions of multiple frames.\n",
"- Tóm tắt nội dung video bằng cách kết hợp các mô tả văn bản của nhiều khung hình.\n",
"\n",
"Let experiment on an example:\n",
"Hãy thử nghiệm trên một ví dụ:\n",
"\n",
"<video width=\"640\" height=\"360\" controls>\n",
" <source src=\"https://cdn.pixabay.com/video/2023/10/28/186794-879050032_large.mp4\" type=\"video/mp4\">\n",
Expand Down Expand Up @@ -347,7 +352,7 @@
"def extract_frames(video_path, max_frames=50, target_size=None):\n",
" cap = cv2.VideoCapture(video_path)\n",
" if not cap.isOpened():\n",
" raise ValueError(f\"Could not open video: {video_path}\")\n",
" raise ValueError(f\"Không thể mở video: {video_path}\")\n",
" \n",
" total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))\n",
" frame_indices = np.linspace(0, total_frames - 1, max_frames, dtype=int)\n",
Expand All @@ -373,7 +378,7 @@
" top = (image.height - target_size) // 2\n",
" return image.crop((left, top, left + target_size, top + target_size))\n",
"\n",
"# Video link\n",
"# Đường dẫn video\n",
"video_link = \"https://cdn.pixabay.com/video/2023/10/28/186794-879050032_large.mp4\""
]
},
Expand All @@ -392,15 +397,15 @@
}
],
"source": [
"question = \"Describe what the woman is doing.\"\n",
"question = \"Mô tả những gì người phụ nữ đang làm.\"\n",
"\n",
"def generate_response(model, processor, frames, question):\n",
"\n",
" image_tokens = [{\"type\": \"image\"} for _ in frames]\n",
" messages = [\n",
" {\n",
" \"role\": \"user\",\n",
" \"content\": [{\"type\": \"text\", \"text\": \"Following are the frames of a video in temporal order.\"}, *image_tokens, {\"type\": \"text\", \"text\": question}]\n",
" \"content\": [{\"type\": \"text\", \"text\": \"Sau đây là các khung hình của một video theo thứ tự thời gian.\"}, *image_tokens, {\"type\": \"text\", \"text\": question}]\n",
" }\n",
" ]\n",
" inputs = processor(\n",
Expand All @@ -414,34 +419,34 @@
" )\n",
" return processor.decode(outputs[0], skip_special_tokens=True)\n",
"\n",
"\n",
"# Extract frames from the video\n",
"# Trích xuất khung hình từ video\n",
"frames = extract_frames(video_link, max_frames=15, target_size=384)\n",
"\n",
"processor.image_processor.size = (384, 384)\n",
"processor.image_processor.do_resize = False\n",
"# Generate response\n",
"# Tạo phản hồi\n",
"response = generate_response(model, processor, frames, question)\n",
"\n",
"# Display the result\n",
"# print(\"Question:\", question)\n",
"print(\"Response:\", response)"
"# Hiển thị kết quả\n",
"# print(\"Câu hỏi:\", question)\n",
"print(\"Phản hồi:\", response)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 💐 You're Done!\n",
"## 💐 Bạn đã hoàn thành!\n",
"Notebook này đã minh họa cách sử dụng Mô hình Ngôn ngữ Thị giác (VLM) như định dạng lời nhắc cho các tác vụ đa phương thức. Bằng cách làm theo các bước được nêu ở đây, bạn có thể thử nghiệm với VLM và các ứng dụng của chúng.\n",
"\n",
"### Các bước tiếp theo để khám phá:\n",
"- Thử nghiệm với nhiều trường hợp sử dụng VLM hơn.\n",
"\n",
"This notebook demonstrated how to use a Visual-Language Model (VLM) such as formating prompts for multimodal tasks. By following the steps outlined here, you can experiment with VLMs and their applications.\n",
"- Cộng tác với đồng nghiệp bằng cách xem xét các yêu cầu kéo (PR) của họ.\n",
"\n",
"### Next Steps to Explore:\n",
"- Experiment with more use cases of VLMs.\n",
"- Collaborate with a colleague by reviewing their pull requests (PRs).\n",
"- Contribute to improving this course material by opening an issue or submitting a PR to introduce new use cases, examples, or concepts.\n",
"- Đóng góp để cải thiện tài liệu khóa học này bằng cách mở một vấn đề (issue) hoặc gửi PR để giới thiệu các trường hợp sử dụng, ví dụ hoặc khái niệm mới.\n",
"\n",
"Happy exploring! 🌟"
"Chúc bạn khám phá vui vẻ! 🌟"
]
}
],
Expand Down

0 comments on commit ea34cd4

Please sign in to comment.