Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
107 changes: 107 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
# Solaritivity - AI Driven Solar Defect Intelligence Platform

An end to end governed AI system for Solar PV defect detection, impact estimation, and carbon intelligence.
Built to power India’s march toward Viksit Bharat 2047 with reliable, efficient, and safe solar infrastructure.

---

## **Problem Statement**

As India races toward Viksit Bharat 2047, solar energy is positioned to become the backbone of sustainable industrial growth. Yet, Solar PV modules silently lose 5-30% energy due to micro-cracks, manufacturing defects, and thermal hotspots. These degradations shorten module lifespan by 3-8 years, increase O&M costs, and elevate fire risks directly impacting national grid reliability, industrial productivity, and carbon efficiency. Despite 800+ GW of installed capacity worldwide, inspections remain manual, inconsistent, and non governed.

---

## **Project Idea**

Solaritivity is built on five core pillars - Integrity, Detectability, Interpretability, Sustainability, and Explainability forming a unified, future ready ecosystem for governed solar defect intelligence.

- **Multi modal defect detection & localization**
- **Energy loss + carbon impact analysis**
- **RAG Based Personalized Chatbot** with sentiment-driven response behavior
- **Digital Twin Layer** for future simulation modules
- **Explainable AI (XAI)** visualizations
- **Pipeline Automation** (Ingestion → Detection → Insights)
- **Real time monitoring layer** for enterprise ready deployment

---

## **Project Structure**

```
HACKATHON_KARUR/
├── auth/ # login + authentication logic
├── chroma_db/ # vector DB for RAG
├── data/ # raw + processed datasets
├── docs/ # documentation and reference files
├── explanations/ # XAI output maps (gradcam, saliency)
├── fyp_pycell/ # extra scripts / experimental modules
├── invalid_test_images/ # test images for invalid-input handling
├── model/ # ML/DL models, weights, checkpoints
├── modules/ # all core backend modules
├── results/ # predictions, summaries, analytics results
├── static/
│ │ ├── script.js
│ │ ├── styles.css
├── templates/
│ ├── partials/ # reusable UI components
│ │ ├── css.html
│ │ ├── js.html
│ │ ├── nav.html
│ │ ├── panel_carbon.html
│ │ ├── panel_chat.html
│ │ ├── panel_detect.html
│ │ ├── panel_detect_thermal.html
│ │ ├── panel_summary.html
│ │ ├── panel_thermal.html
│ │ ├── panel_xai.html
│ │ ├── panel_xai_thermal.html
│ │ └── panel_xai1.html
│ ├── dashboard.html
│ └── login.html
├── thermal_uploads/ # thermal image uploads
├── uploads/ # visual image uploads
├── valid_test_images/ # valid input test samples
├── app.py # main app runner
├── config.py # configuration + constants
├── gemini_check.py # Gemini API related script
├── invalid_gen.py # script for invalid image generation
├── training_vgg19.ipynb # model training notebook
├── requirements.txt # dependencies
└── .env # environment variables
```

---

## **System Architecture**

<img width="1919" height="1079" alt="image" src="https://github.com/user-attachments/assets/700b97d2-22d8-4e6c-9c00-9f97317573db" />

---

## **How to Use (Quick Start Guide)**

Follow these steps to run Solaritivity.

### 1️⃣ Clone the Repository
```bash
git clone https://github.com/paranthagan78/SolaritivityPlus
cd SolaritivityPlus
```

### 2️⃣ Create a Virtual Environment & Install Dependencies
```bash
pip install -r requirements.txt
```

### 3️⃣ Ingest the Document Dataset
```bash
python ingest.py
```

### 4️⃣ Start the Application
```bash
python app.py
```
30 changes: 29 additions & 1 deletion app.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,20 @@ def create_app() -> Flask:
chatbot_bp, weather_bp):
app.register_blueprint(bp)

# ── Eagerly load DistilBERT at startup ────────────────────────────────
# THIS IS THE KEY FIX for the teammate problem.
#
# Without this, the model loads lazily on the first request. On a machine
# that hasn't downloaded the model yet (~67 MB), the download happens during
# that first request — and every request that arrives before the download
# completes silently falls back to rule-based sentiment instead of DistilBERT.
#
# With this call, the model is fully downloaded, loaded, and warmed up
# BEFORE Flask starts serving requests. Every machine gets DistilBERT
# from request #1, regardless of whether the model was pre-cached.
from modules.chatbot.sentiment import warmup_sentiment_model
warmup_sentiment_model()

