|
import os |
|
import random |
|
import shutil |
|
from concurrent.futures import ThreadPoolExecutor |
|
|
|
# Define paths |
|
dataset_folder = 'path/to/dataset' |
|
train_folder = os.path.join(dataset_folder, 'train') |
|
val_folder = os.path.join(dataset_folder, 'validation') |
|
|
|
# Create validation folder if it doesn't exist |
|
os.makedirs(val_folder, exist_ok=True) |
|
|
|
# Get all label folders inside train folder |
|
label_folders = [f for f in os.listdir(train_folder) if os.path.isdir(os.path.join(train_folder, f))] |
|
|
|
# Function to move images from a specific label folder |
|
def process_label_folder(label_folder, num_threads): |
|
train_label_folder = os.path.join(train_folder, label_folder) |
|
val_label_folder = os.path.join(val_folder, label_folder) |
|
|
|
# Create corresponding validation label folder |
|
os.makedirs(val_label_folder, exist_ok=True) |
|
|
|
# Get all images in the train/label_folder |
|
all_images = os.listdir(train_label_folder) |
|
total_images = len(all_images) |
|
|
|
# Calculate 20% of images for validation |
|
val_size = int(total_images * 0.2) |
|
|
|
# Randomly select 20% of the images for validation |
|
val_images = random.sample(all_images, val_size) |
|
|
|
# Function to move a single image |
|
def move_image(image): |
|
src = os.path.join(train_label_folder, image) |
|
dest = os.path.join(val_label_folder, image) |
|
shutil.move(src, dest) |
|
|
|
# Use ThreadPoolExecutor to move images in parallel |
|
with ThreadPoolExecutor(max_workers=num_threads) as executor: |
|
executor.map(move_image, val_images) |
|
|
|
print(f"Moved {val_size} images from {label_folder} to validation folder.") |
|
|
|
# Main function to get user input for number of threads and process folders |
|
def main(): |
|
# Ask user for the number of threads |
|
num_threads = int(input("Enter the number of threads to use: ")) |
|
|
|
# Process each label folder using the input number of threads |
|
for label_folder in label_folders: |
|
process_label_folder(label_folder, num_threads) |
|
|
|
print("Validation dataset created.") |
|
|
|
if __name__ == "__main__": |
|
main() |
|
|
|
|
|
import numpy as np |
|
from sklearn.metrics import confusion_matrix, precision_score, recall_score, f1_score, accuracy_score |
|
|
|
# Assuming you have true labels and predicted labels |
|
y_true = [0, 1, 2, 1, 0, 1, 2, 2, 0] # Replace with your true labels |
|
y_pred = [0, 0, 2, 1, 0, 1, 2, 1, 0] # Replace with your predicted labels |
|
|
|
# Calculate the confusion matrix |
|
conf_matrix = confusion_matrix(y_true, y_pred) |
|
|
|
# Print the confusion matrix |
|
print("Confusion Matrix:") |
|
print(conf_matrix) |
|
|
|
# Calculate precision, recall, f1-score, and accuracy for each label |
|
precision = precision_score(y_true, y_pred, average=None) |
|
recall = recall_score(y_true, y_pred, average=None) |
|
f1 = f1_score(y_true, y_pred, average=None) |
|
accuracy = accuracy_score(y_true, y_pred) |
|
|
|
# Print precision, recall, f1-score for each label |
|
for i in range(len(precision)): |
|
print(f"Label {i}:") |
|
print(f" Precision: {precision[i]:.4f}") |
|
print(f" Recall: {recall[i]:.4f}") |
|
print(f" F1-Score: {f1[i]:.4f}") |
|
print() |
|
|
|
# Print overall accuracy |
|
print(f"Overall Accuracy: {accuracy:.4f}") |
|
|
|
|
|
import numpy as np |
|
from sklearn.metrics import confusion_matrix |
|
|
|
# Example true and predicted labels |
|
y_true = [0, 1, 2, 1, 0, 1, 2, 2, 0] # Replace with your true labels |
|
y_pred = [0, 0, 2, 1, 0, 1, 2, 1, 0] # Replace with your predicted labels |
|
|
|
# Class names (replace with your actual labels) |
|
label_names = ['Class A', 'Class B', 'Class C'] |
|
|
|
# Calculate the confusion matrix |
|
conf_matrix = confusion_matrix(y_true, y_pred) |
|
|
|
# Print the confusion matrix |
|
print("Confusion Matrix:") |
|
print(conf_matrix) |
|
|
|
# Number of classes |
|
num_classes = conf_matrix.shape[0] |
|
|
|
# Initialize lists for precision, recall, and f1-score |
|
precision = [] |
|
recall = [] |
|
f1_score = [] |
|
|
|
# Calculate precision, recall, and F1-score from confusion matrix for each class |
|
for i in range(num_classes): |
|
tp = conf_matrix[i, i] # True Positives |
|
fp = np.sum(conf_matrix[:, i]) - tp # False Positives |
|
fn = np.sum(conf_matrix[i, :]) - tp # False Negatives |
|
|
|
# Calculate precision, recall, f1-score |
|
precision_i = tp / (tp + fp) if (tp + fp) > 0 else 0 |
|
recall_i = tp / (tp + fn) if (tp + fn) > 0 else 0 |
|
f1_i = 2 * (precision_i * recall_i) / (precision_i + recall_i) if (precision_i + recall_i) > 0 else 0 |
|
|
|
# Append to lists |
|
precision.append(precision_i) |
|
recall.append(recall_i) |
|
f1_score.append(f1_i) |
|
|
|
# Print precision, recall, f1-score for each label |
|
for i, label in enumerate(label_names): |
|
print(f"{label}:") |
|
print(f" Precision: {precision[i]:.4f}") |
|
print(f" Recall: {recall[i]:.4f}") |
|
print(f" F1-Score: {f1_score[i]:.4f}") |
|
print() |
|
|
|
|
|
import React, { useState, useEffect } from "react"; |
|
import * as tflite from "@tensorflow/tfjs-tflite"; |
|
import * as tf from "@tensorflow/tfjs"; |
|
|
|
function ObjectDetector() { |
|
const [model, setModel] = useState(null); |
|
const [imageUrl, setImageUrl] = useState(null); |
|
const [predictions, setPredictions] = useState([]); |
|
|
|
// Load the TFLite model |
|
useEffect(() => { |
|
const loadModel = async () => { |
|
const loadedModel = await tflite.loadTFLiteModel('/path_to_your_model.tflite'); |
|
setModel(loadedModel); |
|
}; |
|
|
|
loadModel(); |
|
}, []); |
|
|
|
// Handle image input change |
|
const handleImageChange = (event) => { |
|
const file = event.target.files[0]; |
|
if (file) { |
|
setImageUrl(URL.createObjectURL(file)); |
|
} |
|
}; |
|
|
|
// Run inference on the selected image |
|
const runInference = async () => { |
|
if (!model || !imageUrl) return; |
|
|
|
const imageElement = document.getElementById("inputImage"); |
|
|
|
// Load the image into a tensor |
|
const inputTensor = preprocessImage(imageElement, [1, 320, 320, 3]); // Adjust this size based on your model's expected input |
|
|
|
// Run inference |
|
const output = await model.predict(inputTensor); |
|
|
|
// Extract predictions |
|
const [boxes, classes, scores, numDetections] = extractPredictions(output); |
|
|
|
// Display the predictions |
|
const predictionResults = []; |
|
for (let i = 0; i < numDetections; i++) { |
|
if (scores[i] > 0.5) { // Only display results with confidence > 0.5 |
|
predictionResults.push({ |
|
class: classes[i], // Map class ID to label if available |
|
score: scores[i], |
|
bbox: boxes[i], |
|
}); |
|
} |
|
} |
|
setPredictions(predictionResults); |
|
|
|
// Clean up the tensor to free memory |
|
tf.dispose([inputTensor]); |
|
}; |
|
|
|
// Function to preprocess image (resize, normalize, and convert to tensor) |
|
const preprocessImage = (image, inputShape) => { |
|
const tensor = tf.browser.fromPixels(image) // Load image into a tensor |
|
.toFloat() |
|
.div(tf.scalar(255.0)) // Normalize pixel values to [0, 1] |
|
.resizeBilinear([inputShape[1], inputShape[2]]) // Resize to 320x320 or model input size |
|
.expandDims(0); // Add batch dimension [1, 320, 320, 3] |
|
|
|
return tensor; |
|
}; |
|
|
|
// Function to extract bounding boxes, class IDs, and scores from the model output |
|
const extractPredictions = (output) => { |
|
const boxes = output[0].arraySync(); // Bounding boxes |
|
const classes = output[1].arraySync(); // Class IDs |
|
const scores = output[2].arraySync(); // Confidence scores |
|
const numDetections = output[3].arraySync()[0]; // Number of detected objects |
|
|
|
return [boxes, classes, scores, numDetections]; |
|
}; |
|
|
|
return ( |
|
<div> |
|
<h1>Object Detection with TFLite</h1> |
|
|
|
{/* Input: Upload Image */} |
|
<input type="file" accept="image/*" onChange={handleImageChange} /> |
|
|
|
{/* Display Selected Image */} |
|
{imageUrl && ( |
|
<div> |
|
<img id="inputImage" src={imageUrl} alt="Input" width="300px" /> |
|
</div> |
|
)} |
|
|
|
{/* Run Inference Button */} |
|
<button onClick={runInference} disabled={!model}> |
|
Run Inference |
|
</button> |
|
|
|
{/* Display Predictions */} |
|
{predictions.length > 0 && ( |
|
<div> |
|
<h2>Predictions:</h2> |
|
<ul> |
|
{predictions.map((pred, index) => ( |
|
<li key={index}> |
|
{`Class: ${pred.class}, Confidence: ${pred.score.toFixed(2)}, Bounding Box: [${pred.bbox}]`} |
|
</li> |
|
))} |
|
</ul> |
|
</div> |
|
)} |
|
</div> |
|
); |
|
} |
|
|
|
export default ObjectDetector; |
|
|
|
|
|
|
|
import json |
|
import random |
|
import os |
|
|
|
# Load the COCO annotations file |
|
coco_file = 'annotations.json' # Path to your COCO annotations file |
|
output_dir = 'output_dir/' # Directory to save the split files |
|
train_ratio = 0.8 # 80% for training, 20% for validation |
|
|
|
# Create output directory if it doesn't exist |
|
if not os.path.exists(output_dir): |
|
os.makedirs(output_dir) |
|
|
|
# Load COCO annotations |
|
with open(coco_file, 'r') as f: |
|
coco_data = json.load(f) |
|
|
|
# Extract images and annotations |
|
images = coco_data['images'] |
|
annotations = coco_data['annotations'] |
|
|
|
# Shuffle images to ensure random split |
|
random.shuffle(images) |
|
|
|
# Split images into training and validation sets |
|
train_size = int(len(images) * train_ratio) |
|
train_images = images[:train_size] |
|
val_images = images[train_size:] |
|
|
|
# Create dictionaries to store image IDs for filtering annotations |
|
train_image_ids = {img['id'] for img in train_images} |
|
val_image_ids = {img['id'] for img in val_images} |
|
|
|
# Split annotations based on image IDs |
|
train_annotations = [ann for ann in annotations if ann['image_id'] in train_image_ids] |
|
val_annotations = [ann for ann in annotations if ann['image_id'] in val_image_ids] |
|
|
|
# Create train and validation splits for COCO format |
|
train_data = { |
|
'images': train_images, |
|
'annotations': train_annotations, |
|
'categories': coco_data['categories'], # Keep categories the same |
|
} |
|
|
|
val_data = { |
|
'images': val_images, |
|
'annotations': val_annotations, |
|
'categories': coco_data['categories'], # Keep categories the same |
|
} |
|
|
|
# Save the new train and validation annotation files |
|
train_file = os.path.join(output_dir, 'train_annotations.json') |
|
val_file = os.path.join(output_dir, 'val_annotations.json') |
|
|
|
with open(train_file, 'w') as f: |
|
json.dump(train_data, f) |
|
|
|
with open(val_file, 'w') as f: |
|
json.dump(val_data, f) |
|
|
|
print(f"Train annotations saved to: {train_file}") |
|
print(f"Validation annotations saved to: {val_file}") |
|
|
|
|
|
|