image-captioning-blip / quick_test_flickr8k.py
Pokkhrong Rasee
Initial commit: image captioning project setup
aa6c1ef
Raw
History Blame Contribute Delete
3.67 kB
"""
quick_test_flickr8k.py
Quick script to:
1. Extract your Flickr8k zip (if not already extracted)
2. Inspect the dataset structure
3. Run a pretrained BLIP model on a few sample images
(No training required — instant results!)
Usage:
python quick_test_flickr8k.py
"""
import os
import zipfile
import random
from pathlib import Path
from PIL import Image
from tqdm import tqdm
import torch
from transformers import BlipProcessor, BlipForConditionalGeneration
# ============================
# CONFIG — adjust if needed
# ============================
ZIP_PATH = "archive.zip"
EXTRACT_TO = "./flickr8k_extracted"
NUM_SAMPLES = 5 # How many random images to caption
MODEL_NAME = "Salesforce/blip-image-captioning-base"
def extract_zip(zip_path, extract_to):
"""Extract zip if not already extracted."""
extract_path = Path(extract_to)
if extract_path.exists() and any(extract_path.iterdir()):
print(f"[INFO] Already extracted at: {extract_path}")
return str(extract_path)
print(f"[INFO] Extracting {zip_path}{extract_path} ...")
extract_path.mkdir(parents=True, exist_ok=True)
with zipfile.ZipFile(zip_path, 'r') as zf:
zf.extractall(extract_path)
print("[INFO] Extraction complete.")
return str(extract_path)
def find_images_folder(root):
"""Find the folder containing .jpg images."""
root = Path(root)
# Common names
for name in ["Flicker8k_Dataset", "Flickr8k_Dataset", "images", "Images"]:
p = root / name
if p.exists() and p.is_dir():
return p
# Also check one level deep
for sub in root.iterdir():
if sub.is_dir():
p2 = sub / name
if p2.exists() and p2.is_dir():
return p2
# Fallback: find any folder with .jpg files
for sub in root.rglob("*.jpg"):
return sub.parent
return None
def main():
print("=" * 60)
print(" FLICKR8K QUICK TEST — Pretrained BLIP")
print("=" * 60)
# 1. Extract
extracted = extract_zip(ZIP_PATH, EXTRACT_TO)
print(f"[INFO] Extracted root: {extracted}")
# 2. Find images
img_folder = find_images_folder(extracted)
if img_folder is None:
print("[ERROR] Could not find image folder. Check your zip structure.")
return
print(f"[INFO] Image folder: {img_folder}")
# 3. Collect images
all_images = sorted([f for f in img_folder.iterdir() if f.suffix.lower() in ('.jpg', '.jpeg', '.png')])
print(f"[INFO] Found {len(all_images)} images")
if len(all_images) == 0:
print("[ERROR] No images found.")
return
# Sample random images
samples = random.sample(all_images, min(NUM_SAMPLES, len(all_images)))
print(f"[INFO] Testing on {len(samples)} random images...\n")
# 4. Load model
device = "cuda" if torch.cuda.is_available() else "cpu"
print(f"[INFO] Loading BLIP model on {device} ...")
processor = BlipProcessor.from_pretrained(MODEL_NAME)
model = BlipForConditionalGeneration.from_pretrained(MODEL_NAME).to(device)
print("[INFO] Model loaded. Generating captions...\n")
# 5. Generate captions
for img_path in samples:
image = Image.open(img_path).convert("RGB")
inputs = processor(images=image, return_tensors="pt").to(device)
with torch.no_grad():
output = model.generate(**inputs, max_length=50, num_beams=5)
caption = processor.decode(output[0], skip_special_tokens=True)
print(f" {img_path.name}")
print(f" → \"{caption}\"\n")
print("[DONE] Test complete!")
if __name__ == "__main__":
main()