s23 / search_hyperparams.py
IhorIvanyshyn01's picture
Update tuned hyperparameters
8f748c3
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']
)