import os import cv2 import torch import random import numpy as np from torch import nn from torch.utils.data import Dataset,DataLoader import tqdm IMAGE_DIR="data/images" DEVICE="cuda" if torch.cuda.is_available() else "cpu" # ------------------------- # Feature extraction # ------------------------- HUE_BINS=16 def extract_features(path): img=cv2.imread(path) img=cv2.cvtColor( img, cv2.COLOR_BGR2HSV ) h=img[:,:,0] s=img[:,:,1]/255 v=img[:,:,2]/255 features=[] zones=[ ("shadow",v<0.3), ("mid", (v>=0.3)&(v<0.7)), ("highlight",v>=0.7) ] for _,mask in zones: total=np.sum(mask)+1 for i in range(HUE_BINS): hue_start=i*180/HUE_BINS hue_end=(i+1)*180/HUE_BINS hm=( (h>=hue_start) & (h0: features.extend([ pixels/total, np.mean(s[hm]), np.mean(v[hm]) ]) else: features.extend([ 0, 0, 0 ]) # global features features.extend([ np.mean(s), np.mean(v), np.std(v) ]) return np.array( features, dtype=np.float32 ) # ------------------------- # Dataset # ------------------------- class ColorDataset(Dataset): def __init__(self): self.files=[ os.path.join( IMAGE_DIR,x ) for x in os.listdir(IMAGE_DIR) ] def __len__(self): return len(self.files) def __getitem__(self,i): return torch.tensor( extract_features( self.files[i] ) ) # ------------------------- # Masking # ------------------------- def random_mask(x,ratio=0.3): mask=torch.rand_like(x)