✦ Research Deep Dive ⏳ 8 min read • Astroinformatics & Deep Learning

Astro Py: Exoplanet Detection & Transit Photometry Deep Dive

A 2-month scientific journey born from an ISRO hackathon problem statement. Exploring transit light curves, Kepler & TESS archival photometry, the evolution of automated vetting architectures (from Kepler Autovetter to AstroNet & ExoMiner++), and developing a 5-class multi-branch CNN classifier.

📑 Article Table of Contents

01. The Spark & Problem Statement

My journey into astroinformatics began with an ISRO hackathon problem statement. I had always been captivated by the scale of the cosmos, but looking at actual space telescope data revealed a massive challenge: NASA’s Kepler and TESS missions have collected hundreds of thousands of stellar light curves, each containing subtle dips in brightness.

While existing machine learning models typically perform binary classification (Planet vs. Non-Planet), real-world astronomical catalogs require deeper discrimination. Thousands of non-planetary dips are caused by authentic astrophysical phenomena like eclipsing binaries or background stellar variability. I set out to explore whether a neural network could identify not just if a transit dip is a planet, but specifically which astronomical event produced the signal.

02. Astronomy & Transit Photometry Fundamentals

When an exoplanet orbits in front of its host star relative to our line of sight, it blocks a tiny fraction of the star's emitted light. This creates a periodic dip in the measured brightness over time—known as a transit light curve.

Core Photometric Equations

Transit Depth (δ): δ ≈ (Rp / R*)2 — proportional to the ratio of planetary radius to stellar radius.
Orbital Period (P): Time interval between consecutive transit ingress center points.
Transit Duration (T): Total time the planet spends crossing the stellar disc.

Because typical Earth-sized exoplanets cause brightness drops of less than 0.01% (100 parts per million), raw light curves are heavily corrupted by stellar flares, instrumental jitter, and cosmic ray hits.

03. Kepler & TESS Data Archives

NASA's MAST (Mikulski Archive for Space Telescopes) hosts the complete catalog of Kepler Objects of Interest (KOI). The catalog partitions detections into:

04. Astrophysical False Positives & Mimics

Exoplanet vetting models fail most often when encountering astronomical mimics:

  1. Eclipsing Binaries (EB): Two stars orbiting each other, causing deeper V-shaped or alternating primary/secondary eclipses.
  2. Background Eclipsing Binaries (BEB): A faint background binary aligned along the same pixel line of sight, diluting the eclipse depth to mimic an exoplanet.
  3. Centroid Offset Motion: Significant shifts in the center of light flux during transit indicate the signal originates from a nearby companion star rather than the target star.
  4. Instrumental & Systematic Noise: Spacecraft momentum wheel desaturations and thermal drift.

05. Lightkurve & Signal Processing Pipeline

Raw Target Pixel Files (TPF) are converted into high-signal time series through a multi-stage preprocessing pipeline:

STAGE 01
FITS Extraction
MAST query & Simple Aperture Photometry (SAP/PDCSAP).
STAGE 02
Flatten & Detrend
Savitzky-Golay filtering to remove low-frequency stellar activity.
STAGE 03
BLS Periodogram
Box Least Squares search for optimal period (P) and transit epoch (t0).
STAGE 04
Phase Folding
Folding all orbits into unified Global & Local normalized views.

06. Evolution of State-of-the-Art Architectures (2015–2025)

Before designing my model, I analyzed how the research field progressed over the past decade:

Model & Year Core Architecture Input Representations Classification Goal
Kepler Autovetter (2015) Random Forest Handcrafted scalar transit features 3-Class candidate triage
AstroNet (2018 - Google/NASA) Dual-Branch CNN Global View + Local View light curves Binary: Planet vs False Positive
ExoNet (2019) Transfer Learning CNN Pre-trained representations on Kepler Binary classification with faster convergence
ExoMiner (2022) Multi-Modal Deep Net Light curves + Centroid curves + Stellar params Multi-factor NASA validation benchmark
ExoMiner++ (2025) Transformer + CNN Hybrid Unfolded + Folded + Multi-spectral images Multi-mission (Kepler + K2 + TESS) vetting

07. 5-Class Multi-Branch CNN Design

Inspired by AstroNet and ExoNet, my custom architecture feeds two distinct temporal resolutions into parallel 1D convolutional branches:

5 Target Classification Classes

1. Planet Transit • 2. Stellar Eclipse • 3. Centroid Offset • 4. Ephemeris Match • 5. Non-Transit Noise

08. Code Implementation Snippet

Here is the core PyTorch architecture implementation combining dual 1D convolutional feature extractors with a unified multi-layer classifier:

import torch
import torch.nn as nn

class MultiBranchAstroCNN(nn.Module):
    def __init__(self, num_classes=5):
        super(MultiBranchAstroCNN, self).__init__()
        
        # Global View Branch (2001 time bins)
        self.global_branch = nn.Sequential(
            nn.Conv1d(in_channels=1, out_channels=32, kernel_size=5, padding=2),
            nn.ReLU(),
            nn.MaxPool1d(kernel_size=2),
            nn.Conv1d(32, 64, kernel_size=5, padding=2),
            nn.ReLU(),
            nn.MaxPool1d(kernel_size=2),
            nn.AdaptiveAvgPool1d(16)
        )
        
        # Local View Branch (201 time bins)
        self.local_branch = nn.Sequential(
            nn.Conv1d(in_channels=1, out_channels=32, kernel_size=3, padding=1),
            nn.ReLU(),
            nn.MaxPool1d(kernel_size=2),
            nn.Conv1d(32, 64, kernel_size=3, padding=1),
            nn.ReLU(),
            nn.MaxPool1d(kernel_size=2),
            nn.AdaptiveAvgPool1d(16)
        )
        
        # Fully Connected Classification Head
        self.classifier = nn.Sequential(
            nn.Linear(64 * 16 * 2, 256),
            nn.ReLU(),
            nn.Dropout(0.4),
            nn.Linear(256, 128),
            nn.ReLU(),
            nn.Dropout(0.3),
            nn.Linear(128, num_classes)
        )
        
    def forward(self, x_global, x_local):
        feat_global = self.global_branch(x_global).flatten(start_dim=1)
        feat_local = self.local_branch(x_local).flatten(start_dim=1)
        
        combined = torch.cat([feat_global, feat_local], dim=1)
        return self.classifier(combined)

09. Key Insights & Experimental Findings

Working on this research yielded several crucial takeaways for applying machine learning to astronomical data:

10. Future Research Directions

I am actively expanding this pipeline to incorporate:

  1. Self-Attention Transformers: Applying Temporal Attention to dynamically weight transit dip phases without requiring fixed binning.
  2. TESS Full Frame Images (FFI): Processing 2-minute cadence time series across thousands of southern/northern sky sectors.
  3. Integration with Gaia DR3: Leveraging stellar parallax and radius constraints for physical validation.
← Back to Blog & Research Next: Moon CNN Case Study →