# ── Static file routes ─────────────────────────────────────────────────
@app.route("/uploads/<path:filename>")
def serve_upload(filename):
Expand Down Expand Up @@ -76,9 +90,23 @@ def dashboard():
return render_template("dashboard.html")

# ── Health check ───────────────────────────────────────────────────────
# Now includes sentiment model status so you can verify DistilBERT loaded
# correctly on any machine by hitting GET /api/health
@app.route("/api/health")
def health():
return jsonify({"status": "ok", "service": "Solar PV Defect Detection"}), 200
from modules.chatbot.sentiment import _model_loaded, _model_failed
if _model_loaded:
sentiment_status = "distilbert_ready"
elif _model_failed:
sentiment_status = "rule_based_fallback"
else:
sentiment_status = "not_loaded"

return jsonify({
"status": "ok",
"service": "Solar PV Defect Detection",
"sentiment_model": sentiment_status,
}), 200

# ── Error handlers ─────────────────────────────────────────────────────
@app.errorhandler(404)
Expand Down
Binary file added backticks.txt
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file added chroma_db/chroma.sqlite3
Binary file not shown.
11 changes: 6 additions & 5 deletions config.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,11 @@
os.makedirs(_d, exist_ok=True)

# ── Model paths ────────────────────────────────────────────────────────────
YOLO_MODEL_PATH = os.path.join(BASE_DIR, "model", "best.pt")
INTEGRITY_MODEL_PATH = os.path.join(BASE_DIR, "model", "integrity_model.pth")
CARBON_MODEL_PATH = os.path.join(BASE_DIR, "model", "carbon_model.pkl")
LABEL_ENCODER_PATH = os.path.join(BASE_DIR, "model", "label_encoder.pkl")
YOLO_MODEL_PATH = os.path.join(BASE_DIR, "model", "best.pt")
THERMAL_YOLO_MODEL_PATH = os.path.join(BASE_DIR, "model", "bestthermal.pt")
INTEGRITY_MODEL_PATH = os.path.join(BASE_DIR, "model", "integrity_model.pth")
CARBON_MODEL_PATH = os.path.join(BASE_DIR, "model", "carbon_model.pkl")
LABEL_ENCODER_PATH = os.path.join(BASE_DIR, "model", "label_encoder.pkl")

# ── CSV paths ──────────────────────────────────────────────────────────────
DETECTIONS_CSV = os.path.join(DATA_FOLDER, "detections.csv")
Expand Down Expand Up @@ -52,7 +53,7 @@
}

