| |
| |
| |
|
|
| import numpy as np |
| import pandas as pd |
|
|
| |
| |
|
|
| import os |
| for dirname, _, filenames in os.walk('/kaggle/input'): |
| for filename in filenames: |
| print(os.path.join(dirname, filename)) |
|
|
| |
| |
|
|
|
|
| get_ipython().getoutput("pip install nltk") |
|
|
|
|
| import torch |
| from transformers import BlipProcessor, BlipForConditionalGeneration |
| from nltk.translate.bleu_score import sentence_bleu, SmoothingFunction |
| from tqdm import tqdm |
|
|
|
|
| device = "cuda" if torch.cuda.is_available() else "cpu" |
|
|
| model_name = "utkarshpise/blip-rsicd-captioning" |
|
|
| processor = BlipProcessor.from_pretrained(model_name) |
| model = BlipForConditionalGeneration.from_pretrained(model_name) |
|
|
| model.to(device) |
| model.eval() |
|
|
| print(" Model loaded") |
|
|
|
|
| smooth = SmoothingFunction().method1 |
|
|
| def evaluate_model(model, loader, processor, device): |
| model.eval() |
|
|
| total_loss = 0 |
| preds = [] |
| refs = [] |
|
|
| with torch.no_grad(): |
| for batch in tqdm(loader, desc="Evaluating"): |
| batch = {k: v.to(device) for k, v in batch.items()} |
|
|
| |
| outputs = model(**batch) |
| loss = outputs.loss |
| total_loss += loss.item() |
|
|
| |
| generated_ids = model.generate( |
| pixel_values=batch["pixel_values"], |
| max_length=50, |
| num_beams=5 |
| ) |
|
|
| pred = processor.batch_decode(generated_ids, skip_special_tokens=True) |
| ref = processor.batch_decode(batch["labels"], skip_special_tokens=True) |
|
|
| preds.extend(pred) |
| refs.extend(refs if False else ref) |
|
|
| avg_loss = total_loss / len(loader) |
|
|
| bleu_scores = [] |
| for p, r in zip(preds, refs): |
| score = sentence_bleu([r.split()], p.split(), smoothing_function=smooth) |
| bleu_scores.append(score) |
|
|
| bleu = sum(bleu_scores) / len(bleu_scores) |
|
|
| return avg_loss, bleu |
|
|
|
|
|
|
| import kagglehub |
| import os |
| import pandas as pd |
|
|
| path = kagglehub.dataset_download("thedevastator/rsicd-image-caption-dataset") |
|
|
| print("Dataset path:", path) |
| print("Files:", os.listdir(path)) |
|
|
|
|
| TEST_CSV = os.path.join(path, "test.csv") |
|
|
| df = pd.read_csv(TEST_CSV) |
|
|
| print("Total samples:", len(df)) |
|
|
|
|
| import random |
|
|
|
|
|
|
| class RSICDDataset(Dataset): |
| def __init__(self, df, processor): |
| self.df = df |
| self.processor = processor |
|
|
| def __len__(self): |
| return len(self.df) |
|
|
| def __getitem__(self, idx): |
| row = self.df.iloc[idx] |
|
|
| |
| import ast |
| from io import BytesIO |
| from PIL import Image |
|
|
| img_data = row["image"] |
|
|
| if isinstance(img_data, str): |
| img_dict = ast.literal_eval(img_data) |
| image_bytes = img_dict["bytes"] |
| else: |
| image_bytes = img_data["bytes"] |
|
|
| image = Image.open(BytesIO(image_bytes)).convert("RGB") |
|
|
| |
| captions = row["captions"] |
|
|
| if isinstance(captions, str): |
| captions = ast.literal_eval(captions) |
|
|
| caption = random.choice(captions) |
|
|
| encoding = self.processor( |
| images=image, |
| text=caption, |
| padding="max_length", |
| truncation=True, |
| return_tensors="pt" |
| ) |
|
|
| encoding = {k: v.squeeze(0) for k, v in encoding.items()} |
| encoding["labels"] = encoding["input_ids"] |
|
|
| return encoding |
|
|
|
|
| from torch.utils.data import DataLoader |
|
|
| dataset = RSICDDataset(df, processor) |
|
|
| test_loader = DataLoader(dataset, batch_size=8, num_workers=2) |
|
|
|
|
| loss, bleu = evaluate_model(model, test_loader, processor, device) |
|
|
| print(f"\nLM Loss: {loss}") |
| print(f" BLEU Score: {bleu}") |
|
|
|
|
| from huggingface_hub import login |
|
|
| login() |
|
|
|
|
|
|
| from huggingface_hub import upload_file |
|
|
| repo_id = "utkarshpise/blip-rsicd-captioning" |
|
|
| upload_file( |
| path_or_fileobj="/kaggle/working/.virtual_documents/__notebook_source__.ipynb", |
| path_in_repo="inference.py", |
| repo_id=repo_id, |
| repo_type="model" |
| ) |
|
|
| print(" Code uploaded!") |
|
|
|
|
| Evaluating: 100%|ββββββββββ| 137/137 [05:44<00:00, 2.51s/it] |
|
|
| LM Loss: 16.873739333048356 |
| BLEU Score: 0.10002967072689554 |
|
|