Structural Health Monitoring: G. Meazza Stadium

The goal was early warning of damage to the stands of Milan’s G. Meazza stadium: a classifier trained on two years of vibration data tells a healthy stand from a near-identical neighbor that represents the damaged state, with 97% accuracy on recordings it had never seen. Designed as the core of a real-time warning system, it misses 2.27% of the damage-proxy cases and raises 3.02% false alarms.

Project
M.Sc. thesis project
Institution
Politecnico di Milano
Site
Giuseppe Meazza Stadium, Milan
My role
Signal processing, feature selection, classifier design and validation
Tools
MATLAB (Signal Processing, Statistics & ML Toolboxes)
Interior view of the G. Meazza (San Siro) stadium, showing the tiered seating and roof structure
Interior view of the G. Meazza (San Siro) Stadium in Milan, showing the three structural rings.
  • 97%classification accuracy on 397 recordings the model never saw
  • 2.27%missed-detection rate (damage read as healthy)
  • 3.02%false-alarm rate (healthy read as damaged)
  • 4,00010-minute recordings, mid-2018 to mid-2020

Skills shown

  • Vibration & Modal Analysis Fundamentals
  • Sensor Data Acquisition (DAQ)
  • Signal Processing (Spectral & Statistical Features)
  • MATLAB
  • Data-Driven Structural Assessment
  • Classifier Optimization & Validation
  • Large-Scale Structural Systems
  • Technical Reporting

How I did it

Large structures age, get pushed past their original design life, and get used for loads they weren’t originally sized for, like concerts stacked on top of football matches. Manual inspection can’t keep pace with that. The goal was an automated, sensor-based system that flags a change in structural behavior as soon as it shows up in the vibration data, without needing a full analytical model of the structure.

  1. Detect a change in structural behavior automatically, from data the site already collects, without interrupting normal operation.
  2. Classify a reading as healthy or anomalous in real time, fast enough to be useful for a live monitoring system rather than a post-processed report.
  3. Avoid depending on a finite-element model of the whole structure, impractical to build and keep accurate for a structure that has been extended and modified multiple times since 1925.
  4. Validate the method against real, full-scale field data, not a lab specimen or a simulation.
  5. Reach a classification accuracy reliable enough to justify extending the method to the rest of the monitoring network.
  1. The structure & monitoring network

    Permanent accelerometer network · 5 CompactRIO units

    San Siro is Italy’s largest stadium and one of its structurally most complex: three seating rings, each built in a different era with a different structural system, plus an independently supported roof carrying its own load path.

    Seats
    75,817, the largest stadium in Italy
    Structural rings
    3, each a different era & system
    Accelerometers per monitored stand
    2 (vertical + horizontal)
    Vibration data used
    2018–20
    Labeled cross-section and photo of the stadium's first, second and third structural rings
    Cross-section and photo of the first, second, and third structural rings, each built in a different construction phase and load path. Select to enlarge.
    Cross-section showing accelerometer placement across the three seating tiers
    Accelerometer placement across the first, second, and third tiers.
    Map of the permanent monitoring network showing stand numbers and the color-coded zones of the five acquisition units
    Layout of the permanent monitoring network: five National Instruments CompactRIO acquisition units, each covering a color-coded zone of stands. Select to enlarge.
  2. Method

    MATLAB · vibration features + supervised classifier

    Rather than model the whole structure, the approach compares new vibration readings against a known reference condition, conceptually the same thing as a modal analysis in FEA, where a shift in natural frequency or mode shape relative to a baseline model gets read as damage. Here, the baseline is a real, healthy stand instead of a healthy FE model.

    Classification = Classifier (27 vibration-derived features, extracted from a 10-minute accelerometer recording)

    • Two accelerometers (vertical + horizontal) per stand feed a permanent, wired monitoring network sampling at 128 Hz.
    • Stand 2041 is treated as the healthy reference; a structurally similar neighboring stand, 2051, stands in for the damaged case. It is deliberately the hardest comparison available, since the two behave almost identically under normal loading.
    • 27 features are extracted per recording: spectral features sensitive to changes in stiffness and mass, and statistical features sensitive to smaller changes the spectral ones miss.
    • A classifier is trained on 70% of the dataset, validated on the remaining 30%, then stress-tested on recordings it never saw during training or tuning.
    • Feature extraction, classifier training, optimization, and code generation for deployment were all done in MATLAB.

    Anyone who has run a modal analysis in FEA has already done a version of this: perturb a model’s stiffness or mass, watch its natural frequencies and mode shapes shift, and read that shift as damage. This project runs the same logic on a real structure, with sensor data standing in for the FE model.

    Same logic as an FEA modal damage check
    In an FEA modal studyIn this project
    Build the FE model of the healthy part or structure.Two real, near-identical stands stand in for the healthy and damaged model.
    Introduce a stiffness or mass change to represent damage.Accelerometers replace the FE solver as the source of dynamic data.
    Re-run the modal analysis.27 features are extracted, several of them the same modal quantities an FEA report would list: dominant frequency, frequency ratio, spectral entropy.
    Compare natural frequencies and mode shapes to the baseline.A trained classifier replaces manual mode-shape comparison.
    A shift beyond tolerance flags damage.A deviation from the healthy baseline flags damage, in real time and on real data.
  3. Engineering process

    Feature selection → classifier benchmark → tuning → blind test

    Four stages, each narrowing in on a real-time, reliable classifier, plus one deliberate step back from the “best” validation result once it stopped generalizing.

    Backing off from the best validation score to the best test score was a deliberate call: fewer iterations avoided overfitting to the training data, and generalized better to data the model had truly never seen. Because the blind-test results guided that choice, the 97% should be confirmed on a fresh hold-out set before deployment (see the recommendations).

    1. Feature selection
    All 27 features kept: 86.2% vs. 78.1% (5 NCA) and 80.2% (7 hybrid)
    2. Classifier selection
    Boosted Trees Ensemble, best of 30: 86.3%, AUC 0.94
    3. Cost ratio & tuning
    5 : 3 cost ratio; false alarms 17.8% → 12.6%
    4. Independent blind test
    8 iterations, not 14: 2.27% / 3.02% errors
    Blind-test confusion matrices at the 4th, 8th and 14th hyperparameter search iterations
    Blind-test confusion matrices at the 4th (a), 8th (b), and 14th (c) search iterations. 8 iterations gives the best, most balanced result. Select to enlarge.

    Each stage in full, with its figures, is in the technical details.

