Spaces:
Sleeping
Sleeping
| title: Crack Detection And Measurement | |
| emoji: π§± | |
| colorFrom: gray | |
| colorTo: red | |
| sdk: docker | |
| app_port: 7860 | |
| pinned: false | |
| # Crack Detection & Measurement | |
| Upload a photo of a wall; the app detects the crack, measures its width and | |
| length in real centimetres, and shows the segmented result. | |
| > The block above is Hugging Face Spaces configuration. It is ignored when | |
| > running locally and tells the Space to build from the `Dockerfile`. | |
| ## Pipeline | |
| 1. **Scale & rectification (ArUco)** β a printed ArUco marker in the photo | |
| gives four points with known real-world coordinates. The wall plane's | |
| homography is recovered and the image is warped to a fronto-parallel view | |
| where **1 pixel = a fixed known mm**. This corrects camera angle and fixes | |
| scale. See `aruco_scale.py`. | |
| 2. **Segmentation (ML)** β `best_crack_model.pth`, a ResNet34-Unet, *locates* | |
| the crack and produces a binary mask. See `crack_pipeline.py`. | |
| 3. **Measurement (computer vision)** β within the ML-detected region, a | |
| black-tophat operator (local intensity contrast) plus Otsu thresholding | |
| re-segments the crack tightly on its actual dark pixels, not the model's | |
| wider "crack zone". Width is then sampled along the crack centreline. | |
| See `cv_crack.py`. | |
| Reported: **max width**, **min width** (both excluding the crack's tapering | |
| tips), and **total length**. The refined crack mask is shown as the | |
| segmented image. | |
| ## Print the marker | |
| ```bash | |
| ./venv/bin/python make_marker.py # -> aruco_marker_60mm_A4.pdf | |
| ``` | |
| Print at **100% / Actual Size** (no scaling); verify the black square is | |
| exactly **6.0 cm**. Tape it flat on the wall next to the crack and photograph | |
| wall + marker together. The app serves the PDF at `/marker`. | |
| ## Run | |
| ```bash | |
| ./run.sh | |
| ``` | |
| Creates the virtualenv on first run, then serves at | |
| <http://127.0.0.1:5001> (port 5000 is taken by macOS AirPlay). Override with | |
| `PORT=8080 ./venv/bin/python app.py`. | |
| ## Files | |
| | File | Purpose | | |
| |------------------------|--------------------------------------------------| | |
| | `aruco_scale.py` | ArUco detection, plane rectification, mm scaling | | |
| | `crack_pipeline.py` | Model loading, ML segmentation, pipeline, overlay| | |
| | `cv_crack.py` | Intensity-profile crack-width measurement | | |
| | `make_marker.py` | Generates the printable marker PDF | | |
| | `app.py` | Flask server (`/`, `/analyze`, `/marker`, `/health`) | | |
| | `templates/index.html` | Upload UI and results view | | |
| | `best_crack_model.pth` | Trained segmentation weights | | |
| ## API | |
| `POST /analyze` β multipart form, field `image`. Returns JSON: base64 PNG | |
| `overlay`, a `measurements` object (`summary` / `summary_mm` with max width, | |
| min width, total length), and an `aruco` object describing marker detection. | |
| ## Deploying | |
| The app is Flask + PyTorch (CPU). For a public deployment: | |
| - Replace the Flask dev server with a production server (`gunicorn`). | |
| - Pin dependency versions in `requirements.txt`. | |
| - It needs ~1.5β2 GB RAM (PyTorch + the 98 MB model). | |
| - Good hosts: **Hugging Face Spaces** (free, built for ML demos), or a Docker | |
| container on Fly.io / Render / Railway. | |