# ── Auth ───────────────────────────────────────────────────────────────────
PASSCODE = os.environ.get("PASSCODE", "SOLAR@2025")
PASSCODE = os.environ.get("PASSCODE", "HackFest")
SESSION_TIMEOUT = int(os.environ.get("SESSION_TIMEOUT", 3600))
MAX_ATTEMPTS = 5
LOCKOUT_DURATION = 300
Expand Down
68 changes: 68 additions & 0 deletions data/carbon.csv
Original file line number Diff line number Diff line change
@@ -1,3 +1,71 @@
timestamp,image_filename,city,panel_power_w,ambient_temp_c,irradiance_w_m2,emission_factor,num_defects,dominant_defect,total_degradation_pct,co2_kg_per_year
2026-02-19T23:52:17.786428,fb83acf6c6024c4099b8b801b329e830.jpg,Delhi,380.0,25.0,900.0,0.85,2,crack,1.42,9.55
2026-02-19T23:53:06.806821,dd203d7faf224a60812a6c2748291bb0.jpg,Delhi,380.0,25.0,900.0,0.85,2,crack,0.8,6.07
2026-02-20T12:28:08.737413,f1a95e02b29c4569acda3723704b1c06.jpg,Chennai,380.0,31.0,900.0,0.82,6,finger,0.45,7.48
2026-02-20T13:03:45.951848,fc0c05d5129b43449bcd5b63216d6b17.jpg,Chennai,380.0,32.0,900.0,0.82,1,finger,0.14,0.89
2026-02-20T13:29:28.542298,cb44158798cb4378ae7ddcaad1218250.jpg,Chennai,380.0,32.0,900.0,0.82,1,crack,0.87,4.55
2026-02-20T14:39:18.708734,f4a6c5d070cd4d11a0bd5b9019d0e005.jpg,Chennai,380.0,30.0,900.0,0.82,1,finger,0.14,0.9
2026-02-20T14:48:38.377801,ecbb22bbb95e4e8bacb99046315a110d.jpg,Chennai,380.0,32.0,900.0,0.82,1,black_core,37.43,204.64
2026-02-20T15:07:02.130804,20d6525fdf7a4d1085cb1397de6fc188.jpg,Chennai,380.0,30.0,900.0,0.82,1,black_core,38.28,204.73
2026-02-20T16:52:45.206256,fa9a250a5d364e308d92301afa276be8.jpg,Chennai,380.0,32.0,900.0,0.82,2,finger,0.34,3.38
2026-02-20T18:46:18.197115,3db7070a788c4c9e9728de40a2ec2c3e.jpg,Chennai,380.0,27.0,900.0,0.82,1,black_core,32.33,170.6
2026-02-20T16:10:48.169351,d776dc1e2458451c923ddbcbd71d717c.jpg,Chennai,380.0,30.0,900.0,0.82,1,crack,12.76,69.12
2026-02-20T16:11:03.203225,d776dc1e2458451c923ddbcbd71d717c.jpg,Chennai,380.0,30.0,900.0,0.82,1,crack,12.76,69.12
2026-02-20T16:11:17.588066,d776dc1e2458451c923ddbcbd71d717c.jpg,Chennai,380.0,30.0,900.0,0.82,1,crack,12.76,69.12
2026-02-20T16:26:29.566060,489ae0552c3e458698b4a3a6b213b166.jpg,Chennai,380.0,29.0,900.0,0.82,1,crack,12.76,69.1
2026-02-20T16:29:36.831282,bbdfd5c6f2b541a8ae665b7a4da10056.jpg,Mumbai,380.0,31.0,900.0,0.78,1,black_core,37.64,196.01
2026-02-20T16:31:28.365827,unknown,Mumbai,380.0,31.0,900.0,0.78,0,black_core,0.0,0.86
2026-02-20T16:32:42.405905,d7d073f015504945b743bf22218d1a43.jpg,Mumbai,380.0,31.0,900.0,0.78,2,finger,0.34,2.87
2026-02-20T16:35:39.052999,b66d8ff882b543a88efab271f23daeaf.jpg,"Thalavapalayam, Karur",380.0,34.0,900.0,0.8,3,finger,7.9,43.31
2026-02-20T16:38:32.426088,e3629abe48fc4bfeb449c7fee882a1ff.jpg,"Thalavapalayam, Karur",380.0,34.0,900.0,0.8,1,black_core,39.27,200.86
2026-02-20T16:48:47.831969,e8c0b12fdf2b4a16bd028f8036d8ae8c.jpg,"Thalavapalayam, Karur",380.0,33.0,900.0,0.8,1,black_core,39.27,200.83
2026-02-20T16:49:49.442941,afa768841e8b450c8e75d2348d48eafb.jpg,"Thalavapalayam, Karur",380.0,33.0,900.0,0.8,1,crack,12.76,68.12
2026-02-20T17:08:45.494390,e64fc47c9c114afca19783b48eaf9fd9.jpg,"Thalavapalayam, Karur",380.0,33.0,900.0,0.8,2,finger,0.34,3.33
2026-02-20T17:10:31.662859,6a1a647c3d904c03ab0df1ce926f01b2.jpg,"Thalavapalayam, Karur",380.0,33.0,900.0,0.8,3,crack,7.9,43.31
2026-02-20T17:20:43.402220,7f8ce02c0c3c458f9d4ffa3887041a36.jpg,"Thalavapalayam, Karur",380.0,33.0,900.0,0.8,1,black_core,37.64,200.83
2026-02-20T17:22:29.708047,f0dfcecb0b4d4cd3b897c79b50c19622.jpg,"Thalavapalayam, Karur",380.0,33.0,900.0,0.8,1,crack,0.9,5.35
2026-02-20T18:04:57.334796,a671857c6760492dbd0674ef1746140e.jpg,"Thalavapalayam, Karur",380.0,32.0,900.0,0.8,1,black_core,39.82,200.77
2026-02-20T18:06:35.371468,a81aaf65edbb4cea929811b42b7d34e0.jpg,"Thalavapalayam, Karur",380.0,32.0,900.0,0.8,5,finger,0.7,6.6
2026-02-20T18:10:04.070486,unknown,"Thalavapalayam, Karur",380.0,32.0,900.0,0.8,0,black_core,0.0,0.99
2026-02-20T18:12:28.066943,unknown,"Thalavapalayam, Karur",380.0,32.0,900.0,0.8,0,black_core,0.0,0.99
2026-02-20T18:13:04.915114,unknown,"Thalavapalayam, Karur",380.0,32.0,900.0,0.8,0,black_core,0.0,0.99
2026-02-20T18:50:05.829353,unknown,"Thalavapalayam, Karur",380.0,31.0,900.0,0.8,0,black_core,0.0,1.0
2026-02-20T18:56:50.865377,59cbb8a88822463dbbba1d8fd2b025db.jpg,"Thalavapalayam, Karur",380.0,31.0,900.0,0.8,5,finger,0.7,6.6
2026-02-20T19:18:38.842609,cea2b4f521264f61a3547a726e0e3bea.jpg,"Thalavapalayam, Karur",380.0,30.0,900.0,0.8,1,finger,0.19,1.62
2026-02-20T19:22:50.583742,5952fedc7f65417c95407d6b6e4ffff2.jpg,"Thalavapalayam, Karur",380.0,30.0,900.0,0.8,1,black_core,40.0,200.87
2026-02-20T20:43:10.641819,b6e3ba3cb62e497a8fc0a7968480ae26.jpg,"Thalavapalayam, Karur",380.0,28.0,900.0,0.8,2,finger,0.34,3.34
2026-02-20T20:55:07.039752,a0df065710e24bb2b4323bbefbe59f44.jpg,"Thalavapalayam, Karur",380.0,28.0,900.0,0.8,3,finger,3.69,20.76
2026-02-20T21:15:25.557610,32814407b22d4be9bd3576b593bfd054.jpg,"Thalavapalayam, Karur",380.0,27.0,900.0,0.8,1,crack,0.71,3.84
2026-02-20T21:17:19.103017,08c69eff45214e72b09ec77f630d1171.jpg,Fort Worth,380.0,6.0,900.0,0.8,3,crack,7.9,43.36
2026-02-20T21:20:59.307689,e10852b13c574c94a6a27e612f223dd1.jpg,"Thalavapalayam, Karur",380.0,27.0,900.0,0.8,3,crack,7.9,43.31
2026-02-20T21:22:23.688302,adee2ce989a146d3a427f31d3cdd9e7e.jpg,"Thalavapalayam, Karur",380.0,27.0,900.0,0.8,3,crack,7.9,43.31
2026-02-20T22:03:41.083880,f59c69d55bf3467f98b45197fcec07b4.jpg,"Thalavapalayam, Karur",380.0,27.0,900.0,0.8,3,finger,7.9,43.31
2026-02-20T23:13:31.481230,832a638e6bbc4ed98d75cc9d60fbf48b.jpg,"Thalavapalayam, Karur",380.0,26.0,900.0,0.8,1,black_core,37.64,200.48
2026-02-20T23:14:55.071865,50bc6dd265274e9d9ed0f594a0b85f20.jpg,"Thalavapalayam, Karur",380.0,26.0,900.0,0.8,3,black_core,7.9,43.3
2026-02-20T23:21:27.746803,ece21e99bb694264adfb4194867d201f.jpg,"Thalavapalayam, Karur",380.0,25.0,900.0,0.8,1,black_core,37.64,200.48
2026-02-20T23:25:08.309735,26dae42761c949df8307393e1ebf1b7e.jpg,"Thalavapalayam, Karur",380.0,25.0,900.0,0.8,1,black_core,37.64,200.48
2026-02-20T23:27:59.501476,9e7e01f0a07b4d338969f2eda0efa874.jpg,"Thalavapalayam, Karur",380.0,25.0,900.0,0.8,1,black_core,37.64,200.48
2026-02-20T23:30:27.958387,c3b7ae8ff7dc4ffab9f19292b0c97661.jpg,"Thalavapalayam, Karur",380.0,25.0,900.0,0.8,1,black_core,37.64,200.48
2026-02-20T23:40:55.690781,4aca04cbda9441e2a91812954b992f83.jpg,"Thalavapalayam, Karur",380.0,25.0,900.0,0.8,2,finger,0.34,3.33
2026-02-21T08:22:00.543834,202afc91227e44bfb73b917280781c4c.jpg,"Thalavapalayam, Karur",380.0,25.0,900.0,0.8,1,black_core,37.64,200.48
2026-02-21T08:40:42.913738,8e8026f14bb2448fa966c3b555363815.jpg,"Thalavapalayam, Karur",380.0,26.0,900.0,0.8,1,black_core,38.28,200.48
2026-02-21T08:43:20.178768,dbbfffed512849f5abbd8db3853a83ab.jpg,"Thalavapalayam, Karur",380.0,26.0,900.0,0.8,1,black_core,37.64,200.48
2026-02-21T09:00:06.901018,3172bbd7795848fbb7ff0bab0806ee8e.jpg,"Thalavapalayam, Karur",380.0,27.0,900.0,0.8,2,finger,2.42,13.85
2026-02-21T09:02:23.634324,fe305043ffe34d629c52b5bbef02453d.jpg,"Thalavapalayam, Karur",380.0,27.0,900.0,0.8,1,crack,1.16,6.69
2026-02-21T09:03:19.008549,40d550410790458ea5f2dfb1a0beffc1.jpg,"Thalavapalayam, Karur",380.0,27.0,900.0,0.8,1,black_core,35.98,185.1
2026-02-21T09:04:48.228536,65b20bd844da4dd7be81e64e5a62d397.jpg,"Thalavapalayam, Karur",380.0,27.0,900.0,0.8,1,black_core,39.27,200.72
2026-02-21T09:12:12.633639,6f3e03f3a18c490692172e34e6bc9b82.jpg,Chennai,380.0,32.0,900.0,0.82,1,black_core,39.27,204.64
2026-02-21T09:16:08.057523,fe53d4a66d3a4418b768acc7a1ea3eaa.jpg,"Thalavapalayam, Karur",380.0,27.0,900.0,0.8,1,black_core,39.27,200.72
2026-02-21T09:17:54.697915,f8ba7eaa9e394dc1aedeff77fd4f7444.jpg,"Thalavapalayam, Karur",380.0,32.0,900.0,0.8,1,black_core,39.27,200.77
2026-02-21T09:19:13.227453,ac645665379b4b4d8fcb560cbb0ced2d.jpg,Chennai,380.0,32.0,900.0,0.82,1,black_core,39.27,204.64
2026-02-21T09:21:48.315160,a444e738d98f4fbb94bada5110fd4575.jpg,"Thalavapalayam, Karur",380.0,28.0,900.0,0.8,1,black_core,38.28,200.78
2026-02-21T09:38:08.276310,5bd1493a63a14d17bb6b7435cab529a2.jpg,"Thalavapalayam, Karur",380.0,28.0,900.0,0.8,1,black_core,38.28,200.78
2026-02-21T09:46:17.153398,072eb752bd1c446c9720f0fa796687c3.jpg,"Thalavapalayam, Karur",380.0,29.0,900.0,0.8,1,crack,0.87,4.6
2026-02-21T09:53:20.995076,188b1882313c40a891d13f76c46ab8c2.jpg,"Thalavapalayam, Karur",380.0,32.0,900.0,0.8,3,black_core,7.9,43.31
2026-02-21T10:03:13.366105,a9707141cf164f9792109d36118b668d.jpg,"Thalavapalayam, Karur",380.0,29.0,900.0,0.8,3,crack,7.9,43.31
2026-02-21T10:12:11.623677,5eabc5295e124fa797fc1156f29b9cc4.jpg,"Thalavapalayam, Karur",380.0,29.0,900.0,0.8,1,black_core,38.28,200.85
2026-02-21T10:19:07.355053,2ef1b37221da44db9e7aed6d8c1f4207.jpg,"Thalavapalayam, Karur",380.0,30.0,900.0,0.8,1,black_core,37.64,200.87
2026-02-21T10:26:26.212152,c579f85c6f4349e08b0e675c75394df7.jpg,"Thalavapalayam, Karur",380.0,30.0,900.0,0.8,1,black_core,32.33,167.1
2026-02-21T10:30:48.462866,50145cfd87714a1c9f42dbf2a8e80b1b.jpg,"Thalavapalayam, Karur",380.0,30.0,900.0,0.8,2,finger,0.32,3.36
2026-02-21T11:17:26.671286,cb8b1801ed8f421e9865567aa8e74744.jpg,"Thalavapalayam, Karur",380.0,31.0,900.0,0.8,5,finger,0.7,6.6
2026-03-24T23:50:31.456014,a6672fc74dd44e82810a9858b48c48bc.jpeg,"Thalavapalayam, Karur",380.0,27.0,900.0,0.8,2,finger,0.34,3.33
Loading