Back to Projects

Project Overview

Ensemble deep learning model identifying Aedes aegypti and Aedes albopictus — primary Zika virus vectors — from wing morphology images. Combines VGG16, ResNet50, and EfficientNetB3 via soft voting. Published at IEEE ICIPTM 2026.

94.8%Ensemble Accuracy
92.4%EfficientNetB3 Solo
3CNNs in Ensemble
<2sInference on RPi4

Why This Matters

The 2015–2016 Zika outbreak infected over 1.5 million people. Early identification of Ae. aegypti and Ae. albopictus in surveillance traps is critical for outbreak prevention — but traditional microscopy-based ID requires trained entomologists and is not scalable for thousands of field trap sites.

Dataset Challenges

  • Class imbalance: Ae. aegypti dominated 60%+ of samples
  • Inter-species similarity: Wing morphology visually very close between Aedes species
  • Image quality variance: Motion blur, variable lighting, wing damage in field images
Python
from tensorflow.keras.preprocessing.image import ImageDataGenerator

datagen = ImageDataGenerator(
    rotation_range=30, width_shift_range=0.2, height_shift_range=0.2,
    shear_range=0.15, zoom_range=0.2, horizontal_flip=True, vertical_flip=True,
    brightness_range=[0.7, 1.3], fill_mode='nearest', validation_split=0.2
)
train_gen = datagen.flow_from_directory(
    'dataset/', target_size=(224, 224),
    batch_size=32, subset='training', class_mode='categorical'
)

Ensemble Architecture

Python
from tensorflow.keras.applications import VGG16, ResNet50, EfficientNetB3
from tensorflow.keras.layers import GlobalAveragePooling2D, Dense, Dropout
from tensorflow.keras.models import Model
import numpy as np

def build_model(base_arch, num_classes=6):
    base = base_arch(weights='imagenet', include_top=False, input_shape=(224,224,3))
    base.trainable = False
    x = GlobalAveragePooling2D()(base.output)
    x = Dense(256, activation='relu')(x)
    x = Dropout(0.4)(x)
    out = Dense(num_classes, activation='softmax')(x)
    return Model(inputs=base.input, outputs=out)

models = [build_model(VGG16), build_model(ResNet50), build_model(EfficientNetB3)]

# Soft-voting ensemble
def ensemble_predict(models, X):
    return np.mean([m.predict(X) for m in models], axis=0)

Results

89.3%VGG16
91.7%ResNet50
92.4%EfficientNetB3
94.8%Ensemble ✅

IEEE Paper: IEEE ICIPTM 2026, Noida NCR, India — In-Press on IEEE Xplore. View full citation

VGG16ResNet50EfficientNet EnsembleTensorFlowIEEE 2026