Machine Learning Waveforms

Last Updated or created 2025-02-20

I’ve used machine learning before, this is my waveform classifier.

(Next to do, more classes)

Class0 – Train data

Class1 – Train data

Running train script

Test data

Prediction

Code ( generates a h5 classifier )

import tensorflow as tf

from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout, Input
import os


# Define dataset path
DATASET_PATH = "data/"

# Load images using ImageDataGenerator
datagen = ImageDataGenerator(rescale=1./255, validation_split=0.2)

train_data = datagen.flow_from_directory(
    DATASET_PATH,
    target_size=(128, 128),
    batch_size=32,
    class_mode='categorical',
    subset="training"
)

val_data = datagen.flow_from_directory(
    DATASET_PATH,
    target_size=(128, 128),
    batch_size=32,
    class_mode='categorical',
    subset="validation"
)

# Define CNN model
model = Sequential([
    Input(shape=(128, 128, 3)),
    Conv2D(32, (3,3), activation='relu'),
    MaxPooling2D(2,2),
    
    Conv2D(64, (3,3), activation='relu'),
    MaxPooling2D(2,2),
    
    Flatten(),
    Dense(128, activation='relu'),
    Dropout(0.5),
    Dense(train_data.num_classes, activation='softmax')
])

# Compile model
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])

# Train the CNN
model.fit(train_data, validation_data=val_data, epochs=10)

# Save model
model.save("waveform_classifier.h5")
print("Model saved as waveform_classifier.h5")

Code to predict class

import numpy as np
from tensorflow.keras.preprocessing import image
from tensorflow.keras.models import load_model

# Load trained model
model = load_model("waveform_classifier.h5")

# Load and preprocess image
def predict_waveform(image_path):
    img = image.load_img(image_path, target_size=(128, 128))
    img_array = image.img_to_array(img) / 255.0
    img_array = np.expand_dims(img_array, axis=0)

    # Predict class
    prediction = model.predict(img_array)
    predicted_class = np.argmax(prediction)
    
    print(f"Predicted Class: {predicted_class}")

for f in range(1,5):
    predict_waveform("testdata/" + str(f) + ".png")

Generate images from CSV

import pandas as pd
import matplotlib.pyplot as plt

def waveform_to_image(csv_file, signal_column="amplitude", save_path="waveform.png"):
    # Load CSV
    df = pd.read_csv(csv_file)

    # Extract signal (time,amplitude)
    signal = df[signal_column]

    # Plot waveform
    plt.figure(figsize=(4, 4))
    plt.ylim(0, 20)

    plt.plot(signal, color='black', linewidth=2)
    # Hide axes
    plt.axis('off')  

    # Save as an image
    plt.savefig(save_path, bbox_inches='tight', pad_inches=0)
    plt.close()
    print(f"Saved waveform image as {save_path}")

# Loop through files 1.csv to 32.csv and generate images
for i in range(1, 31):
    csv_filename = f"{i}.csv"
    png_filename = f"{i}.png"
    waveform_to_image(csv_filename, save_path=png_filename)
Spread the love

Leave a Reply

Your email address will not be published. Required fields are marked *