Skip to content

Add 06cb:00a2#1

Open
dmitriy-myz wants to merge 6 commits into
masterfrom
add-a2
Open

Add 06cb:00a2#1
dmitriy-myz wants to merge 6 commits into
masterfrom
add-a2

Conversation

@dmitriy-myz

Copy link
Copy Markdown
Owner

For now it only match already added fingers (e.g. from windows or using a.exe from this repo.
Also currently this will broke already supported sensors

dmitriy-myz and others added 3 commits March 3, 2021 16:33
…ght we add fingers to db? maybe just match images on hosts as we allready have finger image?
Comment thread validitysensor/sensor.py
Comment on lines +848 to +855
# debug save image
import numpy as np
from PIL import Image
img = np.frombuffer(img_data, dtype=np.uint8).reshape(x,y)
# for some reason sensor returns transposed image
img = np.transpose(img)
Image.fromarray(img).save("fingerprint.jpg")
# end debug save image

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

don't forget to remove this

dmitriy-myz added a commit that referenced this pull request May 28, 2026
Two changes, big payoff: AAB0 #0 went from 243/250 to 250/250 byte-exact
on the captured Wine enrollment frame. Average across 9 AAB0s improved
from ~94% to ~98%.

1. FILL was 128 (= the Q0 mid-gray byte value). DLL pads its 3×3 tiles
   with Q16 mid-gray = 0x800000 (= 8388608). Using 128 propagated through
   the doh convolution chain to non-padding pixels and changed NMS
   results in EDGE TILES (rows 2 and cols 2 of the 3×3 grid). With the
   fix, my port's tile 8 is byte-exact with captured F250 tile 8.

2. Corner-tile tightening in _a960_passes_global_edge: for tile
   (i=GRID-1, j=GRID-1) — bottom-right — cap gy at oy + last_row_step
   (= 102 exclusive for 112-px frame). Without this, my port keeps
   7 tile-8 kps with gy in [102, 108] that DLL drops. Empirically
   derived from 9-AAB0 enrollment capture; the kp orientation of these
   kps and the per-AAB0 gy_max in DLL's tile 8 (range 82-101) suggests
   the actual rule may be more nuanced (per-frame variable), but the
   exclusive `gy < oy + step` empirically catches most edge cases for
   the captured data.

Per-AAB0 byte-exact (gx, gy) match after fix:
  #0: 250/250  #1: 239/250  #2: 239/250  #3: 243/250  #4: 244/250
  uunicorn#5: 248/250  uunicorn#6: 249/250  uunicorn#7: 246/250  uunicorn#8: 246/250

Residual drift (1-11 per frame) is concentrated in TILE 8 (corner)
where DLL applies a per-frame gy cut whose rule isn't yet pinned down.
For example AAB0 #1 DLL keeps only 3 of ~12 high-resp tile-8 kps;
DLL's kept kps have gy ≤ 82 while my port's only_mine kps have gy
in [89, 101]. The cut isn't strict top-N or fixed gy threshold.

Diagnostic tools added:
  dev/find_edge_bound.py     - per-tile bound aggregator across all
                                AAB0s (lists observed gx/gy ranges)
  dev/try_per_tile_bound.py  - tests a per-tile bound filter against
                                my port's output

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
dmitriy-myz added a commit that referenced this pull request May 29, 2026
…ery)

Adds GDB_DUMP_A5B0_KP=1 hook that dumps the FULL kp_array (count×32B) and
the 4-byte local_flags struct at sub_18000A5B0 entry AND exit, so the
exit/entry diff exposes any per-kp side effect A5B0 has:

  - count change at exit  => A5B0 culls kps
  - byte[+0x8] flips      => A5B0 marks kps "bad" (A7E0 sorts them back)
  - flags[0]/flags[2]!=0  => meaning becomes clear from kp diff (AAB0
                              reads these right after each call — disasm
                              b070..b07e)
  - all identical         => A5B0 is purely a descriptor writer; cull
                              must live elsewhere (likely NMS or A960
                              edge-tile divergence we missed)

Background: ~6-10 residual edge-tile drifts per AAB0 in the native port
(see [[native-enrollment-status]]) — the cull mechanism that picks 250 of
~503 kps in DLL doesn't match my "top-250 by resp", and a static rule
hasn't fit the AAB0 #1 case where DLL keeps only 3 of ~12 tile-8 kps.
This hook lets one Wine enrollment capture decide whether A5B0 is the
cull or whether to look elsewhere — much cheaper than disassembling
A5B0's internals on speculation.

The earlier suspicion that sub_18000E6B0 (called from A5B0) was a cull
function was wrong — E6B0 is the BRIEF seed-table generator (decoded;
seeds inlined as immediate stores; the runtime-built BRIEF pair table is
already snapshotted to validitysensor/brief_table.bin). Memory updated.

Args at A5B0 entry (Win64, callee rsp = caller rsp − 8):
  RDX = minutia_ctx {kp_array_ptr@+0, count@+8, byte_n_good@+0xc}
  [rsp+0x38] = tile_id
  [rsp+0x40] = start_kp_idx
  [rsp+0x48] = end_kp_idx
  [rsp+0x50] = &local_flags (4 bytes)

Independent of the existing GDB_DUMP_STAGE5 hook (which dumps the v85
descriptor target buffer); gdb allows multiple BPs at the same address.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant