v2.4.2+ - Complete Feature Export & Enhanced Progress
Release Date: October 12, 2025
Tagline: All Computed Features Now Exported - Complete ML-Ready Datasets
π― Overviewβ
Version 2.4.2+ addresses a critical feature export issue where only 12 features were being saved despite computing 35-45+ features in full mode. This release ensures all computed geometric features are exported to disk across all output formats (NPZ, HDF5, PyTorch, LAZ), with enhanced metadata tracking and improved progress reporting.
Datasets generated before v2.4.2+ may be missing critical features. We recommend regenerating training datasets to access the complete feature sets.
β¨ What's Newβ
Complete Feature Exportβ
- π All Features Saved: Fixed critical bug where only 12/43 features were exported
- π Feature Metadata: Added
metadata['feature_names']
list andmetadata['num_features']
count - π― Consistent Ordering: Features exported in reproducible order across all formats
- πΎ Complete LAZ Export: All geometric features now saved as extra dimensions in LAZ files
- π Feature Tracking: Easy verification of which features are in your datasets
Enhanced Progress Reportingβ
- π Detailed Progress Bars: Point counts, chunk info, memory usage, and processing rates
- π― Mode Indicators: Visual indicators for GPU (π―), GPU fallback (π§), and CPU (π») modes
- β±οΈ Better Time Estimates: Accurate remaining time predictions for long-running jobs
- π Completion Statistics: Summary statistics after feature computation completes
π Feature Export Detailsβ
Before v2.4.2 (Bug)β
Issue: Only 12 features exported despite computing 35-45+
# What was computed (43+ features):
# - Normals (3), Curvature (2), Eigenvalues (5), ...
# - Architectural (5), Density (5), Height (7), ...
# What was saved (only 12 features):
features = [
'normal_x', 'normal_y', 'normal_z',
'curvature', 'planarity', 'linearity',
'sphericity', 'verticality', 'density',
'height_above_ground', 'wall_score', 'roof_score'
]
After v2.4.2+ (Fixed)β
All Features Exported in consistent order:
# Normals (3)
['normal_x', 'normal_y', 'normal_z']
# Core shape descriptors (6)
['planarity', 'linearity', 'sphericity', 'anisotropy', 'roughness', 'omnivariance']
# Curvature features (2)
['curvature', 'change_curvature']
# Eigenvalue features (5)
['eigenvalue_1', 'eigenvalue_2', 'eigenvalue_3', 'sum_eigenvalues', 'eigenentropy']
# Height features (7)
['height_above_ground', 'vertical_std', 'z_normalized',
'z_absolute', 'z_from_ground', 'z_from_median', 'distance_to_center']
# Building scores (3)
['verticality', 'wall_score', 'roof_score', 'horizontality']
# Density features (5)
['density', 'local_density', 'num_points_2m', 'neighborhood_extent', 'height_extent_ratio']
# Architectural features (5)
['edge_strength', 'corner_likelihood', 'overhang_indicator',
'surface_roughness', 'local_roughness']
# Total: 38-43+ features depending on mode
π§ Technical Changesβ
Feature Matrix Constructionβ
Updated: base_formatter.py
- _build_feature_matrix()
- Returns all computed features in consistent order
- Added
return_feature_names=True
parameter for metadata - Comprehensive feature ordering for reproducibility
LAZ Export Enhancementβ
Updated: serialization.py
- _add_geometric_features()
# Before: Only 8 features
geometric_features = [
'planarity', 'linearity', 'sphericity', 'anisotropy',
'roughness', 'density', 'curvature', 'verticality'
]
# After: All 35+ features
geometric_features = [
# Core shape descriptors (6)
'planarity', 'linearity', 'sphericity',
'anisotropy', 'roughness', 'omnivariance',
# Curvature (2)
'curvature', 'change_curvature',
# Eigenvalues (5)
'eigenvalue_1', 'eigenvalue_2', 'eigenvalue_3',
'sum_eigenvalues', 'eigenentropy',
# Building scores (4)
'verticality', 'horizontality', 'wall_score', 'roof_score',
# Density (5)
'density', 'local_density', 'num_points_2m',
'neighborhood_extent', 'height_extent_ratio',
# Architectural (5)
'edge_strength', 'corner_likelihood', 'overhang_indicator',
'surface_roughness', 'local_roughness',
]
Progress Bar Enhancementsβ
Updated: All feature computation modules
# Before: Basic progress
"Processing chunk X/Y..."
# After: Detailed context
"π― GPU Features [cuML] (10,234,567 pts, 42 chunks @ 245.2MB)"
"π» CPU Features (5,123,456 pts, 21 chunks @ 122.6MB)"
"π§ GPU Features [sklearn] (8,765,432 pts, 35 chunks @ 210.1MB)"
π Impact & Benefitsβ
Complete ML Trainingβ
- No Missing Features: All computed features now available for training
- Better Model Performance: Access to all 35-45+ features improves model accuracy
- Feature Analysis: Can now analyze importance of all computed features
- Reproducibility: Feature names in metadata ensure consistent feature ordering
File Size Considerationsβ
- NPZ/HDF5/PyTorch: ~3-4x larger (12 β 43 features)
- LAZ: ~2-3x larger (7 β 35 extra dimensions)
- Trade-off: Complete feature sets worth the storage increase
GIS Interoperabilityβ
- LAZ Export: All features as extra dimensions
- QGIS/CloudCompare: Can visualize all computed features
- Feature Inspection: Verify feature computation visually
π Migration Guideβ
Regenerate Datasetsβ
If you generated datasets before v2.4.2+, we recommend regenerating:
# Backup existing datasets
mv patches/ patches_old/
# Regenerate with full features
ign-lidar-hd process \
--config-file examples/config_lod3_full_features.yaml \
input_dir=data/ \
output_dir=patches/
Verify Feature Completenessβ
Check your datasets have all features:
import numpy as np
# Load a patch
data = np.load('patches/patch_001.npz')
# Check feature count and names
print(f"Features: {data['metadata'].item()['num_features']}")
print(f"Names: {data['metadata'].item()['feature_names']}")
# Expected for full mode: 38-43+ features
# Expected for LOD3: 35-38 features
# Expected for LOD2: 12 features
π Verificationβ
Feature Export Testβ
from ign_lidar.io.formatters.hybrid_formatter import HybridFormatter
# Create formatter
formatter = HybridFormatter(
use_rgb=True,
use_infrared=True,
use_geometric=True
)
# Format a patch
formatted = formatter.format_patch(patch)
# Check metadata
metadata = formatted['metadata']
print(f"β Features exported: {metadata['num_features']}")
print(f"β Feature names: {metadata['feature_names']}")
LAZ Feature Inspectionβ
Open exported LAZ files in QGIS or CloudCompare:
- Load LAZ file
- View "Extra Dimensions" list
- Verify all 35+ geometric features present
- Visualize features using color mapping
π Documentation Updatesβ
- β Updated Feature Modes Guide
- β Updated Output Formats Guide
- β Added feature count tables
- β Updated README with v2.4.2+ notice
- β Added feature verification examples
π Bug Fixesβ
Critical Fixesβ
- Feature Export: All computed features now saved to disk (previously only 12/43)
- LAZ Export: All geometric features now exported as extra dimensions
- Progress Bars: Added missing context (point counts, chunk info, rates)
Impactβ
- High: Datasets missing up to 31 features in full mode
- Medium: LAZ files missing 27+ extra dimensions
- Low: Progress bars lacked helpful context
π What's Next?β
See the Feature Modes Documentation for:
- Complete feature lists for each mode
- Performance comparisons
- Best practices for feature selection
- Training tips for LOD2/LOD3/Full modes
π Changelog Summaryβ
Added:
- Feature name tracking in metadata
- Feature count in metadata
- Enhanced progress bars with detailed statistics
- Complete feature export across all formats
Changed:
- Feature matrix construction exports ALL features
- LAZ export includes ALL geometric features
- Progress bars show point counts, chunks, memory, rates
- File sizes increase ~3-4x for complete feature sets
Fixed:
- Feature export bug (only 12/43 features saved)
- LAZ missing geometric features
- Progress bars missing helpful context
Ready to use complete feature sets? Get Started β