How I checked the results

The optimized classifier reaches 97% accuracy on data it never saw during training or tuning, with both error types low enough to trust for a real monitoring system.

97%

classification accuracy on the independent blind-test set (397 unseen recordings)

The model correctly separates the healthy stand from the damage-simulating stand in 97 of every 100 unseen recordings: a 2.27% missed-detection rate (damage-proxy stand read as healthy) and a 3.02% false-alarm rate (healthy read as damaged), achieved between two structurally near-identical stands, the hardest comparison in the dataset.

Classification accuracy through the engineering process

Validation / test accuracy at each stage, %. Hover a bar for details.

Accuracy: 86.2% for the baseline benchmark of 30 classifiers, 88.5% after cost and hyperparameter tuning, and 97% on the final blind test with unseen data.
Checkpoints, metric, result and status
CheckpointMetricResultStatus
Feature-set selectionValidation accuracy, 27 features86.2%Selected
Classifier benchmarkBest of 30 classifiers (Boosted Trees Ensemble)86.3% val., AUC 0.94Selected
Cost-ratio & hyperparameter tuningFalse-alarm rate (healthy → damaged)17.8% → 12.6%Improved, imbalance remained
Independent blind test (8 iterations)Missed-detection / false-alarm rate2.27% / 3.02%Validated
Overall resultFinal classification accuracy, unseen data97%Validated

Engineering judgment and recommendations

Beyond the headline accuracy number, working through this pipeline surfaced a few things worth flagging before a method like this goes into a production monitoring system.

  • Flagged

    No confirmed real-damage case yet

    The damaged condition here is a proxy: a genuinely undamaged but structurally distinct stand standing in for stand 2041’s damaged state. The classifier has never been tested against a confirmed real damage event. Before relying on it operationally, it should be checked against retrofit, repair, or incident data as that becomes available.

  • Flagged

    Confirm the 97% on a fresh hold-out set

    The blind-test results also decided the final setting (8 search iterations instead of 14), so the same recordings served for both model selection and the final score. The 97% is therefore slightly optimistic; a new, untouched set of recordings, or a nested cross-validation, should confirm it before the classifier goes into service.

  • Opportunity: extend to farther, more different stands

    Stands 2041 and 2051 were deliberately the hardest pair available, adjacent, near-identical, and easy to confuse. The same 27-feature pipeline should generalize more easily to stand pairs with more distinct dynamic behavior. Extending it there is the natural next step, with an even higher accuracy bar to clear.

  • Re-baseline after any structural modification

    The healthy reference is empirical, drawn from stand 2041’s measured behavior between 2018 and 2020. Any future modification to that stand, or to the load path around it, would invalidate the baseline. The same discipline used to update an FE model after a design change applies here: re-collect reference data and retrain.

  • Cost ratio was tuned for this pair, not universally

    The 5:3 cost ratio that balanced the error rates was found by trial and error on this specific stand pair. Rolling the same pipeline out to other locations should treat that ratio as a parameter to re-tune, not a constant to reuse, since baseline noise and structural similarity will differ from stand to stand.

