01 — Profil

Informasi Penelitian

Penelitian kolaborasi dua kampus mengenai ekstraksi fitur dan klasifikasi citra daun untuk deteksi penyakit serta identifikasi jenis tanaman.

Logo UPN Veteran Jawa Timur
Kampus Pengusul

Universitas Pembangunan Nasional "Veteran" Jawa Timur

Ketua Pengusul

Dhian Satria Yudha Kartika, S.Kom, M.Kom

NIDN 0722058601 — Program Studi Bisnis Digital, UPN "Veteran" Jawa Timur

Anggota Pengusul 1

Nur Cahyo Wibowo, S.Kom, M.Kom

NIDN 0717037901 — Program Studi Sistem Informasi, UPN "Veteran" Jawa Timur

Anggota Pengusul 2

Dita Atasa, S.P, M.P

NIDN 0021029501 — Program Studi Agribisnis, UPN "Veteran" Jawa Timur

Anggota Pengusul 3

Priza Pandunata, S.Kom, M.Kom

NIDN 0031018303 — Program Studi Teknologi Informasi, Universitas Jember

Skema Penelitian
Penelitian Fundamental - Reguler — Kementerian Pendidikan Tinggi, Sains, dan Teknologi, Tahun 2026
Tentang Penelitian

Penelitian ini mengembangkan sistem berbasis Machine Learning untuk mendukung deteksi dini masalah pada tanaman melalui citra daun, diusulkan oleh tim peneliti UPN "Veteran" Jawa Timur bersama anggota dari Universitas Jember. Sistem dibangun dari dua model dengan fokus berbeda namun saling melengkapi.

Model 1 berfokus pada deteksi penyakit tanaman menggunakan arsitektur Convolutional Neural Network (CNN) yang dibangun dari awal (from scratch), sementara Model 2 berfokus pada identifikasi jenis tanaman menggunakan pendekatan Transfer Learning dengan arsitektur InceptionV3.

02 — Ringkasan

Dashboard

Gambaran umum skala dataset dan performa akhir kedua model.

Total Dataset
78.725
citra daun, gabungan 2 model
Dataset Model 1
61.486
38 kelas penyakit tanaman
Dataset Model 2
17.239
22 kelas jenis tanaman
Rata-rata Akurasi
96,86%
akurasi uji, kedua model
Ringkasan per Model

Model 1 — Deteksi Penyakit

CNN · from scratch
97,72%F1-Score
  • Jumlah kelas38 kelas penyakit tanaman
  • Data uji5.850 citra

Model 2 — Jenis Tanaman

InceptionV3 · transfer learning
96%F1-Score
  • Jumlah kelas22 kelas jenis tanaman
  • Data uji2.579 citra
Detail Dataset

Plant Village Disease

kaggle.com/abdallahalidev/plantvillage-dataset

61.000 citra daun sehat & terinfeksi penyakit, dikurasi dari platform PlantVillage. Terdiri dari 15 jenis tanaman dan 20 jenis penyakit, membentuk 38 kelas klasifikasi untuk Model 1.

15 Jenis Tanaman
Apple Background (Tanpa Daun) Blueberry Cherry Corn Grape Orange Peach Pepper, Bell Potato Raspberry Soybean Squash Strawberry Tomato
20 Jenis Penyakit
Apple Scab Black Rot Cedar Apple Rust Powdery Mildew Cercospora / Gray Leaf Spot Common Rust Northern Leaf Blight Esca (Black Measles) Leaf Blight (Isariopsis) Huanglongbing (Citrus Greening) Bacterial Spot Early Blight Late Blight Leaf Scorch Leaf Mold Septoria Leaf Spot Spider Mites (Two-spotted) Target Spot Tomato Yellow Leaf Curl Virus Tomato Mosaic Virus

PlantVillage + House Plant Species

kaggle.com/kacpergregorowicz/house-plant-species

Gabungan citra sehat dari PlantVillage (tanaman pangan) dan House Plant Species (14.790 citra, 47 kelas tanaman hias via Bing Images). Diseleksi menjadi 22 kelas relevan untuk konteks Indonesia.

22 Kelas Tanaman
0 · Aloe Vera 1 · Apple (Sehat) 2 · Areca Palm (Dypsis lutescens) 3 · Birds Nest Fern (Asplenium nidus) 4 · Blueberry (Sehat) 5 · Cherry (Sehat) 6 · Chinese Evergreen (Aglaonema) 7 · Corn (Sehat) 8 · Dracaena 9 · Dumb Cane (Dieffenbachia spp.) 10 · Elephant Ear (Alocasia spp.) 11 · Grape (Sehat) 12 · Monstera Deliciosa 13 · Peach (Sehat) 14 · Pepper, Bell (Sehat) 15 · Polka Dot Plant (Hypoestes phyllostachya) 16 · Ponytail Palm (Beaucarnea recurvata) 17 · Potato (Sehat) 18 · Raspberry (Sehat) 19 · Snake Plant (Sanseviera) 20 · Strawberry (Sehat) 21 · Tomato (Sehat)
03 — Persiapan Data

Pre-processing

Tahapan umum sebelum data masuk ke pelatihan, diikuti detail spesifik tiap model.

01

Data Gathering

Pengumpulan dataset dari Kaggle untuk kebutuhan masing-masing model.

02

Labeling Otomatis

Label kelas diambil otomatis dari nama folder tempat tiap citra disimpan.

03

Eksplorasi Data

Memeriksa distribusi kelas, sampel citra acak, dan konsistensi resolusi gambar.

04

Balancing Data

Menyeimbangkan jumlah citra tiap kelas lewat oversampling & undersampling.

05

Resize & Normalisasi

Menyeragamkan dimensi citra dan menskalakan nilai piksel ke rentang [0, 1].

Balancing Data per Kelas

Oversampling & Undersampling ke Target 1.500 Citra/Kelas

Jumlah gambar tiap kelas pada dataset awal tidak seimbang, berkisar antara 189 hingga 5.507 gambar/kelas. Untuk mencegah bias model terhadap kelas mayoritas, dilakukan proses balancing dengan target seragam:

●Target akhir: 1.500 gambar / kelas
  • Kelas dengan jumlah gambar > 1.500 → undersampling (random sampling ke 1.500 gambar)
  • Kelas dengan jumlah gambar < 1.500 → oversampling dengan augmentasi (rotasi, shift, zoom, flip) hingga mencapai 1.500 gambar
Distribusi Data Sebelum Balancing — Model 1 Distribusi kelas sebelum balancing Model 1
Distribusi Data Sebelum Balancing — Model 2 Distribusi kelas sebelum balancing Model 2
Distribusi Data Setelah Balancing — Model 1 Distribusi kelas setelah balancing Model 1
Distribusi Data Setelah Balancing — Model 2 Distribusi kelas setelah balancing Model 2
Detail per Model

Model 1 — Deteksi Penyakit

Resize 256×256px · Normalisasi piksel (÷255)

  1. Resizing seluruh citra ke 256×256 piksel
  2. Normalisasi piksel dari rentang [0, 255] ke [0, 1]
  3. Split dataset dengan rasio 80 : 10 : 10
46.800
Train
5.850
Val
5.850
Test

Model 2 — Jenis Tanaman

Resize 224×224px · Normalisasi piksel (÷255)

  1. Resizing seluruh citra ke 224×224 piksel (standar arsitektur modern)
  2. Normalisasi piksel dari rentang [0, 255] ke [0, 1]
  3. Split dataset 80 : 10 : 10 via sklearn.train_test_split
23.100
Train
4.950
Val
4.950
Test
04 — Arsitektur

Model

Dua model dengan tujuan berbeda: satu mendeteksi penyakit, satu lagi mengenali jenis tanaman.

Model 1 — Deteksi Penyakit Tanaman

Klasifikasi 38 kelas penyakit tanaman dari citra daun 256×256
CNN · built from scratch
Optimizer
Adam
Loss Function
Sparse Cat. Crossentropy
Epoch
30 (early stopping)
Batch Size
32
Input 256×256×3
→
Conv2D 32 → MaxPool
→
Conv2D 64 → MaxPool
→
Conv2D 128 → MaxPool
→
Conv2D 256 → MaxPool
→
GlobalAvgPool
→
Dense 128 + Dropout
→
Softmax 39
from tensorflow.keras import layers, Model, Input
from tensorflow.keras.layers import Rescaling

input_layer = Input(shape=(256, 256, 3))
x = Rescaling(1.0 / 255)(input_layer)
x = layers.Conv2D(32, (3, 3), activation='relu')(input_layer)
x = layers.MaxPooling2D((2, 2))(x)
x = layers.Conv2D(64, (3, 3), activation='relu')(x)
x = layers.MaxPooling2D((2, 2))(x)
x = layers.Conv2D(128, (3, 3), activation='relu')(x)
x = layers.MaxPooling2D((2, 2))(x)
x = layers.Conv2D(256, (3, 3), activation='relu')(x)
x = layers.MaxPooling2D((2, 2))(x)
x = layers.GlobalAveragePooling2D(name='global_avg_pool')(x)
x = layers.Dense(128, activation='relu')(x)
x = layers.Dropout(0.2)(x)
output_layer = layers.Dense(39, activation='softmax')(x)

model = Model(inputs=input_layer, outputs=output_layer)
model.compile(
    optimizer='adam',
    loss='sparse_categorical_crossentropy',
    metrics=['accuracy']
)

callbacks = [
    tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=5),
    tf.keras.callbacks.ModelCheckpoint('best_model.h5', save_best_only=True)
]

history = model.fit(
    train_dataset,
    epochs=30,
    validation_data=val_dataset,
    callbacks=callbacks,
    verbose=1
)

Model 2 — Klasifikasi Jenis Tanaman

Klasifikasi 22 kelas jenis tanaman dari citra daun 224×224
InceptionV3 · transfer learning
Optimizer
Adam
Loss Function
Sparse Cat. Crossentropy
Epoch
20 (model checkpoint)
Total Parameter
9,08 juta (101K trainable)
Input 224×224×3
→
InceptionV3 (frozen s.d. "mixed7")
→
GlobalAvgPool2D
→
Dense 128 + Dropout
→
Softmax 22
from tensorflow.keras.applications import InceptionV3
from tensorflow.keras.layers import Dense, GlobalAveragePooling2D, Dropout
from tensorflow.keras.models import Model
import tensorflow as tf

# Load model InceptionV3 tanpa output layer
base_model = InceptionV3(weights='imagenet', include_top=False, input_shape=(224, 224, 3))
base_model.trainable = False  # Freeze base model

# Dapatkan lapisan hingga mixed7
x = base_model.get_layer('mixed7').output

# Tambahkan custom classifier
x = GlobalAveragePooling2D()(x)
x = Dense(128, activation='relu')(x)
x = Dropout(0.2)(x)
predictions = Dense(num_classes, activation='softmax')(x)

# Buat model akhir
model = Model(inputs=base_model.input, outputs=predictions)
model.summary()
05 — Evaluasi

Akurasi & Grafik

Kurva akurasi dan loss selama pelatihan, serta hasil akhir evaluasi pada data uji.

Model 1 — Deteksi Penyakit

Train (biru) vs Validation (oranye)

Grafik akurasi dan loss Model 1
97,71%
Accuracy
97,79%
Precision
97,71%
Recall
97,72%
F1-Score
0,0229
Hamming Loss

Model 2 — Jenis Tanaman

Training (biru) vs Validation (merah)

Grafik akurasi dan loss Model 2
96,01%
Accuracy
96,08%
Precision
96,01%
Recall
96,00%
F1-Score
0,0399
Hamming Loss
Confusion Matrix per Kelas

Model 1 — Deteksi Penyakit (39 Kelas)

5.850 citra data uji
Confusion matrix Model 1
#KelasAccuracyPrecisionRecallF1-Score
0Apple___Apple_scab0.99950.99330.98670.9900
1Apple___Black_rot0.99910.97390.99330.9835
2Apple___Cedar_apple_rust0.99930.97401.00000.9868
3Apple___healthy0.99910.98660.98000.9833
4Background_without_leaves0.99910.98010.98670.9834
5Blueberry___healthy0.99950.98041.00000.9901
6Cherry___Powdery_mildew0.99901.00000.96000.9796
7Cherry___healthy0.99950.98680.99330.9900
8Corn___Cercospora_leaf_spot Gray_leaf_spot0.99570.94960.88000.9135
9Corn___Common_rust0.99981.00000.99330.9967
10Corn___Northern_Leaf_Blight0.99590.88890.96000.9231
11Corn___healthy0.99981.00000.99330.9967
12Grape___Black_rot0.99950.98680.99330.9900
13Grape___Esca_(Black_Measles)0.99980.99341.00000.9967
14Grape___Leaf_blight_(Isariopsis_Leaf_Spot)0.99970.98681.00000.9934
15Grape___healthy0.99950.98041.00000.9901
16Orange___Haunglongbing_(Citrus_greening)0.99970.99330.99330.9933
17Peach___Bacterial_spot0.99851.00000.94000.9691
18Peach___healthy0.99930.97401.00000.9868
19Pepper,_bell___Bacterial_spot0.99810.97280.95330.9630
20Pepper,_bell___healthy0.99881.00000.95330.9761
21Potato___Early_blight0.99950.99330.98670.9900
22Potato___Late_blight0.99850.99300.94670.9693
23Potato___healthy0.99910.96771.00000.9836
24Raspberry___healthy1.00001.00001.00001.0000
25Soybean___healthy0.99931.00000.97330.9865
26Squash___Powdery_mildew0.99880.96730.98670.9769
27Strawberry___Leaf_scorch0.99951.00000.98000.9899
28Strawberry___healthy0.99971.00000.98670.9933
29Tomato___Bacterial_spot0.99900.99320.96670.9797
30Tomato___Early_blight0.99730.94670.94670.9467
31Tomato___Late_blight0.99740.94700.95330.9502
32Tomato___Leaf_Mold0.99910.98660.98000.9833
33Tomato___Septoria_leaf_spot0.99760.93590.97330.9542
34Tomato___Spider_mites Two-spotted_spider_mite0.99680.97120.90000.9343
35Tomato___Target_Spot0.99560.85630.99330.9198
36Tomato___Tomato_Yellow_Leaf_Curl_Virus0.99930.98670.98670.9867
37Tomato___Tomato_mosaic_virus1.00001.00001.00001.0000
38Tomato___healthy0.99950.99330.98670.9900

Model 2 — Jenis Tanaman (22 Kelas)

2.579 citra data uji
Confusion matrix Model 2
#KelasAccuracyPrecisionRecallF1-Score
0Aloe Vera0.99550.97180.92830.9495
1Apple___healthy0.99880.97401.00000.9868
2Areca Palm (Dypsis lutescens)0.99620.95980.95560.9577
3Birds Nest Fern (Asplenium nidus)0.99550.98560.91520.9491
4Blueberry___healthy0.99980.99561.00000.9978
5Cherry___healthy0.99940.99120.99560.9933
6Chinese Evergreen (Aglaonema)0.98640.85270.84890.8508
7Corn___healthy1.00001.00001.00001.0000
8Dracaena0.98970.86860.91110.8894
9Dumb Cane (Dieffenbachia spp.)0.98950.93260.82190.8738
10Elephant Ear (Alocasia spp.)0.99290.90250.94670.9241
11Grape___healthy0.99981.00000.99560.9978
12Monstera Deliciosa (Monstera deliciosa)0.99270.88840.95980.9227
13Peach___healthy0.99941.00000.98670.9933
14Pepper,_bell___healthy0.99981.00000.99560.9978
15Polka Dot Plant (Hypoestes phyllostachya)0.99780.96930.98220.9757
16Ponytail Palm (Beaucarnea recurvata)0.99800.96540.99110.9781
17Potato___healthy0.99920.98680.99560.9912
18Raspberry___healthy0.99801.00000.95560.9773
19Snake Plant (Sanseviera)0.99370.91740.94620.9316
20Strawberry___healthy0.99840.97800.98670.9823
21Tomato___healthy0.99980.99561.00000.9978
Kesimpulan

Kedua model menunjukkan performa yang tinggi dan stabil pada tugasnya masing-masing. Model 1 mencapai akurasi test 97,71% dalam mendeteksi 38 kelas penyakit tanaman, sementara Model 2 mencapai akurasi validasi 96,01% dalam mengklasifikasikan 22 jenis tanaman. Kurva training dan validasi pada kedua model bergerak beriringan tanpa jarak (gap) yang signifikan, menandakan tidak terjadi overfitting berarti pada proses pelatihan.