Right now AI is making a visual judgement. Later we will add a known-size reference beside the finger, calculate pixels per millimetre, locate the fingertip and nail edges, and compare a calibrated free-edge measurement with the school rule.
IMAGE → REFERENCE SCALE → PIXELS PER MM → FINGERTIP EDGE → NAIL EDGE → FREE EDGE PIXELS → MILLIMETRES → COMPARE WITH SCHOOL RULE
API mode: Interactions
Model: gemini-3.6-flash
Gemini configured: Yes
Connection: Not tested
Gemini requests today: 0 / 100
[
{
"request_id": "gem_20260903133650_bec871f44d21",
"created_at": "2026-09-03T13:37:01+00:00",
"request_type": "interactions_vision",
"api_mode": "interactions",
"interaction_id": null,
"ok": true,
"code": null,
"http_status": 200,
"google_status": null,
"google_error_code": null,
"sanitized_error": null,
"model": "gemini-3.6-flash",
"prompt_version": "1",
"processing_time_ms": 11309.4,
"input": {
"sha256": "085fcb0cc2ceb20bbc8dd037858083a15d0ffdd1e3c2857c9191b2d9a9855ac9",
"width": 564,
"height": 224,
"size_bytes": 10651,
"mime": "image/jpeg"
},
"cache_hit": false,
"school_rules": {
"rules_version": "school_rules_v1",
"length_check_enabled": true,
"maximum_free_edge_mm": 3,
"visual_tolerance": "normal",
"cleanliness_check_enabled": false,
"polish_check_enabled": false,
"artificial_nail_check_enabled": false,
"uncertain_policy": "RECHECK",
"borderline_result": "RECHECK",
"prompt_behavior": "NORMAL: make a cautious ordinary visual screening; return UNCERTAIN for borderline views."
},
"result": {
"suitable": true,
"finger_count": 5,
"finger": {
"box_2d": [
294,
395,
735,
460
],
"tip": [
294,
432
]
},
"nail": {
"visible": true,
"box_2d": [
294,
417,
360,
458
],
"polygon": [
[
294,
432
],
[
298,
421
],
[
315,
417
],
[
345,
418
],
[
358,
428
],
[
358,
442
],
[
348,
455
],
[
318,
458
],
[
298,
450
]
],
"free_edge": [
[
294,
423
],
[
294,
432
],
[
295,
445
]
],
"mask": [
[
294,
432
],
[
298,
421
],
[
315,
417
],
[
345,
418
],
[
358,
428
],
[
358,
442
],
[
348,
455
],
[
318,
458
],
[
298,
450
]
]
},
"quality": {
"blur": "low",
"lighting": "dim",
"occluded": false
},
"school_screening": {
"status": "LOOKS_ACCEPTABLE",
"rule_maximum_free_edge_mm": 3,
"visual_assessment": "The fingernails appear neatly trimmed and short. They are well within acceptable length limits.",
"confidence": "high",
"measurement_available": false,
"requires_calibration_for_mm": true
},
"student_message": ""
},
"normalized_coordinates": {
"finger_box": [
294,
395,
735,
460
],
"finger_tip": [
294,
432
],
"nail_box": [
294,
417,
360,
458
],
"nail_polygon": [
[
294,
432
],
[
298,
421
],
[
315,
417
],
[
345,
418
],
[
358,
428
],
[
358,
442
],
[
348,
455
],
[
318,
458
],
[
298,
450
]
]
},
"source_coordinates": {
"finger_box": {
"x": 222.78,
"y": 65.86,
"width": 36.66,
"height": 98.78
},
"finger_tip": {
"x": 243.65,
"y": 65.86
},
"nail_box": {
"x": 235.19,
"y": 65.86,
"width": 23.12,
"height": 14.78
},
"nail_polygon": [
{
"x": 243.65,
"y": 65.86
},
{
"x": 237.44,
"y": 66.75
},
{
"x": 235.19,
"y": 70.56
},
{
"x": 235.75,
"y": 77.28
},
{
"x": 241.39,
"y": 80.19
},
{
"x": 249.29,
"y": 80.19
},
{
"x": 256.62,
"y": 77.95
},
{
"x": 258.31,
"y": 71.23
},
{
"x": 253.8,
"y": 66.75
}
],
"free_edge": [
{
"x": 238.57,
"y": 65.86
},
{
"x": 243.65,
"y": 65.86
},
{
"x": 250.98,
"y": 66.08
}
]
}
},
{
"request_id": "gem_20260903132034_aedec74cd827",
"created_at": "2026-09-03T13:20:43+00:00",
"request_type": "interactions_vision",
"api_mode": "interactions",
"interaction_id": null,
"ok": true,
"code": null,
"http_status": 200,
"google_status": null,
"google_error_code": null,
"sanitized_error": null,
"model": "gemini-3.6-flash",
"prompt_version": "1",
"processing_time_ms": 8581.4,
"input": {
"sha256": "ea31c0b189b4d90d8126221c89c80c2de790585be6c372edc8ce9462ae4e524b",
"width": 564,
"height": 224,
"size_bytes": 10685,
"mime": "image/jpeg"
},
"cache_hit": false,
"result": {
"suitable": true,
"finger_count": 1,
"finger": {
"box_2d": [
292,
510,
529,
925
],
"tip": [
375,
510
]
},
"nail": {
"visible": true,
"box_2d": [
300,
513,
440,
570
],
"polygon": [
[
300,
545
],
[
320,
518
],
[
375,
510
],
[
425,
525
],
[
440,
550
],
[
400,
568
],
[
340,
565
]
],
"mask": [
[
300,
545
],
[
320,
518
],
[
375,
510
],
[
425,
525
],
[
440,
550
],
[
400,
568
],
[
340,
565
]
]
},
"quality": {
"blur": "low",
"lighting": "dim",
"occluded": false
},
"student_message": ""
},
"normalized_coordinates": {
"finger_box": [
292,
510,
529,
925
],
"finger_tip": [
375,
510
],
"nail_box": [
300,
513,
440,
570
],
"nail_polygon": [
[
300,
545
],
[
320,
518
],
[
375,
510
],
[
425,
525
],
[
440,
550
],
[
400,
568
],
[
340,
565
]
]
},
"source_coordinates": {
"finger_box": {
"x": 287.64,
"y": 65.41,
"width": 234.06,
"height": 53.09
},
"finger_tip": {
"x": 287.64,
"y": 84
},
"nail_box": {
"x": 289.33,
"y": 67.2,
"width": 32.15,
"height": 31.36
},
"nail_polygon": [
{
"x": 307.38,
"y": 67.2
},
{
"x": 292.15,
"y": 71.68
},
{
"x": 287.64,
"y": 84
},
{
"x": 296.1,
"y": 95.2
},
{
"x": 310.2,
"y": 98.56
},
{
"x": 320.35,
"y": 89.6
},
{
"x": 318.66,
"y": 76.16
}
]
}
},
{
"request_id": "gem_20260903122848_02a49695907c",
"created_at": "2026-09-03T12:28:49+00:00",
"ok": false,
"code": "gemini_model_unavailable",
"http_status": 404,
"google_status": "NOT_FOUND",
"google_error_code": 404,
"sanitized_error": "This model models/gemini-2.5-flash is no longer available to new users. Please update your code to use models/gemini-3.6-flash for the latest features and improvements. We recommend you to use the Interactions API.",
"model": "gemini-2.5-flash",
"prompt_version": "1",
"processing_time_ms": 310.4,
"input": {
"sha256": "e3a50eb67f2002cbebb67b582667ec2089d2308d97da652ca56a248b0161b8d1",
"width": 564,
"height": 224,
"size_bytes": 11923,
"mime": "image/jpeg"
},
"cache_hit": false
},
{
"request_id": "gem_20260903122432_b6dbe17a42ea",
"created_at": "2026-09-03T12:24:33+00:00",
"ok": false,
"code": "gemini_model_unavailable",
"http_status": 404,
"google_status": "NOT_FOUND",
"google_error_code": 404,
"sanitized_error": "This model models/gemini-2.5-flash is no longer available to new users. Please update your code to use models/gemini-3.6-flash for the latest features and improvements. We recommen",
"model": "gemini-2.5-flash",
"prompt_version": "1",
"processing_time_ms": 315.4,
"input": {
"sha256": "06e5610e36a80dda493e4443450fe00e1eb72eb7fa1fadaca4afaba50547cc12",
"width": 564,
"height": 224,
"size_bytes": 15530,
"mime": "image/jpeg"
},
"cache_hit": false
},
{
"request_id": "gem_20260903121941_825125b9eaf8",
"created_at": "2026-09-03T12:19:42+00:00",
"ok": false,
"code": "gemini_http_error",
"sanitized_error": "HTTP 404",
"model": "gemini-2.5-flash",
"prompt_version": "1",
"processing_time_ms": 401.6,
"input": {
"sha256": "3adfb83b1c405b6840c60998c2364dcfa1580ef624002127a22df462eca8eb1f",
"width": 564,
"height": 224,
"size_bytes": 15249,
"mime": "image/jpeg"
},
"cache_hit": false
}
]Development mode: analysis images are currently being stored on this server for detector improvement. Oldest attempts are automatically removed after 300 records.
Student STEM Lab · Experimental Detectors / Full Hand Detector · Teacher / Presentation Mode · Export Training Dataset
Student Mode is collecting the examples that will teach a future AI what a nail looks like. The student's marking is the correct answer, called ground truth.
Ground Truth: The correct answer provided by a person for an AI training example.
Reprocess Original ROI with OpenCV Detector — creates a new linked attempt and preserves this record.
Click an image for full-size inspection. Missing stages remain visible so detector versions can be compared.







