clip-model-main / data.py
JonSnow1512's picture
Upload 11 files
90307d4 verified
Raw
History Blame Contribute Delete
1.72 kB
import os
import numpy as np
from PIL import Image
from tqdm import tqdm
from sklearn.preprocessing import LabelEncoder
from transformers import CLIPProcessor, CLIPModel
import torch
from config import DEVICE
clip_model = CLIPModel.from_pretrained("openai/clip-vit-base-patch32").to(DEVICE)
clip_processor = CLIPProcessor.from_pretrained("openai/clip-vit-base-patch32")
def extract_features_from_folder(folder_path):
features, labels = [], []
for label in os.listdir(folder_path):
label_path = os.path.join(folder_path, label)
if not os.path.isdir(label_path): continue
for img_file in tqdm(os.listdir(label_path), desc=f"Processing {label}"):
img_path = os.path.join(label_path, img_file)
try:
image = Image.open(img_path).convert("RGB")
inputs = clip_processor(images=image, return_tensors="pt").to(DEVICE)
with torch.no_grad():
img_feat = clip_model.get_image_features(**inputs)
img_feat = img_feat / img_feat.norm(p=2, dim=-1, keepdim=True)
features.append(img_feat.cpu().numpy().squeeze())
labels.append(label)
except Exception as e:
print(f"Error reading {img_path}: {e}")
return np.array(features), labels
def prepare_dataset(train_dir, test_dir):
X_train, y_train = extract_features_from_folder(train_dir)
X_test, y_test = extract_features_from_folder(test_dir)
encoder = LabelEncoder()
y_train_enc = encoder.fit_transform(y_train)
y_test_enc = encoder.transform(y_test)
return X_train, y_train_enc, X_test, y_test_enc, encoder