School Nail Rules



Borderline result: Ask for another picture (RECHECK)
Rules version: school_rules_v1

Next Experiment: Real Measurement

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

Gemini Vision Experiments

API mode: Interactions
Model: gemini-3.6-flash
Gemini configured: Yes
Connection: Not tested
Gemini requests today: 0 / 100


Recent sanitized requests
[
    {
        "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
    }
]

Developer / Parent View

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

Why doesn't Student Mode automatically find the nail?

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.

20260903_034806_7a6303d8d359

Reprocess Original ROI with OpenCV Detector — creates a new linked attempt and preserves this record.

Detector Summary

Attempt ID: 20260903_034806_7a6303d8d359
Detector version: 1.1.0
Result: Nail candidate detected
Overall confidence: 85
Processing time: 111.2 ms
Finger orientation: N/A°
Fingertip confidence: N/A
Nail-search dimensions: N/A
Candidates: 2
Best candidate: N/A
Second candidate: N/A
Score margin: N/A
Representation agreement: N/A
Ensemble agreement: N/A
Final nail confidence: N/A

Visual Detection Pipeline

Click an image for full-size inspection. Missing stages remain visible so detector versions can be compared.

1. Original ROI
Original ROI
2. Analysis Input
Analysis Input
3. Normalized Finger
Not generated by this detector version
4. Finger Segmentation Mask
Finger Segmentation Mask
5. Cleaned Mask
Cleaned Mask
6. Fingertip / Geometry Overlay
Fingertip / Geometry Overlay
7. Nail Search ROI
Nail Search ROI
8. Original RGB Nail Crop
Not generated by this detector version
9. Grayscale
Not generated by this detector version
10. Contrast-enhanced Grayscale
Not generated by this detector version
11. Local Contrast
Not generated by this detector version
12. Saturation Map
Not generated by this detector version
13. Chroma / YCbCr Map
Not generated by this detector version
14. Gradient X
Not generated by this detector version
15. Gradient Y
Not generated by this detector version
16. Edge Magnitude
Not generated by this detector version
17. False-colour Feature Map
Not generated by this detector version
18. Fused Nail Likelihood
Not generated by this detector version
19. Boundary Traces
Not generated by this detector version
20. Legacy Candidate
Not generated by this detector version
21. Fused Candidate
Not generated by this detector version
22. Boundary Candidate
Not generated by this detector version
23. Ensemble Overlay
Not generated by this detector version
24. Final Overlay
Final Overlay
25. OpenCV Original ROI
Not generated by this detector version
26. OpenCV Normalized Finger
Not generated by this detector version
27. OpenCV Fingertip Crop
Not generated by this detector version
28. OpenCV Grayscale
Not generated by this detector version
29. OpenCV CLAHE
Not generated by this detector version
30. OpenCV Bilateral Filter
Not generated by this detector version
31. OpenCV Canny
Not generated by this detector version
32. OpenCV Morphological Gradient
Not generated by this detector version
33. OpenCV Adaptive Threshold
Not generated by this detector version
34. OpenCV Contours
Not generated by this detector version
35. OpenCV Candidate Contours
Not generated by this detector version
36. OpenCV Ellipse Candidates
Not generated by this detector version
37. OpenCV GrabCut
Not generated by this detector version
38. OpenCV Ensemble
Not generated by this detector version
39. OpenCV Final Overlay
Not generated by this detector version

Side-by-side Comparison

Left image comparison
Right image comparison

Overlay Comparison

Compare a map or trace directly over RGB. The images are scaled into the same viewport.

Base representationOverlay representation

Representation Score Table

RepresentationScore / Evidence
GeometryN/A
GrayscaleN/A
Local ContrastN/A
EdgeN/A
SaturationN/A
ChromaN/A
TextureN/A
BoundaryN/A
Highlight PenaltyN/A
FusedN/A
Representation AgreementN/A
Ensemble AgreementN/A

Top Nail Candidates

IDDetectorBBoxAreaWidth ratioLength ratioAspectCenterlineTip distanceBrightness ΔSaturation ΔChroma ΔTextureEdgeBoundaryHighlightGeometryFusedTotalDecision
N/AN/AN/AN/AN/AN/AN/AN/AN/AN/AN/AN/AN/AN/AN/AN/AN/AN/AN/A[]
N/AN/AN/AN/AN/AN/AN/AN/AN/AN/AN/AN/AN/AN/AN/AN/AN/AN/AN/A["below_minimum_area_ratio"]

