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"] |
{
"scan_mode": "single",
"auto_capture": {
"enabled": false,
"readiness_checks": 0,
"finger_first_seen_at": null,
"stable_started_at": null,
"captured_at": "2026-09-03T05:00:56.309Z",
"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:00:47.540Z"
},
{
"state": "SEARCHING",
"at": "2026-09-03T05:00:48.124Z"
},
{
"state": "ANALYZING",
"at": "2026-09-03T05:00:56.309Z"
}
]
},
"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": 10,
"width": 371,
"height": 214,
"polygon": [
{
"x": -50.356507475806694,
"y": 36.365903225979494
},
{
"x": 356.0763608310637,
"y": 10.115956428353641
},
{
"x": 370.6600446645846,
"y": 235.91787887165975
},
{
"x": -35.772823642285815,
"y": 262.1678256692856
}
],
"major_padding_pixels": 39.414162391284,
"minor_padding_pixels": 37.71206409288418,
"coordinate_basis": "PCA_major_minor_axes"
},
"original_roi": {
"width": 720,
"height": 404
},
"analysis": {
"width": 400,
"height": 224
},
"image_quality": {
"mean_brightness": 100.24442341330861,
"laplacian_variance": 115.23251377025926,
"bright_enough": true,
"sharp_enough": true
},
"segmentation": {
"raw_skin_pixels": 40758,
"cleaned_skin_pixels": 40640,
"cleaned_skin_ratio": 0.45357142857142857
},
"finger": {
"detected": true,
"area_pixels": 40415,
"bounding_box": {
"x": 1,
"y": 66,
"width": 324,
"height": 156
},
"centroid": {
"x": 147.61365829518743,
"y": 140.2797476184585
},
"area_ratio": 0.45106026785714287
},
"capture_accepted": false,
"validation_messages": [
"Keep fingertip inside frame"
],
"screening_result": "pass",
"processing_time_ms": 119.2,
"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": -3.6953830136427324,
"major_axis_vector": {
"x": 0.9979208151497614,
"y": -0.06445189439291676
},
"minor_axis_vector": {
"x": 0.06445189439291676,
"y": 0.9979208151497614
},
"minimum_major_projection": -151.4469426854938,
"maximum_major_projection": 177.00441057520624,
"minimum_minor_projection": -78.74527642582427,
"maximum_minor_projection": 72.10297994571242,
"major_length_pixels": 328.45135326070005,
"minor_width_pixels": 150.8482563715367,
"axis_alignment": 0.9979208151497614
},
"endpoint_a": {
"x": -3.518398201459746,
"y": 150.04078997455406
},
"endpoint_b": {
"x": 324.2500439815003,
"y": 128.8714780409848
},
"selected_fingertip": {
"x": 4.262135922330097,
"y": 147.08252427184465
},
"selected_fingertip_reason": "left_endpoint_controlled_capture",
"fingertip_selection_reason": "left_endpoint_controlled_capture",
"fingertip_refinement": {
"x": 4.262135922330097,
"y": 147.08252427184465,
"method": "distal_major_axis_contour_centroid",
"band_depth_pixels": 27.152686146876608,
"contour_pixels_used": 206,
"coarse_endpoint": {
"x": -3.518398201459746,
"y": 150.04078997455406
}
},
"finger_width": 150.8482563715367,
"boundary_handling": {
"confidence_boundary_is_actual_capture_boundary_only": true,
"internal_finger_roi_boundary_penalty": false
},
"nail_search_roi": {
"bounding_box": {
"x": 13,
"y": 65,
"width": 255,
"height": 150
},
"polygon": [
{
"x": 19.60565580915966,
"y": 215.82268155748832
},
{
"x": 268.2254906938617,
"y": 204.02437498685222
},
{
"x": 261.6470409696282,
"y": 65.39998220265468
},
{
"x": 13.027206084926188,
"y": 77.19828877329078
}
],
"origin": {
"x": 4.262135922330097,
"y": 147.08252427184465
},
"inward_axis": {
"x": 0.9988758997504835,
"y": -0.04740186597236513
},
"finger_width_pixels": 150.8482563715367
},
"nail_candidates": {
"count": 9,
"considered": [
{
"bounding_box": {
"x": 203,
"y": 72,
"width": 65,
"height": 125
},
"center": {
"x": 235.5,
"y": 134.5
},
"area_pixels": 3835,
"area_ratio": 0.0948905109489051,
"mean_brightness": 171.9496740547588,
"mean_saturation": 0.2818926029475345,
"contrast": 60.361476603317485,
"axis_start": 200.55665483635698,
"axis_end": 261.0140660614128,
"axis_length": 60.45741122505581,
"candidate_score": 99.53674321147612,
"valid_size": true,
"rejection_reasons": []
},
{
"bounding_box": {
"x": 179,
"y": 73,
"width": 55,
"height": 7
},
"center": {
"x": 206.5,
"y": 76.5
},
"area_pixels": 249,
"area_ratio": 0.0061610788073735,
"mean_brightness": 145.97590361445782,
"mean_saturation": 0.2110961866006713,
"contrast": 34.38770616301652,
"axis_start": 177.9108854895716,
"axis_end": 231.80278221012534,
"axis_length": 53.891896720553746,
"candidate_score": 32.44226645042633,
"valid_size": false,
"rejection_reasons": [
"below_minimum_area_ratio"
]
},
{
"bounding_box": {
"x": 215,
"y": 198,
"width": 10,
"height": 3
},
"center": {
"x": 220,
"y": 199.5
},
"area_pixels": 21,
"area_ratio": 0.0005196090560435481,
"mean_brightness": 130.38095238095238,
"mean_saturation": 0.10520665737262533,
"contrast": 18.792754929511077,
"axis_start": 207.99258650001573,
"axis_end": 217.0772733297148,
"axis_length": 9.08468682969908,
"candidate_score": 31.96144919168517,
"valid_size": false,
"rejection_reasons": [
"below_minimum_area_ratio"
]
},
{
"bounding_box": {
"x": 227,
"y": 196,
"width": 8,
"height": 3
},
"center": {
"x": 231,
"y": 197.5
},
"area_pixels": 19,
"area_ratio": 0.00047012247927749596,
"mean_brightness": 129.6315789473684,
"mean_saturation": 0.09683385092161456,
"contrast": 18.043381495927107,
"axis_start": 220.07390102896628,
"axis_end": 227.16083605916438,
"axis_length": 7.086935030198106,
"candidate_score": 32.38696499011968,
"valid_size": false,
"rejection_reasons": [
"below_minimum_area_ratio"
]
},
{
"bounding_box": {
"x": 208,
"y": 200,
"width": 4,
"height": 2
},
"center": {
"x": 210,
"y": 201
},
"area_pixels": 8,
"area_ratio": 0.00019794630706420884,
"mean_brightness": 126.5,
"mean_saturation": 0.07394175109842624,
"contrast": 14.911802548558697,
"axis_start": 200.95305333578997,
"axis_end": 203.9970829010138,
"axis_length": 3.0440295652238376,
"candidate_score": 31.489826657106804,
"valid_size": false,
"rejection_reasons": [
"below_minimum_area_ratio"
]
},
{
"bounding_box": {
"x": 175,
"y": 76,
"width": 3,
"height": 2
},
"center": {
"x": 176.5,
"y": 77
},
"area_pixels": 6,
"area_ratio": 0.00014845973029815662,
"mean_brightness": 128.5,
"mean_saturation": 0.3533679105258975,
"contrast": 16.911802548558697,
"axis_start": 173.8679800245973,
"axis_end": 175.91313369007062,
"axis_length": 2.045153665473322,
"candidate_score": 32.17634473329436,
"valid_size": false,
"rejection_reasons": [
"below_minimum_area_ratio"
]
},
{
"bounding_box": {
"x": 158,
"y": 78,
"width": 3,
"height": 2
},
"center": {
"x": 159.5,
"y": 79
},
"area_pixels": 6,
"area_ratio": 0.00014845973029815662,
"mean_brightness": 126.5,
"mean_saturation": 0.3315849052149638,
"contrast": 14.911802548558697,
"axis_start": 156.79228599689435,
"axis_end": 158.8374396623677,
"axis_length": 2.04515366547335,
"candidate_score": 32.3434911701144,
"valid_size": false,
"rejection_reasons": [
"below_minimum_area_ratio"
]
},
{
"bounding_box": {
"x": 217,
"y": 98,
"width": 2,
"height": 1
},
"center": {
"x": 218,
"y": 98.5
},
"area_pixels": 2,
"area_ratio": 4.948657676605221e-5,
"mean_brightness": 135,
"mean_saturation": 0.36304264310411066,
"contrast": 23.411802548558697,
"axis_start": 214.82532862869795,
"axis_end": 215.82420452844843,
"axis_length": 0.9988758997504874,
"candidate_score": 38.93320953020161,
"valid_size": false,
"rejection_reasons": [
"below_minimum_area_ratio"
]
},
{
"bounding_box": {
"x": 219,
"y": 99,
"width": 1,
"height": 1
},
"center": {
"x": 219.5,
"y": 99.5
},
"area_pixels": 1,
"area_ratio": 2.4743288383026105e-5,
"mean_brightness": 131,
"mean_saturation": 0.37404580152671746,
"contrast": 19.411802548558697,
"axis_start": 216.77567856222655,
"axis_end": 216.77567856222655,
"axis_length": 0,
"candidate_score": 39.24160429793939,
"valid_size": false,
"rejection_reasons": [
"below_minimum_area_ratio"
]
}
]
},
"nail_candidate": {
"detected": true,
"bounding_box": {
"x": 203,
"y": 72,
"width": 65,
"height": 125
},
"center": {
"x": 235.5,
"y": 134.5
},
"area_pixels": 3835,
"area_ratio": 0.0948905109489051,
"mean_brightness": 171.9496740547588,
"mean_saturation": 0.2818926029475345,
"contrast": 60.361476603317485,
"axis_start": 200.55665483635698,
"axis_end": 261.0140660614128,
"axis_length": 60.45741122505581,
"candidate_score": 99.53674321147612,
"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_050059_1f17d591d82c",
"timestamp": "2026-09-03T05:00:59+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": null
}