1. 25 Jun, 2026 1 commit
    • Andrey Filippov's avatar
      CLAUDE: CUAS RT mode-0 path + L2 age/noise/flight-log (pre-JNA-migration checkpoint) · 3dfe70ad
      Andrey Filippov authored
      Checkpoint of the CUAS real-time work before the JCuda->JNA GPU-layer migration:
      - OpticalFlow.buildSeries mode-0 curt_en fork: generate the merged-CUAS stack via
        CuasRanging.prepareFpixels() (GPU, explicit) then run the CUDA-free CuasDetectRT;
        coexists with the oracle (oracle gated off when curt_en).
      - CuasDetectRT: file + in-memory(ImagePlus) entries via shared ingest(); -OFFSET gains
        an L2 "age" slice (5->6 ch), per-level noise scale, -LEV0 uniform naming, -OFFSET-<model> suffix.
      - infer_server.py: L2 track-age (masked 5x5 max-pool, AGE_THR=0.2/AGE_K=0.5),
        per-level noise normalization (sqrt(2)^(L-3) default, Java-sent scale), nch + noise_scale
        + CMD_STATUS protocol additions; auto model-switch in CuasDnnRemote.ensureServer.
      - cuasSynth + cuasNoise list SET keys (shared synth dir / inline per-level scales).
      - CuasRanging.saveUasFlightLogCsv: per-frame UAS truth -> <name>-UAS_DATA.tsv (mode-0 only).
      Co-Authored-By: 's avatarClaude Opus 4.8 (1M context) <noreply@anthropic.com>
      3dfe70ad
  2. 21 Jun, 2026 6 commits
    • Andrey Filippov's avatar
      Added logging · 95e25fcc
      Andrey Filippov authored
      95e25fcc
    • Andrey Filippov's avatar
      CLAUDE: -OFFSET in px (s-first, full-frame meta, s-gated NaN); curt_dnn_thresh... · 571ef32e
      Andrey Filippov authored
      CLAUDE: -OFFSET in px (s-first, full-frame meta, s-gated NaN); curt_dnn_thresh viz-only (recurrent gets full field)
      
      -OFFSET (remote) reordered to {s,Vx,Vy,dx,dy} (s first -> ImageJ auto-ranges on it); Vx,Vy converted cells->px/level-frame (/vel_decimate); full-frame ROI written to the file metadata (self-describes its extent); Vx,Vy,dx,dy NaN'd where s<curt_dnn_thresh (s kept). curt_dnn_thresh is now VISUALIZATION-ONLY: the local inferROI feeds Layer 2 the FULL field (sThresh=0) so the recurrent gets the weak sub-threshold signal it integrates (no premature threshold = the LReLU lesson); dialog label/tooltip/decl updated to say viz-only, do-not-use-for-computation.
      Co-Authored-By: 's avatarClaude Opus 4.8 (1M context) <noreply@anthropic.com>
      571ef32e
    • Andrey Filippov's avatar
      CLAUDE: GenericJTabbedDialog - don't stretch checkboxes (fix accidental toggle) · 3c144146
      Andrey Filippov authored
      Checkboxes were laid out with fill=HORIZONTAL, stretching the (text-less) JCheckBox across the half-width cell so its click target reached the scrollbar - a near-scrollbar miss-click silently toggled them (this flipped 'DNN remote' off mid-session). Anchor checkboxes WEST at natural size; the rest of the cell is now dead space. Applies to all tabbed dialogs.
      Co-Authored-By: 's avatarClaude Opus 4.8 (1M context) <noreply@anthropic.com>
      3c144146
    • Andrey Filippov's avatar
      CLAUDE: Batch the DGX remote DNN path + on-GPU ghostbuster · 5bee1911
      Andrey Filippov authored
      runDnnRemote requests each level's scenes in chunks (REQ=64) via CuasDnnRemote.inferBatch instead of per-scene; the DGX runs them continuously (production-representative ~100ms/scene full-res) and applies the ghostbuster on the GPU in decode, so BOTH the ROI 121-cell field and the full-frame -OFFSET {dx,dy,s,Vx,Vy} are ghostbusted (dropped the Java-side ghostbust). Validated: local vs remote on the same weighted9_pm_s model -> max |diff| ~1e-4 (ORT per-pixel vs PyTorch shift-and-stitch fp). Full-res ~100ms/scene is the oracle; RT would use the 1/4-res single forward (~4.4ms).
      Co-Authored-By: 's avatarClaude Opus 4.8 (1M context) <noreply@anthropic.com>
      5bee1911
    • Andrey Filippov's avatar
      CLAUDE: Port ghostbuster to the remote DNN path (match CPU -HYPER-RECT) · 01a6e535
      Andrey Filippov authored
      runDnnRemote() decoded the raw softmax*s field but skipped dnnGhostbust, so the untrained corner-velocity sidelobes (which the local CPU path zeros when curt_dnn_vmax>0) survived as background noise (~0.06 vs ~5e-4 on the MAX-all-v layer). Apply dnnGhostbust to the ROI field, mirroring the local path -> verified: ImageJ subtract of -HYPER-RECT MAX slices vs the CPU (17_UAS_REFACTORED) is exact zero. (Full-frame -OFFSET s is not yet ghostbusted - Java lacks the full 121-field; a DGX-side decode ghostbuster would cover that.)
      Co-Authored-By: 's avatarClaude Opus 4.8 (1M context) <noreply@anthropic.com>
      01a6e535
    • Andrey Filippov's avatar
      CLAUDE: Add DGX remote DNN inference path (full-res shift-and-stitch) · 69753750
      Andrey Filippov authored
      detectTargets() can offload the DNN front-end to the GB10 DGX (curt_dnn_remote): CuasDnnRemote uploads the LoG-conditioned stack once, the DGX builds the pyramid and runs full-res shift-and-stitch per (level,scene), returning the full-frame {dx,dy,s,Vx,Vy} (-OFFSET) + ROI 121-cell softmax*s (-RECT/-HYPER-RECT). Auto-launches the server if down (bundled cuas_dnn/ scripts, or curt_dnn_remote_srcdir local-repo override - mirrors the GPU-kernel default-vs-override). Synthetic targets are mixed into the upload stack so synth works on the remote path. 4 curt_dnn_remote_* dialog params, grouped with the model fields. Local CPU path unchanged (curt_dnn_remote=false) for Layer 2. Validated end-to-end; shift-and-stitch is fp64-exact vs per-pixel.
      Co-Authored-By: 's avatarClaude Opus 4.8 (1M context) <noreply@anthropic.com>
      69753750
  3. 20 Jun, 2026 3 commits
    • Andrey Filippov's avatar
      CLAUDE: CUAS cleanup pt2 — scrub dead 3d3/MF leftover symbols · 5df977ab
      Andrey Filippov authored
      Dead after the 3d3/matched-filter removal (predecessor at tag cuas-layer1):
      render3d3Hyperstack, get3d3Radius + the 3d3 kernel state (kernel3d3_rad, indx_*_3d3)
      with its constructor param/setup/call-site; TemporalKernelGenerator.generateKernelMatched/Direct;
      CuasDetectRT SUFFIX_CONV3D3, CONV3D3_MODES, bilinearFrame. No live callers; build OK.
      Co-authored-by: 's avatarClaude Opus 4.8 (1M context) <noreply@anthropic.com>
      5df977ab
    • Andrey Filippov's avatar
      CLAUDE: CUAS cleanup — remove pre-DNN/dead paths; LReLU -> linear · 4abf02b0
      Andrey Filippov authored
      Layer-1 is DNN-only; predecessor code preserved at git tag cuas-layer1.
      Removed: 3d3 coarse-velocity path (curt_3d3_*, rleak1, convolve3D3LReLU);
      C5P matched-filter / Bayes-posterior / whitening (curt_c5_matched/en/post/.../white*/from_pix);
      LReLU rectification (curt_rleak0/pyr -> linear alpha=1, LoG kept);
      distribution-vote (-GVOTE/-GHEADS, voteScatterGrid); curt_dnn_t8frac.
      28 dialog params dropped; dialogQuestions/dialogAnswers re-verified aligned (44 widgets = 44 getNext). ~1841 lines removed.
      Deprecated (kept): curt_stage2_model, MF-S S convention.
      Kept: DNN front-end, recurrent, synth-test, SUBAVG, pyramid, LoG (linear). Build OK.
      
      Runtime-untested (dialog) — verify a run; restore point: tag cuas-layer1.
      Co-authored-by: 's avatarClaude Opus 4.8 (1M context) <noreply@anthropic.com>
      4abf02b0
    • Andrey Filippov's avatar
      CLAUDE: CUAS Layer-1 — synth bg-avg fast path + Time-ROI window + MF-S head · 1d9ef9a8
      Andrey Filippov authored
      - IntersceneMatchParameters: add curt_synth_bg_avg (synth quick-run: average N=2^LEV real
        frames per output frame and force a single level — restores the fast synthetic+background path).
      - CuasDetectRT: that fast synth path (decimate-average to a short sequence + single level),
        honoring "Time ROI to" for the averaged-sequence length.
      - CuasDnnInfer: MF-S head reads channel 0 as the raw matched-filter path-sum (clamp>=0, no sigmoid).
      
      Validated: weighted model tracks the real UAS sub-pixel at LEV2/3; linear conditioning
      (LReLU off) is dropout-free and matches the no-LReLU training. Checkpoint before Layer 2.
      Co-authored-by: 's avatarClaude Opus 4.8 (1M context) <noreply@anthropic.com>
      1d9ef9a8
  4. 19 Jun, 2026 1 commit
  5. 18 Jun, 2026 12 commits
    • Andrey Filippov's avatar
      CLAUDE: v2 Stage-2 Hough-vote wiring + curt_c5_en flag + ORT log fix · a2a2a22d
      Andrey Filippov authored
      - 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>
      a2a2a22d
    • Andrey Filippov's avatar
      CLAUDE: fopen_pose_compare.py — handle timestamp-named COLMAP images · 2f169094
      Andrey Filippov authored
      parse_images_txt() now accepts both frame_NNN names and timestamp names
      (e.g. 1763232419_474661.png). Introduces sort_key (float) so entries
      sort correctly regardless of naming style. fno stays -1 for timestamp
      images since no integer frame number is present.
      Co-authored-by: 's avatarClaude <claude@elphel.com>
      2f169094
    • Andrey Filippov's avatar
      CLAUDE: Add printer_kvm.py — Ender 3 physical stylus control for phone touchscreen · 00a639ff
      Andrey Filippov authored
      Serial (USB/CH340G, 115200 baud) G-code driver for Creality Ender 3.
      Provides tap(), swipe(), home(), calibrate() over /dev/ttyUSB0.
      Part of the NanoKVM + Ender 3 physical phone-control project.
      Co-authored-by: 's avatarClaude <claude@elphel.com>
      00a639ff
    • Andrey Filippov's avatar
      CLAUDE: fopen_turn_finder.py — add lat/lon from *-ims.corr-xml · 9942ae46
      Andrey Filippov authored
      *-ims.corr-xml in the scene root dir always has an INS-fused GPS fix
      (did_ins_2-lla, fallback did_gps1_pos-lla) giving the representative
      position of the sequence for map location.
      
      Changes:
      - find_xml_files: also yields ims_path (*-ims.corr-xml from scene root)
      - parse_lla(): reads lat/lon from INS or GPS1 LLA entry
      - lat/lon added to metrics, console tables, and TSV output
      Co-authored-by: 's avatarClaude <claude@elphel.com>
      9942ae46
    • Andrey Filippov's avatar
      CLAUDE: fopen_turn_finder.py — add AGL from elevations_histogram.csv · 2b1e81b3
      Andrey Filippov authored
      *-elevations_histogram.csv (row 2, col 1) gives flight altitude above
      ground level for each sequence.  Low AGL (<25-50 m) correlates with
      algorithm failures in dense-canopy areas.
      
      Changes:
      - find_xml_files: also yields hist_path (*-elevations_histogram.csv)
      - parse_agl(): reads AGL from second row, first column (tab-separated)
      - agl_m added to sequence metrics dict and TSV output
      - --min_agl filter: hide sequences below given AGL from console output
      - AGL column shown in console tables
      Co-authored-by: 's avatarClaude <claude@elphel.com>
      2b1e81b3
    • Andrey Filippov's avatar
      CLAUDE: fopen_turn_finder.py — use _dt rates, add glitch filter · 1d5fdb15
      Andrey Filippov authored
      Finite-diff vel1 was dominated by single-frame pose glitches from
      algorithm failures (low altitude / dense canopy), giving 600+ deg/s
      for sequences where _dt shows ~10 deg/s.
      
      Changes:
      - parse _dt entries (algorithm's smooth polynomial derivatives) as
        primary velocity metric — unaffected by pose glitches
      - keep finite-diff as secondary; glitch = fd_max / dt_max
        (~1 = clean data, >>1 = pose jumps / algorithm failure)
      - --max_glitch filter hides suspect sequences from console output
        (TSV always contains all rows for Calc analysis)
      - removed windowed finite-diff (vel5) — _dt makes it redundant
      Co-authored-by: 's avatarClaude <claude@elphel.com>
      1d5fdb15
    • Andrey Filippov's avatar
      CLAUDE: Add fopen_turn_finder.py — find sharpest turns across all INTERFRAME.corr-xml · b925f5dc
      Andrey Filippov authored
      Scans all scene dirs under a linked data root, parses each
      *-INTERFRAME.corr-xml (latest version subdir), and computes per-sequence
      angular metrics for A/T/R axes:
        - range (max−min, deg)
        - vel1: max consecutive |Δangle|/Δt (deg/s) — fast, noise-sensitive
        - velW: max W-frame windowed |Δangle|/Δt (deg/s) — robust (default W=5)
      
      A/T/R Cessna-nadir convention documented: R=heading, T=banking, A=pitch.
      Sequence-length/altitude note documented: metrics are Δt-normalised.
      Outputs ranked console tables and optional TSV.
      Co-authored-by: 's avatarClaude <claude@elphel.com>
      b925f5dc
    • Andrey Filippov's avatar
      CLAUDE: fopen_pose_compare.py — clean CSV/TSV output for Calc analysis · 313276ef
      Andrey Filippov authored
      - flat column names (no _x_y_z suffix, single comparison set)
      - XML angles in degrees (not radians) — more useful for Calc plotting
      - auto TSV when --out ends in .tsv, CSV otherwise
      - column comment block documents layout in the source
      Co-authored-by: 's avatarClaude <claude@elphel.com>
      313276ef
    • Andrey Filippov's avatar
      CLAUDE: fopen_pose_compare.py — add frame-numbering cross-reference docs · 3c05de2f
      Andrey Filippov authored
      Documents the ImageJ (1-based slice:timestamp), INTERFRAME.corr-xml
      (timestamp_microseconds key), and COLMAP (0-based frame_NNNN) conventions
      in the module docstring so any frame can be cross-referenced across tools.
      Also clarifies the underscore→dot timestamp conversion in parse_interframe_xml.
      Co-authored-by: 's avatarClaude <claude@elphel.com>
      3c05de2f
    • Andrey Filippov's avatar
      CLAUDE: fopen_pose_compare.py — use timestamp as frame identity, drop scene_idx · 40bc3da4
      Andrey Filippov authored
      Timestamps are unambiguous when using sub-sequences (e.g. 378 of 498
      frames).  0-based sequential scene_idx was misleading.
      
      - console top-N table: Scene column replaced with Timestamp
      - CSV: scene_idx column removed, timestamp is the identity column
      - parse_interframe_xml: drop scene_idx from returned dicts
      Co-authored-by: 's avatarClaude <claude@elphel.com>
      40bc3da4
    • Andrey Filippov's avatar
      CLAUDE: fopen_pose_compare.py — remove egomotion.csv support, --xml only · 730211c2
      Andrey Filippov authored
      *-egomotion.csv is a human-readable output file for Calc analysis, not
      a machine input source.  *-INTERFRAME.corr-xml is the internal state
      always present alongside processed data and is the correct programmatic
      source for x/y/z/a/t/r poses.
      
      - remove parse_egomotion_csv() and --ego argument
      - --xml is now required
      - remove IMS/PIMU col_specs (not in XML)
      - rename CSV output columns: ego_* → xml_*, ers_*_rad → xml_*_rad
      Co-authored-by: 's avatarClaude <claude@elphel.com>
      730211c2
    • Andrey Filippov's avatar
      CLAUDE: fopen_pose_compare.py — accept --xml (INTERFRAME.corr-xml) as pose source · 81f67ed0
      Andrey Filippov authored
      --ego (egomotion.csv) was required but is not always present (it is an
      optional output file).  --xml (*-INTERFRAME.corr-xml) is always written
      by the pipeline and contains the same x/y/z/a/t/r values.
      
      Changes:
      - add parse_interframe_xml(): sorts timestamps → same frame order as COLMAP
      - --xml is the new preferred input; --ego is optional and overrides --xml
        (it additionally provides IMS/PIMU columns)
      - at least one of --xml or --ego is required
      - IMS/PIMU [SKIP] messages suppressed when using XML (NaN is expected)
      - verified: XML and egomotion.csv produce identical results
      Co-authored-by: 's avatarClaude <claude@elphel.com>
      81f67ed0
  6. 17 Jun, 2026 3 commits
  7. 16 Jun, 2026 3 commits
    • Andrey Filippov's avatar
      CLAUDE: Save mixed DNN input (-SYNTHMIX) after synth injection · f94eb7ec
      Andrey Filippov authored
      The CONV2D images are saved BEFORE synth injection (real-only), so the actual
      DNN input (LoG-conditioned real bg + injected synth) was no longer visible once
      the mixing order moved to post-conditioning. Add a per-selected-level save of
      dpixels_pyramid right after injection: getBaseName()+"-SYNTHMIX"+("B" if over
      real bg)+("-SUBAVG" if avg-subtracted)+"-LEVn", full-frame (640x512), same
      timestamps - what the network actually sees. Gated by save_LoG_pixels.
      Co-Authored-By: 's avatarClaude Opus 4.8 (1M context) <noreply@anthropic.com>
      f94eb7ec
    • Andrey Filippov's avatar
      CLAUDE: Configurable DNN patch size (curt_dnn_patch) for larger-attention model · 81698963
      Andrey Filippov authored
      inferROI's receptive-field patch was hardcoded P=24. Add CuasDnnInfer.setPatch
      and new param curt_dnn_patch (default 24) so a wider-attention model (patch 32)
      can be deployed: CuasDetectRT sets it on the inferer. The 32-patch model widens
      off-center suppression reach (off_max 9->13 px) and removes the trajectory-alias
      ghosts seen in the clean synthetic grid (field ~0.16 -> ~0.003). Must match the
      loaded model's training patch.
      Co-Authored-By: 's avatarClaude Opus 4.8 (1M context) <noreply@anthropic.com>
      81698963
    • Andrey Filippov's avatar
      CLAUDE: DNN ghostbuster - discard untrained corner velocities (R>vmax) · 0bd16311
      Andrey Filippov authored
      The DNN velocity grid (radius vel_radius) extends past the trained velocity
      disk, so untrained corner cells emit spurious sidelobes (ghosts) of non-trivial
      strength (s up to ~0.09) that would confuse the recurrent layer. New
      dnnGhostbust() zeros velocity cells with cell-radius > curt_dnn_vmax*vel_decimate,
      and if a pixel's peak lands in the untrained corner it discards the whole
      detection (field=0, s=0). Applied to the DNN field + offset before save and the
      recurrent feed. New param curt_dnn_vmax (px/frame, default 1.4 = PM models'
      training vmax_px; set to match the loaded model; <=0 disables).
      Co-Authored-By: 's avatarClaude Opus 4.8 (1M context) <noreply@anthropic.com>
      0bd16311
  8. 15 Jun, 2026 4 commits
    • Andrey Filippov's avatar
      CLAUDE: Wire curt_synth_bg - zero real background for clean targets · 65664688
      Andrey Filippov authored
      curt_synth_bg was fully parsed/persisted in IntersceneMatchParameters
      but never read by the detector: the synthetic grid was always ADDED on
      top of the LoG-conditioned real pyramid, so "Synthetic over real
      background = false" had no effect (real background noise, and any NaN
      border pixels, always present). Now when curt_synth_bg=false the level
      is zeroed before the synthetic targets are injected -> truly clean,
      noise-free targets. Logs which path was taken.
      Co-Authored-By: 's avatarClaude Opus 4.8 (1M context) <noreply@anthropic.com>
      65664688
    • Andrey Filippov's avatar
      CLAUDE: Honor curt_save_select ROI in synthetic mode (fix SYNTH_ROI OOM) · cc0c0f86
      Andrey Filippov authored
      Synthetic mode previously force-overrode the ROI with the full-grid
      SYNTH_ROI (320x320). showConvKernel5d expands each ROI pixel by
      (vout_dim+1)*sub_dim per axis, so 320x320 blows the heap. Now synthetic
      mode uses curt_save_select directly and falls back to SYNTH_ROI only
      when no ROI is set, so the user can shrink it to a slice of the grid.
      Co-Authored-By: 's avatarClaude Opus 4.8 (1M context) <noreply@anthropic.com>
      cc0c0f86
    • Andrey Filippov's avatar
      CLAUDE: Derive DNN temporal depth from ONNX input shape (8/9 swap) · 9d06cce7
      Andrey Filippov authored
      CuasDnnInfer reads N (temporal frame count) from the model's input
      shape [B,N,H,W] and exposes getNFrames(); the constructor arg is now
      only a fallback hint. CuasDetectRT uses dnn.getNFrames() instead of the
      hardcoded 8, so an 8- vs 9-frame ONNX swaps purely by changing
      curt_dnn_model (N follows automatically).
      Co-Authored-By: 's avatarClaude Opus 4.8 (1M context) <noreply@anthropic.com>
      9d06cce7
    • Andrey Filippov's avatar
      CLAUDE: DNN de-streak (subtract-avg), compute-window, and recurrent feed · 1f04cb6a
      Andrey Filippov authored
      - curt_subtract_avg (+ -SUBAVG filename tag): subtract the input per-pixel temporal
        mean before LoG. Removes the static treeline edge (and so its 8px tile-grid
        horizontal streak and the first-LReLU amplification of it); the moving target is
        not in the average, so it survives. Uses the whole sequence (not realtime; realtime
        would use a prior-run average).
      - DNN compute-window: the timing ROI (curt_time_from/to) now gates the DNN inference
        loop (only in-window scenes are inferred), not just the saved output - fast iteration
        on a target's few seconds.
      - DNN -> recurrent layer: feed the DNN field to runRecurrentLevel (per selected level,
        curt_recur_*). curt_dnn_recur_splat toggles feed-as-is vs bilinear splat of each
        pixel's velocity vector to its fractional (px+dx,py+dy) so neighbours reinforce in one
        sub-pixel bin (-SPLAT mark). curt_dnn_recur_scale (default 10) lifts the [0,1] field
        (peaks ~0.1) to the recurrent's tuned rs_min~1.0 scale. splatField() helper added.
      Co-authored-by: 's avatarClaude Opus 4.8 (1M context) <noreply@anthropic.com>
      1f04cb6a
  9. 14 Jun, 2026 5 commits
    • Andrey Filippov's avatar
      CLAUDE: CUAS-RT overhaul - real-base synthetic-grid injection, level/time... · ee86f0fc
      Andrey Filippov authored
      CLAUDE: CUAS-RT overhaul - real-base synthetic-grid injection, level/time ROIs, 3d3 bypass, DNN offset/stride/window
      
      Reworks the synthetic B-measurement and detector flow on the real pyramid base:
      
      - Load: the real -CUAS-MERGED-CUAS stack is always the pyramid base (full-length
        levels); when curt_synth_src, the synthetic grid is loaded separately (scaled,
        NOT LoG'd) and injected TILED into each selected pyramid level AFTER the pure
        pyramid is built - same grid at every level, real noise averaged (sqrt(2)/level,
        printed). Both file picks use newestFile(). The old load-time mixing and the
        curt_synth_bg_avg (N=) decimation are retired.
      - Level selection unified on curt_c5_levels for ALL heavy paths (3d3/conv5d,
        C5P-direct, DNN); cheap temporalAverage pyramid still builds up to the max
        selected level. Pyramid-depth guard stops building when a level would have <1
        frame (was NegativeArraySizeException on short sequences).
      - Timing ROI curt_time_from/to (timestamp seconds; last-4-of-seconds shortcut,
        rollover-aware, 3-decimal fixed display) clips saved RECT/HYPER/DNN/C5P stacks
        and gates the DNN inference (compute-window, not just save).
      - curt_3d3_en (default false) bypasses the 3d3 coarse-velocity path and its
        ~W*H*9 arrays. Full-velocities hyperstack render is guarded by a free-heap
        estimate (it is also an unfilled stub) and skipped if it would not fit.
      - DNN: curt_dnn_stride (1 testing / 4 production 50%-overlap), and -DNN-OFFSET
        visualization (dx, dy, s over the ROI) from the offset channels.
      Co-authored-by: 's avatarClaude Opus 4.8 (1M context) <noreply@anthropic.com>
      ee86f0fc
    • Andrey Filippov's avatar
      CLAUDE: Add velocity-count getters + DNN offset-channel overload · f2b3b3b5
      Andrey Filippov authored
      CuasRTUtils.getNumVout()/getSubDim() expose the 5D render dimensions for the
      full-velocity-hyperstack memory estimate. CuasDnnInfer adds an inferROI(...,
      double[][] offOut) overload that also returns the two offset channels
      {dx, dy, s} per pixel (the DNN's per-pixel sub-pixel position estimate); the
      existing 6-arg call delegates with offOut=null, so the field output is
      unchanged. Both are prerequisites used by the CUAS-RT overhaul that follows.
      Co-authored-by: 's avatarClaude Opus 4.8 (1M context) <noreply@anthropic.com>
      f2b3b3b5
    • Andrey Filippov's avatar
      CLAUDE: Add MAX-over-v locator slice to -HYPER-RECT · bf2ba914
      Andrey Filippov authored
      Prepend velocity index 0 = max over all velocities (per scene, per pixel) to
      showConvKernel5dHyperRect, and scale the display range to that slice instead
      of the fixed IMP_MINMAX, so the small (~0.1) maxima are visible on open. It is
      the first slice ImageJ shows - a quick map of non-empty pixels before scanning
      scenes (Z) and velocities (T). Applies to both -HYPER-RECT and -DNN-HYPER-RECT.
      Co-authored-by: 's avatarClaude Opus 4.8 (1M context) <noreply@anthropic.com>
      bf2ba914
    • Andrey Filippov's avatar
      CLAUDE: Fix synth bg_avg to do real pyramid-level decimation · 134a5bdb
      Andrey Filippov authored
      The bg_avg>1 path kept all n_synth frames and only added an averaged
      background, so AVG4 and AVG8 produced the same frame count and 1/fps
      timestamps. Now output frame i is the mean of bg_avg consecutive frames of
      BOTH the scaled synthetic target AND the real background (non-overlapping
      groups): the sequence is decimated by N (n_synth/N frames), the moving target
      is motion-averaged like a real pyramid level, and each timestamp is the last
      real frame of its group (N/fps increments).
      Co-authored-by: 's avatarClaude Opus 4.8 (1M context) <noreply@anthropic.com>
      134a5bdb
    • Andrey Filippov's avatar
      CLAUDE: Wire DNN front-end into CuasDetectRT (-DNN field, all scenes) · c899aa2b
      Andrey Filippov authored
      When curt_dnn_model is set, run the ONNX DNN per-pixel inference over
      curt_save_select across all available scenes (not just the first few),
      saving -DNN-RECT / -DNN-HYPER-RECT. Slice labels carry timestamp + absolute
      frame index for matching to real targets. New curt_dnn_thresh (6 sites in
      IntersceneMatchParameters) zeroes the (Vx,Vy,s) field below confidence s -
      display/FP-suppression only. inferROI tiles the ROI batch (CHUNK) to bound
      ONNX Runtime activation memory.
      Co-authored-by: 's avatarClaude Opus 4.8 (1M context) <noreply@anthropic.com>
      c899aa2b
  10. 13 Jun, 2026 2 commits