Human Diagnostic Feedback

Which representation shows the nail most clearly?









What appears to be wrong?








OpenCV Analysis

OpenCV finger contour: N/A
OpenCV orientation: N/A
Internal contours: N/A
Plausible nail contours: N/A
Best nail candidate: N/A
Detector agreement: N/A
Confidence: N/A
Initialization time: N/A ms
OpenCV processing time: N/A ms
Full metadata.json
{
    "camera": {
        "width": 720,
        "height": 1280,
        "frame_rate": 10,
        "facing_mode": "environment"
    },
    "roi": {
        "x": 108,
        "y": 569,
        "width": 504,
        "height": 142
    },
    "original_roi": {
        "width": 504,
        "height": 142
    },
    "analysis": {
        "width": 400,
        "height": 113
    },
    "segmentation": {
        "raw_skin_pixels": 38753,
        "cleaned_skin_pixels": 38242,
        "cleaned_skin_ratio": 0.8460619469026549
    },
    "finger": {
        "detected": true,
        "area_pixels": 38073,
        "bounding_box": {
            "x": 28,
            "y": 1,
            "width": 371,
            "height": 111
        },
        "centroid": {
            "x": 223.99532477083497,
            "y": 57.0339610747774
        },
        "area_ratio": 0.8423230088495576,
        "boundary_clipped": true,
        "center_offset_ratio": 0.03375
    },
    "fingertip": {
        "detected": true,
        "x": 252.64736331284374,
        "y": 7.47460368812682,
        "method": "centroid_of_uppermost_10_percent_band"
    },
    "nail_search": {
        "bounding_box": {
            "x": 127,
            "y": 1,
            "width": 252,
            "height": 54
        },
        "finger_mean_brightness": 120.90917448060306,
        "finger_mean_saturation": 0.366800301759434,
        "brightness_threshold_offset": 8,
        "saturation_threshold_factor": 0.92
    },
    "nail_candidates": {
        "count": 2,
        "considered": [
            {
                "bounding_box": {
                    "x": 127,
                    "y": 2,
                    "width": 157,
                    "height": 38
                },
                "area_pixels": 1102,
                "area_ratio": 0.028944396291335068,
                "mean_brightness": 153.9283121597096,
                "mean_saturation": 0.2027418970638153,
                "contrast": 33.01913767910655,
                "candidate_score": 92.52459754037676,
                "valid_size": true,
                "rejection_reasons": []
            },
            {
                "bounding_box": {
                    "x": 173,
                    "y": 26,
                    "width": 2,
                    "height": 2
                },
                "area_pixels": 4,
                "area_ratio": 0.00010506132955112547,
                "mean_brightness": 131.25,
                "mean_saturation": 0.32765151515151525,
                "contrast": 10.340825519396944,
                "candidate_score": 28.2117979687378,
                "valid_size": false,
                "rejection_reasons": [
                    "below_minimum_area_ratio"
                ]
            }
        ]
    },
    "nail_candidate": {
        "detected": true,
        "bounding_box": {
            "x": 127,
            "y": 2,
            "width": 157,
            "height": 38
        },
        "area_pixels": 1102,
        "area_ratio": 0.028944396291335068,
        "mean_brightness": 153.9283121597096,
        "mean_saturation": 0.2027418970638153,
        "contrast": 33.01913767910655,
        "candidate_score": 92.52459754037676,
        "valid_size": true,
        "rejection_reasons": []
    },
    "confidence": {
        "finger_score": 65,
        "nail_score": 35,
        "boundary_adjustment": -15,
        "components": {
            "finger_area": 30,
            "centering": 20,
            "fingertip": 15,
            "nail_size": 25,
            "nail_contrast": 10,
            "boundary": -15
        },
        "overall_score": 85
    },
    "result": "Nail candidate detected",
    "processing_time_ms": 111.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
    },
    "attempt_id": "20260903_034806_7a6303d8d359",
    "timestamp": "2026-09-03T03:48:06+00:00",
    "detector_version": "1.1.0",
    "detector_config": {
        "camera_width": 1280,
        "camera_height": 720,
        "target_fps": 10,
        "camera_facing": "environment",
        "guide_width_percent": 70,
        "guide_height_percent": 35,
        "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.0",
        "debug_capture_enabled": true,
        "debug_storage_path": "debug_attempts",
        "debug_max_attempts": 300,
        "debug_jpeg_quality": 0.82
    },
    "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
}