Add 06cb:00a2#1
Open
dmitriy-myz wants to merge 6 commits into
Open
Conversation
…ght we add fingers to db? maybe just match images on hosts as we allready have finger image?
dmitriy-myz
commented
May 31, 2021
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 |
Owner
Author
There was a problem hiding this comment.
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
For now it only match already added fingers (e.g. from windows or using
a.exefrom this repo.Also currently this will broke already supported sensors