Compare a map or trace directly over RGB. The images are scaled into the same viewport.
| Representation | Score / Evidence |
|---|---|
| Geometry | N/A |
| Grayscale | N/A |
| Local Contrast | N/A |
| Edge | N/A |
| Saturation | N/A |
| Chroma | N/A |
| Texture | N/A |
| Boundary | N/A |
| Highlight Penalty | N/A |
| Fused | N/A |
| Representation Agreement | N/A |
| Ensemble Agreement | N/A |
| ID | Detector | BBox | Area | Width ratio | Length ratio | Aspect | Centerline | Tip distance | Brightness Δ | Saturation Δ | Chroma Δ | Texture | Edge | Boundary | Highlight | Geometry | Fused | Total | Decision |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | [] |
| N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | ["below_minimum_area_ratio"] |
| N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | ["below_minimum_area_ratio"] |
| N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | ["below_minimum_area_ratio"] |
| N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | ["below_minimum_area_ratio"] |
| N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | ["below_minimum_area_ratio"] |
| N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | ["below_minimum_area_ratio"] |
| N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | ["below_minimum_area_ratio"] |
| N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | ["below_minimum_area_ratio"] |
| N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | ["below_minimum_area_ratio"] |
{
"scan_mode": "single",
"auto_capture": {
"enabled": false,
"readiness_checks": 0,
"finger_first_seen_at": null,
"stable_started_at": null,
"captured_at": "2026-09-03T05:01:07.960Z",
"stable_duration_ms": 0,
"final_centroid_shift": null,
"final_area_change_percent": null,
"final_orientation_change_deg": null,
"readiness_confidence": null,
"capture_reason": "manual_developer",
"rejected_reason_counts": [],
"latest_readiness": null,
"state_transitions": [
{
"state": "CAMERA_STARTING",
"at": "2026-09-03T05:01:05.401Z"
},
{
"state": "SEARCHING",
"at": "2026-09-03T05:01:05.881Z"
},
{
"state": "ANALYZING",
"at": "2026-09-03T05:01:07.960Z"
}
]
},
"camera": {
"width": 720,
"height": 1280,
"frame_rate": 10,
"facing_mode": "environment"
},
"roi": {
"x": 0,
"y": 438,
"width": 720,
"height": 404
},
"user_capture_roi": {
"coordinate_space": "native_camera_pixels; complete visible preview",
"x": 0,
"y": 438,
"width": 720,
"height": 404
},
"positioning_guide_roi": {
"coordinate_space": "native_camera_pixels; visual guidance only",
"x": 42,
"y": 518,
"width": 633,
"height": 244
},
"detected_finger_roi": {
"coordinate_space": "analysis_pixels; padded blob bounds",
"x": 0,
"y": 0,
"width": 400,
"height": 224,
"polygon": [
{
"x": -30.91488421318531,
"y": -69.50776924875699
},
{
"x": 408.04576532729897,
"y": 3.604709811829906
},
{
"x": 364.0895076000015,
"y": 267.51406825875085
},
{
"x": -74.8711419404828,
"y": 194.401589198164
}
],
"major_padding_pixels": 43.06526491984628,
"minor_padding_pixels": 44.59082556026458,
"coordinate_basis": "PCA_major_minor_axes"
},
"original_roi": {
"width": 720,
"height": 404
},
"analysis": {
"width": 400,
"height": 224
},
"image_quality": {
"mean_brightness": 101.89119251986699,
"laplacian_variance": 105.33653947097086,
"bright_enough": true,
"sharp_enough": true
},
"segmentation": {
"raw_skin_pixels": 35638,
"cleaned_skin_pixels": 35460,
"cleaned_skin_ratio": 0.3957589285714286
},
"finger": {
"detected": true,
"area_pixels": 35460,
"bounding_box": {
"x": 1,
"y": 1,
"width": 346,
"height": 162
},
"centroid": {
"x": 136.99839255499154,
"y": 92.45346869712353
},
"area_ratio": 0.3957589285714286
},
"capture_accepted": false,
"validation_messages": [
"Keep fingertip inside frame"
],
"screening_result": "pass",
"processing_time_ms": 55.4,
"client": {
"user_agent": "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Mobile Safari/537.36",
"viewport": {
"width": 360,
"height": 641
},
"device_pixel_ratio": 3
},
"detection_failure_reasons": [
"finger_or_fingertip_clipped"
],
"orientation": {
"finger_orientation_degrees": 9.456273275901461,
"major_axis_vector": {
"x": 0.9864112745578386,
"y": 0.16429484905248998
},
"minor_axis_vector": {
"x": -0.16429484905248998,
"y": 0.9864112745578386
},
"minimum_major_projection": -149.175681572907,
"maximum_major_projection": 209.70152609247867,
"minimum_minor_projection": -87.5822791303602,
"maximum_minor_projection": 90.78102311069811,
"major_length_pixels": 358.87720766538564,
"minor_width_pixels": 178.3633022410583,
"axis_alignment": 0.9864112745578386
},
"endpoint_a": {
"x": -10.150181638373937,
"y": 67.94467261080047
},
"endpoint_b": {
"x": 343.85034218459725,
"y": 126.9063492725641
},
"selected_fingertip": {
"x": 3.7611940298507465,
"y": 71.44278606965175
},
"selected_fingertip_reason": "left_endpoint_controlled_capture",
"fingertip_selection_reason": "left_endpoint_controlled_capture",
"fingertip_refinement": {
"x": 3.7611940298507465,
"y": 71.44278606965175,
"method": "distal_major_axis_contour_centroid",
"band_depth_pixels": 32.10539440339049,
"contour_pixels_used": 201,
"coarse_endpoint": {
"x": -10.150181638373937,
"y": 67.94467261080047
}
},
"finger_width": 178.3633022410583,
"boundary_handling": {
"confidence_boundary_is_actual_capture_boundary_only": true,
"internal_finger_roi_boundary_penalty": false
},
"nail_search_roi": {
"bounding_box": {
"x": 5,
"y": -7,
"width": 316,
"height": 208
},
"polygon": [
{
"x": 5.075691038058917,
"y": 154.71107554071313
},
{
"x": 295.7827796326417,
"y": 200.55378646250256
},
{
"x": 321.34356390418486,
"y": 38.46256130673517
},
{
"x": 30.636475309602123,
"y": -7.380149615054265
}
],
"origin": {
"x": 3.7611940298507465,
"y": 71.44278606965175
},
"inward_axis": {
"x": 0.9877935207861946,
"y": 0.15576893237360834
},
"finger_width_pixels": 178.3633022410583
},
"nail_candidates": {
"count": 17,
"considered": [
{
"bounding_box": {
"x": 259,
"y": 75,
"width": 56,
"height": 68
},
"center": {
"x": 287,
"y": 109
},
"area_pixels": 2041,
"area_ratio": 0.05755781161872532,
"mean_brightness": 163.76678098971092,
"mean_saturation": 0.28222153568752634,
"contrast": 49.300480933309345,
"axis_start": 258.90809950161736,
"axis_end": 308.7194441060234,
"axis_length": 49.81134460440603,
"candidate_score": 98.28853616885107,
"valid_size": true,
"rejection_reasons": []
},
{
"bounding_box": {
"x": 220,
"y": 105,
"width": 13,
"height": 23
},
"center": {
"x": 226.5,
"y": 116.5
},
"area_pixels": 147,
"area_ratio": 0.004145516074450084,
"mean_brightness": 132.00680272108843,
"mean_saturation": 0.35566800421730793,
"contrast": 17.540502664686855,
"axis_start": 220.53992112332935,
"axis_end": 232.3934433727637,
"axis_length": 11.853522249434349,
"candidate_score": 47.608340646978846,
"valid_size": false,
"rejection_reasons": [
"below_minimum_area_ratio"
]
},
{
"bounding_box": {
"x": 245,
"y": 105,
"width": 14,
"height": 14
},
"center": {
"x": 252,
"y": 112
},
"area_pixels": 91,
"area_ratio": 0.0025662718556119573,
"mean_brightness": 130.14285714285714,
"mean_saturation": 0.3420880803563842,
"contrast": 15.67655708645556,
"axis_start": 245.0789902106106,
"axis_end": 257.6087681160839,
"axis_length": 12.52977790547331,
"candidate_score": 49.660132036728,
"valid_size": false,
"rejection_reasons": [
"below_minimum_area_ratio"
]
},
{
"bounding_box": {
"x": 235,
"y": 101,
"width": 10,
"height": 11
},
"center": {
"x": 240,
"y": 106.5
},
"area_pixels": 58,
"area_ratio": 0.0016356457980823463,
"mean_brightness": 130.44827586206895,
"mean_saturation": 0.36449100277166246,
"contrast": 15.981975805667375,
"axis_start": 233.48759674663899,
"axis_end": 242.53350736608832,
"axis_length": 9.04591061944933,
"candidate_score": 49.47118732757552,
"valid_size": false,
"rejection_reasons": [
"below_minimum_area_ratio"
]
},
{
"bounding_box": {
"x": 204,
"y": 127,
"width": 7,
"height": 11
},
"center": {
"x": 207.5,
"y": 132.5
},
"area_pixels": 56,
"area_ratio": 0.0015792442188381276,
"mean_brightness": 127.05357142857143,
"mean_saturation": 0.36125979408021797,
"contrast": 12.587271372169852,
"axis_start": 207.6948345058488,
"axis_end": 213.621595630566,
"axis_length": 5.9267611247171885,
"candidate_score": 38.20885172041641,
"valid_size": false,
"rejection_reasons": [
"below_minimum_area_ratio"
]
},
{
"bounding_box": {
"x": 214,
"y": 123,
"width": 6,
"height": 13
},
"center": {
"x": 217,
"y": 129.5
},
"area_pixels": 46,
"area_ratio": 0.0012972363226170334,
"mean_brightness": 127.67391304347827,
"mean_saturation": 0.3670363289028133,
"contrast": 13.207612987076686,
"axis_start": 216.3266182547219,
"axis_end": 221.73289265577367,
"axis_length": 5.406274401051775,
"candidate_score": 40.532616348428895,
"valid_size": false,
"rejection_reasons": [
"below_minimum_area_ratio"
]
},
{
"bounding_box": {
"x": 233,
"y": 74,
"width": 10,
"height": 4
},
"center": {
"x": 238,
"y": 76
},
"area_pixels": 30,
"area_ratio": 0.0008460236886632825,
"mean_brightness": 128.16666666666666,
"mean_saturation": 0.2145972439640037,
"contrast": 13.700366610265078,
"axis_start": 227.15047959860556,
"axis_end": 236.0406212856813,
"axis_length": 8.890141687075754,
"candidate_score": 39.60386168841376,
"valid_size": false,
"rejection_reasons": [
"below_minimum_area_ratio"
]
},
{
"bounding_box": {
"x": 282,
"y": 144,
"width": 11,
"height": 3
},
"center": {
"x": 287.5,
"y": 145.5
},
"area_pixels": 22,
"area_ratio": 0.0006204173716864072,
"mean_brightness": 141.4090909090909,
"mean_saturation": 0.08154177716936811,
"contrast": 26.942790852689328,
"axis_start": 286.30041845090807,
"axis_end": 296.0225847263964,
"axis_length": 9.722166275488348,
"candidate_score": 42.94172774109419,
"valid_size": false,
"rejection_reasons": [
"below_minimum_area_ratio"
]
},
{
"bounding_box": {
"x": 267,
"y": 146,
"width": 9,
"height": 2
},
"center": {
"x": 271.5,
"y": 147
},
"area_pixels": 18,
"area_ratio": 0.0005076142131979696,
"mean_brightness": 152.44444444444446,
"mean_saturation": 0.0868391079335337,
"contrast": 37.97814438804288,
"axis_start": 271.63928457148876,
"axis_end": 279.6974016701519,
"axis_length": 8.05811709866316,
"candidate_score": 41.97301774954384,
"valid_size": false,
"rejection_reasons": [
"below_minimum_area_ratio"
]
},
{
"bounding_box": {
"x": 265,
"y": 75,
"width": 7,
"height": 2
},
"center": {
"x": 268.5,
"y": 76
},
"area_pixels": 14,
"area_ratio": 0.0003948110547095319,
"mean_brightness": 140.07142857142858,
"mean_saturation": 0.3621967673737596,
"contrast": 25.605128515027005,
"axis_start": 258.60410333139015,
"axis_end": 264.68663338848097,
"axis_length": 6.082530057090821,
"candidate_score": 41.045025052794394,
"valid_size": false,
"rejection_reasons": [
"below_minimum_area_ratio"
]
},
{
"bounding_box": {
"x": 129,
"y": 97,
"width": 3,
"height": 5
},
"center": {
"x": 130.5,
"y": 99.5
},
"area_pixels": 13,
"area_ratio": 0.00036661026508742246,
"mean_brightness": 127.53846153846153,
"mean_saturation": 0.36853211168672373,
"contrast": 13.072161482059954,
"axis_start": 127.69110101668709,
"axis_end": 130.2897637877539,
"axis_length": 2.5986627710668273,
"candidate_score": 44.20086273550841,
"valid_size": false,
"rejection_reasons": [
"below_minimum_area_ratio"
]
},
{
"bounding_box": {
"x": 225,
"y": 96,
"width": 3,
"height": 4
},
"center": {
"x": 226.5,
"y": 98
},
"area_pixels": 9,
"area_ratio": 0.0002538071065989848,
"mean_brightness": 154.66666666666666,
"mean_saturation": 0.36657084582886695,
"contrast": 40.20036661026508,
"axis_start": 222.36351007978817,
"axis_end": 224.65063498610775,
"axis_length": 2.287124906319576,
"candidate_score": 47.93710193518781,
"valid_size": false,
"rejection_reasons": [
"below_minimum_area_ratio"
]
},
{
"bounding_box": {
"x": 259,
"y": 147,
"width": 3,
"height": 2
},
"center": {
"x": 260.5,
"y": 148
},
"area_pixels": 6,
"area_ratio": 0.00016920473773265651,
"mean_brightness": 146.5,
"mean_saturation": 0.07398299190872946,
"contrast": 32.03369994359842,
"axis_start": 263.8927053375728,
"axis_end": 266.0240613115188,
"axis_length": 2.131355973945972,
"candidate_score": 41.31455422058581,
"valid_size": false,
"rejection_reasons": [
"below_minimum_area_ratio"
]
},
{
"bounding_box": {
"x": 146,
"y": 70,
"width": 2,
"height": 2
},
"center": {
"x": 147,
"y": 71
},
"area_pixels": 4,
"area_ratio": 0.00011280315848843768,
"mean_brightness": 135.5,
"mean_saturation": 0.31742931547619047,
"contrast": 21.03369994359842,
"axis_start": 140.27782969596495,
"axis_end": 141.42139214912476,
"axis_length": 1.1435624531598023,
"candidate_score": 44.454518974012274,
"valid_size": false,
"rejection_reasons": [
"below_minimum_area_ratio"
]
},
{
"bounding_box": {
"x": 230,
"y": 102,
"width": 3,
"height": 1
},
"center": {
"x": 231.5,
"y": 102.5
},
"area_pixels": 3,
"area_ratio": 8.460236886632826e-5,
"mean_brightness": 139,
"mean_saturation": 0.3717547849686708,
"contrast": 24.53369994359842,
"axis_start": 228.2370912779608,
"axis_end": 230.21267831953318,
"axis_length": 1.9755870415723962,
"candidate_score": 48.83078990984776,
"valid_size": false,
"rejection_reasons": [
"below_minimum_area_ratio"
]
},
{
"bounding_box": {
"x": 181,
"y": 128,
"width": 2,
"height": 2
},
"center": {
"x": 182,
"y": 129
},
"area_pixels": 3,
"area_ratio": 8.460236886632826e-5,
"mean_brightness": 124,
"mean_saturation": 0.37641530054644806,
"contrast": 9.533699943598421,
"axis_start": 184.04096993352468,
"axis_end": 185.02876345431088,
"axis_length": 0.9877935207861981,
"candidate_score": 31.976212573128002,
"valid_size": false,
"rejection_reasons": [
"below_minimum_area_ratio"
]
},
{
"bounding_box": {
"x": 252,
"y": 100,
"width": 1,
"height": 1
},
"center": {
"x": 252.5,
"y": 100.5
},
"area_pixels": 1,
"area_ratio": 2.820078962210942e-5,
"mean_brightness": 147,
"mean_saturation": 0.37414965986394555,
"contrast": 32.53369994359842,
"axis_start": 249.65701087050985,
"axis_end": 249.65701087050985,
"axis_length": 0,
"candidate_score": 47.55183345570511,
"valid_size": false,
"rejection_reasons": [
"below_minimum_area_ratio"
]
}
]
},
"nail_candidate": {
"detected": true,
"bounding_box": {
"x": 259,
"y": 75,
"width": 56,
"height": 68
},
"center": {
"x": 287,
"y": 109
},
"area_pixels": 2041,
"area_ratio": 0.05755781161872532,
"mean_brightness": 163.76678098971092,
"mean_saturation": 0.28222153568752634,
"contrast": 49.300480933309345,
"axis_start": 258.90809950161736,
"axis_end": 308.7194441060234,
"axis_length": 49.81134460440603,
"candidate_score": 98.28853616885107,
"valid_size": true,
"rejection_reasons": []
},
"nail_extension_pixels": 0,
"nail_extension_ratio": 0,
"extension_definition": "max(0, candidate_axis_length - expected_nail_bed_length) / local_finger_width; experimental proxy, not millimetres",
"confidence": {
"components": {
"finger_area": 30,
"centering": 20,
"fingertip": 15,
"nail_size": 25,
"nail_contrast": 10,
"boundary": -15
},
"overall_score": 85
},
"screening_reason": "experimental extension ratio at or below threshold",
"result": "Nail candidate detected",
"attempt_id": "20260903_050111_82b70d1ee063",
"timestamp": "2026-09-03T05:01:11+00:00",
"detector_version": "1.1.2-geometry",
"detector_config": {
"camera_width": 1280,
"camera_height": 720,
"target_fps": 10,
"camera_facing": "environment",
"guide_width_percent": 88,
"guide_height_percent": 60,
"full_hand_guide_width_percent": 94,
"full_hand_guide_height_percent": 88,
"default_max_nail_length_mm": 3,
"analysis_width": 400,
"skin_cb_min": 72,
"skin_cb_max": 138,
"skin_cr_min": 128,
"skin_cr_max": 180,
"skin_saturation_min": 0.05,
"skin_saturation_max": 0.78,
"skin_value_min": 0.12,
"mask_cleanup_passes": 1,
"minimum_finger_area_ratio": 0.1,
"maximum_finger_area_ratio": 0.88,
"nail_minimum_area_ratio": 0.008,
"nail_maximum_area_ratio": 0.2,
"nail_brightness_offset": 8,
"nail_saturation_factor": 0.92,
"nail_search_depth_ratio": 0.48,
"finger_center_tolerance_ratio": 0.24,
"boundary_clip_penalty": 15,
"confidence_detected_threshold": 70,
"confidence_retry_threshold": 40,
"debug_enabled": true,
"detector_version": "1.1.2-geometry",
"debug_capture_enabled": true,
"debug_storage_path": "debug_attempts",
"debug_max_attempts": 300,
"debug_jpeg_quality": 0.82,
"single_expected_direction": "left",
"single_axis_alignment_min": 0.6,
"nail_search_inward_ratio": 0.08,
"nail_search_length_width_ratio": 1.65,
"nail_search_half_width_ratio": 0.46,
"experimental_nail_bed_length_ratio": 0.55,
"experimental_nail_ratio_pass_max": 0.18,
"experimental_confidence_min": 65,
"experimental_nail_candidate_score_min": 65,
"full_hand_min_skin_ratio": 0.08,
"full_hand_max_skin_ratio": 0.78,
"full_hand_required_fingers": 5,
"full_hand_min_fingers_usable": 5,
"full_hand_peak_separation_ratio": 0.09,
"full_hand_tip_band_ratio": 0.58,
"full_hand_blur_min_variance": 55,
"full_hand_brightness_min": 55,
"completion_vibration_enabled": true,
"finger_roi_horizontal_padding_ratio": 0.15,
"finger_roi_vertical_padding_ratio": 0.2,
"finger_roi_major_padding_ratio": 0.12,
"finger_roi_minor_padding_ratio": 0.25,
"fingertip_refine_band_width_ratio": 0.18,
"fingertip_refine_min_pixels": 8,
"finger_area_ratio_min": 0.025,
"finger_area_ratio_max": 0.75,
"finger_edge_margin_ratio": 0.025,
"auto_capture_enabled": false,
"readiness_analysis_width": 200,
"readiness_check_interval_ms": 300,
"auto_capture_stable_ms": 750,
"max_centroid_shift": 0.035,
"max_area_change_percent": 12,
"max_orientation_change_deg": 10,
"acceptable_orientation_min_deg": -30,
"acceptable_orientation_max_deg": 30,
"min_readiness_confidence": 70,
"auto_stop_camera_after_analysis": true,
"readiness_min_aspect_ratio": 1.8,
"readiness_tip_end_width_ratio_max": 1.35,
"readiness_blob_dominance_min": 0.65,
"readiness_history_limit": 40
},
"saved_artifacts": [
"original_roi.jpg",
"analysis_input.jpg",
"skin_mask.png",
"cleaned_mask.png",
"finger_detection.png",
"fingertip_detection.png",
"nail_search.png",
"nail_candidates.png",
"nail_candidate.png",
"final_overlay.jpg"
],
"user_feedback": {
"rating": "wrong",
"reason": "wrong_nail_region",
"comment": "",
"submitted_at": "2026-09-03T05:01:56+00:00"
}
}