Technical details

The data summary and each stage of the engineering process in full, for engineers who want to go deeper.

Data summary Instrumentation, recording and dataset: 128 Hz, 10-minute windows, 4,000 recordings, 70/30 split

Two years of field data, condensed into a dataset large enough to train a classifier and still hold back a genuinely independent test set.

Data summary
ParameterValue
Instrumentation
Sensors per monitored stand2 (vertical + horizontal accelerometer)
Acquisition hardware5× National Instruments CompactRIO units
Sampling frequency128 Hz
Recording
Window length600 s (10 min), no overlap
Excitation conditionAmbient (empty stadium, no live event)
Collection spanMid-2018 – Mid-2020
Dataset
Total recordings4,000
Training / validation split70% / 30%
Independent blind-test set~397 recordings
Features extracted per recording27 (spectral + statistical)
Engineering process: the four stages Feature selection, classifier benchmark, cost-ratio and hyperparameter tuning, independent blind test

Four stages, each narrowing in on a real-time, reliable classifier. The blind-test confusion matrices for the fourth stage are shown in step 3.

01. Feature selection: full set vs. reduced set

Approach

Fewer features generally means faster processing, so three feature sets were benchmarked head-to-head: all 27 features, 5 features selected by Neighborhood Component Analysis (NCA), and a 7-feature hybrid built by adding back two physically meaningful features.

27 → 86.2%full set, selected5 → 78.1%NCA-reduced7 → 80.2%hybrid set

Reducing the feature set cut processing time by up to 60%. However, since processing time remained real-time across all scenarios, this reduction came at too high an accuracy cost for a safety-relevant application. Therefore, all 27 features were retained for the remainder of the study.

NCA feature weighting factor chart showing five dominant features out of 27
NCA feature-weighting result: only 5 of 27 features carry meaningful weight, yet using just those five underperforms the full set. Select to enlarge.

02. Classifier selection: benchmarking 30 models

Approach

30 classifiers across eight families (decision trees, SVM, ensembles, neural networks, and more) were trained and validated on the same feature table to find the best fit for this data.

86.3%Boosted Trees Ensemble, validation accuracy0.94AUC, ROC curve

Ensemble methods and nonlinear SVM performed best; discriminant analysis failed outright, most likely because some features were constant or linearly dependent within a class, which makes the class covariance matrices singular. Processing time was fast enough across the board that accuracy, not speed, drove the choice.

ROC curve of the selected Boosted Trees classifier
ROC curve of the selected classifier (AUC = 0.94). Select to enlarge.
Confusion matrix before optimization, showing an imbalanced misclassification split
Confusion matrix before optimization: correct classification 82.2% / 90.2%, an imbalanced split. Select to enlarge.

03. Cost-ratio & hyperparameter optimization

Approach

The raw classifier raised too many false alarms for a monitoring application (17.8% of healthy readings misread as damaged). Two levers were tuned to fix that: a misclassification cost ratio, biasing the classifier toward the healthy stand, and the classifier’s own hyperparameters, via Bayesian optimization.

Best cost ratio = 5 : 3   |   hyperparameter search plateaued at 14 iterations

17.8% → 12.6%false-alarm rate9.8% → 10.4%missed-detection rate

The trade-off improved the priority metric but didn’t fully resolve the imbalance, a sign that 14 iterations were starting to overfit. That is exactly what the next stage was designed to catch.

Bayesian hyperparameter search convergence chart
Hyperparameter search: minimum classification error vs. number of function evaluations. Select to enlarge.
Confusion matrix after optimization at 14 iterations
Confusion matrix after optimization (14 iterations). Select to enlarge.

04. Independent blind test: guarding against overfitting

Approach

The 14-iteration model looked best on validation data, but validation data isn’t proof of real-world performance. The model was re-tested on ~397 recordings it had never seen, at three different hyperparameter-search lengths, to check which one actually generalized best.

8 iterationsbest-generalizing model, not the 14 that looked best on validation2.27% / 3.02%missed-detection / false-alarm rate, final

Backing off from the best validation score to the best test score was a deliberate call: fewer iterations avoided overfitting to the training data, and generalized better to data the model had truly never seen. Because the blind-test results guided that choice, the 97% should be confirmed on a fresh hold-out set before deployment (see the recommendations).

Questions about this project?

I’m happy to walk through the data and results in more detail.