import csv import argparse import numpy as np from PIL import Image from sklearn.svm import SVC from joblib import dump, load def load_image_as_vector(path): img = Image.open(path).convert('L') arr = np.array(img) return arr.flatten() parser = argparse.ArgumentParser() parser.add_argument("--mode", required=True) parser.add_argument("--dataset") parser.add_argument("--model", required=True) parser.add_argument("--input") parser.add_argument("--output") args = parser.parse_args() if args.mode == "train": dataset_csv = args.dataset model_path = args.model paths = [] labels = [] with open(dataset_csv, newline="") as f: reader = csv.reader(f) header = next(reader) for row in reader: path = row[0] label = row[1] paths.append(path) labels.append(label) X_list = [] Y_list = [] for path, label in zip(paths, labels): vec = load_image_as_vector(path) X_list.append(vec) Y_list.append(label) X = np.array(X_list) Y = np.array(Y_list) model = SVC(kernel="rbf", gamma="scale") model.fit(X, Y) dump(model, model_path) elif args.mode == "inference": model_path = args.model input_csv = args.input output_csv = args.output model = load(model_path) paths = [] with open(input_csv, newline="") as f: reader = csv.reader(f) header = next(reader) for row in reader: path = row[0] paths.append(path) X_list = [] for path in paths: vec = load_image_as_vector(path) X_list.append(vec) X = np.array(X_list) preds = model.predict(X) with open(output_csv, 'w', newline="") as f: writer = csv.writer(f) writer.writerow(['path', 'label']) for path, label in zip(paths, preds): writer.writerow([path, label])