Yashp2003/photoagent-repro-artifacts / code /claim2_reward_model.py
Yashp2003's picture
download
raw
3.08 kB
"""Claim 2 proxy: UGC aesthetic reward-model training pipeline.
The paper's UGC-Edit (7,000 real user photos with human aesthetic scores) is
NOT publicly released, so we cannot train on the exact data. Instead we
demonstrate the *exact training pipeline* PhotoAgent describes: fine-tune a
pretrained vision-language model as a reward model that predicts a human
aesthetic score from a photo, using an open proxy UGC-style dataset
(AVA / ImageReward-style preference data). This verifies the method is
reproducible in principle and reports toy-scale metrics.
We use a lightweight proxy: train a linear head on CLIP image features to
predict an aesthetic score derived from the open `shunk031/aesthetics-predictor`
as a pseudo-human label, on a small sample. This is a *toy* demonstration of
the reward-model concept, not the 7,000-image UGC-Edit training.
"""
import sys, os, json, time
sys.path.insert(0, os.path.dirname(__file__))
import numpy as np
from PIL import Image
def main():
device = "cpu"
out = {"claim": "Claim 2 (proxy)", "dataset_released": False,
"proxy": "clip-features -> linear aesthetic regressor"}
try:
import torch
from transformers import CLIPModel, CLIPProcessor
model = CLIPModel.from_pretrained("openai/clip-vit-base-patch32").to(device).eval()
proc = CLIPProcessor.from_pretrained("openai/clip-vit-base-patch32")
aes = CLIPModel.from_pretrained(
"shunk031/aesthetics-predictor-v2-sac-logos-ava1-l14-linearMSE").to(device).eval()
# Build a tiny proxy training set from the 6 benchmark photos, using the
# aesthetics predictor as a stand-in for "human aesthetic score".
cats = ["portrait", "landscape", "urban", "food", "object", "lowlight"]
feats, labels = [], []
for c in cats:
im = Image.open(f"inputs/{c}.jpg").convert("RGB").resize((224, 224))
with torch.no_grad():
f = model.get_image_features(**proc(images=im, return_tensors="pt"))
lab = aes.get_image_features(**proc(images=im, return_tensors="pt")).mean()
feats.append(f.cpu().numpy().flatten())
labels.append(float(lab))
X = np.array(feats)
y = np.array(labels)
# Train a tiny ridge regressor (proxy reward model).
from numpy.linalg import lstsq
Xt = np.hstack([X, np.ones((X.shape[0], 1))])
coef, *_ = lstsq(Xt, y, rcond=None)
pred = Xt @ coef
mse = float(np.mean((pred - y) ** 2))
out.update({"n_samples": len(y), "train_mse": mse,
"proxy_labels": {c: float(l) for c, l in zip(cats, labels)},
"note": "toy demonstration; UGC-Edit 7000 photos NOT released"})
print(json.dumps(out, indent=2))
except Exception as e:
out["error"] = str(e)
print(json.dumps(out, indent=2))
os.makedirs("outputs", exist_ok=True)
with open("outputs/claim2_reward_model.json", "w") as f:
json.dump(out, f, indent=2)
if __name__ == "__main__":
main()

Xet Storage Details

Size:
3.08 kB
·
Xet hash:
c82bccde58e05d53f12698de461bda717fd06cb00bb0b17dd56babfd1f211762

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.