This project is an implementation of the paper "LanHAR: A Novel System for Cross-Dataset Human Activity Recognition Using LLM-Generated Semantic Interpretations". It uses LLMs to generate semantic interpretations of sensor data and performs cross-dataset human activity recognition.
- LLM-based Semantic Interpretation: Generate natural language interpretations for sensor data and activity labels
- Iterative Regeneration: Quality improvement through clustering-based outlier detection and regeneration
- BERT Text Encoder: Convert semantic interpretations to embeddings
- Transformer Sensor Encoder: Map sensor data to language space
- Contrastive Learning: Align sensor and text embeddings
- UCI ADL Dataset Support: Activity recognition based on ambient sensor data
pip install -r requirements.txtAn OpenAI API key is required to use LLM features:
export OPENAI_API_KEY="your-api-key-here"Or set it directly in config.py.
Place the UCI ADL dataset in the data/UCI ADL Binary Dataset/ directory.
python main.py --mode train --max_windows 100 --max_activities 10 --epochs 10python main.py --mode generate --max_windows 50 --max_activities 5python main.py --mode evaluatepython main.py --mode train \
--dataset UCI_ADL \
--window_size 60 \
--overlap 0.8 \
--max_windows 1000 \
--max_activities 20 \
--epochs 20 \
--batch_size 64 \
--learning_rate 1e-5| Argument | Description | Default | Choices |
|---|---|---|---|
--mode |
Execution mode | train |
train, generate, evaluate |
--dataset |
Dataset to use | UCI_ADL |
UCI_ADL, MARBLE |
--window_size |
Time window size (seconds) | 60 |
Any integer |
--overlap |
Window overlap ratio | 0.8 |
0.0-1.0 |
--batch_size |
Training batch size | 32 |
Any integer |
--epochs |
Number of training epochs | 100 |
Any integer |
--learning_rate |
Learning rate | 2e-5 |
Any float |
--max_windows |
Max windows per home | 10000 |
Any integer |
--max_activities |
Max activities for interpretation | 20 |
Any integer |
--api_key |
OpenAI API key (optional) | None |
Your API key |
- UCI ADL: Ambient sensor data (PIR, Magnetic, Pressure, Flush, Electric sensors)
- MARBLE: IMU sensor data (accelerometer, gyroscope, magnetometer, barometer, smartphone)
semantic/
βββ main.py # Main execution script
βββ config.py # Configuration settings
βββ requirements.txt # Python dependencies
βββ README.md # Project documentation
βββ data/ # Dataset directory
β βββ MARBLE/ # MARBLE dataset (IMU sensors)
β βββ UCI ADL Binary Dataset/ # UCI ADL dataset (ambient sensors)
βββ dataloader/ # Data loading modules
β βββ data_loader.py # Dataset loading and preprocessing
βββ llm/ # LLM semantic generation
β βββ semantic_generator.py # Semantic interpretation generation
βββ models/ # Model implementations
β βββ text_encoder.py # Text encoder and trainer
βββ outputs/ # Generated outputs
β βββ time_windows.json # Generated time windows
β βββ semantic_interpretations.json # LLM interpretations
βββ checkpoints/ # Model checkpoints
βββ text_encoder.pth # Trained text encoder
βββ text_decoder.pth # Trained text decoder
- UCI ADL: Ambient sensor data parsing and preprocessing
- MARBLE: IMU sensor data loading and preprocessing
- Time window generation (default 60 seconds, 80% overlap)
- Train/Validation/Test split maintaining temporal order
- Data normalization and scaling
- OpenAI GPT Integration: Semantic interpretation generation
- 4-Part Prompt Structure: Data Introduction, Data Analysis, Knowledge, Task Introduction
- 3-Part Activity Prompt: General Description, Ambient Sensor Patterns, Environmental Context
- Window2Text Approach: Subject-perspective descriptions from sensor events
- Iterative Re-generation: Quality control and filtering
- Batch Processing: Efficient processing of large datasets
- BERT-based Text Encoder:
bert-base-uncasedmodel - Contrastive Learning: Alignment loss for sensor-activity matching
- Reconstruction Loss: TextDecoder for language model retention
- Early Stopping: Validation-based training termination
- GPU Acceleration: CUDA support for faster training
- TextEncoderEvaluator: Comprehensive evaluation class
- Alignment Quality: Cosine similarity metrics
- Reconstruction Quality: Cross-entropy loss assessment
- t-SNE Visualization: High-dimensional embedding visualization
- Similarity Matrix: Heatmap analysis of embeddings
- Data Preparation: Load dataset (UCI ADL or MARBLE) and generate time windows
- Semantic Interpretation Generation: LLM-based interpretation of sensor data and activity labels
- Text Encoder Training: BERT-based encoder with contrastive learning
- Model Evaluation: Comprehensive evaluation with visualization
- Output Generation: Save trained models and evaluation results
- Statistical Analysis: Ambient sensor data characteristics
- Window2Text Approach: Subject-perspective natural language descriptions
- 4-Part Prompt Structure: Systematic interpretation generation
- Iterative Re-generation: Quality control and filtering
- Alignment Loss: Sensor-activity embedding alignment
- Category Contrastive Loss: Category-wise grouping
- Activity Contrastive Loss: Activity-wise grouping
- Reconstruction Loss: TextDecoder for language model retention
- Alignment Quality: Accuracy and margin metrics
- Reconstruction Quality: Loss and accuracy assessment
- t-SNE Visualization: High-dimensional embedding visualization
- Similarity Matrix: Heatmap analysis of embeddings
- Alignment Accuracy: Sensor-activity embedding alignment quality
- Reconstruction Loss: Text reconstruction quality
- Similarity Matrix: Inter-embedding similarity analysis
- t-SNE Visualization: High-dimensional embedding space visualization
- GPU Utilization: CUDA acceleration for faster training
# Full training pipeline
python main.py --mode train --max_windows 100 --max_activities 10 --epochs 10
# Generate semantic interpretations only
python main.py --mode generate --max_windows 50 --max_activities 5
# Evaluation
python main.py --mode evaluatefrom llm.semantic_generator import SemanticGenerator
from models.text_encoder import TextEncoder, TextEncoderEvaluator
# LLM Generator
generator = SemanticGenerator()
interpretation = generator.generate_sensor_interpretation(sensor_data)
# Text Encoder
text_encoder = TextEncoder()
embeddings = text_encoder.encode_texts([interpretation])
# Evaluator
evaluator = TextEncoderEvaluator(config)
results = evaluator.comprehensive_evaluation()- API Key: Set
OPENAI_API_KEYenvironment variable for LLM integration - Memory: Sufficient memory required for large datasets (recommend 16GB+)
- GPU: CUDA-enabled GPU significantly improves training speed
- Data: Datasets must be placed in the correct
data/directory - Dependencies: Install all requirements with
pip install -r requirements.txt
outputs/time_windows.json: Generated time window dataoutputs/semantic_interpretations.json: LLM-generated semantic interpretationsoutputs/text_encoder_evaluation.json: Text encoder evaluation resultsoutputs/embedding_visualization.png: t-SNE visualizationoutputs/similarity_matrix.png: Similarity matrix heatmapcheckpoints/text_encoder.pth: Trained text encoder modelcheckpoints/text_decoder.pth: Trained text decoder model
- CUDA Error: Use CPU when GPU memory is insufficient
- API Error: Check OpenAI API key and quota
- Memory Error: Reduce batch size or use
--batch_size 16 - Data Loading Error: Check UCI ADL dataset path
When OpenAI API key is not available:
python create_dummy_interpretations.py# Run with detailed logging
python main.py --mode train --max_windows 10 --max_activities 3- Create issues to report bugs or improvements.
- Send pull requests to add new features.
- Follow PEP 8 code style.
This project is distributed under the MIT License.
- LanHAR Paper (Original paper reference)
- BERT: Pre-training of Deep Bidirectional Transformers
- Attention Is All You Need (Transformer paper)
Experience more accurate human activity recognition with the LanHAR system! π―