Commit a2a2a22d authored by Andrey Filippov's avatar Andrey Filippov

CLAUDE: v2 Stage-2 Hough-vote wiring + curt_c5_en flag + ORT log fix

- CuasStage2Infer: ONNX runner for the learned Stage-2 vote-refine (full-field conv).
- CuasDetectRT: voteScatter (s^2-weighted bilinear splat at tail T=P-V*(N-1)) + reg-branch
  wiring -> saves -VOTE heatmap + -REFINED detection when curt_stage2_model is set;
  curt_c5_en gates the heavy C5P convolve (DNN-only fast path).
- IntersceneMatchParameters: curt_c5_en + curt_stage2_model params (all 6 sites each).
- CuasDnnInfer: setSessionLogLevel(ERROR) to suppress benign ORT VerifyOutputSizes warnings.
Co-Authored-By: 's avatarClaude Opus 4.8 (1M context) <noreply@anthropic.com>
parent 2f169094
...@@ -276,6 +276,29 @@ public class CuasDetectRT { ...@@ -276,6 +276,29 @@ public class CuasDetectRT {
/** Level selector for the heavy per-level paths (3d3/conv5d, C5P-direct, DNN): // By Claude on 06/13/2026 /** Level selector for the heavy per-level paths (3d3/conv5d, C5P-direct, DNN): // By Claude on 06/13/2026
* empty/null curt_c5_levels = all built levels, otherwise only the listed ones. */ * empty/null curt_c5_levels = all built levels, otherwise only the listed ones. */
/** v2 Stage-2 vote scatter: each ROI pixel splats an s^2-weighted bilinear vote at the tail
* T = P - V*(N-1) (the invariant convergence point - all of a target's alias-ramp pixels land there).
* S,Vx,Vy: [rw*rh] row-major. Returns [accS, accVx, accVy] (row-major). By Claude on 06/18/2026 */
static double[][] voteScatter(double[] S, double[] Vx, double[] Vy, int rw, int rh, int Nm1) {
int npix = rw * rh;
double[] accS = new double[npix], accVx = new double[npix], accVy = new double[npix];
for (int p = 0; p < npix; p++) {
double s = S[p]; if (!(s > 0)) continue;
double w = s * s; // s^2: suppress the many weak-s (noise) votes
double tx = (p % rw) - Vx[p] * Nm1, ty = (p / rw) - Vy[p] * Nm1;
int x0 = (int) Math.floor(tx), y0 = (int) Math.floor(ty);
double fx = tx - x0, fy = ty - y0;
for (int dx = 0; dx < 2; dx++) for (int dy = 0; dy < 2; dy++) {
int xi = x0 + dx, yi = y0 + dy;
if (xi < 0 || xi >= rw || yi < 0 || yi >= rh) continue;
double bw = w * (dx == 0 ? 1 - fx : fx) * (dy == 0 ? 1 - fy : fy);
int idx = yi * rw + xi;
accS[idx] += bw; accVx[idx] += bw * Vx[p]; accVy[idx] += bw * Vy[p];
}
}
return new double[][] { accS, accVx, accVy };
}
private static boolean c5LevelSelected(int [] c5_levels, int nlev) { // By Claude on 06/13/2026 private static boolean c5LevelSelected(int [] c5_levels, int nlev) { // By Claude on 06/13/2026
if ((c5_levels == null) || (c5_levels.length == 0)) return true; if ((c5_levels == null) || (c5_levels.length == 0)) return true;
for (int l : c5_levels) if (l == nlev) return true; for (int l : c5_levels) if (l == nlev) return true;
...@@ -1095,7 +1118,7 @@ public class CuasDetectRT { ...@@ -1095,7 +1118,7 @@ public class CuasDetectRT {
double [] op_log_prior = cuasRTUtils.getVelLogPrior( // shared by gate + sweep // By Claude on 06/13/2026 double [] op_log_prior = cuasRTUtils.getVelLogPrior( // shared by gate + sweep // By Claude on 06/13/2026
clt_parameters.imp.curt_c5_prior_r0, clt_parameters.imp.curt_c5_prior_r1); // By Claude on 06/13/2026 clt_parameters.imp.curt_c5_prior_r0, clt_parameters.imp.curt_c5_prior_r1); // By Claude on 06/13/2026
for (int nlev = 0; nlev < pyramid_levels; nlev++) { // By Claude on 06/11/2026 for (int nlev = 0; nlev < pyramid_levels; nlev++) { // By Claude on 06/11/2026
if (!c5LevelSelected(c5_levels, nlev)) continue; // skip non-selected levels (speed) // By Claude on 06/13/2026 if (!clt_parameters.imp.curt_c5_en || !c5LevelSelected(c5_levels, nlev)) continue; // curt_c5_en=false skips the heavy C5P convolve+posterior entirely (DNN-only fast path) // By Claude on 06/17/2026
double [][] frames = dpixels_pyramid[nlev]; // By Claude on 06/11/2026 double [][] frames = dpixels_pyramid[nlev]; // By Claude on 06/11/2026
if (frames == null) continue; // By Claude on 06/11/2026 if (frames == null) continue; // By Claude on 06/11/2026
int num_5dp = Math.max(0, frames.length - num_hist_p + 1); // By Claude on 06/11/2026 int num_5dp = Math.max(0, frames.length - num_hist_p + 1); // By Claude on 06/11/2026
...@@ -1278,7 +1301,27 @@ public class CuasDetectRT { ...@@ -1278,7 +1301,27 @@ public class CuasDetectRT {
svxys, curt_save_select.width, title_reg+"-VXYS", ts_reg, new String[]{"S","Vx","Vy","sigma"}, false), clt_parameters.imp), getModelDirectory()); svxys, curt_save_select.width, title_reg+"-VXYS", ts_reg, new String[]{"S","Vx","Vy","sigma"}, false), clt_parameters.imp), getModelDirectory());
QuadCLTCPU.saveImagePlusInDirectory(tagCuasImp(ShowDoubleFloatArrays.showArraysHyperstack( QuadCLTCPU.saveImagePlusInDirectory(tagCuasImp(ShowDoubleFloatArrays.showArraysHyperstack(
soffr, curt_save_select.width, title_reg+"-OFFSET", ts_reg, new String[]{"dx","dy","s"}, false), clt_parameters.imp), getModelDirectory()); soffr, curt_save_select.width, title_reg+"-OFFSET", ts_reg, new String[]{"dx","dy","s"}, false), clt_parameters.imp), getModelDirectory());
continue; // reg level done - skip the grid path below if (!clt_parameters.imp.curt_stage2_model.isEmpty()) { // v2 Stage-2: vote + learned refine views // By Claude on 06/18/2026
int rw2 = curt_save_select.width, rh2 = curt_save_select.height, Nm1v = N_dnn - 1;
double [][][] votem = new double [1][num][rnpr]; // vote heatmap (accS)
double [][][] refd = new double [3][num][rnpr]; // refined {S,Vx,Vy}
try {
CuasStage2Infer s2 = new CuasStage2Infer(clt_parameters.imp.curt_stage2_model);
for (int j = 0; j < num; j++) {
double [][] acc = voteScatter(svxys[0][j], svxys[1][j], svxys[2][j], rw2, rh2, Nm1v);
votem[0][j] = acc[0];
double [][] r = s2.refine(acc, rw2, rh2);
refd[0][j] = r[0]; refd[1][j] = r[1]; refd[2][j] = r[2];
}
s2.close();
QuadCLTCPU.saveImagePlusInDirectory(tagCuasImp(ShowDoubleFloatArrays.showArraysHyperstack(
votem, rw2, title_reg+"-VOTE", ts_reg, new String[]{"vote"}, false), clt_parameters.imp), getModelDirectory());
QuadCLTCPU.saveImagePlusInDirectory(tagCuasImp(ShowDoubleFloatArrays.showArraysHyperstack(
refd, rw2, title_reg+"-REFINED", ts_reg, new String[]{"S","Vx","Vy"}, false), clt_parameters.imp), getModelDirectory());
System.out.println(now()+" v2 Stage-2: saved -VOTE + -REFINED ("+num+" scenes)");
} catch (Exception e) { System.out.println("v2 Stage-2 failed: "+e); }
}
continue; // reg level done - skip the grid path below
} }
double [][][][] dnn_roi = new double [num][][][]; // By Claude on 06/13/2026 double [][][][] dnn_roi = new double [num][][][]; // By Claude on 06/13/2026
double [][][] dnn_off = new double [num][][]; // per scene: [roi_pix][{dx,dy,s}] - sub-pixel offset viz // By Claude on 06/14/2026 double [][][] dnn_off = new double [num][][]; // per scene: [roi_pix][{dx,dy,s}] - sub-pixel offset viz // By Claude on 06/14/2026
......
...@@ -38,6 +38,9 @@ public class CuasDnnInfer implements AutoCloseable { ...@@ -38,6 +38,9 @@ public class CuasDnnInfer implements AutoCloseable {
String local = resolveModel(modelSpec); String local = resolveModel(modelSpec);
this.env = OrtEnvironment.getEnvironment(); this.env = OrtEnvironment.getEnvironment();
OrtSession.SessionOptions opts = new OrtSession.SessionOptions(); OrtSession.SessionOptions opts = new OrtSession.SessionOptions();
// Only log errors (not warnings): suppresses the benign dynamic-batch VerifyOutputSizes W-spam
// (reg head's cat pins the graph's declared batch to 1) that was yellow-on-white in Eclipse. By Claude on 06/17/2026
try { opts.setSessionLogLevel(ai.onnxruntime.OrtLoggingLevel.ORT_LOGGING_LEVEL_ERROR); } catch (Exception e) {}
// CPU EP by default. GPU later: opts.addCUDA(deviceId) once cuDNN 9 is present. // CPU EP by default. GPU later: opts.addCUDA(deviceId) once cuDNN 9 is present.
this.session = env.createSession(local, opts); this.session = env.createSession(local, opts);
this.inputName = session.getInputNames().iterator().next(); // "frames" this.inputName = session.getInputNames().iterator().next(); // "frames"
......
package com.elphel.imagej.cuas.rt;
import java.nio.FloatBuffer;
import java.util.Collections;
import ai.onnxruntime.OnnxTensor;
import ai.onnxruntime.OrtEnvironment;
import ai.onnxruntime.OrtSession;
/**
* C5P DNN v2 Stage-2 (Hough-vote refine) ONNX runner. By Claude on 06/18/2026
* Loads the learned refine net (3-channel vote accumulator [accS, accVx, accVy] -> det logit + Vx,Vy consensus)
* and runs it over a whole ROI-sized accumulator in one pass (full-field conv, NOT patch-based like CuasDnnInfer).
* The vote scatter itself is done in Java (CuasDetectRT.voteScatter); this only runs the conv refine.
*/
public class CuasStage2Infer {
private final OrtEnvironment env;
private final OrtSession session;
private final String inputName;
public CuasStage2Infer(String model) throws Exception {
env = OrtEnvironment.getEnvironment();
OrtSession.SessionOptions opts = new OrtSession.SessionOptions();
try { opts.setSessionLogLevel(ai.onnxruntime.OrtLoggingLevel.ORT_LOGGING_LEVEL_ERROR); } catch (Exception e) {}
session = env.createSession(model, opts);
inputName = session.getInputNames().iterator().next();
System.out.println("CuasStage2Infer: loaded " + model + " input=" + inputName);
}
/** acc = [3][w*h] (accS, accVx, accVy), row-major. Returns [3][w*h]: {sigmoid(det), Vx, Vy} refined. */
public double[][] refine(double[][] acc, int w, int h) throws Exception {
final int npix = w * h;
FloatBuffer fb = FloatBuffer.allocate(3 * npix);
for (int c = 0; c < 3; c++) for (int i = 0; i < npix; i++) fb.put((float) acc[c][i]);
fb.rewind();
double[][] out = new double[3][npix];
try (OnnxTensor in = OnnxTensor.createTensor(env, fb, new long[] {1, 3, h, w});
OrtSession.Result res = session.run(Collections.singletonMap(inputName, in))) {
float[][][][] o = (float[][][][]) res.get(0).getValue(); // [1,3,h,w]
for (int y = 0; y < h; y++) for (int x = 0; x < w; x++) {
int i = y * w + x;
out[0][i] = 1.0 / (1.0 + Math.exp(-o[0][0][y][x])); // det -> sigmoid
out[1][i] = o[0][1][y][x]; // Vx consensus
out[2][i] = o[0][2][y][x]; // Vy consensus
}
}
return out;
}
public void close() { try { if (session != null) session.close(); } catch (Exception e) {} }
}
...@@ -1164,6 +1164,7 @@ min_str_neib_fpn 0.35 ...@@ -1164,6 +1164,7 @@ min_str_neib_fpn 0.35
public double curt_recur_rs_min = 1.0; // re-sharpen minimal blob maximum to re-fit; weaker content passes through as residue // By Claude on 06/10/2026 public double curt_recur_rs_min = 1.0; // re-sharpen minimal blob maximum to re-fit; weaker content passes through as residue // By Claude on 06/10/2026
public boolean curt_c5_from_pix = true; // also compute fine velocities directly from LoG+LReLU pixels (bypass 3x3 coarse stage), parallel -C5P outputs per level // By Claude on 06/11/2026 public boolean curt_c5_from_pix = true; // also compute fine velocities directly from LoG+LReLU pixels (bypass 3x3 coarse stage), parallel -C5P outputs per level // By Claude on 06/11/2026
public boolean curt_c5_matched = true; // direct/C5P kernel: true = matched-filter half-cosine bump (-C5PMK), false = trapezoid optical-analogy (-C5PTK) // By Claude on 06/12/2026 public boolean curt_c5_matched = true; // direct/C5P kernel: true = matched-filter half-cosine bump (-C5PMK), false = trapezoid optical-analogy (-C5PTK) // By Claude on 06/12/2026
public boolean curt_c5_en = true; // run the heavy C5P matched-kernel path (convolve3dDirect + posterior -> C5PMK-RECT/HYPER); false = DNN-only fast path: skip the slow convolve (the DNN front-end does not use it). NB also skips the posterior/recurrent feed. By Claude on 06/17/2026
public boolean curt_c5_post = true; // C5P Bayes posterior visualization: score z^2/2+ln(prior), softmax competition (-POST), per-pixel marginal (-PMARG), swept over curt_c5_lambdas // By Claude on 06/12/2026 public boolean curt_c5_post = true; // C5P Bayes posterior visualization: score z^2/2+ln(prior), softmax competition (-POST), per-pixel marginal (-PMARG), swept over curt_c5_lambdas // By Claude on 06/12/2026
public double[] curt_c5_lambdas = {0.1, 0.2, 0.5, 1.0, 2.0, 5.0}; // assumed input-noise sigmas for the posterior sweep ("fat zero": small=sharp+noisy, large=blur to prior); empty - disable // By Claude on 06/12/2026 public double[] curt_c5_lambdas = {0.1, 0.2, 0.5, 1.0, 2.0, 5.0}; // assumed input-noise sigmas for the posterior sweep ("fat zero": small=sharp+noisy, large=blur to prior); empty - disable // By Claude on 06/12/2026
public double curt_c5_null_z = 4.0; // null-hypothesis floor in sigmas: a detection must beat a null_z-sigma noise fluctuation (Lambda0 = exp(null_z^2/2)) // By Claude on 06/12/2026 public double curt_c5_null_z = 4.0; // null-hypothesis floor in sigmas: a detection must beat a null_z-sigma noise fluctuation (Lambda0 = exp(null_z^2/2)) // By Claude on 06/12/2026
...@@ -1179,6 +1180,7 @@ min_str_neib_fpn 0.35 ...@@ -1179,6 +1180,7 @@ min_str_neib_fpn 0.35
public double curt_c5_white_sp = 0.5; // whitening spatial strength a (3-tap unsharp (1+2a,-a,-a) in x and y); 0 - no spatial sharpening // By Claude on 06/13/2026 public double curt_c5_white_sp = 0.5; // whitening spatial strength a (3-tap unsharp (1+2a,-a,-a) in x and y); 0 - no spatial sharpening // By Claude on 06/13/2026
public double curt_c5_white_vel = 0.0; // whitening velocity strength a (3-tap unsharp in vx and vy); 0 - no velocity sharpening // By Claude on 06/13/2026 public double curt_c5_white_vel = 0.0; // whitening velocity strength a (3-tap unsharp in vx and vy); 0 - no velocity sharpening // By Claude on 06/13/2026
public String curt_dnn_model = ""; // C5P DNN front-end model (ONNX): empty = disabled; local path, scp user@host:path, or http(s) URL fetched to cache; overrides bundled resource (mirrors tile_processor_gpu) // By Claude on 06/13/2026 public String curt_dnn_model = ""; // C5P DNN front-end model (ONNX): empty = disabled; local path, scp user@host:path, or http(s) URL fetched to cache; overrides bundled resource (mirrors tile_processor_gpu) // By Claude on 06/13/2026
public String curt_stage2_model = ""; // C5P DNN v2 Stage-2 (learned Hough-vote refine) ONNX: empty = Stage-1 reg field only; when set + a reg Stage-1 model, the reg branch votes (tail T=P-V*(N-1), s^2-weighted) + refines -> saves -VOTE heatmap + -REFINED detection views. By Claude on 06/18/2026
public double curt_dnn_thresh = 0.0; // DNN display threshold: zero the (Vx,Vy,s) field where detection s < this (0 - show all); cosmetic FP-suppression - real-clutter FPs need a retrain with real-bg negatives, not a threshold // By Claude on 06/13/2026 public double curt_dnn_thresh = 0.0; // DNN display threshold: zero the (Vx,Vy,s) field where detection s < this (0 - show all); cosmetic FP-suppression - real-clutter FPs need a retrain with real-bg negatives, not a threshold // By Claude on 06/13/2026
public int curt_dnn_stride = 1; // DNN temporal output stride (per pyramid-level slice): 1 = every step (testing, watch each temporal unit); 4 = production (50% overlap, matches the convolver's integer-pixel-shift cadence = curt_recur_period) // By Claude on 06/14/2026 public int curt_dnn_stride = 1; // DNN temporal output stride (per pyramid-level slice): 1 = every step (testing, watch each temporal unit); 4 = production (50% overlap, matches the convolver's integer-pixel-shift cadence = curt_recur_period) // By Claude on 06/14/2026
public double curt_dnn_vmax = 1.4; // "ghostbuster": trained DNN velocity limit (px/frame); zero velocity-grid cells beyond this radius (cell-R > vmax*vel_decimate) and discard pixels whose peak lands there (s=0) - the untrained corner cells emit spurious sidelobes that would confuse the recurrent. Set to match the loaded model's training vmax_px (PM models=1.4, base=1.0); <=0 disables // By Claude on 06/15/2026 public double curt_dnn_vmax = 1.4; // "ghostbuster": trained DNN velocity limit (px/frame); zero velocity-grid cells beyond this radius (cell-R > vmax*vel_decimate) and discard pixels whose peak lands there (s=0) - the untrained corner cells emit spurious sidelobes that would confuse the recurrent. Set to match the loaded model's training vmax_px (PM models=1.4, base=1.0); <=0 disables // By Claude on 06/15/2026
...@@ -3500,6 +3502,8 @@ min_str_neib_fpn 0.35 ...@@ -3500,6 +3502,8 @@ min_str_neib_fpn 0.35
"Also compute fine velocities directly from LoG+LReLU pixels, bypassing the 3x3 coarse-velocity stage (single-stage velocity-matched filter, better at low SNR). Parallel -C5P outputs per pyramid level for comparison."); // By Claude on 06/11/2026 "Also compute fine velocities directly from LoG+LReLU pixels, bypassing the 3x3 coarse-velocity stage (single-stage velocity-matched filter, better at low SNR). Parallel -C5P outputs per pyramid level for comparison."); // By Claude on 06/11/2026
gd.addCheckbox ("Matched-filter direct kernel", this.curt_c5_matched, // By Claude on 06/12/2026 gd.addCheckbox ("Matched-filter direct kernel", this.curt_c5_matched, // By Claude on 06/12/2026
"Direct/C5P kernel shape: checked = matched-filter (canonical half-cosine bump swept along velocity, -C5PMK); unchecked = trapezoid optical-analogy kernel (-C5PTK)."); // By Claude on 06/12/2026 "Direct/C5P kernel shape: checked = matched-filter (canonical half-cosine bump swept along velocity, -C5PMK); unchecked = trapezoid optical-analogy kernel (-C5PTK)."); // By Claude on 06/12/2026
gd.addCheckbox ("Compute C5P matched-kernel path", this.curt_c5_en, // By Claude on 06/17/2026
"Run the heavy convolve3dDirect + posterior (C5PMK-RECT/HYPER). Uncheck for DNN-only test runs to skip it - the DNN front-end does not use it and it is the slow part."); // By Claude on 06/17/2026
gd.addCheckbox ("C5P Bayes posterior sweep", this.curt_c5_post, // By Claude on 06/12/2026 gd.addCheckbox ("C5P Bayes posterior sweep", this.curt_c5_post, // By Claude on 06/12/2026
"Visualize the single-segment Bayes posterior at intermediate stages, swept over the lambda list: -SCORE (z^2/2 + ln prior, RECT), -POST (softmax competition over the 4D NMS window + null hypothesis, RECT), -PMARG (per-pixel marginal sum over velocities)."); // By Claude on 06/12/2026 "Visualize the single-segment Bayes posterior at intermediate stages, swept over the lambda list: -SCORE (z^2/2 + ln prior, RECT), -POST (softmax competition over the 4D NMS window + null hypothesis, RECT), -PMARG (per-pixel marginal sum over velocities)."); // By Claude on 06/12/2026
gd.addStringField ("Posterior sweep lambdas", IntersceneMatchParameters.doublesToString(curt_c5_lambdas), 80, // By Claude on 06/12/2026 gd.addStringField ("Posterior sweep lambdas", IntersceneMatchParameters.doublesToString(curt_c5_lambdas), 80, // By Claude on 06/12/2026
...@@ -3530,6 +3534,8 @@ min_str_neib_fpn 0.35 ...@@ -3530,6 +3534,8 @@ min_str_neib_fpn 0.35
"Velocity unsharp strength a: same 3-tap in vx and vy within each pixel's velocity grid. Sharpens the velocity-cell spread. 0 - off (start spatial-only)."); // By Claude on 06/13/2026 "Velocity unsharp strength a: same 3-tap in vx and vy within each pixel's velocity grid. Sharpens the velocity-cell spread. 0 - off (start spatial-only)."); // By Claude on 06/13/2026
gd.addStringField ("C5P DNN model (ONNX)", this.curt_dnn_model, 60, // By Claude on 06/13/2026 gd.addStringField ("C5P DNN model (ONNX)", this.curt_dnn_model, 60, // By Claude on 06/13/2026
"Trained DNN front-end model location. Empty = disabled (use matched-filter/posterior path). Local path, scp user@host:/path (fetched to cache), or http(s) URL. Overrides any bundled resource - same default-vs-override scheme as the GPU kernel sources."); // By Claude on 06/13/2026 "Trained DNN front-end model location. Empty = disabled (use matched-filter/posterior path). Local path, scp user@host:/path (fetched to cache), or http(s) URL. Overrides any bundled resource - same default-vs-override scheme as the GPU kernel sources."); // By Claude on 06/13/2026
gd.addStringField ("C5P Stage-2 vote-refine (ONNX)", this.curt_stage2_model, 60, // By Claude on 06/18/2026
"v2 Stage-2 learned Hough-vote refine model. Empty = Stage-1 reg field only. When set (with a reg Stage-1 model) the reg branch adds the vote heatmap (-VOTE) and refined detection (-REFINED) views.");
gd.addNumericField("DNN confidence threshold", this.curt_dnn_thresh, 6,8,"", // By Claude on 06/13/2026 gd.addNumericField("DNN confidence threshold", this.curt_dnn_thresh, 6,8,"", // By Claude on 06/13/2026
"Zero the DNN (Vx,Vy,s) field where detection confidence s < this (0 = show all). Display/FP-suppression only - real-clutter false positives need a retrain with real-background negatives, not a threshold."); // By Claude on 06/13/2026 "Zero the DNN (Vx,Vy,s) field where detection confidence s < this (0 = show all). Display/FP-suppression only - real-clutter false positives need a retrain with real-background negatives, not a threshold."); // By Claude on 06/13/2026
gd.addCheckbox ("DNN recurrent feed: offset-splat", this.curt_dnn_recur_splat, // By Claude on 06/14/2026 gd.addCheckbox ("DNN recurrent feed: offset-splat", this.curt_dnn_recur_splat, // By Claude on 06/14/2026
...@@ -5077,6 +5083,7 @@ min_str_neib_fpn 0.35 ...@@ -5077,6 +5083,7 @@ min_str_neib_fpn 0.35
this.curt_recur_rs_min = gd.getNextNumber(); // By Claude on 06/10/2026 this.curt_recur_rs_min = gd.getNextNumber(); // By Claude on 06/10/2026
this.curt_c5_from_pix = gd.getNextBoolean(); // By Claude on 06/11/2026 this.curt_c5_from_pix = gd.getNextBoolean(); // By Claude on 06/11/2026
this.curt_c5_matched = gd.getNextBoolean(); // By Claude on 06/12/2026 this.curt_c5_matched = gd.getNextBoolean(); // By Claude on 06/12/2026
this.curt_c5_en = gd.getNextBoolean(); // By Claude on 06/17/2026
this.curt_c5_post = gd.getNextBoolean(); // By Claude on 06/12/2026 this.curt_c5_post = gd.getNextBoolean(); // By Claude on 06/12/2026
this.curt_c5_lambdas = IntersceneMatchParameters.StringToDoubles(gd.getNextString(), 0); // By Claude on 06/12/2026 this.curt_c5_lambdas = IntersceneMatchParameters.StringToDoubles(gd.getNextString(), 0); // By Claude on 06/12/2026
this.curt_c5_null_z = gd.getNextNumber(); // By Claude on 06/12/2026 this.curt_c5_null_z = gd.getNextNumber(); // By Claude on 06/12/2026
...@@ -5092,6 +5099,7 @@ min_str_neib_fpn 0.35 ...@@ -5092,6 +5099,7 @@ min_str_neib_fpn 0.35
this.curt_c5_white_sp = gd.getNextNumber(); // By Claude on 06/13/2026 this.curt_c5_white_sp = gd.getNextNumber(); // By Claude on 06/13/2026
this.curt_c5_white_vel = gd.getNextNumber(); // By Claude on 06/13/2026 this.curt_c5_white_vel = gd.getNextNumber(); // By Claude on 06/13/2026
this.curt_dnn_model = gd.getNextString().trim(); // By Claude on 06/13/2026 this.curt_dnn_model = gd.getNextString().trim(); // By Claude on 06/13/2026
this.curt_stage2_model = gd.getNextString().trim(); // By Claude on 06/18/2026
this.curt_dnn_thresh = gd.getNextNumber(); // By Claude on 06/13/2026 this.curt_dnn_thresh = gd.getNextNumber(); // By Claude on 06/13/2026
this.curt_dnn_recur_splat = gd.getNextBoolean(); // By Claude on 06/14/2026 this.curt_dnn_recur_splat = gd.getNextBoolean(); // By Claude on 06/14/2026
this.curt_dnn_recur_scale = gd.getNextNumber(); // By Claude on 06/14/2026 this.curt_dnn_recur_scale = gd.getNextNumber(); // By Claude on 06/14/2026
...@@ -6451,6 +6459,7 @@ min_str_neib_fpn 0.35 ...@@ -6451,6 +6459,7 @@ min_str_neib_fpn 0.35
properties.setProperty(prefix+"curt_recur_rs_min", this.curt_recur_rs_min+""); // double // By Claude on 06/10/2026 properties.setProperty(prefix+"curt_recur_rs_min", this.curt_recur_rs_min+""); // double // By Claude on 06/10/2026
properties.setProperty(prefix+"curt_c5_from_pix", this.curt_c5_from_pix+""); // boolean // By Claude on 06/11/2026 properties.setProperty(prefix+"curt_c5_from_pix", this.curt_c5_from_pix+""); // boolean // By Claude on 06/11/2026
properties.setProperty(prefix+"curt_c5_matched", this.curt_c5_matched+""); // boolean // By Claude on 06/12/2026 properties.setProperty(prefix+"curt_c5_matched", this.curt_c5_matched+""); // boolean // By Claude on 06/12/2026
properties.setProperty(prefix+"curt_c5_en", this.curt_c5_en+""); // boolean // By Claude on 06/17/2026
properties.setProperty(prefix+"curt_c5_post", this.curt_c5_post+""); // boolean // By Claude on 06/12/2026 properties.setProperty(prefix+"curt_c5_post", this.curt_c5_post+""); // boolean // By Claude on 06/12/2026
properties.setProperty(prefix+"curt_c5_lambdas", IntersceneMatchParameters.doublesToString(this.curt_c5_lambdas)); // By Claude on 06/12/2026 properties.setProperty(prefix+"curt_c5_lambdas", IntersceneMatchParameters.doublesToString(this.curt_c5_lambdas)); // By Claude on 06/12/2026
properties.setProperty(prefix+"curt_c5_null_z", this.curt_c5_null_z+""); // double // By Claude on 06/12/2026 properties.setProperty(prefix+"curt_c5_null_z", this.curt_c5_null_z+""); // double // By Claude on 06/12/2026
...@@ -6466,6 +6475,7 @@ min_str_neib_fpn 0.35 ...@@ -6466,6 +6475,7 @@ min_str_neib_fpn 0.35
properties.setProperty(prefix+"curt_c5_white_sp", this.curt_c5_white_sp+""); // double // By Claude on 06/13/2026 properties.setProperty(prefix+"curt_c5_white_sp", this.curt_c5_white_sp+""); // double // By Claude on 06/13/2026
properties.setProperty(prefix+"curt_c5_white_vel", this.curt_c5_white_vel+""); // double // By Claude on 06/13/2026 properties.setProperty(prefix+"curt_c5_white_vel", this.curt_c5_white_vel+""); // double // By Claude on 06/13/2026
properties.setProperty(prefix+"curt_dnn_model", this.curt_dnn_model); // String // By Claude on 06/13/2026 properties.setProperty(prefix+"curt_dnn_model", this.curt_dnn_model); // String // By Claude on 06/13/2026
properties.setProperty(prefix+"curt_stage2_model", this.curt_stage2_model); // String // By Claude on 06/18/2026
properties.setProperty(prefix+"curt_dnn_thresh", this.curt_dnn_thresh+""); // double // By Claude on 06/13/2026 properties.setProperty(prefix+"curt_dnn_thresh", this.curt_dnn_thresh+""); // double // By Claude on 06/13/2026
properties.setProperty(prefix+"curt_dnn_recur_splat", this.curt_dnn_recur_splat+""); // boolean // By Claude on 06/14/2026 properties.setProperty(prefix+"curt_dnn_recur_splat", this.curt_dnn_recur_splat+""); // boolean // By Claude on 06/14/2026
properties.setProperty(prefix+"curt_dnn_recur_scale", this.curt_dnn_recur_scale+""); // double // By Claude on 06/14/2026 properties.setProperty(prefix+"curt_dnn_recur_scale", this.curt_dnn_recur_scale+""); // double // By Claude on 06/14/2026
...@@ -6860,6 +6870,7 @@ min_str_neib_fpn 0.35 ...@@ -6860,6 +6870,7 @@ min_str_neib_fpn 0.35
if (properties.getProperty(prefix+"curt_c5_from_pix")!=null) this.curt_c5_from_pix=Boolean.parseBoolean(properties.getProperty(prefix+"curt_c5_from_pix")); // By Claude on 06/11/2026 if (properties.getProperty(prefix+"curt_c5_from_pix")!=null) this.curt_c5_from_pix=Boolean.parseBoolean(properties.getProperty(prefix+"curt_c5_from_pix")); // By Claude on 06/11/2026
if (properties.getProperty(prefix+"curt_c5_matched")!=null) this.curt_c5_matched=Boolean.parseBoolean(properties.getProperty(prefix+"curt_c5_matched")); // By Claude on 06/12/2026 if (properties.getProperty(prefix+"curt_c5_matched")!=null) this.curt_c5_matched=Boolean.parseBoolean(properties.getProperty(prefix+"curt_c5_matched")); // By Claude on 06/12/2026
if (properties.getProperty(prefix+"curt_c5_en")!=null) this.curt_c5_en=Boolean.parseBoolean(properties.getProperty(prefix+"curt_c5_en")); // By Claude on 06/17/2026
if (properties.getProperty(prefix+"curt_c5_post")!=null) this.curt_c5_post=Boolean.parseBoolean(properties.getProperty(prefix+"curt_c5_post")); // By Claude on 06/12/2026 if (properties.getProperty(prefix+"curt_c5_post")!=null) this.curt_c5_post=Boolean.parseBoolean(properties.getProperty(prefix+"curt_c5_post")); // By Claude on 06/12/2026
if (properties.getProperty(prefix+"curt_c5_lambdas")!=null) this.curt_c5_lambdas= IntersceneMatchParameters.StringToDoubles(properties.getProperty(prefix+"curt_c5_lambdas"),0); // By Claude on 06/12/2026 if (properties.getProperty(prefix+"curt_c5_lambdas")!=null) this.curt_c5_lambdas= IntersceneMatchParameters.StringToDoubles(properties.getProperty(prefix+"curt_c5_lambdas"),0); // By Claude on 06/12/2026
if (properties.getProperty(prefix+"curt_c5_null_z")!=null) this.curt_c5_null_z=Double.parseDouble(properties.getProperty(prefix+"curt_c5_null_z")); // By Claude on 06/12/2026 if (properties.getProperty(prefix+"curt_c5_null_z")!=null) this.curt_c5_null_z=Double.parseDouble(properties.getProperty(prefix+"curt_c5_null_z")); // By Claude on 06/12/2026
...@@ -6875,6 +6886,7 @@ min_str_neib_fpn 0.35 ...@@ -6875,6 +6886,7 @@ min_str_neib_fpn 0.35
if (properties.getProperty(prefix+"curt_c5_white_sp")!=null) this.curt_c5_white_sp=Double.parseDouble(properties.getProperty(prefix+"curt_c5_white_sp")); // By Claude on 06/13/2026 if (properties.getProperty(prefix+"curt_c5_white_sp")!=null) this.curt_c5_white_sp=Double.parseDouble(properties.getProperty(prefix+"curt_c5_white_sp")); // By Claude on 06/13/2026
if (properties.getProperty(prefix+"curt_c5_white_vel")!=null) this.curt_c5_white_vel=Double.parseDouble(properties.getProperty(prefix+"curt_c5_white_vel")); // By Claude on 06/13/2026 if (properties.getProperty(prefix+"curt_c5_white_vel")!=null) this.curt_c5_white_vel=Double.parseDouble(properties.getProperty(prefix+"curt_c5_white_vel")); // By Claude on 06/13/2026
if (properties.getProperty(prefix+"curt_dnn_model")!=null) this.curt_dnn_model=(String) properties.getProperty(prefix+"curt_dnn_model"); // By Claude on 06/13/2026 if (properties.getProperty(prefix+"curt_dnn_model")!=null) this.curt_dnn_model=(String) properties.getProperty(prefix+"curt_dnn_model"); // By Claude on 06/13/2026
if (properties.getProperty(prefix+"curt_stage2_model")!=null) this.curt_stage2_model=(String) properties.getProperty(prefix+"curt_stage2_model"); // By Claude on 06/18/2026
if (properties.getProperty(prefix+"curt_dnn_thresh")!=null) this.curt_dnn_thresh=Double.parseDouble(properties.getProperty(prefix+"curt_dnn_thresh")); // By Claude on 06/13/2026 if (properties.getProperty(prefix+"curt_dnn_thresh")!=null) this.curt_dnn_thresh=Double.parseDouble(properties.getProperty(prefix+"curt_dnn_thresh")); // By Claude on 06/13/2026
if (properties.getProperty(prefix+"curt_dnn_recur_splat")!=null) this.curt_dnn_recur_splat=Boolean.parseBoolean(properties.getProperty(prefix+"curt_dnn_recur_splat")); // By Claude on 06/14/2026 if (properties.getProperty(prefix+"curt_dnn_recur_splat")!=null) this.curt_dnn_recur_splat=Boolean.parseBoolean(properties.getProperty(prefix+"curt_dnn_recur_splat")); // By Claude on 06/14/2026
if (properties.getProperty(prefix+"curt_dnn_recur_scale")!=null) this.curt_dnn_recur_scale=Double.parseDouble(properties.getProperty(prefix+"curt_dnn_recur_scale")); // By Claude on 06/14/2026 if (properties.getProperty(prefix+"curt_dnn_recur_scale")!=null) this.curt_dnn_recur_scale=Double.parseDouble(properties.getProperty(prefix+"curt_dnn_recur_scale")); // By Claude on 06/14/2026
...@@ -9151,6 +9163,7 @@ min_str_neib_fpn 0.35 ...@@ -9151,6 +9163,7 @@ min_str_neib_fpn 0.35
imp.curt_recur_rs_min = this.curt_recur_rs_min; // By Claude on 06/10/2026 imp.curt_recur_rs_min = this.curt_recur_rs_min; // By Claude on 06/10/2026
imp.curt_c5_from_pix = this.curt_c5_from_pix; // By Claude on 06/11/2026 imp.curt_c5_from_pix = this.curt_c5_from_pix; // By Claude on 06/11/2026
imp.curt_c5_matched = this.curt_c5_matched; // By Claude on 06/12/2026 imp.curt_c5_matched = this.curt_c5_matched; // By Claude on 06/12/2026
imp.curt_c5_en = this.curt_c5_en; // By Claude on 06/17/2026
imp.curt_c5_post = this.curt_c5_post; // By Claude on 06/12/2026 imp.curt_c5_post = this.curt_c5_post; // By Claude on 06/12/2026
imp.curt_c5_lambdas = this.curt_c5_lambdas.clone(); // By Claude on 06/12/2026 imp.curt_c5_lambdas = this.curt_c5_lambdas.clone(); // By Claude on 06/12/2026
imp.curt_c5_null_z = this.curt_c5_null_z; // By Claude on 06/12/2026 imp.curt_c5_null_z = this.curt_c5_null_z; // By Claude on 06/12/2026
...@@ -9166,6 +9179,7 @@ min_str_neib_fpn 0.35 ...@@ -9166,6 +9179,7 @@ min_str_neib_fpn 0.35
imp.curt_c5_white_sp = this.curt_c5_white_sp; // By Claude on 06/13/2026 imp.curt_c5_white_sp = this.curt_c5_white_sp; // By Claude on 06/13/2026
imp.curt_c5_white_vel = this.curt_c5_white_vel; // By Claude on 06/13/2026 imp.curt_c5_white_vel = this.curt_c5_white_vel; // By Claude on 06/13/2026
imp.curt_dnn_model = this.curt_dnn_model; // By Claude on 06/13/2026 imp.curt_dnn_model = this.curt_dnn_model; // By Claude on 06/13/2026
imp.curt_stage2_model = this.curt_stage2_model; // By Claude on 06/18/2026
imp.curt_dnn_thresh = this.curt_dnn_thresh; // By Claude on 06/13/2026 imp.curt_dnn_thresh = this.curt_dnn_thresh; // By Claude on 06/13/2026
imp.curt_dnn_recur_splat = this.curt_dnn_recur_splat; // By Claude on 06/14/2026 imp.curt_dnn_recur_splat = this.curt_dnn_recur_splat; // By Claude on 06/14/2026
imp.curt_dnn_recur_scale = this.curt_dnn_recur_scale; // By Claude on 06/14/2026 imp.curt_dnn_recur_scale = this.curt_dnn_recur_scale; // By Claude on 06/14/2026
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment