Labelled baseline on the proven loop, quick taps only: enrolled finger 2 of 10, wrong finger 0 of 5. Every press was one frame. The rising-edge frame costs ~700 ms because it runs the matcher twice -- event 5 and event 7 on the same image, two verdicts back. A human tap is over before a second frame can exist at that cost. Keeping only the touch event keeps what every recorded match followed, halves the rising frame, and may be the difference between one frame per tap and two. It is a single variable against a labelled baseline; if the rate drops, it comes out. Also fixes fptrial.sh's latency column, which was all zero: busybox date has no %N, so it reads /proc/uptime instead.
34 lines
1.6 KiB
Shell
34 lines
1.6 KiB
Shell
#!/bin/sh
|
|
# fptrial.sh -- a labelled verification protocol against fingerprintd.
|
|
#
|
|
# fptrial.sh [correct_taps] [wrong_taps] defaults 10 and 5
|
|
#
|
|
# Runs fprintd-verify once per tap and tells you which finger to use before
|
|
# each one. The daemon's transcript records every frame; THIS records the label
|
|
# and the wall-clock time from "press now" to the client seeing a result, which
|
|
# is the latency a user feels. Unlabelled runs cannot be turned into a rate.
|
|
C=${1:-10}; W=${2:-5}
|
|
OUT=/tmp/fptrial-$(date +%Y%m%d-%H%M%S).log
|
|
now() { awk '{gsub(/\./,""); print $1 "0000000"}' /proc/uptime; }
|
|
run() { # $1 = label
|
|
printf '\n>>> %s -- press and LIFT (quick tap) ... ' "$1"
|
|
t0=$(now)
|
|
res=$(timeout 20 fprintd-verify user 2>&1 | grep -E 'Verify result' | tail -1)
|
|
t1=$(now)
|
|
ms=$(( (t1 - t0) / 1000000 ))
|
|
verdict=$(printf '%s' "$res" | grep -oE 'verify-(match|no-match|unknown-error)' || echo timeout)
|
|
printf '%s (%d ms)\n' "$verdict" "$ms"
|
|
printf '%s %s %d\n' "$1" "$verdict" "$ms" >> "$OUT"
|
|
sleep 1
|
|
}
|
|
echo "labelled trial -> $OUT"
|
|
i=1; while [ $i -le $C ]; do run "CORRECT $i/$C"; i=$((i+1)); done
|
|
echo; echo "===== now switch to a DIFFERENT finger ====="; sleep 3
|
|
i=1; while [ $i -le $W ]; do run "WRONG $i/$W"; i=$((i+1)); done
|
|
echo
|
|
echo "===== summary ====="
|
|
awk '$1=="CORRECT"{c++; if($3=="verify-match")cm++; ct+=$4}
|
|
$1=="WRONG" {w++; if($3=="verify-match")wm++; wt+=$4}
|
|
END{printf " correct finger: %d/%d matched (false negatives %d) mean %d ms\n", cm,c,c-cm,(c?ct/c:0);
|
|
printf " wrong finger: %d/%d matched (false ACCEPTS %d) mean %d ms\n", wm,w,wm,(w?wt/w:0)}' "$OUT"
|
|
echo " per-tap log: $OUT"
|