s23-model / search_hyperparams.py
IhorIvanyshyn01's picture
Update tuned hyperparameters
8f748c3
Raw
History Blame Contribute Delete
3.17 kB
import io
import json
import numpy as np
import sys
import os
import re
import importlib
import random
from datasets import load_dataset
from hoho2025.metric_helper import hss
print("Loading dataset from Hugging Face streaming (usm3d/hoho22k_2026_trainval)...")
dataset = load_dataset('usm3d/hoho22k_2026_trainval', split='train', streaming=True, trust_remote_code=True)
# Fetch first 3 samples into memory to speed up search
samples = []
for idx, s in enumerate(dataset):
if idx >= 100:
break
samples.append(s)
def set_hyperparameters(eps, min_len, min_support, max_angle, max_dist, min_degree, min_view):
with open('script.py', 'r') as f:
content = f.read()
content = re.sub(r'VERTEX_MERGE_EPS = .+', f'VERTEX_MERGE_EPS = {eps}', content)
content = re.sub(r'EDGE_MIN_LENGTH = .+', f'EDGE_MIN_LENGTH = {min_len}', content)
content = re.sub(r'EDGE_MIN_SUPPORT_IMAGES = .+', f'EDGE_MIN_SUPPORT_IMAGES = {min_support}', content)
content = re.sub(r'EDGE_MAX_ANGLE_DEG = .+', f'EDGE_MAX_ANGLE_DEG = {max_angle}', content)
content = re.sub(r'VERTEX_MAX_COLMAP_DIST = .+', f'VERTEX_MAX_COLMAP_DIST = {max_dist}', content)
content = re.sub(r'VERTEX_MIN_EDGE_DEGREE = .+', f'VERTEX_MIN_EDGE_DEGREE = {min_degree}', content)
content = re.sub(r'VERTEX_MIN_VIEW_COUNT = .+', f'VERTEX_MIN_VIEW_COUNT = {min_view}', content)
with open('script.py', 'w') as f:
f.write(content)
import script
def evaluate():
importlib.reload(script)
scores = []
for sample in samples:
try:
pred_v, pred_e, _ = script.predict_wireframe_safely(sample)
except Exception:
pred_v, pred_e = np.zeros((2, 3)), [(0, 1)]
gt_v = sample.get('wf_vertices')
gt_e = sample.get('wf_edges')
res = hss(pred_v, pred_e, gt_v, gt_e)
scores.append(res.hss)
# Cache cleaning to prevent memory leaks over many trials
import gc
gc.collect()
return sum(scores) / len(scores) if scores else 0
best_score = -1.0
best_params = None
# Baseline is around 0.34
space = {
'eps': [0.1, 0.5, 1.0],
'min_len': [0.0, 0.2, 0.5],
'min_support': [1, 2],
'max_angle': [25.0, 45.0],
'max_dist': [2.0, 4.0],
'min_degree': [1, 2],
'min_view': [1, 2]
}
trials = 50
print(f"Running Random Search for {trials} trials...")
for i in range(trials):
p = {k: random.choice(v) for k, v in space.items()}
set_hyperparameters(
p['eps'], p['min_len'], p['min_support'],
p['max_angle'], p['max_dist'], p['min_degree'], p['min_view']
)
score = evaluate()
print(f"Trial {i+1} Score: {score:.4f} | Params: {p}")
if score > best_score:
best_score = score
best_params = p
print(f"\n--- BEST RESULT ---")
print(f"Best HSS Score: {best_score:.4f}")
print("Best Parameters:")
for k, v in best_params.items():
print(f" {k}: {v}")
# Restore best params to script.py
set_hyperparameters(
best_params['eps'], best_params['min_len'], best_params['min_support'],
best_params['max_angle'], best_params['max_dist'], best_params['min_degree'], best_params['min_view']
)