commit bd1bd52c6c9d7c90fec661f86f9e38acea7c5b77 Author: DanielS Date: Fri May 29 00:47:49 2026 +0200 initial commit diff --git a/__pycache__/data_generator.cpython-311.pyc b/__pycache__/data_generator.cpython-311.pyc new file mode 100644 index 0000000..67c9293 Binary files /dev/null and b/__pycache__/data_generator.cpython-311.pyc differ diff --git a/__pycache__/dataset.cpython-311.pyc b/__pycache__/dataset.cpython-311.pyc new file mode 100644 index 0000000..69e4956 Binary files /dev/null and b/__pycache__/dataset.cpython-311.pyc differ diff --git a/__pycache__/inference.cpython-311.pyc b/__pycache__/inference.cpython-311.pyc new file mode 100644 index 0000000..7d28d5b Binary files /dev/null and b/__pycache__/inference.cpython-311.pyc differ diff --git a/app/__pycache__/main.cpython-311.pyc b/app/__pycache__/main.cpython-311.pyc new file mode 100644 index 0000000..e31837c Binary files /dev/null and b/app/__pycache__/main.cpython-311.pyc differ diff --git a/app/main.py b/app/main.py new file mode 100644 index 0000000..866431d --- /dev/null +++ b/app/main.py @@ -0,0 +1,523 @@ +import os +import sys +import json +import base64 +import subprocess +from io import BytesIO +import numpy as np +from PIL import Image, ImageDraw +import cv2 +import albumentations as A +import ctypes +import time +import socket +import threading + +from fastapi import FastAPI, HTTPException, BackgroundTasks +from fastapi.staticfiles import StaticFiles +from fastapi.responses import FileResponse, JSONResponse +from pydantic import BaseModel + +from inference import FruitVegetableDetector, CLASSES + +app = FastAPI(title="POS Object Detection API", description="Fruit & Vegetable checkout detection microservice") + +# Initialize detector +detector = FruitVegetableDetector() + +# Paths +BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +STATUS_FILE = os.path.join(BASE_DIR, "training_status.json") + +# Data Models +class DetectionRequest(BaseModel): + image: str # Base64 encoded image or Data URL + +class TrainRequest(BaseModel): + epochs: int = 15 + batch_size: int = 8 + lr: float = 0.001 + +class CaptureRequest(BaseModel): + image: str + class_name: str + +class SaveArticlesRequest(BaseModel): + articles: dict + +class ScanRequest(BaseModel): + class_name: str + +# Serve frontend static files +static_path = os.path.join(os.path.dirname(__file__), "static") +os.makedirs(static_path, exist_ok=True) + +# Helper function to read training status +def get_training_status(): + if not os.path.exists(STATUS_FILE): + return { + "status": "idle", + "epoch": 0, + "total_epochs": 0, + "train_loss": [], + "val_loss": [], + "progress": 0.0, + "message": "No training history found." + } + try: + with open(STATUS_FILE, "r") as f: + return json.load(f) + except Exception: + return {"status": "error", "message": "Failed to read status file."} + +# Helper to write status +def write_training_status(status_dict): + with open(STATUS_FILE, "w") as f: + json.dump(status_dict, f, indent=2) + +@app.post("/api/detect") +async def detect_objects(payload: DetectionRequest): + """ + Accepts base64 encoded frame, runs ONNX inference, and returns detections. + """ + try: + data_url = payload.image + if "," in data_url: + data_url = data_url.split(",")[1] + + img_bytes = base64.b64decode(data_url) + img = Image.open(BytesIO(img_bytes)).convert("RGB") + img_np = np.array(img) + + predictions = detector.detect(img_np) + + return { + "status": "success", + "predictions": predictions + } + except Exception as e: + return JSONResponse( + status_code=400, + content={"status": "error", "message": f"Inference failed: {str(e)}"} + ) + +def bg_generate_dataset(): + try: + from data_generator import build_dataset + build_dataset(base_dir=os.path.join(BASE_DIR, "dataset"), train_count=200, val_count=50) + write_training_status({ + "status": "idle", + "epoch": 0, + "total_epochs": 0, + "train_loss": [], + "val_loss": [], + "progress": 100.0, + "message": "Dataset generation completed successfully!" + }) + except Exception as e: + write_training_status({ + "status": "failed", + "epoch": 0, + "total_epochs": 0, + "train_loss": [], + "val_loss": [], + "progress": 0.0, + "message": f"Dataset generation failed: {str(e)}" + }) + +@app.post("/api/generate_dataset") +async def trigger_dataset_generation(background_tasks: BackgroundTasks): + """ + Triggers dataset generation asynchronously. + """ + status = get_training_status() + if status.get("status") in ["training", "generating_data"]: + raise HTTPException(status_code=400, detail="An operation is already in progress.") + + write_training_status({ + "status": "generating_data", + "epoch": 0, + "total_epochs": 0, + "train_loss": [], + "val_loss": [], + "progress": 10.0, + "message": "Starting synthetic data generation process..." + }) + + background_tasks.add_task(bg_generate_dataset) + + return {"status": "success", "message": "Dataset generation started in the background."} + +@app.post("/api/train") +async def trigger_training(req: TrainRequest): + """ + Triggers model training. + """ + status = get_training_status() + if status.get("status") in ["training", "generating_data"]: + raise HTTPException(status_code=400, detail="Training or data generation is already in progress.") + + write_training_status({ + "status": "training", + "epoch": 0, + "total_epochs": req.epochs, + "train_loss": [], + "val_loss": [], + "progress": 5.0, + "message": "Initializing training background process..." + }) + + # Launch training process in background + cmd = [ + sys.executable, + os.path.join(BASE_DIR, "train.py"), + "--epochs", str(req.epochs), + "--batch-size", str(req.batch_size), + "--lr", str(req.lr) + ] + subprocess.Popen(cmd, cwd=BASE_DIR) + + return {"status": "success", "message": f"Training initiated for {req.epochs} epochs."} + +@app.get("/api/train_status") +async def get_status(): + """ + Returns current training status. + """ + # Check if background processes are actually running + # If status says training/generating but no process matches, we can update status to failed/idle. + status = get_training_status() + return status + +@app.post("/api/export") +async def trigger_export(): + """ + Exports trained PyTorch weights to ONNX format and reloads the detector. + """ + pytorch_path = os.path.join(BASE_DIR, "models", "model.pt") + if not os.path.exists(pytorch_path): + raise HTTPException(status_code=404, detail="No trained PyTorch weights found at models/model.pt. Train a model first.") + + try: + # Run export script synchronously since it is fast (few seconds) + cmd = [sys.executable, os.path.join(BASE_DIR, "export.py")] + result = subprocess.run(cmd, cwd=BASE_DIR, capture_output=True, text=True, check=True) + + # Reload the detector model + detector.load_model() + + return { + "status": "success", + "message": "Model successfully exported to ONNX and loaded into memory.", + "log": result.stdout + } + except Exception as e: + return JSONResponse( + status_code=500, + content={"status": "error", "message": f"ONNX Export failed: {str(e)}"} + ) + +@app.get("/api/augmented_preview") +async def get_augmented_preview(): + """ + Generates a sample preview image from the generator, applies augmentations, + draws bounding boxes on both, and returns them side-by-side. + """ + try: + from data_generator import generate_sample + + # Generate a raw sample image and its YOLO annotations + img, annotations = generate_sample(width=320, height=320) + img_np = np.array(img) + + # Setup the same augmentation pipeline used in training + transform = A.Compose([ + A.ShiftScaleRotate(shift_limit=0.1, scale_limit=0.15, rotate_limit=30, p=1.0), + A.RandomBrightnessContrast(brightness_limit=0.2, contrast_limit=0.2, p=1.0), + A.GaussNoise(p=1.0) + ], bbox_params=A.BboxParams(format='pascal_voc', label_fields=['category_ids'])) + + # Parse annotations to box absolute coords + boxes = [] + classes = [] + for ann in annotations: + parts = ann.strip().split() + if len(parts) == 5: + class_id = int(parts[0]) + xc, yc, w, h = map(float, parts[1:]) + xmin = (xc - w/2) * 320 + ymin = (yc - h/2) * 320 + xmax = (xc + w/2) * 320 + ymax = (yc + h/2) * 320 + boxes.append([xmin, ymin, xmax, ymax]) + classes.append(class_id) + + boxes = np.array(boxes, dtype=np.float32).reshape(-1, 4) + + # Create augmented image + augmented_np = img_np.copy() + aug_boxes = boxes.copy() + if len(boxes) > 0: + try: + augmented = transform(image=img_np, bboxes=boxes, category_ids=classes) + augmented_np = augmented["image"] + aug_boxes = np.array(augmented["bboxes"], dtype=np.float32).reshape(-1, 4) + except Exception: + pass + + # Draw bounding boxes on original image + orig_draw = img.copy() + draw_tool = ImageDraw.Draw(orig_draw) + for idx, box in enumerate(boxes): + draw_tool.rectangle(box.tolist(), outline=(255, 0, 0), width=3) + draw_tool.text((box[0]+2, box[1]+2), CLASSES[classes[idx]], fill=(255, 0, 0)) + + # Draw bounding boxes on augmented image + aug_img = Image.fromarray(augmented_np) + draw_tool_aug = ImageDraw.Draw(aug_img) + for idx, box in enumerate(aug_boxes): + draw_tool_aug.rectangle(box.tolist(), outline=(0, 255, 0), width=3) + draw_tool_aug.text((box[0]+2, box[1]+2), CLASSES[classes[idx]], fill=(0, 255, 0)) + + # Create side-by-side preview canvas + preview = Image.new("RGB", (640, 320)) + preview.paste(orig_draw, (0, 0)) + preview.paste(aug_img, (320, 0)) + + # Buffer and return as base64 + buffered = BytesIO() + preview.save(buffered, format="JPEG") + preview_base64 = base64.b64encode(buffered.getvalue()).decode() + + return { + "status": "success", + "image": f"data:image/jpeg;base64,{preview_base64}" + } + except Exception as e: + raise HTTPException(status_code=500, detail=f"Failed to generate preview: {str(e)}") + +@app.get("/api/simulated_frame") +async def get_simulated_frame(): + """ + Generates a raw synthetic scale frame (without annotations) for client-side POS testing. + """ + try: + from data_generator import generate_sample + # Generate raw sample image (640x480) + img, _ = generate_sample(width=640, height=480) + + buffered = BytesIO() + img.save(buffered, format="JPEG") + img_base64 = base64.b64encode(buffered.getvalue()).decode() + + return { + "status": "success", + "image": f"data:image/jpeg;base64,{img_base64}" + } + except Exception as e: + raise HTTPException(status_code=500, detail=f"Failed to generate simulated frame: {str(e)}") + +@app.post("/api/capture_training_image") +async def capture_training_image(payload: CaptureRequest): + """ + Saves a webcam snapshot and generates a centered YOLO format bounding box label. + """ + try: + class_name = payload.class_name + if class_name not in CLASSES: + raise HTTPException(status_code=400, detail=f"Ungültige Produktklasse: {class_name}") + + class_idx = CLASSES.index(class_name) + + # Decode base64 + data_url = payload.image + if "," in data_url: + data_url = data_url.split(",")[1] + img_bytes = base64.b64decode(data_url) + img = Image.open(BytesIO(img_bytes)).convert("RGB") + + # Save image with unique filename + import time + timestamp = int(time.time() * 1000) + filename = f"user_capture_{timestamp}.jpg" + + images_dir = os.path.join(BASE_DIR, "dataset", "images", "train") + labels_dir = os.path.join(BASE_DIR, "dataset", "labels", "train") + os.makedirs(images_dir, exist_ok=True) + os.makedirs(labels_dir, exist_ok=True) + + img.save(os.path.join(images_dir, filename), quality=95) + + # Write YOLO label centered at scale + # Bounding box: class_idx, x_center=0.5, y_center=0.5, width=0.6, height=0.6 + label_filename = f"user_capture_{timestamp}.txt" + with open(os.path.join(labels_dir, label_filename), "w") as f: + f.write(f"{class_idx} 0.500000 0.500000 0.650000 0.650000\n") + + # Count total user captured images + user_images = [f for f in os.listdir(images_dir) if f.startswith("user_capture_")] + count = len(user_images) + + return { + "status": "success", + "message": f"Bild erfolgreich als Training für {class_name} erfasst!", + "count": count + } + except Exception as e: + raise HTTPException(status_code=500, detail=f"Fehler bei Bild-Erfassung: {str(e)}") + +@app.get("/api/capture_count") +async def get_capture_count(): + """ + Returns the number of user captured training images. + """ + images_dir = os.path.join(BASE_DIR, "dataset", "images", "train") + if not os.path.exists(images_dir): + return {"count": 0} + user_images = [f for f in os.listdir(images_dir) if f.startswith("user_capture_")] + return {"count": len(user_images)} + +# --- BARCODE SCANNER EMULATION (Windows Keyboard Hook) --- +KEYEVENTF_KEYUP = 0x0002 +VK_RETURN = 0x0D +ARTICLES_FILE = os.path.join(BASE_DIR, "articles.json") + +def simulate_keyboard_type(text: str): + """ + Types the EAN code and presses Enter globally on Windows. + Uses hardware scan codes mapped from virtual key codes for highest compatibility. + """ + try: + # Give a small 200ms delay to allow cashier window to gain focus if clicked manually + time.sleep(0.2) + + KEYEVENTF_KEYUP = 0x0002 + MAPVK_VK_TO_VSC = 0 + + for char in text: + vk = None + if '0' <= char <= '9': + vk = 0x30 + int(char) + elif 'A' <= char <= 'Z': + vk = ord(char) + elif 'a' <= char <= 'z': + vk = ord(char.upper()) + + if vk is not None: + # Map to hardware scan code + scan_code = ctypes.windll.user32.MapVirtualKeyW(vk, MAPVK_VK_TO_VSC) + + # Key Down + ctypes.windll.user32.keybd_event(vk, scan_code, 0, 0) + time.sleep(0.001) + + # Key Up + ctypes.windll.user32.keybd_event(vk, scan_code, KEYEVENTF_KEYUP, 0) + time.sleep(0.001) + + # Send VK_RETURN (Enter) with scan code + vk_ret = 0x0D + scan_ret = ctypes.windll.user32.MapVirtualKeyW(vk_ret, MAPVK_VK_TO_VSC) + + ctypes.windll.user32.keybd_event(vk_ret, scan_ret, 0, 0) + time.sleep(0.001) + ctypes.windll.user32.keybd_event(vk_ret, scan_ret, KEYEVENTF_KEYUP, 0) + + return True + except Exception as e: + print(f"Failed to type keyboard input: {e}", file=sys.stderr) + return False + +@app.get("/api/articles") +async def get_articles(): + if not os.path.exists(ARTICLES_FILE): + return {} + try: + with open(ARTICLES_FILE, "r") as f: + return json.load(f) + except Exception as e: + raise HTTPException(status_code=500, detail=f"Fehler beim Laden der Artikeldatenbank: {str(e)}") + +@app.post("/api/articles") +async def save_articles(payload: SaveArticlesRequest): + try: + with open(ARTICLES_FILE, "w") as f: + json.dump(payload.articles, f, indent=2) + from data_generator import reload_classes + reload_classes() + return {"status": "success", "message": "Artikeldatenbank erfolgreich gespeichert!"} + except Exception as e: + raise HTTPException(status_code=500, detail=f"Fehler beim Speichern der Artikeldatenbank: {str(e)}") + +# --- TCP SOCKET CLIENT SENDER --- +TCP_PORT = 9000 + +def send_ean_via_tcp(ean_code: str): + """ + Sends the EAN code to the cash register over TCP on port 9000. + Since the cash register is the server (listening on port 9000), we connect + as a client, transmit the barcode, and close the connection. + """ + message = (ean_code + "\r\n").encode('utf-8') + + print(f"TCP Client Mode: Connecting to cash register at 127.0.0.1:{TCP_PORT}...", flush=True) + try: + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + s.settimeout(0.5) # Fast timeout + s.connect(('127.0.0.1', TCP_PORT)) + s.sendall(message) + print(f"TCP Client: Successfully sent EAN {ean_code} to cash register.", flush=True) + return True + except Exception as e: + print(f"TCP Client: Connection to cash register failed (is register listening on port {TCP_PORT}?): {e}", flush=True) + return False + +@app.post("/api/scan_ean") +async def scan_ean_endpoint(payload: ScanRequest): + try: + class_name = payload.class_name + if not os.path.exists(ARTICLES_FILE): + raise HTTPException(status_code=404, detail="Artikeldatenbank existiert nicht.") + + with open(ARTICLES_FILE, "r") as f: + articles = json.load(f) + + if class_name not in articles: + raise HTTPException(status_code=404, detail=f"Klasse {class_name} nicht in Artikeldatenbank.") + + ean_code = articles[class_name].get("ean", "") + if not ean_code: + raise HTTPException(status_code=400, detail=f"Kein EAN-Code für {class_name} hinterlegt.") + + # 1. Send via TCP (Direct socket integration) + tcp_sent = send_ean_via_tcp(ean_code) + + # 2. Parallel keyboard emulation fallback on Windows + keyboard_sent = simulate_keyboard_type(ean_code) + + if tcp_sent or keyboard_sent: + methods = [] + if tcp_sent: + methods.append("TCP") + if keyboard_sent: + methods.append("Tastatur") + method_desc = " + ".join(methods) + + return { + "status": "success", + "class": class_name, + "name": articles[class_name].get("name", class_name), + "ean": ean_code, + "message": f"Barcode {ean_code} gesendet via {method_desc}!" + } + else: + raise HTTPException(status_code=500, detail="Übertragung fehlgeschlagen (TCP und Tastaturemulation gescheitert).") + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + +# Mount static files (must be after api definitions) +app.mount("/", StaticFiles(directory=static_path, html=True), name="static") + +@app.get("/") +async def root(): + return FileResponse(os.path.join(static_path, "index.html")) diff --git a/app/static/app.js b/app/static/app.js new file mode 100644 index 0000000..5c37b26 --- /dev/null +++ b/app/static/app.js @@ -0,0 +1,1025 @@ +// Application Configuration +const PRICING_DATABASE = { + "apfel_elstar": { name: "Apfel Elstar", price: 2.99, unit: "kg" }, + "apfel_gala": { name: "Apfel Gala", price: 2.49, unit: "kg" }, + "apfel_granny_smith": { name: "Apfel Granny Smith", price: 2.79, unit: "kg" }, + "banane_chiquita": { name: "Banane Chiquita", price: 1.99, unit: "kg" }, + "banane_bio": { name: "Bio Banane", price: 2.29, unit: "kg" }, + "birne": { name: "Birne Abate Fetel", price: 3.29, unit: "kg" }, + "orange": { name: "Orangen", price: 2.19, unit: "kg" }, + "zitrone": { name: "Zitronen", price: 0.59, unit: "Stk." }, + "limette": { name: "Limetten", price: 0.49, unit: "Stk." }, + "erdbeere": { name: "Erdbeeren Schale", price: 2.99, unit: "Stk." }, + "blaubeere": { name: "Kulturheidelbeeren", price: 1.99, unit: "Stk." }, + "weintraube_hell": { name: "Tafeltrauben hell", price: 3.99, unit: "kg" }, + "weintraube_dunkel": { name: "Tafeltrauben dunkel", price: 4.29, unit: "kg" }, + "pfirsich": { name: "Pfirsiche", price: 2.99, unit: "kg" }, + "tomate": { name: "Rispentomaten", price: 3.49, unit: "kg" }, + "gurke": { name: "Salatgurke", price: 0.99, unit: "Stk." }, + "kartoffel": { name: "Speisekartoffeln", price: 1.49, unit: "kg" }, + "karotte": { name: "Speisemöhren", price: 1.29, unit: "kg" }, + "zwiebel_gelb": { name: "Speisezwiebeln", price: 1.19, unit: "kg" }, + "zwiebel_rot": { name: "Rote Zwiebeln", price: 1.69, unit: "kg" }, + "knoblauch": { name: "Knoblauch", price: 0.89, unit: "Stk." }, + "brokkoli": { name: "Brokkoli", price: 1.79, unit: "Stk." }, + "paprika_rot": { name: "Paprika rot", price: 3.99, unit: "kg" }, + "paprika_gelb": { name: "Paprika gelb", price: 3.99, unit: "kg" }, + "paprika_gruen": { name: "Paprika grün", price: 3.49, unit: "kg" }, + "champignon": { name: "Champignons weiß", price: 1.89, unit: "Stk." }, + "zucchini": { name: "Zucchini", price: 2.19, unit: "kg" }, + "avocado": { name: "Avocado Hass", price: 1.29, unit: "Stk." } +}; + +// Application State +let activeTab = 'checkout'; +let isWebcamActive = false; +let webcamStream = null; +let simulatedStreamInterval = null; +let currentFrameBase64 = null; +let isDetecting = false; +let autoDetectEnabled = true; +let trainingPollInterval = null; + +// Scanner Emulator State +let autoScanEnabled = true; +let stableClass = null; +let stableCount = 0; +const STABILITY_THRESHOLD = 4; // number of frames (approx 0.8s) +let lastScannedClass = null; +let scanLockActive = false; +let articlesDatabase = {}; + +// Cart State +let shoppingCart = []; + +// DOM Elements +const videoEl = document.getElementById("webcam"); +const canvasEl = document.getElementById("camera-canvas"); +const ctx = canvasEl.getContext("2d"); +const toggleCameraBtn = document.getElementById("toggle-camera-btn"); +const triggerScaleBtn = document.getElementById("trigger-scale-btn"); +const autoDetectToggle = document.getElementById("auto-detect-toggle"); +const cameraTypeBadge = document.getElementById("camera-type-badge"); +const quickSelectButtons = document.getElementById("quick-selection-buttons"); +const cartList = document.getElementById("cart-list"); +const cartSubtotalEl = document.getElementById("cart-subtotal"); +const cartTotalEl = document.getElementById("cart-total"); +const emptyCartMsg = document.getElementById("empty-cart-msg"); + +// --- TAB NAVIGATION --- +function switchTab(tabName) { + activeTab = tabName; + document.querySelectorAll('.tab-content').forEach(el => el.classList.remove('active')); + document.querySelectorAll('.nav-btn').forEach(el => el.classList.remove('active')); + + document.getElementById(`tab-${tabName}`).classList.add('active'); + document.getElementById(`tab-btn-${tabName}`).classList.add('active'); + + if (tabName === 'dashboard') { + // Start polling training status when entering dashboard + startTrainingPolling(); + refreshAugmentedPreview(); + } else { + stopTrainingPolling(); + } + + if (tabName === 'articles') { + loadArticlesDatabase(); + } +} + +// --- CAMERA & DETECTION LOGIC --- +async function startWebcam() { + try { + webcamStream = await navigator.mediaDevices.getUserMedia({ + video: { width: 640, height: 480, facingMode: "environment" } + }); + videoEl.srcObject = webcamStream; + videoEl.style.display = "none"; + isWebcamActive = true; + cameraTypeBadge.textContent = "LIVE-WEBCAM"; + cameraTypeBadge.style.background = "var(--color-primary)"; + toggleCameraBtn.innerHTML = ` + + Kamera deaktivieren + `; + document.getElementById("stream-status").textContent = "LIVE"; + document.getElementById("stream-status").classList.add("live"); + + // Stop simulated stream if active + if (simulatedStreamInterval) { + clearInterval(simulatedStreamInterval); + simulatedStreamInterval = null; + } + + requestAnimationFrame(processWebcamFrame); + } catch (err) { + console.error("Webcam access denied/unavailable:", err); + alert("Webcam konnte nicht gestartet werden. Der simulierte Kamera-Modus wird verwendet."); + startSimulatedStream(); + } +} + +function stopWebcam() { + if (webcamStream) { + webcamStream.getTracks().forEach(track => track.stop()); + webcamStream = null; + } + videoEl.srcObject = null; + videoEl.style.display = "none"; + isWebcamActive = false; + toggleCameraBtn.innerHTML = ` + + Webcam aktivieren + `; + startSimulatedStream(); +} + +function processWebcamFrame() { + if (!isWebcamActive) return; + + // Draw current video frame to canvas + ctx.drawImage(videoEl, 0, 0, canvasEl.width, canvasEl.height); + + // Get frame as base64 + currentFrameBase64 = canvasEl.toDataURL("image/jpeg", 0.7); + + // Auto-detect if enabled + if (autoDetectEnabled && !isDetecting) { + runDetection(); + } + + setTimeout(() => { + requestAnimationFrame(processWebcamFrame); + }, 150); // Limit detection frequency for performance +} + +function startSimulatedStream() { + cameraTypeBadge.textContent = "SIMULATIONS-MODUS"; + cameraTypeBadge.style.background = "var(--color-bg-dark)"; + document.getElementById("stream-status").textContent = "Simuliert"; + document.getElementById("stream-status").classList.add("live"); + + const loadSimulatedFrame = async () => { + try { + const response = await fetch("/api/simulated_frame"); + const data = await response.json(); + if (data.status === "success" && data.image) { + const img = new Image(); + img.onload = () => { + ctx.drawImage(img, 0, 0, canvasEl.width, canvasEl.height); + currentFrameBase64 = data.image; + + if (autoDetectEnabled && !isDetecting) { + runDetection(); + } + }; + img.src = data.image; + } + } catch (err) { + console.error("Failed to load simulated frame:", err); + } + }; + + loadSimulatedFrame(); // First load immediately + simulatedStreamInterval = setInterval(loadSimulatedFrame, 2500); // cycle frames every 2.5s +} + +// Perform detection API request +async function runDetection() { + if (!currentFrameBase64) return; + isDetecting = true; + + try { + const response = await fetch("/api/detect", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ image: currentFrameBase64 }) + }); + const data = await response.json(); + + if (data.status === "success") { + drawDetections(data.predictions); + updateQuickButtons(data.predictions); + processStabilityAndScan(data.predictions); + } + } catch (err) { + console.error("Detection error:", err); + } finally { + isDetecting = false; + } +} + +// Draw bounding boxes on canvas +function drawDetections(predictions) { + // Redraw the base frame first (to clear old boxes) + const img = new Image(); + img.onload = () => { + ctx.drawImage(img, 0, 0, canvasEl.width, canvasEl.height); + + // Draw boxes + predictions.forEach(pred => { + const [xmin, ymin, xmax, ymax] = pred.box; + const w = xmax - xmin; + const h = ymax - ymin; + const isHighConf = pred.confidence > 0.70; + + // Box outline + ctx.lineWidth = 3; + ctx.strokeStyle = isHighConf ? "#10b981" : "#c084fc"; // Green for high conf, purple for low conf + ctx.strokeRect(xmin, ymin, w, h); + + // Label box background + ctx.fillStyle = isHighConf ? "rgba(16, 185, 129, 0.85)" : "rgba(168, 85, 247, 0.85)"; + const text = `${PRICING_DATABASE[pred.class]?.name || pred.class} (${(pred.confidence * 100).toFixed(0)}%)`; + ctx.font = "bold 12px sans-serif"; + const textWidth = ctx.measureText(text).width; + ctx.fillRect(xmin - 1, ymin - 22, textWidth + 12, 22); + + // Label text + ctx.fillStyle = "#ffffff"; + ctx.fillText(text, xmin + 5, ymin - 6); + }); + }; + img.src = currentFrameBase64; +} + +// Update cashier recommendation buttons +function updateQuickButtons(predictions) { + quickSelectButtons.innerHTML = ""; + + // Filter predictions with confidence > 0.10 + const candidates = predictions.filter(p => p.confidence > 0.10); + + if (candidates.length === 0) { + quickSelectButtons.innerHTML = ` +
+

Keine Objekte erkannt

+ Confidence Schwellenwert unter 10% +
+ `; + return; + } + + candidates.forEach(pred => { + const itemInfo = PRICING_DATABASE[pred.class] || { name: pred.class, price: 1.0, unit: "kg" }; + const confPercent = (pred.confidence * 100).toFixed(0); + const isHigh = pred.confidence > 0.70; + + const btn = document.createElement("button"); + btn.className = `quick-btn ${isHigh ? 'high-conf' : 'low-conf'}`; + btn.onclick = () => sendEanToPos(pred.class); + + btn.innerHTML = ` + ${itemInfo.name} + ${confPercent}% Conf + `; + quickSelectButtons.appendChild(btn); + }); +} + +// --- SHOPPING CART LOGIC --- +function addToCart(classKey) { + const itemInfo = PRICING_DATABASE[classKey]; + if (!itemInfo) return; + + // Simulate weight or piece count + let quantity, itemTotal; + if (itemInfo.unit === "kg") { + // Random weight between 0.150kg and 1.800kg + quantity = parseFloat((0.150 + Math.random() * 1.65).toFixed(3)); + itemTotal = parseFloat((quantity * itemInfo.price).toFixed(2)); + } else { + quantity = 1; + itemTotal = itemInfo.price; + } + + const cartItem = { + key: classKey, + name: itemInfo.name, + pricePerUnit: itemInfo.price, + unit: itemInfo.unit, + quantity: quantity, + total: itemTotal, + timestamp: Date.now() + }; + + shoppingCart.push(cartItem); + updateCartUI(); + + // Scale animation feedback + const scaleCard = document.querySelector(".camera-card"); + scaleCard.classList.add("scale-flash"); + setTimeout(() => scaleCard.classList.remove("scale-flash"), 400); +} + +function deleteCartItem(timestamp) { + shoppingCart = shoppingCart.filter(item => item.timestamp !== timestamp); + updateCartUI(); +} + +function clearCart() { + shoppingCart = []; + updateCartUI(); +} + +function checkoutCart() { + if (shoppingCart.length === 0) return; + const total = cartTotalEl.textContent; + alert(`Zahlung erfolgreich abgeschlossen!\nBetrag: ${total}\nKassenzettel gedruckt.`); + clearCart(); +} + +function updateCartUI() { + cartList.innerHTML = ""; + + if (shoppingCart.length === 0) { + emptyCartMsg.style.display = "flex"; + cartSubtotalEl.textContent = "0,00 €"; + cartTotalEl.textContent = "0,00 €"; + return; + } + + emptyCartMsg.style.display = "none"; + let subtotal = 0; + + shoppingCart.forEach(item => { + subtotal += item.total; + + const row = document.createElement("div"); + row.className = "cart-item-row"; + + const details = document.createElement("div"); + details.className = "item-details"; + + const name = document.createElement("span"); + name.className = "item-name"; + name.textContent = item.name; + + const meta = document.createElement("span"); + meta.className = "item-meta"; + if (item.unit === "kg") { + meta.textContent = `${item.quantity.toFixed(3)} kg x ${item.pricePerUnit.toFixed(2)} €/kg`; + } else { + meta.textContent = `${item.quantity} Stk. x ${item.pricePerUnit.toFixed(2)} €/Stk.`; + } + + details.appendChild(name); + details.appendChild(meta); + + const actions = document.createElement("div"); + actions.className = "item-price-actions"; + + const price = document.createElement("span"); + price.className = "item-price"; + price.textContent = `${item.total.toFixed(2).replace('.', ',')} €`; + + const delBtn = document.createElement("button"); + delBtn.className = "delete-item-btn"; + delBtn.onclick = () => deleteCartItem(item.timestamp); + delBtn.innerHTML = ` + + `; + + actions.appendChild(price); + actions.appendChild(delBtn); + + row.appendChild(details); + row.appendChild(actions); + + cartList.appendChild(row); + }); + + const tax = subtotal * 0.07; // 7% vat + cartSubtotalEl.textContent = `${subtotal.toFixed(2).replace('.', ',')} €`; + cartTotalEl.textContent = `${subtotal.toFixed(2).replace('.', ',')} €`; +} + +// --- DEVELOPER DASHBOARD BACKEND CALLS --- + +// 1. Synthetic dataset trigger +async function generateDataset() { + try { + const response = await fetch("/api/generate_dataset", { method: "POST" }); + const data = await response.json(); + alert(data.message); + startTrainingPolling(); // will start checking generation status + } catch (err) { + console.error("Failed to generate dataset:", err); + } +} + +// 2. Refresh Albumentations augmented preview +async function refreshAugmentedPreview() { + const previewBox = document.getElementById("aug-preview-box"); + previewBox.innerHTML = `
Generiere Vorschau...
`; + + try { + const response = await fetch("/api/augmented_preview"); + const data = await response.json(); + if (data.status === "success") { + previewBox.innerHTML = `Original vs. Augmentiert`; + } else { + previewBox.innerHTML = `
Fehler: ${data.message}
`; + } + } catch (err) { + previewBox.innerHTML = `
Keine Trainingsbilder vorhanden.
Bitte zuerst "Datensatz generieren" klicken.
`; + } +} + +// 3. Trigger model training +async function startTraining() { + const epochs = parseInt(document.getElementById("param-epochs").value) || 15; + const batchSize = parseInt(document.getElementById("param-batch").value) || 8; + + try { + const response = await fetch("/api/train", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ epochs: epochs, batch_size: batchSize }) + }); + const data = await response.json(); + alert(data.message); + startTrainingPolling(); + } catch (err) { + console.error("Failed to start training:", err); + } +} + +// Poll training API +function startTrainingPolling() { + if (trainingPollInterval) return; + + const checkStatus = async () => { + try { + const response = await fetch("/api/train_status"); + const data = await response.json(); + + updateTrainingStatusUI(data); + + // If training or data generation completed or failed, we can stop/keep checking depending on state + if (data.status === "completed" || data.status === "failed" || data.status === "idle") { + // Keep checking periodically but slower, or stop if we want to + } + } catch (err) { + console.error("Status check failed:", err); + } + }; + + checkStatus(); + trainingPollInterval = setInterval(checkStatus, 1500); +} + +function stopTrainingPolling() { + if (trainingPollInterval) { + clearInterval(trainingPollInterval); + trainingPollInterval = null; + } +} + +// Update training UI and plot graphs +function updateTrainingStatusUI(data) { + const trainingState = document.getElementById("training-state"); + const trainingEpoch = document.getElementById("training-epoch"); + const progressFill = document.getElementById("training-progress-fill"); + const logMsg = document.getElementById("training-log-msg"); + const statusBox = document.getElementById("training-status-box"); + + // Update status labels + trainingState.textContent = getGermanState(data.status); + trainingEpoch.textContent = data.epoch > 0 ? `Epoche: ${data.epoch}/${data.total_epochs}` : "Epoche: -/-"; + progressFill.style.width = `${data.progress}%`; + logMsg.textContent = data.message; + + // Update box glow styling + statusBox.className = "training-status-box"; + if (data.status === "training") { + statusBox.classList.add("active-pulse"); + } + + // Plot Chart if loss history is available + if (data.train_loss && data.train_loss.length > 0) { + updateChart(data.train_loss, data.val_loss || []); + } +} + +function getGermanState(status) { + switch (status) { + case "idle": return "Bereit"; + case "generating_data": return "Generiere Daten..."; + case "training": return "Training läuft..."; + case "completed": return "Abgeschlossen"; + case "failed": return "Fehlgeschlagen"; + default: return status; + } +} + +// Plot losses in SVG +function updateChart(trainLosses, valLosses) { + const svgWidth = 440; // width bounds inside SVG 500 + const svgHeight = 150; // height bounds inside SVG 200 + + if (trainLosses.length === 0) return; + + // Find maximum loss to scale Y-axis correctly + const allLosses = [...trainLosses, ...valLosses]; + const maxLoss = Math.max(2.0, ...allLosses); + + const getSvgCoords = (losses) => { + return losses.map((loss, idx) => { + const x = 40 + (idx / (losses.length - 1 || 1)) * svgWidth; + const y = 170 - (loss / maxLoss) * svgHeight; + return `${x.toFixed(1)},${y.toFixed(1)}`; + }); + }; + + const trainPoints = getSvgCoords(trainLosses); + document.getElementById("train-loss-path").setAttribute("d", "M " + trainPoints.join(" L ")); + + if (valLosses.length > 0) { + const valPoints = getSvgCoords(valLosses); + document.getElementById("val-loss-path").setAttribute("d", "M " + valPoints.join(" L ")); + } +} + +// 4. Export model to ONNX +async function exportModel() { + const onnxLog = document.getElementById("onnx-log"); + const exportBtn = document.getElementById("export-onnx-btn"); + const latencyVal = document.getElementById("onnx-latency"); + const latencyStatus = document.getElementById("onnx-latency-status"); + + onnxLog.textContent = "Starte ONNX Export & Benchmarking..."; + exportBtn.disabled = true; + + try { + const response = await fetch("/api/export", { method: "POST" }); + const data = await response.json(); + + exportBtn.disabled = false; + + if (data.status === "success") { + onnxLog.textContent = data.log || "Export erfolgreich!"; + + // Extract latency from benchmark logs using regex + const match = data.log.match(/Average ONNX Runtime inference latency: ([\d\.]+) ms/); + if (match && match[1]) { + const latency = match[1]; + latencyVal.textContent = `${latency} ms`; + latencyStatus.textContent = parseFloat(latency) < 50.0 + ? "✓ < 50 ms (Flüssige Live-Ansicht)" + : "⚠️ > 50 ms (Optimiere Hardware)"; + } else { + latencyVal.textContent = "< 30 ms"; + latencyStatus.textContent = "✓ Inferenz läuft flüssig"; + } + alert("Modell erfolgreich in ONNX konvertiert und geladen!"); + } else { + onnxLog.textContent = `Fehler: ${data.message}`; + alert(`Export fehlgeschlagen: ${data.message}`); + } + } catch (err) { + exportBtn.disabled = false; + onnxLog.textContent = `Fehler bei der Server-Kommunikation.`; + alert("Export-Anfrage fehlgeschlagen. Vergewissere dich, dass ein PyTorch Modell (.pt) existiert."); + } +} + +async function captureForTraining() { + if (!isWebcamActive) { + alert("Bitte aktivieren Sie zuerst die Live-Webcam, um ein echtes Foto aufzunehmen."); + return; + } + + const classSelect = document.getElementById("capture-class-select"); + const selectedClass = classSelect.value; + if (!selectedClass) return; + + const captureBtn = document.getElementById("capture-image-btn"); + captureBtn.disabled = true; + + // Capture current frame from canvas (high quality) + const base64Frame = canvasEl.toDataURL("image/jpeg", 0.95); + + try { + const response = await fetch("/api/capture_training_image", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ image: base64Frame, class_name: selectedClass }) + }); + const data = await response.json(); + captureBtn.disabled = false; + + if (data.status === "success") { + // Update display count + document.getElementById("capture-count-display").textContent = `Eigene Bilder: ${data.count}`; + + // Flash camera box as visual feedback + const container = document.querySelector(".camera-card"); + container.classList.add("scale-flash"); + setTimeout(() => container.classList.remove("scale-flash"), 300); + + console.log(data.message); + } else { + alert(`Fehler bei Aufnahme: ${data.message}`); + } + } catch (err) { + captureBtn.disabled = false; + console.error("Capture request failed:", err); + alert("Serverfehler bei Bild-Erfassung."); + } +} + +async function initCapturePanel() { + const classSelect = document.getElementById("capture-class-select"); + if (!classSelect) return; + + classSelect.innerHTML = ""; + Object.keys(PRICING_DATABASE).forEach(key => { + const opt = document.createElement("option"); + opt.value = key; + opt.textContent = PRICING_DATABASE[key].name; + if (key === "kartoffel") { + opt.selected = true; // default to kartoffel + } + classSelect.appendChild(opt); + }); + + try { + const response = await fetch("/api/capture_count"); + const data = await response.json(); + document.getElementById("capture-count-display").textContent = `Eigene Bilder: ${data.count}`; + } catch (err) { + console.error("Failed to load initial capture count:", err); + } +} + +// --- VIRTUAL BARCODE SCANNER LOGIC --- + +// Initial load of EAN database on startup +async function initArticles() { + try { + const response = await fetch("/api/articles"); + const data = await response.json(); + articlesDatabase = data; + + // Sync names back to PRICING_DATABASE + Object.keys(articlesDatabase).forEach(key => { + if (!PRICING_DATABASE[key]) { + PRICING_DATABASE[key] = { name: articlesDatabase[key].name, price: 1.99, unit: "Stk." }; + } else { + PRICING_DATABASE[key].name = articlesDatabase[key].name; + } + }); + } catch (err) { + console.error("Fehler beim Initialisieren der Artikeldatenbank:", err); + } +} + +// Render articles table rows in Article Management tab +function renderArticlesTable() { + const tbody = document.getElementById("articles-table-body"); + if (!tbody) return; + tbody.innerHTML = ""; + + Object.keys(articlesDatabase).forEach(key => { + const article = articlesDatabase[key]; + const tr = document.createElement("tr"); + tr.style.borderBottom = "1px solid var(--border-glass)"; + + tr.innerHTML = ` + ${key} + + + + + + + `; + tbody.appendChild(tr); + }); +} + +// Load articles table in Article Management tab +async function loadArticlesDatabase() { + try { + const response = await fetch("/api/articles"); + const data = await response.json(); + articlesDatabase = data; + + // Sync to PRICING_DATABASE + Object.keys(articlesDatabase).forEach(key => { + if (!PRICING_DATABASE[key]) { + PRICING_DATABASE[key] = { name: articlesDatabase[key].name, price: 1.99, unit: "Stk." }; + } else { + PRICING_DATABASE[key].name = articlesDatabase[key].name; + } + }); + + renderArticlesTable(); + } catch (err) { + console.error("Fehler beim Laden der Artikeldatenbank:", err); + } +} + +// Prompt to add a new article key and EAN code +function addNewArticlePrompt() { + const key = prompt("Geben Sie einen eindeutigen Systemschlüssel für den Artikel ein (z.B. 'mango', nur Kleinbuchstaben und Unterstriche):"); + if (!key) return; + + // Validate key: lowercase, letters, numbers, underscores + const keyRegex = /^[a-z0-9_]+$/; + if (!keyRegex.test(key)) { + alert("Ungültiger Schlüssel. Bitte nur Kleinbuchstaben (a-z), Zahlen (0-9) und Unterstriche (_) verwenden."); + return; + } + + if (PRICING_DATABASE[key] || articlesDatabase[key]) { + alert("Dieser Artikel-Schlüssel existiert bereits."); + return; + } + + const name = prompt("Geben Sie den Anzeigenamen für den Artikel ein (z.B. 'Mango'):"); + if (!name) return; + + const ean = prompt("Geben Sie den EAN-Barcode für die Tastaturemulation ein (z.B. '4001234000292'):"); + if (!ean) return; + + // Add to local articlesDatabase and PRICING_DATABASE + articlesDatabase[key] = { name: name, ean: ean }; + PRICING_DATABASE[key] = { name: name, price: 1.99, unit: "Stk." }; + + // Reload the table and capture dropdown + renderArticlesTable(); + initCapturePanel(); +} + +// Save articles database +async function saveArticlesDatabase() { + const tbody = document.getElementById("articles-table-body"); + if (!tbody) return; + + const nameInputs = tbody.querySelectorAll(".article-name-input"); + const eanInputs = tbody.querySelectorAll(".article-ean-input"); + + const updatedArticles = {}; + nameInputs.forEach((input, index) => { + const key = input.getAttribute("data-key"); + const name = input.value.trim(); + const ean = eanInputs[index].value.trim(); + updatedArticles[key] = { name, ean }; + }); + + try { + const response = await fetch("/api/articles", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ articles: updatedArticles }) + }); + const data = await response.json(); + if (data.status === "success") { + articlesDatabase = updatedArticles; + + // Sync updated articles to PRICING_DATABASE + Object.keys(updatedArticles).forEach(key => { + if (!PRICING_DATABASE[key]) { + PRICING_DATABASE[key] = { name: updatedArticles[key].name, price: 1.99, unit: "Stk." }; + } else { + PRICING_DATABASE[key].name = updatedArticles[key].name; + } + }); + + // Update capture dropdown + initCapturePanel(); + + alert("Artikeldatenbank erfolgreich gespeichert!"); + } else { + alert("Fehler beim Speichern: " + data.message); + } + } catch (err) { + console.error("Fehler beim Speichern der Artikeldatenbank:", err); + alert("Serverfehler beim Speichern der Artikeldatenbank."); + } +} + +// Play high-pitched scanner beep +function playScannerBeep() { + try { + const audioCtx = new (window.AudioContext || window.webkitAudioContext)(); + const oscillator = audioCtx.createOscillator(); + const gainNode = audioCtx.createGain(); + + oscillator.connect(gainNode); + gainNode.connect(audioCtx.destination); + + oscillator.type = "sine"; + oscillator.frequency.setValueAtTime(1000, audioCtx.currentTime); // 1kHz beep + + gainNode.gain.setValueAtTime(0, audioCtx.currentTime); + gainNode.gain.linearRampToValueAtTime(0.2, audioCtx.currentTime + 0.01); + gainNode.gain.exponentialRampToValueAtTime(0.01, audioCtx.currentTime + 0.15); + + oscillator.start(audioCtx.currentTime); + oscillator.stop(audioCtx.currentTime + 0.16); + } catch (err) { + console.error("Audio Context failed to play beep:", err); + } +} + +// Add log message to the terminal container +function addScanLog(msg) { + const logEl = document.getElementById("scanner-log"); + if (!logEl) return; + + const timeStr = new Date().toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', second: '2-digit' }); + const logLine = `[${timeStr}] ${msg}`; + + if (logEl.textContent === "Warte auf Erkennung...") { + logEl.textContent = logLine; + } else { + logEl.textContent += "\\n" + logLine; + } + + logEl.scrollTop = logEl.scrollHeight; +} + +// Send EAN code to backend scanner endpoint +async function sendEanToPos(classKey) { + const article = articlesDatabase[classKey] || { name: PRICING_DATABASE[classKey]?.name || classKey, ean: "" }; + + if (!article.ean) { + addScanLog(`⚠️ Fehler: Kein EAN-Code für ${article.name} definiert.`); + return; + } + + addScanLog(`Scanne ${article.name} (EAN: ${article.ean})...`); + + try { + const response = await fetch("/api/scan_ean", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ class_name: classKey }) + }); + const data = await response.json(); + + if (response.ok && data.status === "success") { + playScannerBeep(); + addScanLog(`✓ EAN ${article.ean} erfolgreich gesendet.`); + + // Visual flash feedback on scanner card + const scannerCard = document.querySelector(".scanner-card"); + if (scannerCard) { + scannerCard.classList.add("scale-flash"); + setTimeout(() => scannerCard.classList.remove("scale-flash"), 400); + } + } else { + addScanLog(`❌ Fehler: ${data.message || "Tastaturemulation fehlgeschlagen"}`); + } + } catch (err) { + console.error("Scan API error:", err); + addScanLog(`❌ Serverfehler beim Senden des EAN-Codes.`); + } +} + +// Stability filter logic +async function processStabilityAndScan(predictions) { + const autoScanToggle = document.getElementById("auto-scan-toggle"); + const autoScan = autoScanToggle ? autoScanToggle.checked : true; + + // Find the prediction with the highest confidence + let topPrediction = null; + if (predictions && predictions.length > 0) { + predictions.forEach(p => { + if (!topPrediction || p.confidence > topPrediction.confidence) { + topPrediction = p; + } + }); + } + + const scannerIndicator = document.getElementById("scanner-indicator"); + const progressWrapper = document.getElementById("stability-progress-wrapper"); + const progressFill = document.getElementById("stability-progress-fill"); + + const STABLE_CONF_THRESHOLD = 0.75; + + if (topPrediction && topPrediction.confidence >= STABLE_CONF_THRESHOLD) { + const detectedClass = topPrediction.class; + + if (stableClass !== detectedClass) { + stableClass = detectedClass; + stableCount = 1; + } else { + stableCount++; + } + + if (progressWrapper && progressFill) { + progressWrapper.style.display = "block"; + const percent = Math.min(100, (stableCount / STABILITY_THRESHOLD) * 100); + progressFill.style.width = `${percent}%`; + } + + if (scannerIndicator) { + const articleName = PRICING_DATABASE[detectedClass]?.name || detectedClass; + scannerIndicator.textContent = `Erkenne ${articleName}... (${stableCount}/${STABILITY_THRESHOLD})`; + scannerIndicator.style.color = "var(--color-accent)"; + } + + if (stableCount >= STABILITY_THRESHOLD) { + if (lastScannedClass !== detectedClass && !scanLockActive) { + if (autoScan) { + await sendEanToPos(detectedClass); + } else { + addScanLog(`[Auto-Scan aus] ${PRICING_DATABASE[detectedClass]?.name || detectedClass} stabil erkannt.`); + } + lastScannedClass = detectedClass; + scanLockActive = true; + } + + if (progressFill) progressFill.style.width = "0%"; + if (progressWrapper) progressWrapper.style.display = "none"; + + if (scannerIndicator) { + scannerIndicator.textContent = `Gesperrt (Waage leeren)`; + scannerIndicator.style.color = "var(--color-danger)"; + } + } + } else { + const CLEAR_THRESHOLD = 0.15; + + if (!topPrediction || topPrediction.confidence < CLEAR_THRESHOLD) { + stableClass = null; + stableCount = 0; + scanLockActive = false; + lastScannedClass = null; + + if (progressWrapper) progressWrapper.style.display = "none"; + if (progressFill) progressFill.style.width = "0%"; + if (scannerIndicator) { + scannerIndicator.textContent = "Bereit (Warte auf Objekt)"; + scannerIndicator.style.color = "var(--color-success)"; + } + } else { + stableCount = Math.max(0, stableCount - 1); + if (progressWrapper && progressFill) { + const percent = (stableCount / STABILITY_THRESHOLD) * 100; + progressFill.style.width = `${percent}%`; + } + if (scannerIndicator && stableCount > 0) { + scannerIndicator.textContent = `Signal instabil...`; + scannerIndicator.style.color = "var(--color-warning)"; + } else if (scannerIndicator && !scanLockActive) { + scannerIndicator.textContent = "Bereit (Signal instabil)"; + scannerIndicator.style.color = "var(--color-success)"; + } + } + } +} + +// Manual scan trigger +async function triggerManualScan() { + if (stableClass) { + addScanLog(`Manueller Scan ausgelöst für ${PRICING_DATABASE[stableClass]?.name || stableClass}...`); + await sendEanToPos(stableClass); + } else { + addScanLog(`⚠️ Kein stabiles Objekt auf der Waage. Manueller Scan abgebrochen.`); + alert("Bitte legen Sie ein Produkt auf die Waage, um es zu scannen."); + } +} + +// --- INTERACTIVE EVENT LISTENERS --- +toggleCameraBtn.addEventListener("click", () => { + if (isWebcamActive) { + stopWebcam(); + } else { + startWebcam(); + } +}); + +triggerScaleBtn.addEventListener("click", () => { + // Flash scale overlay on manual trigger + const overlay = document.querySelector(".camera-card"); + overlay.classList.add("scale-flash"); + setTimeout(() => overlay.classList.remove("scale-flash"), 400); + + // Explicitly run detection + runDetection(); +}); + +autoDetectToggle.addEventListener("change", (e) => { + autoDetectEnabled = e.target.checked; +}); + +// App Startup Initialization +window.addEventListener("DOMContentLoaded", () => { + // Start in simulated video mode by default + startSimulatedStream(); + + // Fetch articles from database + initArticles(); + + // Read parameters from local values + updateCartUI(); + + // Initialize capture classes + initCapturePanel(); +}); diff --git a/app/static/index.html b/app/static/index.html new file mode 100644 index 0000000..dfe440e --- /dev/null +++ b/app/static/index.html @@ -0,0 +1,382 @@ + + + + + + FruitVision AI - POS Objekterkennung + + + + + + +
+ +
+ + + +
+ + +
+ + +
+
+ +
+
+
+

Kamera-Vorschau

+

Positioniere das lose Obst & Gemüse auf der Waage

+
+ Simuliert +
+ +
+ + + + +
+
+
+ +
SIMULATION-MODUS
+
+ +
+ + + +
+ + +
+

Reales Produktbild erfassen (Datensammler)

+
+ + + Eigene Bilder: 0 +
+

+ Legen Sie Ihre echte Kartoffel mittig in das Zielkreuz und nehmen Sie 10-15 Bilder aus verschiedenen Winkeln/Entfernungen auf. +

+
+
+ + +
+ + +
+
+

KI Schnellwahltasten

+

Vorschläge über Confidence-Schwellenwert > 10%

+
+
+
+

Warte auf Objekterkennung...

+ Legen Sie Obst auf die Waage +
+
+
+ + +
+
+

Virtueller Barcode-Scanner

+ +
+
+
+ Scanner-Status: + Bereit +
+ +
+
Scanner-Verlauf (Keystroke Logs)
+
Warte auf Erkennung...
+
+ +
+
+ + +
+
+

Kassenzettel

+

Aktuelle Transaktion

+
+
+
+ +

Einkaufswagen ist leer

+
+
+
+
+ Zwischensumme: + 0,00 € +
+
+ Gesamtsumme: + 0,00 € +
+
+
+ + +
+
+ +
+
+
+ + +
+
+ + +
+ + +
+
+ Schritt 1 +

Synthetische Datenpipeline

+

Generiere Trainingsdaten & Augmentierungen (Albumentations)

+
+
+
+ + Erstellt 200 Trainings- & 50 Validierungsbilder (YOLO-Format) +
+ +
+
+

Augmentierungs-Vorschau (Live-Pipeline)

+ +
+

Echtzeit-Störung (Shift, Rotate, Scale, Brightness, Noise) zur Vermeidung von Overfitting an Lichtbedingungen.

+ +
+
+ Klicke auf "Aktualisieren" um ein Bild und seine Albumentations-Störung anzuzeigen. +
+
+
+
+
+ + +
+
+ Schritt 3 +

ONNX-Export & Hardware-Inferenz

+

Modell-Optimierung für flüssigen Kassenbetrieb unter 50 ms

+
+
+
+ + Konvertiert PyTorch (.pt) in ONNX (.onnx) für die Inferenz-Engine. +
+ +
+
ONNX Compiler Logs
+
Warte auf Export-Trigger...
+
+ +
+
+ Inferenz-Zeit (CPU/NPU) + - ms + Warte auf Export +
+
+ Lizenzen & Schutzrecht + 100% OK + Royalty-Free (BSD / MIT), kein GPL-Copyleft +
+
+
+
+
+ + +
+ + +
+
+ Schritt 2 +

Transfer Learning (PyTorch)

+

Modelltraining auf SSDLite MobileNetV3-Large Basis

+
+
+
+
+ + +
+
+ + +
+ +
+ + +
+
+ Status: Bereit + Epoche: -/- +
+ +
+
+
+ +

Klicke "Training starten" um den Feintuning-Prozess anzustoßen.

+
+ + +
+

Lernkurve (Loss History)

+
+ + + + + + + + + 2.0 + 1.0 + 0.5 + 0.0 + + + + + +
+
+
Train Loss
+
Validation Loss
+
+
+
+
+ +
+
+
+ + +
+
+
+
+

Artikel- & EAN-Verwaltung

+

Hinterlegen Sie die Barcodes (EAN) Ihrer Produkte für den virtuellen Scanner

+
+
+ + +
+
+
+

+ Geben Sie für jede Produktklasse den gewünschten Barcode (EAN) ein. Wenn das System dieses Produkt stabil erkennt, simuliert der virtuelle Tastatur-Scanner diesen Barcode direkt in Ihr Kassenfenster (gefolgt von Enter). +

+ +
+ + + + + + + + + + + +
Klasse (ML-Key)Name (Anzeige)EAN-Barcode (Tastaturemulation)
+
+
+
+
+
+ + +
+

Lizenz-Fokus: 100% kommerziell nutzbar, BSD & MIT Open-Source Lizenzen. ONNX Runtime Inference.

+
+
+ + + + diff --git a/app/static/styles.css b/app/static/styles.css new file mode 100644 index 0000000..2e1d87a --- /dev/null +++ b/app/static/styles.css @@ -0,0 +1,1075 @@ +/* Global CSS Variables & Theme Setup */ +:root { + --color-bg-darkest: #0a0d14; + --color-bg-dark: #101420; + --color-bg-card: rgba(21, 27, 43, 0.75); + --color-bg-input: #151b2a; + --color-primary: #6366f1; /* Vibrant Indigo */ + --color-primary-glow: rgba(99, 102, 241, 0.35); + --color-accent: #a855f7; /* Electric Purple */ + --color-accent-glow: rgba(168, 85, 247, 0.25); + --color-success: #10b981; /* Emerald Green */ + --color-success-glow: rgba(16, 185, 129, 0.25); + --color-warning: #f59e0b; /* Amber */ + --color-danger: #ef4444; /* Rose Red */ + + --text-primary: #f3f4f6; + --text-secondary: #9ca3af; + --text-muted: #6b7280; + + --border-glass: rgba(255, 255, 255, 0.08); + --border-focus: rgba(99, 102, 241, 0.5); + --shadow-soft: 0 10px 30px -10px rgba(0, 0, 0, 0.5); + --shadow-glow: 0 0 20px var(--color-primary-glow); + + --font-heading: 'Outfit', sans-serif; + --font-body: 'Inter', sans-serif; + + --border-radius-lg: 16px; + --border-radius-md: 10px; + --border-radius-sm: 6px; +} + +/* Reset & Base Styles */ +* { + box-sizing: border-box; + margin: 0; + padding: 0; +} + +body { + background-color: var(--color-bg-darkest); + background-image: radial-gradient(circle at 10% 20%, rgba(99, 102, 241, 0.05) 0%, transparent 40%), + radial-gradient(circle at 90% 80%, rgba(168, 85, 247, 0.05) 0%, transparent 40%); + background-attachment: fixed; + color: var(--text-primary); + font-family: var(--font-body); + -webkit-font-smoothing: antialiased; + min-height: 100vh; +} + +.app-container { + display: flex; + flex-direction: column; + min-height: 100vh; + padding: 0 24px; + max-width: 1600px; + margin: 0 auto; +} + +/* Header styling */ +.app-header { + display: flex; + justify-content: space-between; + align-items: center; + padding: 20px 0; + border-bottom: 1px solid var(--border-glass); +} + +.header-logo { + display: flex; + align-items: center; + gap: 12px; +} + +.header-logo h1 { + font-family: var(--font-heading); + font-size: 24px; + font-weight: 700; + letter-spacing: -0.5px; + color: var(--text-primary); +} + +.header-logo h1 span.badge { + font-size: 11px; + font-family: var(--font-body); + font-weight: 600; + letter-spacing: 0.5px; + padding: 3px 8px; + background: linear-gradient(135deg, var(--color-primary), var(--color-accent)); + border-radius: 20px; + margin-left: 6px; + vertical-align: middle; + box-shadow: 0 0 10px rgba(99, 102, 241, 0.2); +} + +.header-nav { + display: flex; + gap: 12px; + background: rgba(16, 20, 32, 0.6); + padding: 4px; + border-radius: var(--border-radius-md); + border: 1px solid var(--border-glass); + backdrop-filter: blur(8px); +} + +.nav-btn { + display: flex; + align-items: center; + gap: 8px; + background: transparent; + border: none; + color: var(--text-secondary); + padding: 8px 16px; + font-family: var(--font-body); + font-size: 14px; + font-weight: 500; + border-radius: var(--border-radius-sm); + cursor: pointer; + transition: all 0.2s ease; +} + +.nav-btn:hover { + color: var(--text-primary); + background: rgba(255, 255, 255, 0.04); +} + +.nav-btn.active { + color: var(--text-primary); + background: var(--color-primary); + box-shadow: 0 4px 12px rgba(99, 102, 241, 0.25); +} + +/* Main layouts */ +.app-main { + flex-grow: 1; + padding: 24px 0; +} + +.tab-content { + display: none; + animation: fadeIn 0.4s cubic-bezier(0.4, 0, 0.2, 1) forwards; +} + +.tab-content.active { + display: block; +} + +@keyframes fadeIn { + from { opacity: 0; transform: translateY(8px); } + to { opacity: 1; transform: translateY(0); } +} + +/* Card components */ +.card { + background: var(--color-bg-card); + border: 1px solid var(--border-glass); + border-radius: var(--border-radius-lg); + box-shadow: var(--shadow-soft); + backdrop-filter: blur(16px); + overflow: hidden; + margin-bottom: 24px; +} + +.card-header { + padding: 20px 24px; + border-bottom: 1px solid var(--border-glass); + display: flex; + justify-content: space-between; + align-items: center; +} + +.card-title { + font-family: var(--font-heading); + font-size: 18px; + font-weight: 600; + color: var(--text-primary); +} + +.card-subtitle { + font-size: 13px; + color: var(--text-secondary); + margin-top: 2px; +} + +.card-body { + padding: 24px; +} + +/* Checkout View Layout */ +.checkout-grid { + display: grid; + grid-template-columns: 1.6fr 1fr; + gap: 24px; + align-items: start; +} + +@media (max-width: 1024px) { + .checkout-grid { + grid-template-columns: 1fr; + } +} + +.camera-card { + margin-bottom: 0; +} + +.camera-viewport-container { + position: relative; + width: 100%; + aspect-ratio: 4/3; + max-height: 520px; + background: #000; + border-bottom: 1px solid var(--border-glass); + display: flex; + align-items: center; + justify-content: center; + overflow: hidden; +} + +#camera-canvas { + width: 100%; + height: 100%; + object-fit: cover; +} + +/* Weight Scale target frame overlap overlay */ +.scale-target-overlay { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + pointer-events: none; + display: flex; + align-items: center; + justify-content: center; +} + +.scale-target-box { + width: 70%; + height: 65%; + border: 2px dashed rgba(255, 255, 255, 0.25); + border-radius: var(--border-radius-lg); + box-shadow: 0 0 0 9999px rgba(0, 0, 0, 0.4); + position: relative; + transition: all 0.3s ease; +} + +.scale-target-box::before, .scale-target-box::after { + content: ''; + position: absolute; + width: 24px; + height: 24px; + border-color: rgba(255, 255, 255, 0.5); + border-style: solid; +} + +.scale-target-box::before { + top: -2px; left: -2px; border-width: 3px 0 0 3px; border-top-left-radius: 8px; +} +.scale-target-box::after { + bottom: -2px; right: -2px; border-width: 0 3px 3px 0; border-bottom-right-radius: 8px; +} + +.scale-flash .scale-target-box { + border-color: var(--color-success); + box-shadow: 0 0 0 9999px rgba(0, 0, 0, 0.2), 0 0 40px var(--color-success-glow); +} + +.stream-badge { + position: absolute; + top: 16px; + left: 16px; + background: rgba(0, 0, 0, 0.7); + border: 1px solid var(--border-glass); + padding: 4px 10px; + border-radius: var(--border-radius-sm); + font-size: 11px; + font-weight: 600; + letter-spacing: 0.5px; + color: var(--text-primary); + backdrop-filter: blur(4px); +} + +.status-indicator { + display: flex; + align-items: center; + gap: 6px; + font-size: 12px; + font-weight: 500; + padding: 4px 10px; + background: rgba(255, 255, 255, 0.05); + border: 1px solid var(--border-glass); + border-radius: 20px; +} + +.status-indicator::before { + content: ''; + display: inline-block; + width: 8px; + height: 8px; + border-radius: 50%; + background: var(--text-muted); +} + +.status-indicator.live::before { + background: var(--color-success); + box-shadow: 0 0 8px var(--color-success); + animation: pulse 1.5s infinite; +} + +.status-indicator.training::before { + background: var(--color-warning); + box-shadow: 0 0 8px var(--color-warning); + animation: pulse 1.5s infinite; +} + +@keyframes pulse { + 0% { transform: scale(0.9); opacity: 0.6; } + 50% { transform: scale(1.2); opacity: 1; } + 100% { transform: scale(0.9); opacity: 0.6; } +} + +.camera-controls { + padding: 16px 24px; + display: flex; + align-items: center; + gap: 16px; +} + +/* POS Quick buttons layout */ +.quick-buttons-container { + padding: 20px; + display: grid; + grid-template-columns: repeat(auto-fill, minmax(130px, 1fr)); + gap: 12px; + min-height: 100px; +} + +.quick-btn { + background: linear-gradient(135deg, rgba(255, 255, 255, 0.04), rgba(255, 255, 255, 0.01)); + border: 1px solid var(--border-glass); + color: var(--text-primary); + padding: 14px; + border-radius: var(--border-radius-md); + cursor: pointer; + display: flex; + flex-direction: column; + align-items: center; + gap: 6px; + transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1); +} + +.quick-btn:hover { + transform: translateY(-2px); + border-color: var(--color-primary); + background: rgba(99, 102, 241, 0.08); +} + +.quick-btn:active { + transform: translateY(0); +} + +.quick-btn .btn-label { + font-size: 13px; + font-weight: 500; + text-align: center; + text-transform: capitalize; +} + +.quick-btn .btn-conf { + font-size: 11px; + font-weight: 600; + padding: 2px 6px; + border-radius: 20px; +} + +/* Style conf badge color dynamically based on class values */ +.quick-btn.high-conf { + border-color: rgba(16, 185, 129, 0.4); + background: rgba(16, 185, 129, 0.05); +} +.quick-btn.high-conf:hover { + background: rgba(16, 185, 129, 0.1); + border-color: var(--color-success); +} +.quick-btn.high-conf .btn-conf { + background: var(--color-success-glow); + color: #34d399; +} + +.quick-btn.low-conf .btn-conf { + background: rgba(255, 255, 255, 0.05); + color: var(--text-secondary); +} + +.empty-state { + grid-column: 1 / -1; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + color: var(--text-muted); + padding: 24px; + text-align: center; +} + +.empty-state span { + font-size: 12px; + margin-top: 4px; +} + +/* Shopping Cart styling - Kassenzettel */ +.cart-card { + display: none !important; +} + +.cart-items { + padding: 20px 24px; + flex-grow: 1; + min-height: 180px; + max-height: 320px; + overflow-y: auto; + border-bottom: 1px dashed var(--border-glass); +} + +.empty-cart-state { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + color: var(--text-muted); + height: 100%; + gap: 8px; + padding: 24px; +} + +.empty-cart-state p { + font-size: 14px; +} + +.cart-item-row { + display: flex; + justify-content: space-between; + align-items: center; + padding: 10px 0; + border-bottom: 1px solid rgba(255, 255, 255, 0.03); +} + +.cart-item-row:last-child { + border-bottom: none; +} + +.item-details { + display: flex; + flex-direction: column; +} + +.item-name { + font-weight: 500; + font-size: 14px; + text-transform: capitalize; +} + +.item-meta { + font-size: 11px; + color: var(--text-secondary); + margin-top: 2px; +} + +.item-price-actions { + display: flex; + align-items: center; + gap: 16px; +} + +.item-price { + font-weight: 600; + font-size: 14px; +} + +.delete-item-btn { + background: transparent; + border: none; + color: var(--text-muted); + cursor: pointer; + padding: 4px; + border-radius: 4px; + transition: all 0.2s ease; +} + +.delete-item-btn:hover { + color: var(--color-danger); + background: rgba(239, 68, 68, 0.08); +} + +.cart-summary { + padding: 16px 24px; + background: rgba(0, 0, 0, 0.15); + border-bottom: 1px solid var(--border-glass); +} + +.summary-row { + display: flex; + justify-content: space-between; + font-size: 13px; + color: var(--text-secondary); + margin-bottom: 6px; +} + +.summary-row:last-child { + margin-bottom: 0; +} + +.summary-row.total { + font-family: var(--font-heading); + font-size: 18px; + font-weight: 700; + color: var(--text-primary); + margin-top: 8px; + padding-top: 8px; + border-top: 1px solid var(--border-glass); +} + +.cart-actions { + padding: 16px 24px; + display: flex; + gap: 12px; +} + +.cart-actions button { + flex-grow: 1; +} + +/* Button UI system */ +.btn { + display: inline-flex; + align-items: center; + justify-content: center; + gap: 8px; + padding: 10px 20px; + font-family: var(--font-body); + font-size: 14px; + font-weight: 500; + border-radius: var(--border-radius-md); + border: 1px solid transparent; + cursor: pointer; + transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1); +} + +.btn:active { + transform: scale(0.98); +} + +.btn-primary { + background: var(--color-primary); + color: #fff; + box-shadow: 0 4px 14px rgba(99, 102, 241, 0.3); +} +.btn-primary:hover { + background: #4f46e5; + transform: translateY(-1px); +} + +.btn-secondary { + background: rgba(255, 255, 255, 0.04); + border-color: var(--border-glass); + color: var(--text-primary); +} +.btn-secondary:hover { + background: rgba(255, 255, 255, 0.08); + transform: translateY(-1px); +} + +.btn-accent { + background: var(--color-accent); + color: #fff; + box-shadow: 0 4px 14px rgba(168, 85, 247, 0.3); +} +.btn-accent:hover { + background: #9333ea; + transform: translateY(-1px); +} + +.btn-success { + background: var(--color-success); + color: #fff; + box-shadow: 0 4px 14px rgba(16, 185, 129, 0.3); +} +.btn-success:hover { + background: #059669; + transform: translateY(-1px); +} + +.btn-danger { + background: rgba(239, 68, 68, 0.1); + border-color: rgba(239, 68, 68, 0.2); + color: var(--color-danger); +} +.btn-danger:hover { + background: var(--color-danger); + color: #fff; + transform: translateY(-1px); +} + +.btn-text { + background: transparent; + border: none; + color: var(--color-primary); + padding: 4px 8px; + border-radius: 4px; + font-size: 13px; +} +.btn-text:hover { + background: rgba(99, 102, 241, 0.08); +} + +.btn-glow:hover { + box-shadow: 0 0 25px var(--color-primary-glow); +} +.btn-success.btn-glow:hover { + box-shadow: 0 0 25px var(--color-success-glow); +} + +/* Toggle Switches */ +.toggle-control { + display: flex; + align-items: center; + gap: 8px; + cursor: pointer; + user-select: none; +} + +.toggle-slider { + position: relative; + display: inline-block; + width: 44px; + height: 24px; + background-color: rgba(255, 255, 255, 0.1); + border: 1px solid var(--border-glass); + border-radius: 20px; + transition: all 0.3s ease; +} + +.toggle-slider::before { + content: ''; + position: absolute; + height: 16px; + width: 16px; + left: 3px; + bottom: 3px; + background-color: var(--text-secondary); + border-radius: 50%; + transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); +} + +input:checked + .toggle-slider { + background-color: var(--color-primary); + border-color: var(--color-primary); +} + +input:checked + .toggle-slider::before { + transform: translateX(20px); + background-color: #fff; +} + +.toggle-label { + font-size: 13px; + font-weight: 500; + color: var(--text-primary); +} + +.toggle-control input { + display: none; +} + +/* Developer Dashboard layout */ +.dashboard-grid { + display: grid; + grid-template-columns: 1fr 1.1fr; + gap: 24px; +} + +@media (max-width: 1024px) { + .dashboard-grid { + grid-template-columns: 1fr; + } +} + +.dashboard-column { + display: flex; + flex-direction: column; +} + +.step-num { + font-size: 10px; + font-weight: 700; + letter-spacing: 1px; + text-transform: uppercase; + color: var(--color-accent); + padding: 3px 8px; + background: var(--color-accent-glow); + border-radius: 4px; + border: 1px solid rgba(168, 85, 247, 0.15); +} + +.action-row { + display: flex; + align-items: center; + gap: 20px; + margin-bottom: 20px; +} + +.action-desc { + font-size: 13px; + color: var(--text-secondary); + line-height: 1.4; +} + +/* Preview Augmentations styling */ +.augmentation-section { + border-top: 1px solid var(--border-glass); + padding-top: 20px; + margin-top: 20px; +} + +.section-title-row { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 6px; +} + +.section-title-row h3 { + font-size: 15px; + font-weight: 600; +} + +.section-desc { + font-size: 12px; + color: var(--text-muted); + margin-bottom: 12px; + line-height: 1.4; +} + +.preview-container { + width: 100%; + aspect-ratio: 2/1; + background: #090b10; + border: 1px solid var(--border-glass); + border-radius: var(--border-radius-md); + display: flex; + align-items: center; + justify-content: center; + overflow: hidden; +} + +.preview-placeholder { + color: var(--text-muted); + font-size: 12px; + text-align: center; + padding: 24px; + max-width: 80%; +} + +.preview-image { + width: 100%; + height: 100%; + object-fit: contain; +} + +/* Terminal compiler output simulation */ +.terminal-container { + background: #090c12; + border: 1px solid var(--border-glass); + border-radius: var(--border-radius-md); + padding: 12px; + margin-top: 12px; + margin-bottom: 20px; +} + +.terminal-header { + font-family: monospace; + font-size: 11px; + color: var(--text-muted); + margin-bottom: 6px; + padding-bottom: 4px; + border-bottom: 1px solid rgba(255, 255, 255, 0.03); +} + +.terminal-output { + font-family: 'Courier New', Courier, monospace; + font-size: 11px; + color: #38bdf8; /* light blue */ + white-space: pre-wrap; + max-height: 120px; + overflow-y: auto; + line-height: 1.4; +} + +/* Metrics Dashboard Cards */ +.metric-grid { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 16px; +} + +.metric-card { + background: rgba(0, 0, 0, 0.15); + border: 1px solid var(--border-glass); + border-radius: var(--border-radius-md); + padding: 16px; + display: flex; + flex-direction: column; +} + +.metric-label { + font-size: 11px; + font-weight: 500; + color: var(--text-secondary); + text-transform: uppercase; + letter-spacing: 0.5px; +} + +.metric-value { + font-family: var(--font-heading); + font-size: 26px; + font-weight: 700; + margin: 8px 0 4px 0; +} + +.metric-desc { + font-size: 11px; + color: var(--text-muted); +} + +.text-accent { + color: var(--color-accent); +} +.text-success { + color: var(--color-success); +} + +/* Training panel inputs & controls */ +.training-controls-row { + display: flex; + align-items: flex-end; + gap: 16px; + margin-bottom: 24px; +} + +.control-group { + display: flex; + flex-direction: column; + gap: 6px; +} + +.control-group label { + font-size: 12px; + font-weight: 500; + color: var(--text-secondary); +} + +.control-group input, .control-group select { + background: var(--color-bg-input); + border: 1px solid var(--border-glass); + border-radius: var(--border-radius-md); + padding: 8px 12px; + color: var(--text-primary); + font-family: var(--font-body); + font-size: 14px; + width: 100px; +} + +.control-group input:focus, .control-group select:focus { + outline: none; + border-color: var(--color-primary); +} + +.training-controls-row button { + flex-grow: 1; +} + +/* Training status monitor card */ +.training-status-box { + background: rgba(0, 0, 0, 0.2); + border: 1px solid var(--border-glass); + border-radius: var(--border-radius-md); + padding: 16px; + margin-bottom: 24px; +} + +.status-header-row { + display: flex; + justify-content: space-between; + font-size: 13px; + margin-bottom: 10px; +} + +.status-epoch { + color: var(--text-secondary); +} + +.progress-bar-container { + width: 100%; + height: 8px; + background: rgba(255, 255, 255, 0.05); + border-radius: 10px; + overflow: hidden; + margin-bottom: 12px; +} + +.progress-bar-fill { + height: 100%; + background: linear-gradient(90deg, var(--color-primary), var(--color-accent)); + border-radius: 10px; + transition: width 0.4s ease; + box-shadow: 0 0 10px var(--color-primary-glow); +} + +.status-log-message { + font-size: 12px; + color: var(--text-secondary); + line-height: 1.4; +} + +/* Training chart */ +.chart-container h3 { + font-size: 14px; + font-weight: 600; + color: var(--text-primary); + margin-bottom: 12px; +} + +.chart-wrapper { + background: #090c12; + border: 1px solid var(--border-glass); + border-radius: var(--border-radius-md); + padding: 12px; +} + +.training-chart { + width: 100%; + height: auto; + overflow: visible; +} + +.training-chart text { + font-family: monospace; +} + +.chart-legend { + display: flex; + gap: 16px; + justify-content: center; + margin-top: 10px; +} + +.legend-item { + display: flex; + align-items: center; + gap: 6px; + font-size: 11px; + color: var(--text-secondary); +} + +.legend-color { + width: 12px; + height: 4px; + border-radius: 2px; + display: inline-block; +} + +.legend-color.train { + background: var(--color-primary); +} + +.legend-color.val { + background: var(--color-accent); + border-top: 1px dashed #fff; /* indicates dash array */ +} + +/* Real Data Capture Panel Styles */ +.capture-training-panel { + padding: 16px 24px; + border-top: 1px dashed var(--border-glass); + background: rgba(0, 0, 0, 0.12); +} + +.capture-training-panel h3 { + font-size: 13px; + font-weight: 600; + margin-bottom: 10px; + color: var(--text-primary); + text-transform: uppercase; + letter-spacing: 0.5px; +} + +.capture-controls-row { + display: flex; + gap: 12px; + align-items: center; + margin-bottom: 8px; +} + +.capture-controls-row select { + flex-grow: 1; + background: var(--color-bg-input); + border: 1px solid var(--border-glass); + border-radius: var(--border-radius-md); + padding: 8px 12px; + color: var(--text-primary); + font-family: var(--font-body); + font-size: 14px; + outline: none; +} + +.capture-controls-row select:focus { + border-color: var(--color-accent); +} + +.capture-count-badge { + font-size: 12px; + font-weight: 600; + padding: 6px 12px; + background: var(--color-accent-glow); + border: 1px solid rgba(168, 85, 247, 0.2); + color: var(--color-accent); + border-radius: var(--border-radius-sm); + white-space: nowrap; +} + +.panel-info-text { + font-size: 11px; + color: var(--text-muted); + line-height: 1.4; +} + +/* Article Management Table Styles */ +.articles-table th, .articles-table td { + padding: 12px 16px; + border-bottom: 1px solid var(--border-glass); +} + +.articles-table tbody tr:hover { + background: rgba(255, 255, 255, 0.02); +} + +.articles-table input { + background: var(--color-bg-input); + border: 1px solid var(--border-glass); + border-radius: var(--border-radius-sm); + padding: 6px 12px; + color: var(--text-primary); + font-family: monospace; + font-size: 14px; + width: 100%; + max-width: 250px; + outline: none; + transition: all 0.2s ease; +} + +.articles-table input:focus { + border-color: var(--color-primary); + box-shadow: 0 0 8px var(--color-primary-glow); +} + +/* Footer styling */ +.app-footer { + border-top: 1px solid var(--border-glass); + padding: 16px 0; + text-align: center; + color: var(--text-muted); + font-size: 11px; +} diff --git a/articles.json b/articles.json new file mode 100644 index 0000000..7669785 --- /dev/null +++ b/articles.json @@ -0,0 +1,114 @@ +{ + "apfel_elstar": { + "name": "Apfel Elstar", + "ean": "4001234000018" + }, + "apfel_gala": { + "name": "Apfel Gala", + "ean": "4001234000025" + }, + "apfel_granny_smith": { + "name": "Apfel Granny Smith", + "ean": "4001234000032" + }, + "banane_chiquita": { + "name": "Banane Chiquita", + "ean": "4001234000049" + }, + "banane_bio": { + "name": "Bio Banane", + "ean": "4001234000056" + }, + "birne": { + "name": "Birne Abate Fetel", + "ean": "4001234000063" + }, + "orange": { + "name": "Orangen", + "ean": "4001234000070" + }, + "zitrone": { + "name": "Zitronen", + "ean": "4001234000087" + }, + "limette": { + "name": "Limetten", + "ean": "4001234000094" + }, + "erdbeere": { + "name": "Erdbeeren Schale", + "ean": "4001234000100" + }, + "blaubeere": { + "name": "Kulturheidelbeeren", + "ean": "4001234000117" + }, + "weintraube_hell": { + "name": "Tafeltrauben hell", + "ean": "4001234000124" + }, + "weintraube_dunkel": { + "name": "Tafeltrauben dunkel", + "ean": "4001234000131" + }, + "pfirsich": { + "name": "Pfirsiche", + "ean": "4001234000148" + }, + "tomate": { + "name": "Rispentomaten", + "ean": "4001234000155" + }, + "gurke": { + "name": "Salatgurke", + "ean": "4001234000162" + }, + "kartoffel": { + "name": "Speisekartoffeln", + "ean": "4001234000163" + }, + "karotte": { + "name": "Speisem\u00c3\u00b6hren", + "ean": "4001234000186" + }, + "zwiebel_gelb": { + "name": "Speisezwiebeln", + "ean": "4001234000193" + }, + "zwiebel_rot": { + "name": "Rote Zwiebeln", + "ean": "4001234000209" + }, + "knoblauch": { + "name": "Knoblauch", + "ean": "4001234000216" + }, + "brokkoli": { + "name": "Brokkoli", + "ean": "4001234000223" + }, + "paprika_rot": { + "name": "Paprika rot", + "ean": "4001234000230" + }, + "paprika_gelb": { + "name": "Paprika gelb", + "ean": "4001234000247" + }, + "paprika_gruen": { + "name": "Paprika gr\u00c3\u00bcn", + "ean": "4001234000254" + }, + "champignon": { + "name": "Champignons wei\u00c3\u0178", + "ean": "4001234000261" + }, + "zucchini": { + "name": "Zucchini", + "ean": "4001234000278" + }, + "avocado": { + "name": "Avocado Hass", + "ean": "4001234000285" + } +} \ No newline at end of file diff --git a/data_generator.py b/data_generator.py new file mode 100644 index 0000000..f021afd --- /dev/null +++ b/data_generator.py @@ -0,0 +1,475 @@ +import os +import random +import numpy as np +from PIL import Image, ImageDraw, ImageFilter + +import json + +# Define expanded classes (28 classes) +DEFAULT_CLASSES = [ + "apfel_elstar", + "apfel_gala", + "apfel_granny_smith", + "banane_chiquita", + "banane_bio", + "birne", + "orange", + "zitrone", + "limette", + "erdbeere", + "blaubeere", + "weintraube_hell", + "weintraube_dunkel", + "pfirsich", + "tomate", + "gurke", + "kartoffel", + "karotte", + "zwiebel_gelb", + "zwiebel_rot", + "knoblauch", + "brokkoli", + "paprika_rot", + "paprika_gelb", + "paprika_gruen", + "champignon", + "zucchini", + "avocado" +] + +def get_classes_from_db(): + base_dir = os.path.dirname(os.path.abspath(__file__)) + articles_path = os.path.join(base_dir, "articles.json") + if os.path.exists(articles_path): + try: + with open(articles_path, "r") as f: + articles = json.load(f) + keys = list(articles.keys()) + if keys: + return keys + except Exception: + pass + return DEFAULT_CLASSES.copy() + +CLASSES = get_classes_from_db() + +def reload_classes(): + new_classes = get_classes_from_db() + CLASSES.clear() + CLASSES.extend(new_classes) + print(f"Reloaded CLASSES: {len(CLASSES)} classes in memory.") + +def draw_apple_elstar(draw): + draw.ellipse([45, 50, 155, 160], fill=(210, 45, 45, 255)) + draw.ellipse([80, 45, 120, 60], fill=(210, 45, 45, 255)) + draw.ellipse([55, 70, 110, 140], fill=(230, 140, 40, 180)) + draw.line([(100, 55), (105, 25)], fill=(101, 67, 33, 255), width=4) + draw.ellipse([93, 50, 107, 57], fill=(60, 20, 20, 255)) + +def draw_apple_gala(draw): + draw.ellipse([45, 50, 155, 160], fill=(240, 190, 60, 255)) + draw.ellipse([80, 45, 120, 60], fill=(240, 190, 60, 255)) + for offset in range(-35, 45, 15): + draw.arc([45 + offset, 50, 155 + offset, 160], start=30, end=150, fill=(210, 40, 40, 200), width=4) + draw.arc([45 - offset, 50, 155 - offset, 160], start=30, end=150, fill=(210, 40, 40, 200), width=4) + draw.line([(100, 55), (103, 25)], fill=(101, 67, 33, 255), width=4) + draw.ellipse([93, 50, 107, 57], fill=(70, 50, 20, 255)) + +def draw_apple_granny_smith(draw): + # Bright green apple + draw.ellipse([45, 50, 155, 160], fill=(120, 200, 40, 255)) + draw.ellipse([80, 45, 120, 60], fill=(120, 200, 40, 255)) + # Light yellow highlight + draw.ellipse([60, 70, 95, 110], fill=(160, 230, 80, 180)) + # Stem + draw.line([(100, 55), (105, 25)], fill=(101, 67, 33, 255), width=4) + draw.ellipse([93, 50, 107, 57], fill=(40, 70, 15, 255)) + +def draw_banana_chiquita(draw): + banana_pts = [ + (40, 130), (50, 100), (70, 75), (100, 60), (130, 60), + (160, 75), (170, 95), (160, 95), (135, 80), (110, 80), + (85, 90), (65, 110), (50, 140) + ] + draw.polygon(banana_pts, fill=(245, 215, 50, 255)) + draw.polygon([(40, 130), (50, 140), (45, 145), (35, 135)], fill=(75, 100, 30, 255)) + draw.polygon([(160, 75), (170, 95), (175, 90), (165, 70)], fill=(90, 75, 30, 255)) + draw.ellipse([100, 65, 112, 75], fill=(10, 50, 150, 255)) + draw.ellipse([103, 68, 109, 72], fill=(245, 215, 50, 255)) + +def draw_banana_bio(draw): + banana_pts = [ + (45, 125), (55, 100), (75, 80), (100, 70), (125, 70), + (150, 82), (160, 98), (152, 98), (130, 88), (110, 85), + (88, 93), (70, 110), (53, 133) + ] + draw.polygon(banana_pts, fill=(225, 220, 60, 255)) + draw.polygon([(45, 125), (53, 133), (48, 138), (40, 130)], fill=(50, 90, 20, 255)) + draw.polygon([(150, 82), (160, 98), (163, 93), (153, 77)], fill=(70, 90, 20, 255)) + spots = [(70, 105), (85, 92), (100, 83), (115, 83), (130, 86)] + for sx, sy in spots: + draw.ellipse([sx-2, sy-2, sx+2, sy+2], fill=(80, 50, 20, 200)) + draw.polygon([(95, 70), (105, 70), (102, 87), (92, 86)], fill=(120, 140, 90, 255)) + +def draw_pear(draw): + # Birne: pear shape (narrow top, wide bottom) + draw.ellipse([65, 50, 135, 110], fill=(180, 190, 50, 255)) # top + draw.ellipse([50, 90, 150, 170], fill=(180, 190, 50, 255)) # bottom + draw.ellipse([60, 75, 140, 145], fill=(180, 190, 50, 255)) # mid fill + # Orange-red blush + draw.ellipse([95, 100, 140, 150], fill=(210, 110, 30, 120)) + # Stem + draw.line([(100, 55), (105, 25)], fill=(101, 67, 33, 255), width=3) + +def draw_orange(draw): + draw.ellipse([45, 45, 155, 155], fill=(245, 120, 20, 255)) + # Peel texture (little dots) + for _ in range(15): + tx = random.randint(60, 140) + ty = random.randint(60, 140) + draw.ellipse([tx, ty, tx+2, ty+2], fill=(215, 95, 5, 200)) + +def draw_lemon(draw): + # Zitrone: yellow oval with pointed ends + draw.ellipse([50, 65, 150, 135], fill=(245, 225, 40, 255)) + draw.polygon([(40, 100), (52, 90), (52, 110)], fill=(245, 225, 40, 255)) # left tip + draw.polygon([(160, 100), (148, 90), (148, 110)], fill=(245, 225, 40, 255)) # right tip + +def draw_lime(draw): + # Limette: green oval with pointed ends + draw.ellipse([55, 70, 145, 130], fill=(60, 160, 30, 255)) + draw.polygon([(47, 100), (57, 92), (57, 108)], fill=(60, 160, 30, 255)) + draw.polygon([(153, 100), (143, 92), (143, 108)], fill=(60, 160, 30, 255)) + +def draw_strawberry(draw): + # Erdbeere: heart shape + draw.polygon([(100, 165), (55, 80), (100, 60), (145, 80)], fill=(225, 30, 50, 255)) + draw.ellipse([55, 70, 105, 100], fill=(225, 30, 50, 255)) + draw.ellipse([95, 70, 145, 100], fill=(225, 30, 50, 255)) + # Seeds (yellow dots) + for _ in range(20): + sx = random.randint(65, 135) + sy = random.randint(75, 140) + draw.ellipse([sx, sy, sx+2, sy+2], fill=(240, 220, 100, 255)) + # Leafy top + draw.polygon([(100, 65), (85, 45), (95, 60), (100, 40), (105, 60), (115, 45)], fill=(40, 160, 50, 255)) + +def draw_blueberry(draw): + # Blaubeere: small blue circle + draw.ellipse([70, 70, 130, 130], fill=(45, 80, 160, 255)) + # Crown (dark crown tip) + draw.polygon([(90, 70), (100, 62), (110, 70), (105, 75), (95, 75)], fill=(20, 45, 95, 255)) + +def draw_grape_green(draw): + # Weintraube hell: cluster of small green circles + coords = [ + (100, 60), (85, 75), (115, 75), (70, 95), (100, 95), (130, 95), + (85, 115), (115, 115), (100, 135), (100, 155) + ] + # Stem + draw.line([(100, 60), (100, 35)], fill=(110, 140, 50, 255), width=3) + for cx, cy in coords: + draw.ellipse([cx-16, cy-16, cx+16, cy+16], fill=(160, 210, 80, 255)) + draw.ellipse([cx-16, cy-16, cx+16, cy+16], outline=(130, 180, 60, 255), width=1) + +def draw_grape_dark(draw): + # Weintraube dunkel: cluster of small dark purple circles + coords = [ + (100, 60), (85, 75), (115, 75), (70, 95), (100, 95), (130, 95), + (85, 115), (115, 115), (100, 135), (100, 155) + ] + draw.line([(100, 60), (100, 35)], fill=(90, 70, 110, 255), width=3) + for cx, cy in coords: + draw.ellipse([cx-16, cy-16, cx+16, cy+16], fill=(65, 30, 105, 255)) + draw.ellipse([cx-16, cy-16, cx+16, cy+16], outline=(45, 15, 80, 255), width=1) + +def draw_peach(draw): + # Pfirsich: fuzzy orange-pink circle + draw.ellipse([45, 50, 155, 160], fill=(245, 130, 80, 255)) + draw.ellipse([47, 50, 120, 160], fill=(245, 80, 110, 255)) # pink cheek + # Indentation line + draw.arc([40, 50, 150, 160], start=270, end=90, fill=(185, 45, 45, 255), width=2) + # stem + draw.line([(100, 53), (102, 30)], fill=(90, 70, 40, 255), width=3) + +def draw_tomato(draw): + draw.ellipse([50, 55, 150, 155], fill=(225, 30, 30, 255)) + draw.ellipse([65, 70, 85, 85], fill=(255, 255, 255, 180)) + cx, cy = 100, 55 + stem_pts = [ + (cx, cy), (cx-15, cy-10), (cx-5, cy-2), + (cx, cy-20), (cx+5, cy-2), (cx+15, cy-10), + (cx+8, cy+5), (cx, cy+8), (cx-8, cy+5) + ] + draw.polygon(stem_pts, fill=(34, 139, 34, 255)) + draw.line([(cx, cy), (cx-5, cy-25)], fill=(34, 139, 34, 255), width=4) + +def draw_cucumber(draw): + draw.rounded_rectangle([35, 80, 165, 120], radius=20, fill=(20, 100, 40, 255)) + for x in range(50, 150, 15): + draw.line([(x, 85), (x+5, 115)], fill=(30, 130, 55, 255), width=2) + draw.ellipse([32, 95, 38, 105], fill=(139, 115, 85, 255)) + draw.ellipse([162, 95, 168, 105], fill=(100, 80, 40, 255)) + +def draw_potato(draw): + # Kartoffel: irregular brown-yellow oval + draw.rounded_rectangle([45, 65, 155, 135], radius=35, fill=(190, 160, 95, 255)) + # Add potato eyes (dark brown dots) + eyes = [(65, 80), (135, 90), (115, 120), (80, 125), (100, 85)] + for ex, ey in eyes: + draw.ellipse([ex-2, ey-1, ex+2, ey+1], fill=(110, 85, 45, 255)) + draw.arc([ex-3, ey-3, ex+3, ey+3], start=0, end=180, fill=(110, 85, 45, 255), width=1) + +def draw_carrot(draw): + # Karotte: tapered orange shape + draw.polygon([(40, 85), (160, 100), (40, 115)], fill=(245, 110, 20, 255)) + draw.ellipse([35, 85, 45, 115], fill=(245, 110, 20, 255)) + # Green leaves on one end (left) + draw.polygon([(38, 100), (15, 80), (30, 95), (10, 100), (30, 105), (15, 120)], fill=(45, 155, 55, 255)) + # Texture lines + for x in range(60, 140, 20): + draw.line([(x, 92), (x, 108)], fill=(215, 85, 10, 255), width=2) + +def draw_onion_yellow(draw): + # Zwiebel gelb: golden bulb shape + draw.ellipse([50, 60, 150, 150], fill=(195, 145, 75, 255)) + draw.polygon([(100, 40), (80, 65), (120, 65)], fill=(195, 145, 75, 255)) # top tip + # Root hairs at bottom + draw.line([(90, 150), (85, 162)], fill=(230, 210, 170, 255), width=2) + draw.line([(100, 150), (100, 165)], fill=(230, 210, 170, 255), width=2) + draw.line([(110, 150), (115, 162)], fill=(230, 210, 170, 255), width=2) + +def draw_onion_red(draw): + # Zwiebel rot: red-purple bulb shape + draw.ellipse([50, 60, 150, 150], fill=(140, 35, 95, 255)) + draw.polygon([(100, 40), (80, 65), (120, 65)], fill=(140, 35, 95, 255)) + # Light stripes + draw.arc([55, 60, 145, 150], start=180, end=360, fill=(185, 75, 135, 255), width=2) + # Root hairs + draw.line([(95, 150), (95, 162)], fill=(210, 190, 180, 255), width=2) + draw.line([(105, 150), (105, 162)], fill=(210, 190, 180, 255), width=2) + +def draw_garlic(draw): + # Knoblauch: off-white bulb with segment lines + draw.ellipse([50, 60, 150, 150], fill=(235, 230, 220, 255)) + draw.polygon([(100, 42), (85, 65), (115, 65)], fill=(235, 230, 220, 255)) + # Segment lines + draw.arc([65, 60, 135, 150], start=270, end=90, fill=(195, 190, 180, 255), width=2) + draw.arc([80, 60, 120, 150], start=270, end=90, fill=(195, 190, 180, 255), width=2) + # Roots + draw.line([(100, 150), (100, 160)], fill=(160, 150, 130, 255), width=2) + +def draw_broccoli(draw): + # Brokkoli: green tree-like structure + # Stalk + draw.rounded_rectangle([80, 110, 120, 170], radius=8, fill=(110, 175, 75, 255)) + # Florets (overlapping circles) + draw.ellipse([60, 60, 110, 110], fill=(30, 110, 50, 255)) + draw.ellipse([90, 50, 150, 100], fill=(30, 110, 50, 255)) + draw.ellipse([75, 80, 135, 130], fill=(30, 110, 50, 255)) + # Add tiny dots/texture + for _ in range(30): + tx = random.randint(65, 135) + ty = random.randint(55, 120) + draw.ellipse([tx, ty, tx+2, ty+2], fill=(60, 150, 80, 255)) + +def draw_pepper_red(draw): + # Paprika rot: blocky rounded shape + draw.rounded_rectangle([50, 60, 150, 150], radius=25, fill=(210, 30, 30, 255)) + # Lobes indentations + draw.arc([45, 60, 155, 150], start=230, end=310, fill=(160, 15, 15, 255), width=3) + # Green stem + draw.line([(100, 60), (100, 35)], fill=(45, 130, 45, 255), width=5) + +def draw_pepper_yellow(draw): + # Paprika gelb: blocky rounded shape + draw.rounded_rectangle([50, 60, 150, 150], radius=25, fill=(240, 190, 20, 255)) + draw.arc([45, 60, 155, 150], start=230, end=310, fill=(195, 145, 10, 255), width=3) + draw.line([(100, 60), (100, 35)], fill=(45, 130, 45, 255), width=5) + +def draw_pepper_green(draw): + # Paprika grün: blocky rounded shape + draw.rounded_rectangle([50, 60, 150, 150], radius=25, fill=(35, 115, 45, 255)) + draw.arc([45, 60, 155, 150], start=230, end=310, fill=(20, 85, 25, 255), width=3) + draw.line([(100, 60), (100, 35)], fill=(25, 80, 25, 255), width=5) + +def draw_mushroom(draw): + # Champignon: white-brown stalk and cap + # Stalk + draw.rounded_rectangle([85, 100, 115, 160], radius=6, fill=(225, 215, 205, 255)) + # Cap (umbrella) + draw.ellipse([45, 60, 155, 120], fill=(210, 200, 190, 255)) + draw.rectangle([45, 90, 155, 120], fill=(210, 200, 190, 255)) # bottom flat + # Gills (brown under cap) + draw.line([(45, 120), (155, 120)], fill=(120, 100, 90, 255), width=3) + +def draw_zucchini(draw): + # Zucchini: long cylinder, thicker than cucumber, dark green + draw.rounded_rectangle([30, 75, 170, 125], radius=22, fill=(15, 75, 35, 255)) + # Speckled light green stripes + for x in range(45, 155, 20): + draw.line([(x, 80), (x+8, 120)], fill=(35, 115, 60, 180), width=3) + # Thick stem + draw.ellipse([167, 95, 173, 105], fill=(80, 95, 50, 255)) + +def draw_avocado(draw): + # Halved avocado: pear outline, yellow-green center, brown seed + # Outer skin + draw.ellipse([60, 50, 140, 120], fill=(15, 45, 20, 255)) + draw.ellipse([45, 85, 155, 170], fill=(15, 45, 20, 255)) + # Light green inner meat + draw.ellipse([63, 53, 137, 117], fill=(185, 215, 110, 255)) + draw.ellipse([49, 89, 151, 166], fill=(185, 215, 110, 255)) + # Yellow center + draw.ellipse([58, 98, 142, 158], fill=(215, 235, 135, 255)) + # Brown pit (seed) in center + draw.ellipse([78, 105, 122, 149], fill=(110, 65, 30, 255)) + draw.ellipse([82, 109, 100, 125], fill=(255, 255, 255, 80)) # Pit reflection + +def create_object_image(class_idx, angle, scale): + obj_img = Image.new("RGBA", (200, 200), (0, 0, 0, 0)) + draw = ImageDraw.Draw(obj_img) + + # Map class index to drawing functions + draw_funcs = [ + draw_apple_elstar, draw_apple_gala, draw_apple_granny_smith, + draw_banana_chiquita, draw_banana_bio, draw_pear, + draw_orange, draw_lemon, draw_lime, + draw_strawberry, draw_blueberry, draw_grape_green, + draw_grape_dark, draw_peach, draw_tomato, + draw_cucumber, draw_potato, draw_carrot, + draw_onion_yellow, draw_onion_red, draw_garlic, + draw_broccoli, draw_pepper_red, draw_pepper_yellow, + draw_pepper_green, draw_mushroom, draw_zucchini, + draw_avocado + ] + + if class_idx < len(draw_funcs): + draw_funcs[class_idx](draw) + + rotated = obj_img.rotate(angle, resample=Image.Resampling.BILINEAR, expand=True) + + if scale != 1.0: + new_w = int(rotated.width * scale) + new_h = int(rotated.height * scale) + rotated = rotated.resize((new_w, new_h), resample=Image.Resampling.BILINEAR) + + bbox = rotated.getbbox() + if bbox is None: + return None, None + + cropped = rotated.crop(bbox) + return cropped, bbox + +def generate_background(width, height): + bg = Image.new("RGB", (width, height), (210, 215, 220)) + draw = ImageDraw.Draw(bg) + grid_color = (185, 190, 195) + for x in range(0, width, 80): + draw.line([(x, 0), (x, height)], fill=grid_color, width=2) + for y in range(0, height, 80): + draw.line([(0, y), (width, y)], fill=grid_color, width=2) + draw.rectangle([10, 10, width-10, height-10], outline=(170, 175, 180), width=3) + + arr = np.array(bg, dtype=np.float32) + x_grad = np.linspace(-15, 15, width) + y_grad = np.linspace(-15, 15, height) + xx, yy = np.meshgrid(x_grad, y_grad) + arr[:, :, 0] += xx + yy + arr[:, :, 1] += xx + yy + arr[:, :, 2] += xx + yy + noise = np.random.normal(0, 3, (height, width, 3)) + arr += noise + arr = np.clip(arr, 0, 255).astype(np.uint8) + return Image.fromarray(arr) + +def generate_sample(width=640, height=480): + bg = generate_background(width, height) + num_objects = random.randint(1, 3) + annotations = [] + placed_boxes = [] + + for _ in range(num_objects): + class_idx = random.randint(0, len(CLASSES)-1) + angle = random.randint(0, 360) + scale = random.uniform(0.7, 1.2) + + obj_img, _ = create_object_image(class_idx, angle, scale) + if obj_img is None: + continue + + ow, oh = obj_img.size + placed = False + + for attempt in range(25): + x = random.randint(30, width - ow - 30) + y = random.randint(30, height - oh - 30) + + overlap = False + for px1, py1, px2, py2 in placed_boxes: + ix1 = max(x, px1) + iy1 = max(y, py1) + ix2 = min(x + ow, px2) + iy2 = min(y + oh, py2) + + if ix2 > ix1 and iy2 > iy1: + inter_area = (ix2 - ix1) * (iy2 - iy1) + box_area = ow * oh + p_area = (px2 - px1) * (py2 - py1) + iou = inter_area / float(box_area + p_area - inter_area) + if iou > 0.12: + overlap = True + break + + if not overlap: + bg.paste(obj_img, (x, y), obj_img) + placed_boxes.append((x, y, x + ow, y + oh)) + x_center = (x + ow / 2.0) / width + y_center = (y + oh / 2.0) / height + w_norm = ow / float(width) + h_norm = oh / float(height) + annotations.append(f"{class_idx} {x_center:.6f} {y_center:.6f} {w_norm:.6f} {h_norm:.6f}") + placed = True + break + + if not placed and len(placed_boxes) == 0: + x = random.randint(30, width - ow - 30) + y = random.randint(30, height - oh - 30) + bg.paste(obj_img, (x, y), obj_img) + placed_boxes.append((x, y, x + ow, y + oh)) + x_center = (x + ow / 2.0) / width + y_center = (y + oh / 2.0) / height + w_norm = ow / float(width) + h_norm = oh / float(height) + annotations.append(f"{class_idx} {x_center:.6f} {y_center:.6f} {w_norm:.6f} {h_norm:.6f}") + + bg = bg.filter(ImageFilter.GaussianBlur(0.5)) + return bg, annotations + +def build_dataset(base_dir="dataset", train_count=200, val_count=50): + os.makedirs(os.path.join(base_dir, "images", "train"), exist_ok=True) + os.makedirs(os.path.join(base_dir, "images", "val"), exist_ok=True) + os.makedirs(os.path.join(base_dir, "labels", "train"), exist_ok=True) + os.makedirs(os.path.join(base_dir, "labels", "val"), exist_ok=True) + + with open(os.path.join(base_dir, "classes.txt"), "w") as f: + f.write("\n".join(CLASSES)) + + print(f"Generating {train_count} training samples for {len(CLASSES)} classes...") + for idx in range(train_count): + img, ann = generate_sample() + img.save(os.path.join(base_dir, "images", "train", f"train_{idx:04d}.jpg"), quality=90) + with open(os.path.join(base_dir, "labels", "train", f"train_{idx:04d}.txt"), "w") as f: + f.write("\n".join(ann)) + + print(f"Generating {val_count} validation samples...") + for idx in range(val_count): + img, ann = generate_sample() + img.save(os.path.join(base_dir, "images", "val", f"val_{idx:04d}.jpg"), quality=90) + with open(os.path.join(base_dir, "labels", "val", f"val_{idx:04d}.txt"), "w") as f: + f.write("\n".join(ann)) + + print("Dataset generation complete!") + +if __name__ == "__main__": + build_dataset(train_count=200, val_count=50) diff --git a/dataset.py b/dataset.py new file mode 100644 index 0000000..85f824b --- /dev/null +++ b/dataset.py @@ -0,0 +1,103 @@ +import os +import cv2 +import numpy as np +import torch +from torch.utils.data import Dataset + +class FruitVegetableDataset(Dataset): + def __init__(self, images_dir, labels_dir, transform=None): + """ + Args: + images_dir (str): Path to images directory. + labels_dir (str): Path to labels directory. + transform (albumentations.Compose, optional): Albumentations transform pipeline. + """ + self.images_dir = images_dir + self.labels_dir = labels_dir + self.transform = transform + + # List all image files + self.image_files = sorted([ + f for f in os.listdir(images_dir) + if f.lower().endswith(('.jpg', '.jpeg', '.png')) + ]) + + def __len__(self): + return len(self.image_files) + + def __getitem__(self, idx): + img_name = self.image_files[idx] + img_path = os.path.join(self.images_dir, img_name) + + # Load image via OpenCV (BGR) and convert to RGB + image = cv2.imread(img_path) + image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) + height, width, _ = image.shape + + # Load corresponding label file + label_name = os.path.splitext(img_name)[0] + ".txt" + label_path = os.path.join(self.labels_dir, label_name) + + boxes = [] + class_ids = [] + + if os.path.exists(label_path): + with open(label_path, "r") as f: + for line in f: + parts = line.strip().split() + if len(parts) == 5: + class_id = int(parts[0]) + # YOLO format: x_center, y_center, width, height (normalized) + x_c, y_c, w, h = map(float, parts[1:]) + + # Convert to Pascal VOC absolute coordinates [x_min, y_min, x_max, y_max] + xmin = (x_c - w / 2.0) * width + ymin = (y_c - h / 2.0) * height + xmax = (x_c + w / 2.0) * width + ymax = (y_c + h / 2.0) * height + + # Ensure coordinates are within image boundaries + xmin = max(0.0, min(xmin, float(width - 1))) + ymin = max(0.0, min(ymin, float(height - 1))) + xmax = max(xmin + 1.0, min(xmax, float(width))) + ymax = max(ymin + 1.0, min(ymax, float(height))) + + boxes.append([xmin, ymin, xmax, ymax]) + class_ids.append(class_id) + + boxes = np.array(boxes, dtype=np.float32).reshape(-1, 4) + class_ids = np.array(class_ids, dtype=np.int64) + + # Apply Albumentations transformations + if self.transform: + augmented = self.transform( + image=image, + bboxes=boxes, + category_ids=class_ids + ) + image = augmented["image"] + boxes = np.array(augmented["bboxes"], dtype=np.float32).reshape(-1, 4) + class_ids = np.array(augmented["category_ids"], dtype=np.int64) + + # Convert image to CHW tensor and scale to [0, 1] + image_tensor = torch.from_numpy(image).permute(2, 0, 1).float() / 255.0 + + # Convert targets to PyTorch Tensors + # NOTE: torchvision models reserve class 0 for background. + # We must shift our class IDs by +1 (0 -> 1, 1 -> 2, etc.) + torch_boxes = torch.as_tensor(boxes, dtype=torch.float32) + torch_labels = torch.as_tensor(class_ids + 1, dtype=torch.int64) + + target = { + "boxes": torch_boxes, + "labels": torch_labels, + "image_id": torch.tensor([idx]) + } + + return image_tensor, target + +def collate_fn(batch): + """ + Collate function for DataLoader. Returns a tuple of (images, targets). + """ + return tuple(zip(*batch)) diff --git a/dataset/classes.txt b/dataset/classes.txt new file mode 100644 index 0000000..ae5d8b5 --- /dev/null +++ b/dataset/classes.txt @@ -0,0 +1,28 @@ +apfel_elstar +apfel_gala +apfel_granny_smith +banane_chiquita +banane_bio +birne +orange +zitrone +limette +erdbeere +blaubeere +weintraube_hell +weintraube_dunkel +pfirsich +tomate +gurke +kartoffel +karotte +zwiebel_gelb +zwiebel_rot +knoblauch +brokkoli +paprika_rot +paprika_gelb +paprika_gruen +champignon +zucchini +avocado \ No newline at end of file diff --git a/dataset/images/train/train_0000.jpg b/dataset/images/train/train_0000.jpg new file mode 100644 index 0000000..0f0e02e Binary files /dev/null and b/dataset/images/train/train_0000.jpg differ diff --git a/dataset/images/train/train_0001.jpg b/dataset/images/train/train_0001.jpg new file mode 100644 index 0000000..9e6d5f9 Binary files /dev/null and b/dataset/images/train/train_0001.jpg differ diff --git a/dataset/images/train/train_0002.jpg b/dataset/images/train/train_0002.jpg new file mode 100644 index 0000000..2a7a427 Binary files /dev/null and b/dataset/images/train/train_0002.jpg differ diff --git a/dataset/images/train/train_0003.jpg b/dataset/images/train/train_0003.jpg new file mode 100644 index 0000000..51eb9be Binary files /dev/null and b/dataset/images/train/train_0003.jpg differ diff --git a/dataset/images/train/train_0004.jpg b/dataset/images/train/train_0004.jpg new file mode 100644 index 0000000..317af8b Binary files /dev/null and b/dataset/images/train/train_0004.jpg differ diff --git a/dataset/images/train/train_0005.jpg b/dataset/images/train/train_0005.jpg new file mode 100644 index 0000000..13a959b Binary files /dev/null and b/dataset/images/train/train_0005.jpg differ diff --git a/dataset/images/train/train_0006.jpg b/dataset/images/train/train_0006.jpg new file mode 100644 index 0000000..ec15f4a Binary files /dev/null and b/dataset/images/train/train_0006.jpg differ diff --git a/dataset/images/train/train_0007.jpg b/dataset/images/train/train_0007.jpg new file mode 100644 index 0000000..ecdd55d Binary files /dev/null and b/dataset/images/train/train_0007.jpg differ diff --git a/dataset/images/train/train_0008.jpg b/dataset/images/train/train_0008.jpg new file mode 100644 index 0000000..52cd42f Binary files /dev/null and b/dataset/images/train/train_0008.jpg differ diff --git a/dataset/images/train/train_0009.jpg b/dataset/images/train/train_0009.jpg new file mode 100644 index 0000000..7a08f57 Binary files /dev/null and b/dataset/images/train/train_0009.jpg differ diff --git a/dataset/images/train/train_0010.jpg b/dataset/images/train/train_0010.jpg new file mode 100644 index 0000000..f5719a9 Binary files /dev/null and b/dataset/images/train/train_0010.jpg differ diff --git a/dataset/images/train/train_0011.jpg b/dataset/images/train/train_0011.jpg new file mode 100644 index 0000000..fe43289 Binary files /dev/null and b/dataset/images/train/train_0011.jpg differ diff --git a/dataset/images/train/train_0012.jpg b/dataset/images/train/train_0012.jpg new file mode 100644 index 0000000..47e3f4a Binary files /dev/null and b/dataset/images/train/train_0012.jpg differ diff --git a/dataset/images/train/train_0013.jpg b/dataset/images/train/train_0013.jpg new file mode 100644 index 0000000..0ade307 Binary files /dev/null and b/dataset/images/train/train_0013.jpg differ diff --git a/dataset/images/train/train_0014.jpg b/dataset/images/train/train_0014.jpg new file mode 100644 index 0000000..ba002f1 Binary files /dev/null and b/dataset/images/train/train_0014.jpg differ diff --git a/dataset/images/train/train_0015.jpg b/dataset/images/train/train_0015.jpg new file mode 100644 index 0000000..f203a5f Binary files /dev/null and b/dataset/images/train/train_0015.jpg differ diff --git a/dataset/images/train/train_0016.jpg b/dataset/images/train/train_0016.jpg new file mode 100644 index 0000000..00341b0 Binary files /dev/null and b/dataset/images/train/train_0016.jpg differ diff --git a/dataset/images/train/train_0017.jpg b/dataset/images/train/train_0017.jpg new file mode 100644 index 0000000..32e076d Binary files /dev/null and b/dataset/images/train/train_0017.jpg differ diff --git a/dataset/images/train/train_0018.jpg b/dataset/images/train/train_0018.jpg new file mode 100644 index 0000000..d1fbea8 Binary files /dev/null and b/dataset/images/train/train_0018.jpg differ diff --git a/dataset/images/train/train_0019.jpg b/dataset/images/train/train_0019.jpg new file mode 100644 index 0000000..be69624 Binary files /dev/null and b/dataset/images/train/train_0019.jpg differ diff --git a/dataset/images/train/train_0020.jpg b/dataset/images/train/train_0020.jpg new file mode 100644 index 0000000..509a36f Binary files /dev/null and b/dataset/images/train/train_0020.jpg differ diff --git a/dataset/images/train/train_0021.jpg b/dataset/images/train/train_0021.jpg new file mode 100644 index 0000000..c136c22 Binary files /dev/null and b/dataset/images/train/train_0021.jpg differ diff --git a/dataset/images/train/train_0022.jpg b/dataset/images/train/train_0022.jpg new file mode 100644 index 0000000..4e25d54 Binary files /dev/null and b/dataset/images/train/train_0022.jpg differ diff --git a/dataset/images/train/train_0023.jpg b/dataset/images/train/train_0023.jpg new file mode 100644 index 0000000..f8f2f06 Binary files /dev/null and b/dataset/images/train/train_0023.jpg differ diff --git a/dataset/images/train/train_0024.jpg b/dataset/images/train/train_0024.jpg new file mode 100644 index 0000000..a3b123c Binary files /dev/null and b/dataset/images/train/train_0024.jpg differ diff --git a/dataset/images/train/train_0025.jpg b/dataset/images/train/train_0025.jpg new file mode 100644 index 0000000..89ff9f8 Binary files /dev/null and b/dataset/images/train/train_0025.jpg differ diff --git a/dataset/images/train/train_0026.jpg b/dataset/images/train/train_0026.jpg new file mode 100644 index 0000000..be61956 Binary files /dev/null and b/dataset/images/train/train_0026.jpg differ diff --git a/dataset/images/train/train_0027.jpg b/dataset/images/train/train_0027.jpg new file mode 100644 index 0000000..64c3bf8 Binary files /dev/null and b/dataset/images/train/train_0027.jpg differ diff --git a/dataset/images/train/train_0028.jpg b/dataset/images/train/train_0028.jpg new file mode 100644 index 0000000..9601497 Binary files /dev/null and b/dataset/images/train/train_0028.jpg differ diff --git a/dataset/images/train/train_0029.jpg b/dataset/images/train/train_0029.jpg new file mode 100644 index 0000000..5710778 Binary files /dev/null and b/dataset/images/train/train_0029.jpg differ diff --git a/dataset/images/train/train_0030.jpg b/dataset/images/train/train_0030.jpg new file mode 100644 index 0000000..d273d7f Binary files /dev/null and b/dataset/images/train/train_0030.jpg differ diff --git a/dataset/images/train/train_0031.jpg b/dataset/images/train/train_0031.jpg new file mode 100644 index 0000000..b9f2ff1 Binary files /dev/null and b/dataset/images/train/train_0031.jpg differ diff --git a/dataset/images/train/train_0032.jpg b/dataset/images/train/train_0032.jpg new file mode 100644 index 0000000..0ba7734 Binary files /dev/null and b/dataset/images/train/train_0032.jpg differ diff --git a/dataset/images/train/train_0033.jpg b/dataset/images/train/train_0033.jpg new file mode 100644 index 0000000..2d059eb Binary files /dev/null and b/dataset/images/train/train_0033.jpg differ diff --git a/dataset/images/train/train_0034.jpg b/dataset/images/train/train_0034.jpg new file mode 100644 index 0000000..74fc6f9 Binary files /dev/null and b/dataset/images/train/train_0034.jpg differ diff --git a/dataset/images/train/train_0035.jpg b/dataset/images/train/train_0035.jpg new file mode 100644 index 0000000..17853ac Binary files /dev/null and b/dataset/images/train/train_0035.jpg differ diff --git a/dataset/images/train/train_0036.jpg b/dataset/images/train/train_0036.jpg new file mode 100644 index 0000000..e2470cf Binary files /dev/null and b/dataset/images/train/train_0036.jpg differ diff --git a/dataset/images/train/train_0037.jpg b/dataset/images/train/train_0037.jpg new file mode 100644 index 0000000..d4b5d78 Binary files /dev/null and b/dataset/images/train/train_0037.jpg differ diff --git a/dataset/images/train/train_0038.jpg b/dataset/images/train/train_0038.jpg new file mode 100644 index 0000000..1e3a3f3 Binary files /dev/null and b/dataset/images/train/train_0038.jpg differ diff --git a/dataset/images/train/train_0039.jpg b/dataset/images/train/train_0039.jpg new file mode 100644 index 0000000..40e5f24 Binary files /dev/null and b/dataset/images/train/train_0039.jpg differ diff --git a/dataset/images/train/train_0040.jpg b/dataset/images/train/train_0040.jpg new file mode 100644 index 0000000..dae9074 Binary files /dev/null and b/dataset/images/train/train_0040.jpg differ diff --git a/dataset/images/train/train_0041.jpg b/dataset/images/train/train_0041.jpg new file mode 100644 index 0000000..15545e0 Binary files /dev/null and b/dataset/images/train/train_0041.jpg differ diff --git a/dataset/images/train/train_0042.jpg b/dataset/images/train/train_0042.jpg new file mode 100644 index 0000000..0639bbf Binary files /dev/null and b/dataset/images/train/train_0042.jpg differ diff --git a/dataset/images/train/train_0043.jpg b/dataset/images/train/train_0043.jpg new file mode 100644 index 0000000..938b014 Binary files /dev/null and b/dataset/images/train/train_0043.jpg differ diff --git a/dataset/images/train/train_0044.jpg b/dataset/images/train/train_0044.jpg new file mode 100644 index 0000000..109a056 Binary files /dev/null and b/dataset/images/train/train_0044.jpg differ diff --git a/dataset/images/train/train_0045.jpg b/dataset/images/train/train_0045.jpg new file mode 100644 index 0000000..01e1c9c Binary files /dev/null and b/dataset/images/train/train_0045.jpg differ diff --git a/dataset/images/train/train_0046.jpg b/dataset/images/train/train_0046.jpg new file mode 100644 index 0000000..f05e8bf Binary files /dev/null and b/dataset/images/train/train_0046.jpg differ diff --git a/dataset/images/train/train_0047.jpg b/dataset/images/train/train_0047.jpg new file mode 100644 index 0000000..a7bd71e Binary files /dev/null and b/dataset/images/train/train_0047.jpg differ diff --git a/dataset/images/train/train_0048.jpg b/dataset/images/train/train_0048.jpg new file mode 100644 index 0000000..a394415 Binary files /dev/null and b/dataset/images/train/train_0048.jpg differ diff --git a/dataset/images/train/train_0049.jpg b/dataset/images/train/train_0049.jpg new file mode 100644 index 0000000..43bc72b Binary files /dev/null and b/dataset/images/train/train_0049.jpg differ diff --git a/dataset/images/train/train_0050.jpg b/dataset/images/train/train_0050.jpg new file mode 100644 index 0000000..8e5e691 Binary files /dev/null and b/dataset/images/train/train_0050.jpg differ diff --git a/dataset/images/train/train_0051.jpg b/dataset/images/train/train_0051.jpg new file mode 100644 index 0000000..d8aeefb Binary files /dev/null and b/dataset/images/train/train_0051.jpg differ diff --git a/dataset/images/train/train_0052.jpg b/dataset/images/train/train_0052.jpg new file mode 100644 index 0000000..7de20e2 Binary files /dev/null and b/dataset/images/train/train_0052.jpg differ diff --git a/dataset/images/train/train_0053.jpg b/dataset/images/train/train_0053.jpg new file mode 100644 index 0000000..d38d69c Binary files /dev/null and b/dataset/images/train/train_0053.jpg differ diff --git a/dataset/images/train/train_0054.jpg b/dataset/images/train/train_0054.jpg new file mode 100644 index 0000000..174dca9 Binary files /dev/null and b/dataset/images/train/train_0054.jpg differ diff --git a/dataset/images/train/train_0055.jpg b/dataset/images/train/train_0055.jpg new file mode 100644 index 0000000..b8ae2ef Binary files /dev/null and b/dataset/images/train/train_0055.jpg differ diff --git a/dataset/images/train/train_0056.jpg b/dataset/images/train/train_0056.jpg new file mode 100644 index 0000000..3ff3c04 Binary files /dev/null and b/dataset/images/train/train_0056.jpg differ diff --git a/dataset/images/train/train_0057.jpg b/dataset/images/train/train_0057.jpg new file mode 100644 index 0000000..d1b94bf Binary files /dev/null and b/dataset/images/train/train_0057.jpg differ diff --git a/dataset/images/train/train_0058.jpg b/dataset/images/train/train_0058.jpg new file mode 100644 index 0000000..eed8f9f Binary files /dev/null and b/dataset/images/train/train_0058.jpg differ diff --git a/dataset/images/train/train_0059.jpg b/dataset/images/train/train_0059.jpg new file mode 100644 index 0000000..9e66573 Binary files /dev/null and b/dataset/images/train/train_0059.jpg differ diff --git a/dataset/images/train/train_0060.jpg b/dataset/images/train/train_0060.jpg new file mode 100644 index 0000000..15b45a8 Binary files /dev/null and b/dataset/images/train/train_0060.jpg differ diff --git a/dataset/images/train/train_0061.jpg b/dataset/images/train/train_0061.jpg new file mode 100644 index 0000000..7524500 Binary files /dev/null and b/dataset/images/train/train_0061.jpg differ diff --git a/dataset/images/train/train_0062.jpg b/dataset/images/train/train_0062.jpg new file mode 100644 index 0000000..17446d6 Binary files /dev/null and b/dataset/images/train/train_0062.jpg differ diff --git a/dataset/images/train/train_0063.jpg b/dataset/images/train/train_0063.jpg new file mode 100644 index 0000000..f049b44 Binary files /dev/null and b/dataset/images/train/train_0063.jpg differ diff --git a/dataset/images/train/train_0064.jpg b/dataset/images/train/train_0064.jpg new file mode 100644 index 0000000..ac9fcfe Binary files /dev/null and b/dataset/images/train/train_0064.jpg differ diff --git a/dataset/images/train/train_0065.jpg b/dataset/images/train/train_0065.jpg new file mode 100644 index 0000000..521c81d Binary files /dev/null and b/dataset/images/train/train_0065.jpg differ diff --git a/dataset/images/train/train_0066.jpg b/dataset/images/train/train_0066.jpg new file mode 100644 index 0000000..beda337 Binary files /dev/null and b/dataset/images/train/train_0066.jpg differ diff --git a/dataset/images/train/train_0067.jpg b/dataset/images/train/train_0067.jpg new file mode 100644 index 0000000..5afa948 Binary files /dev/null and b/dataset/images/train/train_0067.jpg differ diff --git a/dataset/images/train/train_0068.jpg b/dataset/images/train/train_0068.jpg new file mode 100644 index 0000000..627ec7c Binary files /dev/null and b/dataset/images/train/train_0068.jpg differ diff --git a/dataset/images/train/train_0069.jpg b/dataset/images/train/train_0069.jpg new file mode 100644 index 0000000..088309b Binary files /dev/null and b/dataset/images/train/train_0069.jpg differ diff --git a/dataset/images/train/train_0070.jpg b/dataset/images/train/train_0070.jpg new file mode 100644 index 0000000..0f00864 Binary files /dev/null and b/dataset/images/train/train_0070.jpg differ diff --git a/dataset/images/train/train_0071.jpg b/dataset/images/train/train_0071.jpg new file mode 100644 index 0000000..c4adfec Binary files /dev/null and b/dataset/images/train/train_0071.jpg differ diff --git a/dataset/images/train/train_0072.jpg b/dataset/images/train/train_0072.jpg new file mode 100644 index 0000000..12c283f Binary files /dev/null and b/dataset/images/train/train_0072.jpg differ diff --git a/dataset/images/train/train_0073.jpg b/dataset/images/train/train_0073.jpg new file mode 100644 index 0000000..0cd6d73 Binary files /dev/null and b/dataset/images/train/train_0073.jpg differ diff --git a/dataset/images/train/train_0074.jpg b/dataset/images/train/train_0074.jpg new file mode 100644 index 0000000..9a18b85 Binary files /dev/null and b/dataset/images/train/train_0074.jpg differ diff --git a/dataset/images/train/train_0075.jpg b/dataset/images/train/train_0075.jpg new file mode 100644 index 0000000..e6a85f7 Binary files /dev/null and b/dataset/images/train/train_0075.jpg differ diff --git a/dataset/images/train/train_0076.jpg b/dataset/images/train/train_0076.jpg new file mode 100644 index 0000000..663cc9f Binary files /dev/null and b/dataset/images/train/train_0076.jpg differ diff --git a/dataset/images/train/train_0077.jpg b/dataset/images/train/train_0077.jpg new file mode 100644 index 0000000..7dbfe9c Binary files /dev/null and b/dataset/images/train/train_0077.jpg differ diff --git a/dataset/images/train/train_0078.jpg b/dataset/images/train/train_0078.jpg new file mode 100644 index 0000000..0e70e8d Binary files /dev/null and b/dataset/images/train/train_0078.jpg differ diff --git a/dataset/images/train/train_0079.jpg b/dataset/images/train/train_0079.jpg new file mode 100644 index 0000000..ed1561e Binary files /dev/null and b/dataset/images/train/train_0079.jpg differ diff --git a/dataset/images/train/train_0080.jpg b/dataset/images/train/train_0080.jpg new file mode 100644 index 0000000..2f8f4f6 Binary files /dev/null and b/dataset/images/train/train_0080.jpg differ diff --git a/dataset/images/train/train_0081.jpg b/dataset/images/train/train_0081.jpg new file mode 100644 index 0000000..04cd30b Binary files /dev/null and b/dataset/images/train/train_0081.jpg differ diff --git a/dataset/images/train/train_0082.jpg b/dataset/images/train/train_0082.jpg new file mode 100644 index 0000000..327b804 Binary files /dev/null and b/dataset/images/train/train_0082.jpg differ diff --git a/dataset/images/train/train_0083.jpg b/dataset/images/train/train_0083.jpg new file mode 100644 index 0000000..4c4ed46 Binary files /dev/null and b/dataset/images/train/train_0083.jpg differ diff --git a/dataset/images/train/train_0084.jpg b/dataset/images/train/train_0084.jpg new file mode 100644 index 0000000..53930cf Binary files /dev/null and b/dataset/images/train/train_0084.jpg differ diff --git a/dataset/images/train/train_0085.jpg b/dataset/images/train/train_0085.jpg new file mode 100644 index 0000000..3395918 Binary files /dev/null and b/dataset/images/train/train_0085.jpg differ diff --git a/dataset/images/train/train_0086.jpg b/dataset/images/train/train_0086.jpg new file mode 100644 index 0000000..a367b7b Binary files /dev/null and b/dataset/images/train/train_0086.jpg differ diff --git a/dataset/images/train/train_0087.jpg b/dataset/images/train/train_0087.jpg new file mode 100644 index 0000000..16feceb Binary files /dev/null and b/dataset/images/train/train_0087.jpg differ diff --git a/dataset/images/train/train_0088.jpg b/dataset/images/train/train_0088.jpg new file mode 100644 index 0000000..f8e0409 Binary files /dev/null and b/dataset/images/train/train_0088.jpg differ diff --git a/dataset/images/train/train_0089.jpg b/dataset/images/train/train_0089.jpg new file mode 100644 index 0000000..e22761e Binary files /dev/null and b/dataset/images/train/train_0089.jpg differ diff --git a/dataset/images/train/train_0090.jpg b/dataset/images/train/train_0090.jpg new file mode 100644 index 0000000..9e0363c Binary files /dev/null and b/dataset/images/train/train_0090.jpg differ diff --git a/dataset/images/train/train_0091.jpg b/dataset/images/train/train_0091.jpg new file mode 100644 index 0000000..1c470fb Binary files /dev/null and b/dataset/images/train/train_0091.jpg differ diff --git a/dataset/images/train/train_0092.jpg b/dataset/images/train/train_0092.jpg new file mode 100644 index 0000000..0cb507d Binary files /dev/null and b/dataset/images/train/train_0092.jpg differ diff --git a/dataset/images/train/train_0093.jpg b/dataset/images/train/train_0093.jpg new file mode 100644 index 0000000..4289653 Binary files /dev/null and b/dataset/images/train/train_0093.jpg differ diff --git a/dataset/images/train/train_0094.jpg b/dataset/images/train/train_0094.jpg new file mode 100644 index 0000000..b7dcefc Binary files /dev/null and b/dataset/images/train/train_0094.jpg differ diff --git a/dataset/images/train/train_0095.jpg b/dataset/images/train/train_0095.jpg new file mode 100644 index 0000000..ecb6767 Binary files /dev/null and b/dataset/images/train/train_0095.jpg differ diff --git a/dataset/images/train/train_0096.jpg b/dataset/images/train/train_0096.jpg new file mode 100644 index 0000000..104cbb8 Binary files /dev/null and b/dataset/images/train/train_0096.jpg differ diff --git a/dataset/images/train/train_0097.jpg b/dataset/images/train/train_0097.jpg new file mode 100644 index 0000000..7ffb919 Binary files /dev/null and b/dataset/images/train/train_0097.jpg differ diff --git a/dataset/images/train/train_0098.jpg b/dataset/images/train/train_0098.jpg new file mode 100644 index 0000000..0a1ab47 Binary files /dev/null and b/dataset/images/train/train_0098.jpg differ diff --git a/dataset/images/train/train_0099.jpg b/dataset/images/train/train_0099.jpg new file mode 100644 index 0000000..7f87550 Binary files /dev/null and b/dataset/images/train/train_0099.jpg differ diff --git a/dataset/images/train/train_0100.jpg b/dataset/images/train/train_0100.jpg new file mode 100644 index 0000000..050ca2c Binary files /dev/null and b/dataset/images/train/train_0100.jpg differ diff --git a/dataset/images/train/train_0101.jpg b/dataset/images/train/train_0101.jpg new file mode 100644 index 0000000..5b5e46d Binary files /dev/null and b/dataset/images/train/train_0101.jpg differ diff --git a/dataset/images/train/train_0102.jpg b/dataset/images/train/train_0102.jpg new file mode 100644 index 0000000..724600e Binary files /dev/null and b/dataset/images/train/train_0102.jpg differ diff --git a/dataset/images/train/train_0103.jpg b/dataset/images/train/train_0103.jpg new file mode 100644 index 0000000..1b38729 Binary files /dev/null and b/dataset/images/train/train_0103.jpg differ diff --git a/dataset/images/train/train_0104.jpg b/dataset/images/train/train_0104.jpg new file mode 100644 index 0000000..f5182f2 Binary files /dev/null and b/dataset/images/train/train_0104.jpg differ diff --git a/dataset/images/train/train_0105.jpg b/dataset/images/train/train_0105.jpg new file mode 100644 index 0000000..05890f1 Binary files /dev/null and b/dataset/images/train/train_0105.jpg differ diff --git a/dataset/images/train/train_0106.jpg b/dataset/images/train/train_0106.jpg new file mode 100644 index 0000000..7bb75ae Binary files /dev/null and b/dataset/images/train/train_0106.jpg differ diff --git a/dataset/images/train/train_0107.jpg b/dataset/images/train/train_0107.jpg new file mode 100644 index 0000000..0b833a4 Binary files /dev/null and b/dataset/images/train/train_0107.jpg differ diff --git a/dataset/images/train/train_0108.jpg b/dataset/images/train/train_0108.jpg new file mode 100644 index 0000000..c00d3a3 Binary files /dev/null and b/dataset/images/train/train_0108.jpg differ diff --git a/dataset/images/train/train_0109.jpg b/dataset/images/train/train_0109.jpg new file mode 100644 index 0000000..4f760dd Binary files /dev/null and b/dataset/images/train/train_0109.jpg differ diff --git a/dataset/images/train/train_0110.jpg b/dataset/images/train/train_0110.jpg new file mode 100644 index 0000000..69c22de Binary files /dev/null and b/dataset/images/train/train_0110.jpg differ diff --git a/dataset/images/train/train_0111.jpg b/dataset/images/train/train_0111.jpg new file mode 100644 index 0000000..488f093 Binary files /dev/null and b/dataset/images/train/train_0111.jpg differ diff --git a/dataset/images/train/train_0112.jpg b/dataset/images/train/train_0112.jpg new file mode 100644 index 0000000..81aeef9 Binary files /dev/null and b/dataset/images/train/train_0112.jpg differ diff --git a/dataset/images/train/train_0113.jpg b/dataset/images/train/train_0113.jpg new file mode 100644 index 0000000..5babd18 Binary files /dev/null and b/dataset/images/train/train_0113.jpg differ diff --git a/dataset/images/train/train_0114.jpg b/dataset/images/train/train_0114.jpg new file mode 100644 index 0000000..3e2f3d6 Binary files /dev/null and b/dataset/images/train/train_0114.jpg differ diff --git a/dataset/images/train/train_0115.jpg b/dataset/images/train/train_0115.jpg new file mode 100644 index 0000000..cc6dc67 Binary files /dev/null and b/dataset/images/train/train_0115.jpg differ diff --git a/dataset/images/train/train_0116.jpg b/dataset/images/train/train_0116.jpg new file mode 100644 index 0000000..2e3a57d Binary files /dev/null and b/dataset/images/train/train_0116.jpg differ diff --git a/dataset/images/train/train_0117.jpg b/dataset/images/train/train_0117.jpg new file mode 100644 index 0000000..8c3a8c1 Binary files /dev/null and b/dataset/images/train/train_0117.jpg differ diff --git a/dataset/images/train/train_0118.jpg b/dataset/images/train/train_0118.jpg new file mode 100644 index 0000000..1e28c84 Binary files /dev/null and b/dataset/images/train/train_0118.jpg differ diff --git a/dataset/images/train/train_0119.jpg b/dataset/images/train/train_0119.jpg new file mode 100644 index 0000000..c3a8c54 Binary files /dev/null and b/dataset/images/train/train_0119.jpg differ diff --git a/dataset/images/train/train_0120.jpg b/dataset/images/train/train_0120.jpg new file mode 100644 index 0000000..58acc12 Binary files /dev/null and b/dataset/images/train/train_0120.jpg differ diff --git a/dataset/images/train/train_0121.jpg b/dataset/images/train/train_0121.jpg new file mode 100644 index 0000000..bc1360a Binary files /dev/null and b/dataset/images/train/train_0121.jpg differ diff --git a/dataset/images/train/train_0122.jpg b/dataset/images/train/train_0122.jpg new file mode 100644 index 0000000..edb2762 Binary files /dev/null and b/dataset/images/train/train_0122.jpg differ diff --git a/dataset/images/train/train_0123.jpg b/dataset/images/train/train_0123.jpg new file mode 100644 index 0000000..0becfec Binary files /dev/null and b/dataset/images/train/train_0123.jpg differ diff --git a/dataset/images/train/train_0124.jpg b/dataset/images/train/train_0124.jpg new file mode 100644 index 0000000..11fbbf4 Binary files /dev/null and b/dataset/images/train/train_0124.jpg differ diff --git a/dataset/images/train/train_0125.jpg b/dataset/images/train/train_0125.jpg new file mode 100644 index 0000000..eea3b1a Binary files /dev/null and b/dataset/images/train/train_0125.jpg differ diff --git a/dataset/images/train/train_0126.jpg b/dataset/images/train/train_0126.jpg new file mode 100644 index 0000000..4a5fab0 Binary files /dev/null and b/dataset/images/train/train_0126.jpg differ diff --git a/dataset/images/train/train_0127.jpg b/dataset/images/train/train_0127.jpg new file mode 100644 index 0000000..08b5d40 Binary files /dev/null and b/dataset/images/train/train_0127.jpg differ diff --git a/dataset/images/train/train_0128.jpg b/dataset/images/train/train_0128.jpg new file mode 100644 index 0000000..0cabcc8 Binary files /dev/null and b/dataset/images/train/train_0128.jpg differ diff --git a/dataset/images/train/train_0129.jpg b/dataset/images/train/train_0129.jpg new file mode 100644 index 0000000..e924ed4 Binary files /dev/null and b/dataset/images/train/train_0129.jpg differ diff --git a/dataset/images/train/train_0130.jpg b/dataset/images/train/train_0130.jpg new file mode 100644 index 0000000..d5e637f Binary files /dev/null and b/dataset/images/train/train_0130.jpg differ diff --git a/dataset/images/train/train_0131.jpg b/dataset/images/train/train_0131.jpg new file mode 100644 index 0000000..5bdd68d Binary files /dev/null and b/dataset/images/train/train_0131.jpg differ diff --git a/dataset/images/train/train_0132.jpg b/dataset/images/train/train_0132.jpg new file mode 100644 index 0000000..8698824 Binary files /dev/null and b/dataset/images/train/train_0132.jpg differ diff --git a/dataset/images/train/train_0133.jpg b/dataset/images/train/train_0133.jpg new file mode 100644 index 0000000..2fa8d93 Binary files /dev/null and b/dataset/images/train/train_0133.jpg differ diff --git a/dataset/images/train/train_0134.jpg b/dataset/images/train/train_0134.jpg new file mode 100644 index 0000000..51ef132 Binary files /dev/null and b/dataset/images/train/train_0134.jpg differ diff --git a/dataset/images/train/train_0135.jpg b/dataset/images/train/train_0135.jpg new file mode 100644 index 0000000..8c60722 Binary files /dev/null and b/dataset/images/train/train_0135.jpg differ diff --git a/dataset/images/train/train_0136.jpg b/dataset/images/train/train_0136.jpg new file mode 100644 index 0000000..a9f51e5 Binary files /dev/null and b/dataset/images/train/train_0136.jpg differ diff --git a/dataset/images/train/train_0137.jpg b/dataset/images/train/train_0137.jpg new file mode 100644 index 0000000..323ab72 Binary files /dev/null and b/dataset/images/train/train_0137.jpg differ diff --git a/dataset/images/train/train_0138.jpg b/dataset/images/train/train_0138.jpg new file mode 100644 index 0000000..92d3b90 Binary files /dev/null and b/dataset/images/train/train_0138.jpg differ diff --git a/dataset/images/train/train_0139.jpg b/dataset/images/train/train_0139.jpg new file mode 100644 index 0000000..b1b627e Binary files /dev/null and b/dataset/images/train/train_0139.jpg differ diff --git a/dataset/images/train/train_0140.jpg b/dataset/images/train/train_0140.jpg new file mode 100644 index 0000000..dadbbb6 Binary files /dev/null and b/dataset/images/train/train_0140.jpg differ diff --git a/dataset/images/train/train_0141.jpg b/dataset/images/train/train_0141.jpg new file mode 100644 index 0000000..2ed4d7f Binary files /dev/null and b/dataset/images/train/train_0141.jpg differ diff --git a/dataset/images/train/train_0142.jpg b/dataset/images/train/train_0142.jpg new file mode 100644 index 0000000..bdcbfd5 Binary files /dev/null and b/dataset/images/train/train_0142.jpg differ diff --git a/dataset/images/train/train_0143.jpg b/dataset/images/train/train_0143.jpg new file mode 100644 index 0000000..a8fe7bf Binary files /dev/null and b/dataset/images/train/train_0143.jpg differ diff --git a/dataset/images/train/train_0144.jpg b/dataset/images/train/train_0144.jpg new file mode 100644 index 0000000..e4beeff Binary files /dev/null and b/dataset/images/train/train_0144.jpg differ diff --git a/dataset/images/train/train_0145.jpg b/dataset/images/train/train_0145.jpg new file mode 100644 index 0000000..adba342 Binary files /dev/null and b/dataset/images/train/train_0145.jpg differ diff --git a/dataset/images/train/train_0146.jpg b/dataset/images/train/train_0146.jpg new file mode 100644 index 0000000..0a82aed Binary files /dev/null and b/dataset/images/train/train_0146.jpg differ diff --git a/dataset/images/train/train_0147.jpg b/dataset/images/train/train_0147.jpg new file mode 100644 index 0000000..136685f Binary files /dev/null and b/dataset/images/train/train_0147.jpg differ diff --git a/dataset/images/train/train_0148.jpg b/dataset/images/train/train_0148.jpg new file mode 100644 index 0000000..7bee096 Binary files /dev/null and b/dataset/images/train/train_0148.jpg differ diff --git a/dataset/images/train/train_0149.jpg b/dataset/images/train/train_0149.jpg new file mode 100644 index 0000000..f25e9a7 Binary files /dev/null and b/dataset/images/train/train_0149.jpg differ diff --git a/dataset/images/train/train_0150.jpg b/dataset/images/train/train_0150.jpg new file mode 100644 index 0000000..0f9ab9e Binary files /dev/null and b/dataset/images/train/train_0150.jpg differ diff --git a/dataset/images/train/train_0151.jpg b/dataset/images/train/train_0151.jpg new file mode 100644 index 0000000..7cca470 Binary files /dev/null and b/dataset/images/train/train_0151.jpg differ diff --git a/dataset/images/train/train_0152.jpg b/dataset/images/train/train_0152.jpg new file mode 100644 index 0000000..f532613 Binary files /dev/null and b/dataset/images/train/train_0152.jpg differ diff --git a/dataset/images/train/train_0153.jpg b/dataset/images/train/train_0153.jpg new file mode 100644 index 0000000..0e125e6 Binary files /dev/null and b/dataset/images/train/train_0153.jpg differ diff --git a/dataset/images/train/train_0154.jpg b/dataset/images/train/train_0154.jpg new file mode 100644 index 0000000..27192aa Binary files /dev/null and b/dataset/images/train/train_0154.jpg differ diff --git a/dataset/images/train/train_0155.jpg b/dataset/images/train/train_0155.jpg new file mode 100644 index 0000000..949bb24 Binary files /dev/null and b/dataset/images/train/train_0155.jpg differ diff --git a/dataset/images/train/train_0156.jpg b/dataset/images/train/train_0156.jpg new file mode 100644 index 0000000..0d8528b Binary files /dev/null and b/dataset/images/train/train_0156.jpg differ diff --git a/dataset/images/train/train_0157.jpg b/dataset/images/train/train_0157.jpg new file mode 100644 index 0000000..ad111a3 Binary files /dev/null and b/dataset/images/train/train_0157.jpg differ diff --git a/dataset/images/train/train_0158.jpg b/dataset/images/train/train_0158.jpg new file mode 100644 index 0000000..639d2a4 Binary files /dev/null and b/dataset/images/train/train_0158.jpg differ diff --git a/dataset/images/train/train_0159.jpg b/dataset/images/train/train_0159.jpg new file mode 100644 index 0000000..d302a46 Binary files /dev/null and b/dataset/images/train/train_0159.jpg differ diff --git a/dataset/images/train/train_0160.jpg b/dataset/images/train/train_0160.jpg new file mode 100644 index 0000000..d656446 Binary files /dev/null and b/dataset/images/train/train_0160.jpg differ diff --git a/dataset/images/train/train_0161.jpg b/dataset/images/train/train_0161.jpg new file mode 100644 index 0000000..fca50e3 Binary files /dev/null and b/dataset/images/train/train_0161.jpg differ diff --git a/dataset/images/train/train_0162.jpg b/dataset/images/train/train_0162.jpg new file mode 100644 index 0000000..ef50f52 Binary files /dev/null and b/dataset/images/train/train_0162.jpg differ diff --git a/dataset/images/train/train_0163.jpg b/dataset/images/train/train_0163.jpg new file mode 100644 index 0000000..20ed9b1 Binary files /dev/null and b/dataset/images/train/train_0163.jpg differ diff --git a/dataset/images/train/train_0164.jpg b/dataset/images/train/train_0164.jpg new file mode 100644 index 0000000..2561144 Binary files /dev/null and b/dataset/images/train/train_0164.jpg differ diff --git a/dataset/images/train/train_0165.jpg b/dataset/images/train/train_0165.jpg new file mode 100644 index 0000000..6c4aaf3 Binary files /dev/null and b/dataset/images/train/train_0165.jpg differ diff --git a/dataset/images/train/train_0166.jpg b/dataset/images/train/train_0166.jpg new file mode 100644 index 0000000..0f61d9f Binary files /dev/null and b/dataset/images/train/train_0166.jpg differ diff --git a/dataset/images/train/train_0167.jpg b/dataset/images/train/train_0167.jpg new file mode 100644 index 0000000..e7bd7e5 Binary files /dev/null and b/dataset/images/train/train_0167.jpg differ diff --git a/dataset/images/train/train_0168.jpg b/dataset/images/train/train_0168.jpg new file mode 100644 index 0000000..6f5520b Binary files /dev/null and b/dataset/images/train/train_0168.jpg differ diff --git a/dataset/images/train/train_0169.jpg b/dataset/images/train/train_0169.jpg new file mode 100644 index 0000000..490ac34 Binary files /dev/null and b/dataset/images/train/train_0169.jpg differ diff --git a/dataset/images/train/train_0170.jpg b/dataset/images/train/train_0170.jpg new file mode 100644 index 0000000..bc5fb57 Binary files /dev/null and b/dataset/images/train/train_0170.jpg differ diff --git a/dataset/images/train/train_0171.jpg b/dataset/images/train/train_0171.jpg new file mode 100644 index 0000000..ebc0a3e Binary files /dev/null and b/dataset/images/train/train_0171.jpg differ diff --git a/dataset/images/train/train_0172.jpg b/dataset/images/train/train_0172.jpg new file mode 100644 index 0000000..b7c7f67 Binary files /dev/null and b/dataset/images/train/train_0172.jpg differ diff --git a/dataset/images/train/train_0173.jpg b/dataset/images/train/train_0173.jpg new file mode 100644 index 0000000..0ed6967 Binary files /dev/null and b/dataset/images/train/train_0173.jpg differ diff --git a/dataset/images/train/train_0174.jpg b/dataset/images/train/train_0174.jpg new file mode 100644 index 0000000..33f0568 Binary files /dev/null and b/dataset/images/train/train_0174.jpg differ diff --git a/dataset/images/train/train_0175.jpg b/dataset/images/train/train_0175.jpg new file mode 100644 index 0000000..7f917e5 Binary files /dev/null and b/dataset/images/train/train_0175.jpg differ diff --git a/dataset/images/train/train_0176.jpg b/dataset/images/train/train_0176.jpg new file mode 100644 index 0000000..2a8bc8d Binary files /dev/null and b/dataset/images/train/train_0176.jpg differ diff --git a/dataset/images/train/train_0177.jpg b/dataset/images/train/train_0177.jpg new file mode 100644 index 0000000..ea2a5c1 Binary files /dev/null and b/dataset/images/train/train_0177.jpg differ diff --git a/dataset/images/train/train_0178.jpg b/dataset/images/train/train_0178.jpg new file mode 100644 index 0000000..18102bf Binary files /dev/null and b/dataset/images/train/train_0178.jpg differ diff --git a/dataset/images/train/train_0179.jpg b/dataset/images/train/train_0179.jpg new file mode 100644 index 0000000..bd466de Binary files /dev/null and b/dataset/images/train/train_0179.jpg differ diff --git a/dataset/images/train/train_0180.jpg b/dataset/images/train/train_0180.jpg new file mode 100644 index 0000000..836f474 Binary files /dev/null and b/dataset/images/train/train_0180.jpg differ diff --git a/dataset/images/train/train_0181.jpg b/dataset/images/train/train_0181.jpg new file mode 100644 index 0000000..29dbbaf Binary files /dev/null and b/dataset/images/train/train_0181.jpg differ diff --git a/dataset/images/train/train_0182.jpg b/dataset/images/train/train_0182.jpg new file mode 100644 index 0000000..c73fedd Binary files /dev/null and b/dataset/images/train/train_0182.jpg differ diff --git a/dataset/images/train/train_0183.jpg b/dataset/images/train/train_0183.jpg new file mode 100644 index 0000000..8847f46 Binary files /dev/null and b/dataset/images/train/train_0183.jpg differ diff --git a/dataset/images/train/train_0184.jpg b/dataset/images/train/train_0184.jpg new file mode 100644 index 0000000..7b2e44b Binary files /dev/null and b/dataset/images/train/train_0184.jpg differ diff --git a/dataset/images/train/train_0185.jpg b/dataset/images/train/train_0185.jpg new file mode 100644 index 0000000..9763e46 Binary files /dev/null and b/dataset/images/train/train_0185.jpg differ diff --git a/dataset/images/train/train_0186.jpg b/dataset/images/train/train_0186.jpg new file mode 100644 index 0000000..8c1ab97 Binary files /dev/null and b/dataset/images/train/train_0186.jpg differ diff --git a/dataset/images/train/train_0187.jpg b/dataset/images/train/train_0187.jpg new file mode 100644 index 0000000..a8fcbcd Binary files /dev/null and b/dataset/images/train/train_0187.jpg differ diff --git a/dataset/images/train/train_0188.jpg b/dataset/images/train/train_0188.jpg new file mode 100644 index 0000000..8335867 Binary files /dev/null and b/dataset/images/train/train_0188.jpg differ diff --git a/dataset/images/train/train_0189.jpg b/dataset/images/train/train_0189.jpg new file mode 100644 index 0000000..d28d019 Binary files /dev/null and b/dataset/images/train/train_0189.jpg differ diff --git a/dataset/images/train/train_0190.jpg b/dataset/images/train/train_0190.jpg new file mode 100644 index 0000000..08d8eb4 Binary files /dev/null and b/dataset/images/train/train_0190.jpg differ diff --git a/dataset/images/train/train_0191.jpg b/dataset/images/train/train_0191.jpg new file mode 100644 index 0000000..5471e66 Binary files /dev/null and b/dataset/images/train/train_0191.jpg differ diff --git a/dataset/images/train/train_0192.jpg b/dataset/images/train/train_0192.jpg new file mode 100644 index 0000000..cbb23cc Binary files /dev/null and b/dataset/images/train/train_0192.jpg differ diff --git a/dataset/images/train/train_0193.jpg b/dataset/images/train/train_0193.jpg new file mode 100644 index 0000000..4f90b1a Binary files /dev/null and b/dataset/images/train/train_0193.jpg differ diff --git a/dataset/images/train/train_0194.jpg b/dataset/images/train/train_0194.jpg new file mode 100644 index 0000000..5ae3e61 Binary files /dev/null and b/dataset/images/train/train_0194.jpg differ diff --git a/dataset/images/train/train_0195.jpg b/dataset/images/train/train_0195.jpg new file mode 100644 index 0000000..170af37 Binary files /dev/null and b/dataset/images/train/train_0195.jpg differ diff --git a/dataset/images/train/train_0196.jpg b/dataset/images/train/train_0196.jpg new file mode 100644 index 0000000..db36ac6 Binary files /dev/null and b/dataset/images/train/train_0196.jpg differ diff --git a/dataset/images/train/train_0197.jpg b/dataset/images/train/train_0197.jpg new file mode 100644 index 0000000..9893124 Binary files /dev/null and b/dataset/images/train/train_0197.jpg differ diff --git a/dataset/images/train/train_0198.jpg b/dataset/images/train/train_0198.jpg new file mode 100644 index 0000000..48621f4 Binary files /dev/null and b/dataset/images/train/train_0198.jpg differ diff --git a/dataset/images/train/train_0199.jpg b/dataset/images/train/train_0199.jpg new file mode 100644 index 0000000..eb62de0 Binary files /dev/null and b/dataset/images/train/train_0199.jpg differ diff --git a/dataset/images/train/user_capture_1780003783840.jpg b/dataset/images/train/user_capture_1780003783840.jpg new file mode 100644 index 0000000..0dd967c Binary files /dev/null and b/dataset/images/train/user_capture_1780003783840.jpg differ diff --git a/dataset/images/train/user_capture_1780003803459.jpg b/dataset/images/train/user_capture_1780003803459.jpg new file mode 100644 index 0000000..7dec223 Binary files /dev/null and b/dataset/images/train/user_capture_1780003803459.jpg differ diff --git a/dataset/images/train/user_capture_1780003806546.jpg b/dataset/images/train/user_capture_1780003806546.jpg new file mode 100644 index 0000000..4245f51 Binary files /dev/null and b/dataset/images/train/user_capture_1780003806546.jpg differ diff --git a/dataset/images/train/user_capture_1780003809723.jpg b/dataset/images/train/user_capture_1780003809723.jpg new file mode 100644 index 0000000..621baee Binary files /dev/null and b/dataset/images/train/user_capture_1780003809723.jpg differ diff --git a/dataset/images/train/user_capture_1780003812605.jpg b/dataset/images/train/user_capture_1780003812605.jpg new file mode 100644 index 0000000..01ab5b8 Binary files /dev/null and b/dataset/images/train/user_capture_1780003812605.jpg differ diff --git a/dataset/images/train/user_capture_1780003815582.jpg b/dataset/images/train/user_capture_1780003815582.jpg new file mode 100644 index 0000000..f73f337 Binary files /dev/null and b/dataset/images/train/user_capture_1780003815582.jpg differ diff --git a/dataset/images/train/user_capture_1780003818633.jpg b/dataset/images/train/user_capture_1780003818633.jpg new file mode 100644 index 0000000..45d8dee Binary files /dev/null and b/dataset/images/train/user_capture_1780003818633.jpg differ diff --git a/dataset/images/train/user_capture_1780003821623.jpg b/dataset/images/train/user_capture_1780003821623.jpg new file mode 100644 index 0000000..f6f09d5 Binary files /dev/null and b/dataset/images/train/user_capture_1780003821623.jpg differ diff --git a/dataset/images/train/user_capture_1780003824834.jpg b/dataset/images/train/user_capture_1780003824834.jpg new file mode 100644 index 0000000..a448c70 Binary files /dev/null and b/dataset/images/train/user_capture_1780003824834.jpg differ diff --git a/dataset/images/train/user_capture_1780003828388.jpg b/dataset/images/train/user_capture_1780003828388.jpg new file mode 100644 index 0000000..8d7367f Binary files /dev/null and b/dataset/images/train/user_capture_1780003828388.jpg differ diff --git a/dataset/images/train/user_capture_1780003830953.jpg b/dataset/images/train/user_capture_1780003830953.jpg new file mode 100644 index 0000000..7125ab4 Binary files /dev/null and b/dataset/images/train/user_capture_1780003830953.jpg differ diff --git a/dataset/images/train/user_capture_1780003833933.jpg b/dataset/images/train/user_capture_1780003833933.jpg new file mode 100644 index 0000000..76092d2 Binary files /dev/null and b/dataset/images/train/user_capture_1780003833933.jpg differ diff --git a/dataset/images/train/user_capture_1780003836384.jpg b/dataset/images/train/user_capture_1780003836384.jpg new file mode 100644 index 0000000..c40d831 Binary files /dev/null and b/dataset/images/train/user_capture_1780003836384.jpg differ diff --git a/dataset/images/train/user_capture_1780003838945.jpg b/dataset/images/train/user_capture_1780003838945.jpg new file mode 100644 index 0000000..e845f93 Binary files /dev/null and b/dataset/images/train/user_capture_1780003838945.jpg differ diff --git a/dataset/images/train/user_capture_1780003841632.jpg b/dataset/images/train/user_capture_1780003841632.jpg new file mode 100644 index 0000000..e3dc562 Binary files /dev/null and b/dataset/images/train/user_capture_1780003841632.jpg differ diff --git a/dataset/images/train/user_capture_1780004908498.jpg b/dataset/images/train/user_capture_1780004908498.jpg new file mode 100644 index 0000000..3698724 Binary files /dev/null and b/dataset/images/train/user_capture_1780004908498.jpg differ diff --git a/dataset/images/train/user_capture_1780007172322.jpg b/dataset/images/train/user_capture_1780007172322.jpg new file mode 100644 index 0000000..0556735 Binary files /dev/null and b/dataset/images/train/user_capture_1780007172322.jpg differ diff --git a/dataset/images/train/user_capture_1780007176250.jpg b/dataset/images/train/user_capture_1780007176250.jpg new file mode 100644 index 0000000..3d3d198 Binary files /dev/null and b/dataset/images/train/user_capture_1780007176250.jpg differ diff --git a/dataset/images/train/user_capture_1780007179850.jpg b/dataset/images/train/user_capture_1780007179850.jpg new file mode 100644 index 0000000..925b978 Binary files /dev/null and b/dataset/images/train/user_capture_1780007179850.jpg differ diff --git a/dataset/images/train/user_capture_1780007182800.jpg b/dataset/images/train/user_capture_1780007182800.jpg new file mode 100644 index 0000000..a732fc6 Binary files /dev/null and b/dataset/images/train/user_capture_1780007182800.jpg differ diff --git a/dataset/images/train/user_capture_1780007185911.jpg b/dataset/images/train/user_capture_1780007185911.jpg new file mode 100644 index 0000000..3ebbcfa Binary files /dev/null and b/dataset/images/train/user_capture_1780007185911.jpg differ diff --git a/dataset/images/train/user_capture_1780007193199.jpg b/dataset/images/train/user_capture_1780007193199.jpg new file mode 100644 index 0000000..31390c0 Binary files /dev/null and b/dataset/images/train/user_capture_1780007193199.jpg differ diff --git a/dataset/images/train/user_capture_1780007197515.jpg b/dataset/images/train/user_capture_1780007197515.jpg new file mode 100644 index 0000000..8a4e3f0 Binary files /dev/null and b/dataset/images/train/user_capture_1780007197515.jpg differ diff --git a/dataset/images/train/user_capture_1780007201191.jpg b/dataset/images/train/user_capture_1780007201191.jpg new file mode 100644 index 0000000..a06105d Binary files /dev/null and b/dataset/images/train/user_capture_1780007201191.jpg differ diff --git a/dataset/images/train/user_capture_1780007204503.jpg b/dataset/images/train/user_capture_1780007204503.jpg new file mode 100644 index 0000000..f5ea5d9 Binary files /dev/null and b/dataset/images/train/user_capture_1780007204503.jpg differ diff --git a/dataset/images/val/val_0000.jpg b/dataset/images/val/val_0000.jpg new file mode 100644 index 0000000..21bdbee Binary files /dev/null and b/dataset/images/val/val_0000.jpg differ diff --git a/dataset/images/val/val_0001.jpg b/dataset/images/val/val_0001.jpg new file mode 100644 index 0000000..30fe6f7 Binary files /dev/null and b/dataset/images/val/val_0001.jpg differ diff --git a/dataset/images/val/val_0002.jpg b/dataset/images/val/val_0002.jpg new file mode 100644 index 0000000..8fcd53f Binary files /dev/null and b/dataset/images/val/val_0002.jpg differ diff --git a/dataset/images/val/val_0003.jpg b/dataset/images/val/val_0003.jpg new file mode 100644 index 0000000..1c01c02 Binary files /dev/null and b/dataset/images/val/val_0003.jpg differ diff --git a/dataset/images/val/val_0004.jpg b/dataset/images/val/val_0004.jpg new file mode 100644 index 0000000..5ea24e8 Binary files /dev/null and b/dataset/images/val/val_0004.jpg differ diff --git a/dataset/images/val/val_0005.jpg b/dataset/images/val/val_0005.jpg new file mode 100644 index 0000000..2e64e93 Binary files /dev/null and b/dataset/images/val/val_0005.jpg differ diff --git a/dataset/images/val/val_0006.jpg b/dataset/images/val/val_0006.jpg new file mode 100644 index 0000000..dffae92 Binary files /dev/null and b/dataset/images/val/val_0006.jpg differ diff --git a/dataset/images/val/val_0007.jpg b/dataset/images/val/val_0007.jpg new file mode 100644 index 0000000..cd867f0 Binary files /dev/null and b/dataset/images/val/val_0007.jpg differ diff --git a/dataset/images/val/val_0008.jpg b/dataset/images/val/val_0008.jpg new file mode 100644 index 0000000..cd58cdb Binary files /dev/null and b/dataset/images/val/val_0008.jpg differ diff --git a/dataset/images/val/val_0009.jpg b/dataset/images/val/val_0009.jpg new file mode 100644 index 0000000..314486e Binary files /dev/null and b/dataset/images/val/val_0009.jpg differ diff --git a/dataset/images/val/val_0010.jpg b/dataset/images/val/val_0010.jpg new file mode 100644 index 0000000..622c03c Binary files /dev/null and b/dataset/images/val/val_0010.jpg differ diff --git a/dataset/images/val/val_0011.jpg b/dataset/images/val/val_0011.jpg new file mode 100644 index 0000000..b1889c0 Binary files /dev/null and b/dataset/images/val/val_0011.jpg differ diff --git a/dataset/images/val/val_0012.jpg b/dataset/images/val/val_0012.jpg new file mode 100644 index 0000000..86f9f1b Binary files /dev/null and b/dataset/images/val/val_0012.jpg differ diff --git a/dataset/images/val/val_0013.jpg b/dataset/images/val/val_0013.jpg new file mode 100644 index 0000000..3373054 Binary files /dev/null and b/dataset/images/val/val_0013.jpg differ diff --git a/dataset/images/val/val_0014.jpg b/dataset/images/val/val_0014.jpg new file mode 100644 index 0000000..4d6fec1 Binary files /dev/null and b/dataset/images/val/val_0014.jpg differ diff --git a/dataset/images/val/val_0015.jpg b/dataset/images/val/val_0015.jpg new file mode 100644 index 0000000..bc11617 Binary files /dev/null and b/dataset/images/val/val_0015.jpg differ diff --git a/dataset/images/val/val_0016.jpg b/dataset/images/val/val_0016.jpg new file mode 100644 index 0000000..cbad456 Binary files /dev/null and b/dataset/images/val/val_0016.jpg differ diff --git a/dataset/images/val/val_0017.jpg b/dataset/images/val/val_0017.jpg new file mode 100644 index 0000000..9d1c827 Binary files /dev/null and b/dataset/images/val/val_0017.jpg differ diff --git a/dataset/images/val/val_0018.jpg b/dataset/images/val/val_0018.jpg new file mode 100644 index 0000000..03e0415 Binary files /dev/null and b/dataset/images/val/val_0018.jpg differ diff --git a/dataset/images/val/val_0019.jpg b/dataset/images/val/val_0019.jpg new file mode 100644 index 0000000..6569921 Binary files /dev/null and b/dataset/images/val/val_0019.jpg differ diff --git a/dataset/images/val/val_0020.jpg b/dataset/images/val/val_0020.jpg new file mode 100644 index 0000000..25442f6 Binary files /dev/null and b/dataset/images/val/val_0020.jpg differ diff --git a/dataset/images/val/val_0021.jpg b/dataset/images/val/val_0021.jpg new file mode 100644 index 0000000..113a130 Binary files /dev/null and b/dataset/images/val/val_0021.jpg differ diff --git a/dataset/images/val/val_0022.jpg b/dataset/images/val/val_0022.jpg new file mode 100644 index 0000000..2a7997c Binary files /dev/null and b/dataset/images/val/val_0022.jpg differ diff --git a/dataset/images/val/val_0023.jpg b/dataset/images/val/val_0023.jpg new file mode 100644 index 0000000..3eca705 Binary files /dev/null and b/dataset/images/val/val_0023.jpg differ diff --git a/dataset/images/val/val_0024.jpg b/dataset/images/val/val_0024.jpg new file mode 100644 index 0000000..cef7be4 Binary files /dev/null and b/dataset/images/val/val_0024.jpg differ diff --git a/dataset/images/val/val_0025.jpg b/dataset/images/val/val_0025.jpg new file mode 100644 index 0000000..54b0d4e Binary files /dev/null and b/dataset/images/val/val_0025.jpg differ diff --git a/dataset/images/val/val_0026.jpg b/dataset/images/val/val_0026.jpg new file mode 100644 index 0000000..5b99fac Binary files /dev/null and b/dataset/images/val/val_0026.jpg differ diff --git a/dataset/images/val/val_0027.jpg b/dataset/images/val/val_0027.jpg new file mode 100644 index 0000000..d22115a Binary files /dev/null and b/dataset/images/val/val_0027.jpg differ diff --git a/dataset/images/val/val_0028.jpg b/dataset/images/val/val_0028.jpg new file mode 100644 index 0000000..2e583e0 Binary files /dev/null and b/dataset/images/val/val_0028.jpg differ diff --git a/dataset/images/val/val_0029.jpg b/dataset/images/val/val_0029.jpg new file mode 100644 index 0000000..7c3cd00 Binary files /dev/null and b/dataset/images/val/val_0029.jpg differ diff --git a/dataset/images/val/val_0030.jpg b/dataset/images/val/val_0030.jpg new file mode 100644 index 0000000..fdd2b7a Binary files /dev/null and b/dataset/images/val/val_0030.jpg differ diff --git a/dataset/images/val/val_0031.jpg b/dataset/images/val/val_0031.jpg new file mode 100644 index 0000000..8662c21 Binary files /dev/null and b/dataset/images/val/val_0031.jpg differ diff --git a/dataset/images/val/val_0032.jpg b/dataset/images/val/val_0032.jpg new file mode 100644 index 0000000..59408fa Binary files /dev/null and b/dataset/images/val/val_0032.jpg differ diff --git a/dataset/images/val/val_0033.jpg b/dataset/images/val/val_0033.jpg new file mode 100644 index 0000000..cbf7486 Binary files /dev/null and b/dataset/images/val/val_0033.jpg differ diff --git a/dataset/images/val/val_0034.jpg b/dataset/images/val/val_0034.jpg new file mode 100644 index 0000000..14a7514 Binary files /dev/null and b/dataset/images/val/val_0034.jpg differ diff --git a/dataset/images/val/val_0035.jpg b/dataset/images/val/val_0035.jpg new file mode 100644 index 0000000..dcc6688 Binary files /dev/null and b/dataset/images/val/val_0035.jpg differ diff --git a/dataset/images/val/val_0036.jpg b/dataset/images/val/val_0036.jpg new file mode 100644 index 0000000..508b938 Binary files /dev/null and b/dataset/images/val/val_0036.jpg differ diff --git a/dataset/images/val/val_0037.jpg b/dataset/images/val/val_0037.jpg new file mode 100644 index 0000000..ac6c5c8 Binary files /dev/null and b/dataset/images/val/val_0037.jpg differ diff --git a/dataset/images/val/val_0038.jpg b/dataset/images/val/val_0038.jpg new file mode 100644 index 0000000..dcc8179 Binary files /dev/null and b/dataset/images/val/val_0038.jpg differ diff --git a/dataset/images/val/val_0039.jpg b/dataset/images/val/val_0039.jpg new file mode 100644 index 0000000..ee04cf0 Binary files /dev/null and b/dataset/images/val/val_0039.jpg differ diff --git a/dataset/images/val/val_0040.jpg b/dataset/images/val/val_0040.jpg new file mode 100644 index 0000000..cffdf2f Binary files /dev/null and b/dataset/images/val/val_0040.jpg differ diff --git a/dataset/images/val/val_0041.jpg b/dataset/images/val/val_0041.jpg new file mode 100644 index 0000000..8a96817 Binary files /dev/null and b/dataset/images/val/val_0041.jpg differ diff --git a/dataset/images/val/val_0042.jpg b/dataset/images/val/val_0042.jpg new file mode 100644 index 0000000..e26ffc8 Binary files /dev/null and b/dataset/images/val/val_0042.jpg differ diff --git a/dataset/images/val/val_0043.jpg b/dataset/images/val/val_0043.jpg new file mode 100644 index 0000000..b689556 Binary files /dev/null and b/dataset/images/val/val_0043.jpg differ diff --git a/dataset/images/val/val_0044.jpg b/dataset/images/val/val_0044.jpg new file mode 100644 index 0000000..9d6d243 Binary files /dev/null and b/dataset/images/val/val_0044.jpg differ diff --git a/dataset/images/val/val_0045.jpg b/dataset/images/val/val_0045.jpg new file mode 100644 index 0000000..f8ca700 Binary files /dev/null and b/dataset/images/val/val_0045.jpg differ diff --git a/dataset/images/val/val_0046.jpg b/dataset/images/val/val_0046.jpg new file mode 100644 index 0000000..a925db5 Binary files /dev/null and b/dataset/images/val/val_0046.jpg differ diff --git a/dataset/images/val/val_0047.jpg b/dataset/images/val/val_0047.jpg new file mode 100644 index 0000000..379b3d7 Binary files /dev/null and b/dataset/images/val/val_0047.jpg differ diff --git a/dataset/images/val/val_0048.jpg b/dataset/images/val/val_0048.jpg new file mode 100644 index 0000000..479af41 Binary files /dev/null and b/dataset/images/val/val_0048.jpg differ diff --git a/dataset/images/val/val_0049.jpg b/dataset/images/val/val_0049.jpg new file mode 100644 index 0000000..b956581 Binary files /dev/null and b/dataset/images/val/val_0049.jpg differ diff --git a/dataset/labels/train/train_0000.txt b/dataset/labels/train/train_0000.txt new file mode 100644 index 0000000..98c28f3 --- /dev/null +++ b/dataset/labels/train/train_0000.txt @@ -0,0 +1,2 @@ +12 0.402344 0.168750 0.157812 0.166667 +12 0.849219 0.735417 0.157812 0.204167 \ No newline at end of file diff --git a/dataset/labels/train/train_0001.txt b/dataset/labels/train/train_0001.txt new file mode 100644 index 0000000..79de889 --- /dev/null +++ b/dataset/labels/train/train_0001.txt @@ -0,0 +1,2 @@ +1 0.454688 0.616667 0.231250 0.270833 +18 0.164844 0.598958 0.204687 0.222917 \ No newline at end of file diff --git a/dataset/labels/train/train_0002.txt b/dataset/labels/train/train_0002.txt new file mode 100644 index 0000000..e745b52 --- /dev/null +++ b/dataset/labels/train/train_0002.txt @@ -0,0 +1,2 @@ +19 0.279687 0.358333 0.171875 0.216667 +2 0.175000 0.646875 0.140625 0.227083 \ No newline at end of file diff --git a/dataset/labels/train/train_0003.txt b/dataset/labels/train/train_0003.txt new file mode 100644 index 0000000..7418f9c --- /dev/null +++ b/dataset/labels/train/train_0003.txt @@ -0,0 +1,3 @@ +15 0.274219 0.418750 0.079687 0.312500 +26 0.507812 0.661458 0.225000 0.172917 +4 0.117969 0.286458 0.079687 0.214583 \ No newline at end of file diff --git a/dataset/labels/train/train_0004.txt b/dataset/labels/train/train_0004.txt new file mode 100644 index 0000000..6cf9bc2 --- /dev/null +++ b/dataset/labels/train/train_0004.txt @@ -0,0 +1,2 @@ +11 0.775781 0.526042 0.160938 0.310417 +4 0.309375 0.592708 0.171875 0.227083 \ No newline at end of file diff --git a/dataset/labels/train/train_0005.txt b/dataset/labels/train/train_0005.txt new file mode 100644 index 0000000..22522eb --- /dev/null +++ b/dataset/labels/train/train_0005.txt @@ -0,0 +1,3 @@ +11 0.104688 0.788542 0.106250 0.206250 +18 0.720313 0.701042 0.168750 0.256250 +13 0.707031 0.462500 0.214062 0.254167 \ No newline at end of file diff --git a/dataset/labels/train/train_0006.txt b/dataset/labels/train/train_0006.txt new file mode 100644 index 0000000..c658965 --- /dev/null +++ b/dataset/labels/train/train_0006.txt @@ -0,0 +1 @@ +9 0.823438 0.650000 0.159375 0.270833 \ No newline at end of file diff --git a/dataset/labels/train/train_0007.txt b/dataset/labels/train/train_0007.txt new file mode 100644 index 0000000..80a0c13 --- /dev/null +++ b/dataset/labels/train/train_0007.txt @@ -0,0 +1,3 @@ +14 0.782813 0.323958 0.175000 0.197917 +5 0.557813 0.376042 0.193750 0.368750 +24 0.651563 0.762500 0.206250 0.283333 \ No newline at end of file diff --git a/dataset/labels/train/train_0008.txt b/dataset/labels/train/train_0008.txt new file mode 100644 index 0000000..2a071ad --- /dev/null +++ b/dataset/labels/train/train_0008.txt @@ -0,0 +1 @@ +8 0.410938 0.693750 0.184375 0.170833 \ No newline at end of file diff --git a/dataset/labels/train/train_0009.txt b/dataset/labels/train/train_0009.txt new file mode 100644 index 0000000..fed128d --- /dev/null +++ b/dataset/labels/train/train_0009.txt @@ -0,0 +1,3 @@ +13 0.640625 0.641667 0.143750 0.225000 +2 0.278125 0.735417 0.187500 0.262500 +16 0.825781 0.695833 0.182812 0.254167 \ No newline at end of file diff --git a/dataset/labels/train/train_0010.txt b/dataset/labels/train/train_0010.txt new file mode 100644 index 0000000..b94d3e0 --- /dev/null +++ b/dataset/labels/train/train_0010.txt @@ -0,0 +1,3 @@ +10 0.632812 0.137500 0.087500 0.104167 +6 0.624219 0.644792 0.210938 0.281250 +19 0.192969 0.635417 0.148438 0.233333 \ No newline at end of file diff --git a/dataset/labels/train/train_0011.txt b/dataset/labels/train/train_0011.txt new file mode 100644 index 0000000..a3c2159 --- /dev/null +++ b/dataset/labels/train/train_0011.txt @@ -0,0 +1 @@ +6 0.706250 0.591667 0.150000 0.200000 \ No newline at end of file diff --git a/dataset/labels/train/train_0012.txt b/dataset/labels/train/train_0012.txt new file mode 100644 index 0000000..2cc19a1 --- /dev/null +++ b/dataset/labels/train/train_0012.txt @@ -0,0 +1,3 @@ +1 0.177344 0.369792 0.251563 0.281250 +15 0.900781 0.612500 0.104688 0.175000 +18 0.184375 0.572917 0.162500 0.175000 \ No newline at end of file diff --git a/dataset/labels/train/train_0013.txt b/dataset/labels/train/train_0013.txt new file mode 100644 index 0000000..0ff2123 --- /dev/null +++ b/dataset/labels/train/train_0013.txt @@ -0,0 +1,2 @@ +9 0.644531 0.772917 0.173437 0.170833 +2 0.383594 0.333333 0.173437 0.266667 \ No newline at end of file diff --git a/dataset/labels/train/train_0014.txt b/dataset/labels/train/train_0014.txt new file mode 100644 index 0000000..b61619f --- /dev/null +++ b/dataset/labels/train/train_0014.txt @@ -0,0 +1 @@ +23 0.419531 0.630208 0.164062 0.235417 \ No newline at end of file diff --git a/dataset/labels/train/train_0015.txt b/dataset/labels/train/train_0015.txt new file mode 100644 index 0000000..915ab1b --- /dev/null +++ b/dataset/labels/train/train_0015.txt @@ -0,0 +1,2 @@ +10 0.704688 0.386458 0.121875 0.147917 +20 0.420312 0.351042 0.175000 0.235417 \ No newline at end of file diff --git a/dataset/labels/train/train_0016.txt b/dataset/labels/train/train_0016.txt new file mode 100644 index 0000000..316ea43 --- /dev/null +++ b/dataset/labels/train/train_0016.txt @@ -0,0 +1,2 @@ +21 0.701562 0.676042 0.143750 0.147917 +16 0.410156 0.361458 0.098437 0.168750 \ No newline at end of file diff --git a/dataset/labels/train/train_0017.txt b/dataset/labels/train/train_0017.txt new file mode 100644 index 0000000..89a5688 --- /dev/null +++ b/dataset/labels/train/train_0017.txt @@ -0,0 +1,2 @@ +6 0.272656 0.363542 0.204687 0.272917 +23 0.711719 0.508333 0.129688 0.187500 \ No newline at end of file diff --git a/dataset/labels/train/train_0018.txt b/dataset/labels/train/train_0018.txt new file mode 100644 index 0000000..38910fd --- /dev/null +++ b/dataset/labels/train/train_0018.txt @@ -0,0 +1,2 @@ +6 0.382031 0.333333 0.195312 0.258333 +22 0.318750 0.600000 0.184375 0.270833 \ No newline at end of file diff --git a/dataset/labels/train/train_0019.txt b/dataset/labels/train/train_0019.txt new file mode 100644 index 0000000..c009e4d --- /dev/null +++ b/dataset/labels/train/train_0019.txt @@ -0,0 +1,3 @@ +22 0.602344 0.772917 0.210938 0.270833 +5 0.855469 0.495833 0.164062 0.275000 +20 0.392969 0.519792 0.189062 0.289583 \ No newline at end of file diff --git a/dataset/labels/train/train_0020.txt b/dataset/labels/train/train_0020.txt new file mode 100644 index 0000000..269ecf9 --- /dev/null +++ b/dataset/labels/train/train_0020.txt @@ -0,0 +1 @@ +19 0.564844 0.444792 0.123438 0.197917 \ No newline at end of file diff --git a/dataset/labels/train/train_0021.txt b/dataset/labels/train/train_0021.txt new file mode 100644 index 0000000..b60338a --- /dev/null +++ b/dataset/labels/train/train_0021.txt @@ -0,0 +1 @@ +21 0.459375 0.598958 0.146875 0.252083 \ No newline at end of file diff --git a/dataset/labels/train/train_0022.txt b/dataset/labels/train/train_0022.txt new file mode 100644 index 0000000..785527f --- /dev/null +++ b/dataset/labels/train/train_0022.txt @@ -0,0 +1,3 @@ +16 0.146094 0.480208 0.195312 0.168750 +21 0.682813 0.831250 0.178125 0.204167 +13 0.842969 0.522917 0.160938 0.187500 \ No newline at end of file diff --git a/dataset/labels/train/train_0023.txt b/dataset/labels/train/train_0023.txt new file mode 100644 index 0000000..4a11def --- /dev/null +++ b/dataset/labels/train/train_0023.txt @@ -0,0 +1,3 @@ +17 0.735938 0.141667 0.165625 0.075000 +16 0.697656 0.459375 0.173437 0.177083 +17 0.696094 0.671875 0.245312 0.131250 \ No newline at end of file diff --git a/dataset/labels/train/train_0024.txt b/dataset/labels/train/train_0024.txt new file mode 100644 index 0000000..0ca39be --- /dev/null +++ b/dataset/labels/train/train_0024.txt @@ -0,0 +1 @@ +16 0.445312 0.457292 0.184375 0.181250 \ No newline at end of file diff --git a/dataset/labels/train/train_0025.txt b/dataset/labels/train/train_0025.txt new file mode 100644 index 0000000..9ba4593 --- /dev/null +++ b/dataset/labels/train/train_0025.txt @@ -0,0 +1,2 @@ +10 0.509375 0.861458 0.121875 0.152083 +10 0.248438 0.146875 0.112500 0.135417 \ No newline at end of file diff --git a/dataset/labels/train/train_0026.txt b/dataset/labels/train/train_0026.txt new file mode 100644 index 0000000..735cd99 --- /dev/null +++ b/dataset/labels/train/train_0026.txt @@ -0,0 +1,3 @@ +17 0.864844 0.800000 0.170313 0.225000 +9 0.732031 0.790625 0.164062 0.160417 +18 0.346094 0.560417 0.114062 0.187500 \ No newline at end of file diff --git a/dataset/labels/train/train_0027.txt b/dataset/labels/train/train_0027.txt new file mode 100644 index 0000000..f8b501f --- /dev/null +++ b/dataset/labels/train/train_0027.txt @@ -0,0 +1,2 @@ +14 0.817187 0.581250 0.115625 0.187500 +19 0.553906 0.341667 0.182812 0.237500 \ No newline at end of file diff --git a/dataset/labels/train/train_0028.txt b/dataset/labels/train/train_0028.txt new file mode 100644 index 0000000..7d11be8 --- /dev/null +++ b/dataset/labels/train/train_0028.txt @@ -0,0 +1,2 @@ +9 0.237500 0.816667 0.134375 0.204167 +13 0.759375 0.718750 0.168750 0.216667 \ No newline at end of file diff --git a/dataset/labels/train/train_0029.txt b/dataset/labels/train/train_0029.txt new file mode 100644 index 0000000..d5567c2 --- /dev/null +++ b/dataset/labels/train/train_0029.txt @@ -0,0 +1,3 @@ +24 0.577344 0.410417 0.142187 0.166667 +23 0.368750 0.371875 0.153125 0.235417 +4 0.803906 0.487500 0.182812 0.170833 \ No newline at end of file diff --git a/dataset/labels/train/train_0030.txt b/dataset/labels/train/train_0030.txt new file mode 100644 index 0000000..e7676c0 --- /dev/null +++ b/dataset/labels/train/train_0030.txt @@ -0,0 +1,3 @@ +9 0.321875 0.490625 0.153125 0.260417 +12 0.873437 0.640625 0.156250 0.247917 +6 0.477344 0.503125 0.126562 0.168750 \ No newline at end of file diff --git a/dataset/labels/train/train_0031.txt b/dataset/labels/train/train_0031.txt new file mode 100644 index 0000000..2a53eeb --- /dev/null +++ b/dataset/labels/train/train_0031.txt @@ -0,0 +1 @@ +17 0.732031 0.296875 0.223438 0.272917 \ No newline at end of file diff --git a/dataset/labels/train/train_0032.txt b/dataset/labels/train/train_0032.txt new file mode 100644 index 0000000..79f0fbe --- /dev/null +++ b/dataset/labels/train/train_0032.txt @@ -0,0 +1,2 @@ +1 0.539062 0.435417 0.275000 0.329167 +25 0.682031 0.700000 0.145313 0.183333 \ No newline at end of file diff --git a/dataset/labels/train/train_0033.txt b/dataset/labels/train/train_0033.txt new file mode 100644 index 0000000..8800aee --- /dev/null +++ b/dataset/labels/train/train_0033.txt @@ -0,0 +1 @@ +17 0.829688 0.319792 0.140625 0.177083 \ No newline at end of file diff --git a/dataset/labels/train/train_0034.txt b/dataset/labels/train/train_0034.txt new file mode 100644 index 0000000..51ebab4 --- /dev/null +++ b/dataset/labels/train/train_0034.txt @@ -0,0 +1 @@ +12 0.678906 0.626042 0.173437 0.343750 \ No newline at end of file diff --git a/dataset/labels/train/train_0035.txt b/dataset/labels/train/train_0035.txt new file mode 100644 index 0000000..db14627 --- /dev/null +++ b/dataset/labels/train/train_0035.txt @@ -0,0 +1,3 @@ +5 0.418750 0.227083 0.168750 0.191667 +5 0.176563 0.523958 0.181250 0.268750 +2 0.239844 0.332292 0.220312 0.247917 \ No newline at end of file diff --git a/dataset/labels/train/train_0036.txt b/dataset/labels/train/train_0036.txt new file mode 100644 index 0000000..f73f1d6 --- /dev/null +++ b/dataset/labels/train/train_0036.txt @@ -0,0 +1,3 @@ +26 0.642188 0.720833 0.150000 0.233333 +8 0.474219 0.235417 0.123438 0.258333 +15 0.113281 0.607292 0.132812 0.331250 \ No newline at end of file diff --git a/dataset/labels/train/train_0037.txt b/dataset/labels/train/train_0037.txt new file mode 100644 index 0000000..a7334de --- /dev/null +++ b/dataset/labels/train/train_0037.txt @@ -0,0 +1,3 @@ +24 0.760156 0.542708 0.217188 0.277083 +2 0.703125 0.337500 0.156250 0.191667 +17 0.546094 0.246875 0.189062 0.227083 \ No newline at end of file diff --git a/dataset/labels/train/train_0038.txt b/dataset/labels/train/train_0038.txt new file mode 100644 index 0000000..99c1a35 --- /dev/null +++ b/dataset/labels/train/train_0038.txt @@ -0,0 +1 @@ +13 0.782031 0.782292 0.214062 0.310417 \ No newline at end of file diff --git a/dataset/labels/train/train_0039.txt b/dataset/labels/train/train_0039.txt new file mode 100644 index 0000000..8e740ab --- /dev/null +++ b/dataset/labels/train/train_0039.txt @@ -0,0 +1,3 @@ +10 0.468750 0.153125 0.118750 0.156250 +5 0.580469 0.798958 0.170313 0.160417 +9 0.317969 0.421875 0.179688 0.177083 \ No newline at end of file diff --git a/dataset/labels/train/train_0040.txt b/dataset/labels/train/train_0040.txt new file mode 100644 index 0000000..ac7b6fd --- /dev/null +++ b/dataset/labels/train/train_0040.txt @@ -0,0 +1,3 @@ +18 0.205469 0.533333 0.214062 0.237500 +8 0.807813 0.203125 0.181250 0.164583 +16 0.470313 0.735417 0.181250 0.241667 \ No newline at end of file diff --git a/dataset/labels/train/train_0041.txt b/dataset/labels/train/train_0041.txt new file mode 100644 index 0000000..6bf16b7 --- /dev/null +++ b/dataset/labels/train/train_0041.txt @@ -0,0 +1,3 @@ +19 0.667188 0.210417 0.156250 0.212500 +0 0.439844 0.523958 0.173437 0.193750 +26 0.146875 0.309375 0.125000 0.302083 \ No newline at end of file diff --git a/dataset/labels/train/train_0042.txt b/dataset/labels/train/train_0042.txt new file mode 100644 index 0000000..44ef9da --- /dev/null +++ b/dataset/labels/train/train_0042.txt @@ -0,0 +1,3 @@ +10 0.517188 0.816667 0.078125 0.108333 +2 0.254688 0.486458 0.181250 0.247917 +7 0.868750 0.218750 0.128125 0.283333 \ No newline at end of file diff --git a/dataset/labels/train/train_0043.txt b/dataset/labels/train/train_0043.txt new file mode 100644 index 0000000..a906225 --- /dev/null +++ b/dataset/labels/train/train_0043.txt @@ -0,0 +1,3 @@ +18 0.725000 0.722917 0.115625 0.191667 +3 0.435937 0.212500 0.246875 0.258333 +9 0.638281 0.270833 0.114062 0.191667 \ No newline at end of file diff --git a/dataset/labels/train/train_0044.txt b/dataset/labels/train/train_0044.txt new file mode 100644 index 0000000..09c86c3 --- /dev/null +++ b/dataset/labels/train/train_0044.txt @@ -0,0 +1,3 @@ +7 0.411719 0.330208 0.129688 0.281250 +23 0.450000 0.779167 0.190625 0.254167 +22 0.491406 0.565625 0.145313 0.172917 \ No newline at end of file diff --git a/dataset/labels/train/train_0045.txt b/dataset/labels/train/train_0045.txt new file mode 100644 index 0000000..fa1a8e1 --- /dev/null +++ b/dataset/labels/train/train_0045.txt @@ -0,0 +1,2 @@ +3 0.279687 0.441667 0.231250 0.225000 +18 0.545312 0.428125 0.184375 0.302083 \ No newline at end of file diff --git a/dataset/labels/train/train_0046.txt b/dataset/labels/train/train_0046.txt new file mode 100644 index 0000000..519309a --- /dev/null +++ b/dataset/labels/train/train_0046.txt @@ -0,0 +1,2 @@ +17 0.378125 0.709375 0.215625 0.135417 +11 0.396875 0.565625 0.178125 0.189583 \ No newline at end of file diff --git a/dataset/labels/train/train_0047.txt b/dataset/labels/train/train_0047.txt new file mode 100644 index 0000000..3a053d9 --- /dev/null +++ b/dataset/labels/train/train_0047.txt @@ -0,0 +1,2 @@ +20 0.587500 0.484375 0.181250 0.214583 +6 0.225000 0.565625 0.193750 0.256250 \ No newline at end of file diff --git a/dataset/labels/train/train_0048.txt b/dataset/labels/train/train_0048.txt new file mode 100644 index 0000000..53d2c70 --- /dev/null +++ b/dataset/labels/train/train_0048.txt @@ -0,0 +1,3 @@ +3 0.382812 0.577083 0.140625 0.287500 +23 0.282031 0.721875 0.195312 0.281250 +21 0.775781 0.415625 0.157812 0.277083 \ No newline at end of file diff --git a/dataset/labels/train/train_0049.txt b/dataset/labels/train/train_0049.txt new file mode 100644 index 0000000..06abfc8 --- /dev/null +++ b/dataset/labels/train/train_0049.txt @@ -0,0 +1,2 @@ +25 0.873437 0.581250 0.131250 0.158333 +0 0.466406 0.561458 0.176563 0.202083 \ No newline at end of file diff --git a/dataset/labels/train/train_0050.txt b/dataset/labels/train/train_0050.txt new file mode 100644 index 0000000..917918c --- /dev/null +++ b/dataset/labels/train/train_0050.txt @@ -0,0 +1,3 @@ +4 0.399219 0.339583 0.157812 0.195833 +26 0.467187 0.782292 0.250000 0.243750 +2 0.800781 0.587500 0.142187 0.212500 \ No newline at end of file diff --git a/dataset/labels/train/train_0051.txt b/dataset/labels/train/train_0051.txt new file mode 100644 index 0000000..421fbb4 --- /dev/null +++ b/dataset/labels/train/train_0051.txt @@ -0,0 +1,2 @@ +0 0.270313 0.635417 0.184375 0.295833 +6 0.352344 0.253125 0.192188 0.256250 \ No newline at end of file diff --git a/dataset/labels/train/train_0052.txt b/dataset/labels/train/train_0052.txt new file mode 100644 index 0000000..cdf2430 --- /dev/null +++ b/dataset/labels/train/train_0052.txt @@ -0,0 +1,3 @@ +24 0.776563 0.565625 0.131250 0.185417 +13 0.841406 0.233333 0.145313 0.179167 +15 0.191406 0.743750 0.135937 0.195833 \ No newline at end of file diff --git a/dataset/labels/train/train_0053.txt b/dataset/labels/train/train_0053.txt new file mode 100644 index 0000000..fdedfef --- /dev/null +++ b/dataset/labels/train/train_0053.txt @@ -0,0 +1 @@ +5 0.273438 0.762500 0.181250 0.345833 \ No newline at end of file diff --git a/dataset/labels/train/train_0054.txt b/dataset/labels/train/train_0054.txt new file mode 100644 index 0000000..4f30bcc --- /dev/null +++ b/dataset/labels/train/train_0054.txt @@ -0,0 +1,2 @@ +16 0.792188 0.383333 0.137500 0.150000 +2 0.225000 0.660417 0.128125 0.208333 \ No newline at end of file diff --git a/dataset/labels/train/train_0055.txt b/dataset/labels/train/train_0055.txt new file mode 100644 index 0000000..c759969 --- /dev/null +++ b/dataset/labels/train/train_0055.txt @@ -0,0 +1 @@ +20 0.528125 0.380208 0.168750 0.227083 \ No newline at end of file diff --git a/dataset/labels/train/train_0056.txt b/dataset/labels/train/train_0056.txt new file mode 100644 index 0000000..d386c3c --- /dev/null +++ b/dataset/labels/train/train_0056.txt @@ -0,0 +1 @@ +13 0.176563 0.656250 0.146875 0.170833 \ No newline at end of file diff --git a/dataset/labels/train/train_0057.txt b/dataset/labels/train/train_0057.txt new file mode 100644 index 0000000..4263017 --- /dev/null +++ b/dataset/labels/train/train_0057.txt @@ -0,0 +1 @@ +26 0.421875 0.212500 0.168750 0.237500 \ No newline at end of file diff --git a/dataset/labels/train/train_0058.txt b/dataset/labels/train/train_0058.txt new file mode 100644 index 0000000..f3380c2 --- /dev/null +++ b/dataset/labels/train/train_0058.txt @@ -0,0 +1,2 @@ +26 0.352344 0.367708 0.164062 0.343750 +1 0.491406 0.715625 0.279687 0.297917 \ No newline at end of file diff --git a/dataset/labels/train/train_0059.txt b/dataset/labels/train/train_0059.txt new file mode 100644 index 0000000..e5cb824 --- /dev/null +++ b/dataset/labels/train/train_0059.txt @@ -0,0 +1,2 @@ +17 0.225000 0.680208 0.059375 0.264583 +21 0.337500 0.389583 0.156250 0.191667 \ No newline at end of file diff --git a/dataset/labels/train/train_0060.txt b/dataset/labels/train/train_0060.txt new file mode 100644 index 0000000..e4d6267 --- /dev/null +++ b/dataset/labels/train/train_0060.txt @@ -0,0 +1 @@ +21 0.366406 0.665625 0.226562 0.264583 \ No newline at end of file diff --git a/dataset/labels/train/train_0061.txt b/dataset/labels/train/train_0061.txt new file mode 100644 index 0000000..8837a6f --- /dev/null +++ b/dataset/labels/train/train_0061.txt @@ -0,0 +1,3 @@ +5 0.706250 0.755208 0.168750 0.318750 +20 0.487500 0.679167 0.125000 0.166667 +22 0.511719 0.215625 0.204687 0.272917 \ No newline at end of file diff --git a/dataset/labels/train/train_0062.txt b/dataset/labels/train/train_0062.txt new file mode 100644 index 0000000..cf0ce90 --- /dev/null +++ b/dataset/labels/train/train_0062.txt @@ -0,0 +1 @@ +26 0.706250 0.613542 0.175000 0.260417 \ No newline at end of file diff --git a/dataset/labels/train/train_0063.txt b/dataset/labels/train/train_0063.txt new file mode 100644 index 0000000..b8a17ab --- /dev/null +++ b/dataset/labels/train/train_0063.txt @@ -0,0 +1,3 @@ +3 0.153906 0.457292 0.101562 0.306250 +6 0.547656 0.765625 0.132812 0.177083 +0 0.567187 0.345833 0.225000 0.245833 \ No newline at end of file diff --git a/dataset/labels/train/train_0064.txt b/dataset/labels/train/train_0064.txt new file mode 100644 index 0000000..0f0a8c8 --- /dev/null +++ b/dataset/labels/train/train_0064.txt @@ -0,0 +1,3 @@ +1 0.382812 0.527083 0.303125 0.341667 +16 0.644531 0.467708 0.117188 0.210417 +17 0.193750 0.160417 0.206250 0.079167 \ No newline at end of file diff --git a/dataset/labels/train/train_0065.txt b/dataset/labels/train/train_0065.txt new file mode 100644 index 0000000..9b66ae1 --- /dev/null +++ b/dataset/labels/train/train_0065.txt @@ -0,0 +1,2 @@ +12 0.754687 0.452083 0.206250 0.187500 +15 0.445312 0.608333 0.168750 0.216667 \ No newline at end of file diff --git a/dataset/labels/train/train_0066.txt b/dataset/labels/train/train_0066.txt new file mode 100644 index 0000000..bb125d0 --- /dev/null +++ b/dataset/labels/train/train_0066.txt @@ -0,0 +1,2 @@ +26 0.542188 0.412500 0.200000 0.262500 +27 0.717969 0.768750 0.160938 0.216667 \ No newline at end of file diff --git a/dataset/labels/train/train_0067.txt b/dataset/labels/train/train_0067.txt new file mode 100644 index 0000000..eec6772 --- /dev/null +++ b/dataset/labels/train/train_0067.txt @@ -0,0 +1,2 @@ +26 0.840625 0.641667 0.175000 0.100000 +20 0.232031 0.355208 0.179688 0.210417 \ No newline at end of file diff --git a/dataset/labels/train/train_0068.txt b/dataset/labels/train/train_0068.txt new file mode 100644 index 0000000..c2e43a9 --- /dev/null +++ b/dataset/labels/train/train_0068.txt @@ -0,0 +1,2 @@ +27 0.884375 0.834375 0.137500 0.193750 +11 0.389844 0.738542 0.114062 0.218750 \ No newline at end of file diff --git a/dataset/labels/train/train_0069.txt b/dataset/labels/train/train_0069.txt new file mode 100644 index 0000000..60d0f85 --- /dev/null +++ b/dataset/labels/train/train_0069.txt @@ -0,0 +1,3 @@ +22 0.857031 0.728125 0.179688 0.239583 +2 0.771875 0.563542 0.162500 0.264583 +21 0.184375 0.567708 0.212500 0.218750 \ No newline at end of file diff --git a/dataset/labels/train/train_0070.txt b/dataset/labels/train/train_0070.txt new file mode 100644 index 0000000..d447267 --- /dev/null +++ b/dataset/labels/train/train_0070.txt @@ -0,0 +1,2 @@ +22 0.233594 0.681250 0.157812 0.187500 +2 0.547656 0.800000 0.164062 0.266667 \ No newline at end of file diff --git a/dataset/labels/train/train_0071.txt b/dataset/labels/train/train_0071.txt new file mode 100644 index 0000000..ab496dd --- /dev/null +++ b/dataset/labels/train/train_0071.txt @@ -0,0 +1,3 @@ +14 0.777344 0.645833 0.185938 0.212500 +24 0.377344 0.247917 0.148438 0.195833 +1 0.838281 0.482292 0.192188 0.256250 \ No newline at end of file diff --git a/dataset/labels/train/train_0072.txt b/dataset/labels/train/train_0072.txt new file mode 100644 index 0000000..83a7e7e --- /dev/null +++ b/dataset/labels/train/train_0072.txt @@ -0,0 +1,3 @@ +12 0.666406 0.446875 0.148438 0.243750 +15 0.603906 0.622917 0.129688 0.320833 +9 0.220312 0.608333 0.153125 0.275000 \ No newline at end of file diff --git a/dataset/labels/train/train_0073.txt b/dataset/labels/train/train_0073.txt new file mode 100644 index 0000000..037fef8 --- /dev/null +++ b/dataset/labels/train/train_0073.txt @@ -0,0 +1 @@ +24 0.478125 0.665625 0.190625 0.239583 \ No newline at end of file diff --git a/dataset/labels/train/train_0074.txt b/dataset/labels/train/train_0074.txt new file mode 100644 index 0000000..0fd73ce --- /dev/null +++ b/dataset/labels/train/train_0074.txt @@ -0,0 +1,3 @@ +1 0.560156 0.198958 0.189062 0.252083 +3 0.739844 0.592708 0.207813 0.264583 +5 0.153906 0.482292 0.170313 0.306250 \ No newline at end of file diff --git a/dataset/labels/train/train_0075.txt b/dataset/labels/train/train_0075.txt new file mode 100644 index 0000000..6bb0dbe --- /dev/null +++ b/dataset/labels/train/train_0075.txt @@ -0,0 +1 @@ +18 0.771094 0.773958 0.173437 0.252083 \ No newline at end of file diff --git a/dataset/labels/train/train_0076.txt b/dataset/labels/train/train_0076.txt new file mode 100644 index 0000000..0205552 --- /dev/null +++ b/dataset/labels/train/train_0076.txt @@ -0,0 +1,2 @@ +1 0.800781 0.398958 0.257812 0.418750 +6 0.767969 0.759375 0.198437 0.264583 \ No newline at end of file diff --git a/dataset/labels/train/train_0077.txt b/dataset/labels/train/train_0077.txt new file mode 100644 index 0000000..2a4ac33 --- /dev/null +++ b/dataset/labels/train/train_0077.txt @@ -0,0 +1,3 @@ +25 0.492188 0.210417 0.187500 0.270833 +16 0.408594 0.785417 0.167187 0.200000 +0 0.596875 0.738542 0.231250 0.260417 \ No newline at end of file diff --git a/dataset/labels/train/train_0078.txt b/dataset/labels/train/train_0078.txt new file mode 100644 index 0000000..88b199c --- /dev/null +++ b/dataset/labels/train/train_0078.txt @@ -0,0 +1,3 @@ +7 0.628125 0.581250 0.087500 0.183333 +9 0.714063 0.807292 0.118750 0.172917 +9 0.361719 0.364583 0.189062 0.233333 \ No newline at end of file diff --git a/dataset/labels/train/train_0079.txt b/dataset/labels/train/train_0079.txt new file mode 100644 index 0000000..7f2132e --- /dev/null +++ b/dataset/labels/train/train_0079.txt @@ -0,0 +1,2 @@ +7 0.138281 0.856250 0.157812 0.129167 +11 0.310937 0.329167 0.215625 0.195833 \ No newline at end of file diff --git a/dataset/labels/train/train_0080.txt b/dataset/labels/train/train_0080.txt new file mode 100644 index 0000000..78805e1 --- /dev/null +++ b/dataset/labels/train/train_0080.txt @@ -0,0 +1 @@ +25 0.605469 0.465625 0.154688 0.231250 \ No newline at end of file diff --git a/dataset/labels/train/train_0081.txt b/dataset/labels/train/train_0081.txt new file mode 100644 index 0000000..d81f8c0 --- /dev/null +++ b/dataset/labels/train/train_0081.txt @@ -0,0 +1,2 @@ +14 0.455469 0.635417 0.139063 0.225000 +16 0.837500 0.238542 0.115625 0.172917 \ No newline at end of file diff --git a/dataset/labels/train/train_0082.txt b/dataset/labels/train/train_0082.txt new file mode 100644 index 0000000..dd79fa7 --- /dev/null +++ b/dataset/labels/train/train_0082.txt @@ -0,0 +1 @@ +21 0.767188 0.610417 0.131250 0.241667 \ No newline at end of file diff --git a/dataset/labels/train/train_0083.txt b/dataset/labels/train/train_0083.txt new file mode 100644 index 0000000..57bc64c --- /dev/null +++ b/dataset/labels/train/train_0083.txt @@ -0,0 +1 @@ +8 0.749219 0.703125 0.104688 0.156250 \ No newline at end of file diff --git a/dataset/labels/train/train_0084.txt b/dataset/labels/train/train_0084.txt new file mode 100644 index 0000000..28f490d --- /dev/null +++ b/dataset/labels/train/train_0084.txt @@ -0,0 +1,2 @@ +7 0.435937 0.710417 0.203125 0.166667 +0 0.224219 0.753125 0.198437 0.235417 \ No newline at end of file diff --git a/dataset/labels/train/train_0085.txt b/dataset/labels/train/train_0085.txt new file mode 100644 index 0000000..fc1ba9b --- /dev/null +++ b/dataset/labels/train/train_0085.txt @@ -0,0 +1 @@ +21 0.554688 0.194792 0.165625 0.160417 \ No newline at end of file diff --git a/dataset/labels/train/train_0086.txt b/dataset/labels/train/train_0086.txt new file mode 100644 index 0000000..e98a0c1 --- /dev/null +++ b/dataset/labels/train/train_0086.txt @@ -0,0 +1,2 @@ +8 0.782031 0.384375 0.092188 0.147917 +4 0.383594 0.804167 0.151562 0.083333 \ No newline at end of file diff --git a/dataset/labels/train/train_0087.txt b/dataset/labels/train/train_0087.txt new file mode 100644 index 0000000..9bea74c --- /dev/null +++ b/dataset/labels/train/train_0087.txt @@ -0,0 +1,2 @@ +9 0.339062 0.475000 0.121875 0.204167 +17 0.667188 0.742708 0.184375 0.168750 \ No newline at end of file diff --git a/dataset/labels/train/train_0088.txt b/dataset/labels/train/train_0088.txt new file mode 100644 index 0000000..27f2b3d --- /dev/null +++ b/dataset/labels/train/train_0088.txt @@ -0,0 +1,3 @@ +22 0.773438 0.164583 0.137500 0.187500 +12 0.536719 0.467708 0.167187 0.235417 +17 0.675781 0.613542 0.101562 0.293750 \ No newline at end of file diff --git a/dataset/labels/train/train_0089.txt b/dataset/labels/train/train_0089.txt new file mode 100644 index 0000000..496f118 --- /dev/null +++ b/dataset/labels/train/train_0089.txt @@ -0,0 +1 @@ +27 0.229687 0.691667 0.171875 0.250000 \ No newline at end of file diff --git a/dataset/labels/train/train_0090.txt b/dataset/labels/train/train_0090.txt new file mode 100644 index 0000000..b84a862 --- /dev/null +++ b/dataset/labels/train/train_0090.txt @@ -0,0 +1 @@ +10 0.158594 0.804167 0.107813 0.154167 \ No newline at end of file diff --git a/dataset/labels/train/train_0091.txt b/dataset/labels/train/train_0091.txt new file mode 100644 index 0000000..123c158 --- /dev/null +++ b/dataset/labels/train/train_0091.txt @@ -0,0 +1 @@ +25 0.741406 0.689583 0.157812 0.204167 \ No newline at end of file diff --git a/dataset/labels/train/train_0092.txt b/dataset/labels/train/train_0092.txt new file mode 100644 index 0000000..f3afeea --- /dev/null +++ b/dataset/labels/train/train_0092.txt @@ -0,0 +1,3 @@ +3 0.293750 0.738542 0.121875 0.252083 +14 0.847656 0.482292 0.139063 0.160417 +7 0.230469 0.422917 0.139063 0.216667 \ No newline at end of file diff --git a/dataset/labels/train/train_0093.txt b/dataset/labels/train/train_0093.txt new file mode 100644 index 0000000..17d47bd --- /dev/null +++ b/dataset/labels/train/train_0093.txt @@ -0,0 +1,3 @@ +4 0.607031 0.460417 0.092188 0.233333 +22 0.817187 0.395833 0.200000 0.237500 +20 0.452344 0.651042 0.157812 0.214583 \ No newline at end of file diff --git a/dataset/labels/train/train_0094.txt b/dataset/labels/train/train_0094.txt new file mode 100644 index 0000000..b1c358b --- /dev/null +++ b/dataset/labels/train/train_0094.txt @@ -0,0 +1,2 @@ +24 0.843750 0.234375 0.187500 0.272917 +17 0.268750 0.643750 0.103125 0.225000 \ No newline at end of file diff --git a/dataset/labels/train/train_0095.txt b/dataset/labels/train/train_0095.txt new file mode 100644 index 0000000..a78de0f --- /dev/null +++ b/dataset/labels/train/train_0095.txt @@ -0,0 +1,3 @@ +14 0.678125 0.347917 0.153125 0.170833 +18 0.246875 0.694792 0.184375 0.252083 +1 0.533594 0.337500 0.201563 0.245833 \ No newline at end of file diff --git a/dataset/labels/train/train_0096.txt b/dataset/labels/train/train_0096.txt new file mode 100644 index 0000000..27d509c --- /dev/null +++ b/dataset/labels/train/train_0096.txt @@ -0,0 +1,3 @@ +22 0.573438 0.415625 0.221875 0.293750 +26 0.745313 0.783333 0.175000 0.091667 +20 0.499219 0.833333 0.151562 0.175000 \ No newline at end of file diff --git a/dataset/labels/train/train_0097.txt b/dataset/labels/train/train_0097.txt new file mode 100644 index 0000000..c5703b6 --- /dev/null +++ b/dataset/labels/train/train_0097.txt @@ -0,0 +1 @@ +14 0.422656 0.826042 0.132812 0.185417 \ No newline at end of file diff --git a/dataset/labels/train/train_0098.txt b/dataset/labels/train/train_0098.txt new file mode 100644 index 0000000..ff10b1c --- /dev/null +++ b/dataset/labels/train/train_0098.txt @@ -0,0 +1,3 @@ +24 0.292969 0.580208 0.160938 0.197917 +0 0.615625 0.401042 0.162500 0.252083 +0 0.713281 0.672917 0.182812 0.204167 \ No newline at end of file diff --git a/dataset/labels/train/train_0099.txt b/dataset/labels/train/train_0099.txt new file mode 100644 index 0000000..b25e813 --- /dev/null +++ b/dataset/labels/train/train_0099.txt @@ -0,0 +1 @@ +24 0.707031 0.506250 0.160938 0.204167 \ No newline at end of file diff --git a/dataset/labels/train/train_0100.txt b/dataset/labels/train/train_0100.txt new file mode 100644 index 0000000..116962f --- /dev/null +++ b/dataset/labels/train/train_0100.txt @@ -0,0 +1,2 @@ +20 0.734375 0.465625 0.181250 0.210417 +5 0.308594 0.426042 0.126562 0.197917 \ No newline at end of file diff --git a/dataset/labels/train/train_0101.txt b/dataset/labels/train/train_0101.txt new file mode 100644 index 0000000..342c0b5 --- /dev/null +++ b/dataset/labels/train/train_0101.txt @@ -0,0 +1 @@ +14 0.747656 0.663542 0.179688 0.197917 \ No newline at end of file diff --git a/dataset/labels/train/train_0102.txt b/dataset/labels/train/train_0102.txt new file mode 100644 index 0000000..897862f --- /dev/null +++ b/dataset/labels/train/train_0102.txt @@ -0,0 +1,3 @@ +19 0.216406 0.513542 0.164062 0.185417 +22 0.282031 0.319792 0.207813 0.302083 +5 0.517969 0.797917 0.160938 0.241667 \ No newline at end of file diff --git a/dataset/labels/train/train_0103.txt b/dataset/labels/train/train_0103.txt new file mode 100644 index 0000000..4c2c69b --- /dev/null +++ b/dataset/labels/train/train_0103.txt @@ -0,0 +1,2 @@ +12 0.583594 0.519792 0.245312 0.222917 +17 0.512500 0.691667 0.096875 0.245833 \ No newline at end of file diff --git a/dataset/labels/train/train_0104.txt b/dataset/labels/train/train_0104.txt new file mode 100644 index 0000000..c8f54b7 --- /dev/null +++ b/dataset/labels/train/train_0104.txt @@ -0,0 +1 @@ +1 0.579688 0.568750 0.237500 0.320833 \ No newline at end of file diff --git a/dataset/labels/train/train_0105.txt b/dataset/labels/train/train_0105.txt new file mode 100644 index 0000000..888a5a1 --- /dev/null +++ b/dataset/labels/train/train_0105.txt @@ -0,0 +1 @@ +4 0.181250 0.633333 0.125000 0.275000 \ No newline at end of file diff --git a/dataset/labels/train/train_0106.txt b/dataset/labels/train/train_0106.txt new file mode 100644 index 0000000..8a7b0e6 --- /dev/null +++ b/dataset/labels/train/train_0106.txt @@ -0,0 +1,2 @@ +11 0.741406 0.246875 0.135937 0.156250 +11 0.832812 0.696875 0.140625 0.193750 \ No newline at end of file diff --git a/dataset/labels/train/train_0107.txt b/dataset/labels/train/train_0107.txt new file mode 100644 index 0000000..5239e12 --- /dev/null +++ b/dataset/labels/train/train_0107.txt @@ -0,0 +1,3 @@ +10 0.599219 0.743750 0.107813 0.150000 +7 0.249219 0.406250 0.145313 0.141667 +6 0.297656 0.253125 0.192188 0.256250 \ No newline at end of file diff --git a/dataset/labels/train/train_0108.txt b/dataset/labels/train/train_0108.txt new file mode 100644 index 0000000..a7f680e --- /dev/null +++ b/dataset/labels/train/train_0108.txt @@ -0,0 +1,3 @@ +15 0.807813 0.562500 0.243750 0.100000 +25 0.432812 0.239583 0.140625 0.166667 +5 0.229687 0.260417 0.184375 0.208333 \ No newline at end of file diff --git a/dataset/labels/train/train_0109.txt b/dataset/labels/train/train_0109.txt new file mode 100644 index 0000000..d1570a9 --- /dev/null +++ b/dataset/labels/train/train_0109.txt @@ -0,0 +1,3 @@ +16 0.827344 0.384375 0.135937 0.152083 +19 0.743750 0.262500 0.146875 0.170833 +11 0.640625 0.522917 0.203125 0.187500 \ No newline at end of file diff --git a/dataset/labels/train/train_0110.txt b/dataset/labels/train/train_0110.txt new file mode 100644 index 0000000..e7fd336 --- /dev/null +++ b/dataset/labels/train/train_0110.txt @@ -0,0 +1,3 @@ +24 0.844531 0.496875 0.173437 0.243750 +3 0.589844 0.216667 0.135937 0.295833 +7 0.192188 0.820833 0.121875 0.208333 \ No newline at end of file diff --git a/dataset/labels/train/train_0111.txt b/dataset/labels/train/train_0111.txt new file mode 100644 index 0000000..3479b41 --- /dev/null +++ b/dataset/labels/train/train_0111.txt @@ -0,0 +1 @@ +5 0.660156 0.311458 0.176563 0.197917 \ No newline at end of file diff --git a/dataset/labels/train/train_0112.txt b/dataset/labels/train/train_0112.txt new file mode 100644 index 0000000..d441c50 --- /dev/null +++ b/dataset/labels/train/train_0112.txt @@ -0,0 +1,3 @@ +0 0.558594 0.273958 0.239063 0.272917 +21 0.848437 0.671875 0.118750 0.193750 +15 0.824219 0.259375 0.217188 0.097917 \ No newline at end of file diff --git a/dataset/labels/train/train_0113.txt b/dataset/labels/train/train_0113.txt new file mode 100644 index 0000000..25bf8ba --- /dev/null +++ b/dataset/labels/train/train_0113.txt @@ -0,0 +1 @@ +4 0.518750 0.730208 0.156250 0.272917 \ No newline at end of file diff --git a/dataset/labels/train/train_0114.txt b/dataset/labels/train/train_0114.txt new file mode 100644 index 0000000..3977b50 --- /dev/null +++ b/dataset/labels/train/train_0114.txt @@ -0,0 +1,2 @@ +9 0.653125 0.465625 0.112500 0.189583 +27 0.203906 0.338542 0.189062 0.264583 \ No newline at end of file diff --git a/dataset/labels/train/train_0115.txt b/dataset/labels/train/train_0115.txt new file mode 100644 index 0000000..a5d5d66 --- /dev/null +++ b/dataset/labels/train/train_0115.txt @@ -0,0 +1,2 @@ +1 0.702344 0.555208 0.192188 0.297917 +21 0.333594 0.467708 0.198437 0.218750 \ No newline at end of file diff --git a/dataset/labels/train/train_0116.txt b/dataset/labels/train/train_0116.txt new file mode 100644 index 0000000..80bce0a --- /dev/null +++ b/dataset/labels/train/train_0116.txt @@ -0,0 +1,2 @@ +4 0.840625 0.212500 0.221875 0.154167 +5 0.823438 0.456250 0.168750 0.158333 \ No newline at end of file diff --git a/dataset/labels/train/train_0117.txt b/dataset/labels/train/train_0117.txt new file mode 100644 index 0000000..ae9157d --- /dev/null +++ b/dataset/labels/train/train_0117.txt @@ -0,0 +1,3 @@ +18 0.366406 0.429167 0.210938 0.237500 +14 0.153125 0.431250 0.150000 0.166667 +23 0.823438 0.815625 0.156250 0.214583 \ No newline at end of file diff --git a/dataset/labels/train/train_0118.txt b/dataset/labels/train/train_0118.txt new file mode 100644 index 0000000..62e6ed3 --- /dev/null +++ b/dataset/labels/train/train_0118.txt @@ -0,0 +1,2 @@ +22 0.861719 0.296875 0.176563 0.243750 +14 0.280469 0.442708 0.154688 0.168750 \ No newline at end of file diff --git a/dataset/labels/train/train_0119.txt b/dataset/labels/train/train_0119.txt new file mode 100644 index 0000000..d67f374 --- /dev/null +++ b/dataset/labels/train/train_0119.txt @@ -0,0 +1 @@ +19 0.396875 0.586458 0.125000 0.168750 \ No newline at end of file diff --git a/dataset/labels/train/train_0120.txt b/dataset/labels/train/train_0120.txt new file mode 100644 index 0000000..2d66ad5 --- /dev/null +++ b/dataset/labels/train/train_0120.txt @@ -0,0 +1 @@ +7 0.379688 0.294792 0.134375 0.293750 \ No newline at end of file diff --git a/dataset/labels/train/train_0121.txt b/dataset/labels/train/train_0121.txt new file mode 100644 index 0000000..24e5e73 --- /dev/null +++ b/dataset/labels/train/train_0121.txt @@ -0,0 +1,3 @@ +13 0.511719 0.202083 0.179688 0.275000 +11 0.625000 0.594792 0.153125 0.268750 +21 0.706250 0.239583 0.193750 0.204167 \ No newline at end of file diff --git a/dataset/labels/train/train_0122.txt b/dataset/labels/train/train_0122.txt new file mode 100644 index 0000000..e3d79a5 --- /dev/null +++ b/dataset/labels/train/train_0122.txt @@ -0,0 +1 @@ +19 0.259375 0.313542 0.181250 0.289583 \ No newline at end of file diff --git a/dataset/labels/train/train_0123.txt b/dataset/labels/train/train_0123.txt new file mode 100644 index 0000000..cee530f --- /dev/null +++ b/dataset/labels/train/train_0123.txt @@ -0,0 +1,2 @@ +23 0.378125 0.440625 0.146875 0.222917 +5 0.462500 0.641667 0.168750 0.179167 \ No newline at end of file diff --git a/dataset/labels/train/train_0124.txt b/dataset/labels/train/train_0124.txt new file mode 100644 index 0000000..8d3fa50 --- /dev/null +++ b/dataset/labels/train/train_0124.txt @@ -0,0 +1 @@ +4 0.240625 0.756250 0.137500 0.300000 \ No newline at end of file diff --git a/dataset/labels/train/train_0125.txt b/dataset/labels/train/train_0125.txt new file mode 100644 index 0000000..695b0a5 --- /dev/null +++ b/dataset/labels/train/train_0125.txt @@ -0,0 +1,2 @@ +21 0.192969 0.807292 0.160938 0.177083 +0 0.311719 0.514583 0.242188 0.262500 \ No newline at end of file diff --git a/dataset/labels/train/train_0126.txt b/dataset/labels/train/train_0126.txt new file mode 100644 index 0000000..b79a45c --- /dev/null +++ b/dataset/labels/train/train_0126.txt @@ -0,0 +1,3 @@ +14 0.215625 0.585417 0.171875 0.183333 +17 0.454688 0.287500 0.209375 0.120833 +11 0.209375 0.421875 0.237500 0.218750 \ No newline at end of file diff --git a/dataset/labels/train/train_0127.txt b/dataset/labels/train/train_0127.txt new file mode 100644 index 0000000..cf0379a --- /dev/null +++ b/dataset/labels/train/train_0127.txt @@ -0,0 +1,2 @@ +1 0.682031 0.355208 0.251563 0.335417 +9 0.671875 0.196875 0.140625 0.139583 \ No newline at end of file diff --git a/dataset/labels/train/train_0128.txt b/dataset/labels/train/train_0128.txt new file mode 100644 index 0000000..bccc7fc --- /dev/null +++ b/dataset/labels/train/train_0128.txt @@ -0,0 +1 @@ +10 0.626563 0.777083 0.106250 0.137500 \ No newline at end of file diff --git a/dataset/labels/train/train_0129.txt b/dataset/labels/train/train_0129.txt new file mode 100644 index 0000000..a437f16 --- /dev/null +++ b/dataset/labels/train/train_0129.txt @@ -0,0 +1 @@ +5 0.282031 0.717708 0.267188 0.247917 \ No newline at end of file diff --git a/dataset/labels/train/train_0130.txt b/dataset/labels/train/train_0130.txt new file mode 100644 index 0000000..e4758b5 --- /dev/null +++ b/dataset/labels/train/train_0130.txt @@ -0,0 +1,3 @@ +5 0.706250 0.706250 0.246875 0.279167 +4 0.865625 0.569792 0.090625 0.243750 +6 0.247656 0.628125 0.182812 0.243750 \ No newline at end of file diff --git a/dataset/labels/train/train_0131.txt b/dataset/labels/train/train_0131.txt new file mode 100644 index 0000000..585b574 --- /dev/null +++ b/dataset/labels/train/train_0131.txt @@ -0,0 +1,3 @@ +16 0.630469 0.418750 0.123438 0.229167 +7 0.348438 0.433333 0.128125 0.270833 +8 0.611719 0.609375 0.123438 0.206250 \ No newline at end of file diff --git a/dataset/labels/train/train_0132.txt b/dataset/labels/train/train_0132.txt new file mode 100644 index 0000000..64f7a18 --- /dev/null +++ b/dataset/labels/train/train_0132.txt @@ -0,0 +1 @@ +13 0.278125 0.752083 0.209375 0.279167 \ No newline at end of file diff --git a/dataset/labels/train/train_0133.txt b/dataset/labels/train/train_0133.txt new file mode 100644 index 0000000..3e94cd8 --- /dev/null +++ b/dataset/labels/train/train_0133.txt @@ -0,0 +1 @@ +5 0.654687 0.491667 0.187500 0.283333 \ No newline at end of file diff --git a/dataset/labels/train/train_0134.txt b/dataset/labels/train/train_0134.txt new file mode 100644 index 0000000..c68ff4f --- /dev/null +++ b/dataset/labels/train/train_0134.txt @@ -0,0 +1 @@ +2 0.253906 0.268750 0.170313 0.208333 \ No newline at end of file diff --git a/dataset/labels/train/train_0135.txt b/dataset/labels/train/train_0135.txt new file mode 100644 index 0000000..80eee15 --- /dev/null +++ b/dataset/labels/train/train_0135.txt @@ -0,0 +1 @@ +9 0.545312 0.188542 0.231250 0.227083 \ No newline at end of file diff --git a/dataset/labels/train/train_0136.txt b/dataset/labels/train/train_0136.txt new file mode 100644 index 0000000..7de2450 --- /dev/null +++ b/dataset/labels/train/train_0136.txt @@ -0,0 +1,2 @@ +9 0.518750 0.572917 0.175000 0.175000 +25 0.370312 0.709375 0.184375 0.272917 \ No newline at end of file diff --git a/dataset/labels/train/train_0137.txt b/dataset/labels/train/train_0137.txt new file mode 100644 index 0000000..24dc69b --- /dev/null +++ b/dataset/labels/train/train_0137.txt @@ -0,0 +1,2 @@ +7 0.369531 0.138542 0.160938 0.135417 +27 0.744531 0.226042 0.145313 0.214583 \ No newline at end of file diff --git a/dataset/labels/train/train_0138.txt b/dataset/labels/train/train_0138.txt new file mode 100644 index 0000000..a8ef181 --- /dev/null +++ b/dataset/labels/train/train_0138.txt @@ -0,0 +1,2 @@ +7 0.811719 0.476042 0.117188 0.231250 +11 0.461719 0.648958 0.145313 0.256250 \ No newline at end of file diff --git a/dataset/labels/train/train_0139.txt b/dataset/labels/train/train_0139.txt new file mode 100644 index 0000000..b49bb51 --- /dev/null +++ b/dataset/labels/train/train_0139.txt @@ -0,0 +1,2 @@ +12 0.600000 0.361458 0.175000 0.339583 +18 0.735938 0.690625 0.196875 0.231250 \ No newline at end of file diff --git a/dataset/labels/train/train_0140.txt b/dataset/labels/train/train_0140.txt new file mode 100644 index 0000000..54d2c65 --- /dev/null +++ b/dataset/labels/train/train_0140.txt @@ -0,0 +1 @@ +13 0.314844 0.683333 0.207813 0.325000 \ No newline at end of file diff --git a/dataset/labels/train/train_0141.txt b/dataset/labels/train/train_0141.txt new file mode 100644 index 0000000..3854cbf --- /dev/null +++ b/dataset/labels/train/train_0141.txt @@ -0,0 +1 @@ +16 0.288281 0.728125 0.189062 0.222917 \ No newline at end of file diff --git a/dataset/labels/train/train_0142.txt b/dataset/labels/train/train_0142.txt new file mode 100644 index 0000000..3cb74ab --- /dev/null +++ b/dataset/labels/train/train_0142.txt @@ -0,0 +1 @@ +17 0.702344 0.204167 0.195312 0.112500 \ No newline at end of file diff --git a/dataset/labels/train/train_0143.txt b/dataset/labels/train/train_0143.txt new file mode 100644 index 0000000..5fb3c4f --- /dev/null +++ b/dataset/labels/train/train_0143.txt @@ -0,0 +1,3 @@ +3 0.538281 0.209375 0.179688 0.264583 +13 0.803906 0.225000 0.210938 0.241667 +24 0.644531 0.534375 0.189062 0.252083 \ No newline at end of file diff --git a/dataset/labels/train/train_0144.txt b/dataset/labels/train/train_0144.txt new file mode 100644 index 0000000..8568ade --- /dev/null +++ b/dataset/labels/train/train_0144.txt @@ -0,0 +1,3 @@ +11 0.187500 0.521875 0.193750 0.177083 +19 0.347656 0.661458 0.192188 0.210417 +21 0.564063 0.797917 0.212500 0.245833 \ No newline at end of file diff --git a/dataset/labels/train/train_0145.txt b/dataset/labels/train/train_0145.txt new file mode 100644 index 0000000..4372a0d --- /dev/null +++ b/dataset/labels/train/train_0145.txt @@ -0,0 +1,3 @@ +4 0.359375 0.389583 0.137500 0.145833 +9 0.667188 0.692708 0.162500 0.247917 +11 0.871875 0.521875 0.159375 0.285417 \ No newline at end of file diff --git a/dataset/labels/train/train_0146.txt b/dataset/labels/train/train_0146.txt new file mode 100644 index 0000000..7f2032b --- /dev/null +++ b/dataset/labels/train/train_0146.txt @@ -0,0 +1 @@ +19 0.188281 0.694792 0.123438 0.164583 \ No newline at end of file diff --git a/dataset/labels/train/train_0147.txt b/dataset/labels/train/train_0147.txt new file mode 100644 index 0000000..fdef0d3 --- /dev/null +++ b/dataset/labels/train/train_0147.txt @@ -0,0 +1 @@ +14 0.774219 0.216667 0.229687 0.245833 \ No newline at end of file diff --git a/dataset/labels/train/train_0148.txt b/dataset/labels/train/train_0148.txt new file mode 100644 index 0000000..780895e --- /dev/null +++ b/dataset/labels/train/train_0148.txt @@ -0,0 +1,3 @@ +6 0.264062 0.352083 0.137500 0.183333 +17 0.537500 0.586458 0.096875 0.227083 +16 0.442969 0.177083 0.164062 0.158333 \ No newline at end of file diff --git a/dataset/labels/train/train_0149.txt b/dataset/labels/train/train_0149.txt new file mode 100644 index 0000000..b10380b --- /dev/null +++ b/dataset/labels/train/train_0149.txt @@ -0,0 +1,2 @@ +24 0.702344 0.208333 0.179688 0.241667 +11 0.480469 0.323958 0.117188 0.231250 \ No newline at end of file diff --git a/dataset/labels/train/train_0150.txt b/dataset/labels/train/train_0150.txt new file mode 100644 index 0000000..3af8972 --- /dev/null +++ b/dataset/labels/train/train_0150.txt @@ -0,0 +1 @@ +23 0.428125 0.278125 0.153125 0.222917 \ No newline at end of file diff --git a/dataset/labels/train/train_0151.txt b/dataset/labels/train/train_0151.txt new file mode 100644 index 0000000..d4bdda7 --- /dev/null +++ b/dataset/labels/train/train_0151.txt @@ -0,0 +1,2 @@ +18 0.586719 0.831250 0.154688 0.166667 +4 0.725000 0.730208 0.153125 0.256250 \ No newline at end of file diff --git a/dataset/labels/train/train_0152.txt b/dataset/labels/train/train_0152.txt new file mode 100644 index 0000000..2303626 --- /dev/null +++ b/dataset/labels/train/train_0152.txt @@ -0,0 +1,3 @@ +21 0.759375 0.461458 0.106250 0.185417 +1 0.365625 0.522917 0.225000 0.375000 +25 0.736719 0.272917 0.192188 0.283333 \ No newline at end of file diff --git a/dataset/labels/train/train_0153.txt b/dataset/labels/train/train_0153.txt new file mode 100644 index 0000000..6318e71 --- /dev/null +++ b/dataset/labels/train/train_0153.txt @@ -0,0 +1,3 @@ +5 0.271094 0.229167 0.185938 0.170833 +0 0.201563 0.731250 0.146875 0.204167 +6 0.859375 0.307292 0.146875 0.197917 \ No newline at end of file diff --git a/dataset/labels/train/train_0154.txt b/dataset/labels/train/train_0154.txt new file mode 100644 index 0000000..d49d91d --- /dev/null +++ b/dataset/labels/train/train_0154.txt @@ -0,0 +1 @@ +3 0.574219 0.188542 0.185938 0.239583 \ No newline at end of file diff --git a/dataset/labels/train/train_0155.txt b/dataset/labels/train/train_0155.txt new file mode 100644 index 0000000..e14cb1f --- /dev/null +++ b/dataset/labels/train/train_0155.txt @@ -0,0 +1 @@ +20 0.853906 0.368750 0.139063 0.183333 \ No newline at end of file diff --git a/dataset/labels/train/train_0156.txt b/dataset/labels/train/train_0156.txt new file mode 100644 index 0000000..d0995a9 --- /dev/null +++ b/dataset/labels/train/train_0156.txt @@ -0,0 +1 @@ +4 0.235937 0.315625 0.140625 0.210417 \ No newline at end of file diff --git a/dataset/labels/train/train_0157.txt b/dataset/labels/train/train_0157.txt new file mode 100644 index 0000000..ae0747b --- /dev/null +++ b/dataset/labels/train/train_0157.txt @@ -0,0 +1 @@ +15 0.405469 0.206250 0.070312 0.245833 \ No newline at end of file diff --git a/dataset/labels/train/train_0158.txt b/dataset/labels/train/train_0158.txt new file mode 100644 index 0000000..bbf8981 --- /dev/null +++ b/dataset/labels/train/train_0158.txt @@ -0,0 +1 @@ +18 0.881250 0.158333 0.140625 0.150000 \ No newline at end of file diff --git a/dataset/labels/train/train_0159.txt b/dataset/labels/train/train_0159.txt new file mode 100644 index 0000000..8122e19 --- /dev/null +++ b/dataset/labels/train/train_0159.txt @@ -0,0 +1,2 @@ +9 0.776563 0.308333 0.178125 0.175000 +8 0.652344 0.209375 0.151562 0.185417 \ No newline at end of file diff --git a/dataset/labels/train/train_0160.txt b/dataset/labels/train/train_0160.txt new file mode 100644 index 0000000..9c03b2a --- /dev/null +++ b/dataset/labels/train/train_0160.txt @@ -0,0 +1,3 @@ +6 0.189062 0.835417 0.131250 0.175000 +10 0.462500 0.705208 0.096875 0.118750 +12 0.128125 0.485417 0.118750 0.229167 \ No newline at end of file diff --git a/dataset/labels/train/train_0161.txt b/dataset/labels/train/train_0161.txt new file mode 100644 index 0000000..f0c5527 --- /dev/null +++ b/dataset/labels/train/train_0161.txt @@ -0,0 +1 @@ +15 0.281250 0.730208 0.112500 0.177083 \ No newline at end of file diff --git a/dataset/labels/train/train_0162.txt b/dataset/labels/train/train_0162.txt new file mode 100644 index 0000000..7aa10e6 --- /dev/null +++ b/dataset/labels/train/train_0162.txt @@ -0,0 +1,3 @@ +22 0.367188 0.526042 0.134375 0.197917 +16 0.546094 0.414583 0.179688 0.175000 +18 0.282813 0.818750 0.193750 0.216667 \ No newline at end of file diff --git a/dataset/labels/train/train_0163.txt b/dataset/labels/train/train_0163.txt new file mode 100644 index 0000000..c99f3c1 --- /dev/null +++ b/dataset/labels/train/train_0163.txt @@ -0,0 +1,2 @@ +7 0.869531 0.719792 0.101562 0.227083 +26 0.204687 0.262500 0.137500 0.237500 \ No newline at end of file diff --git a/dataset/labels/train/train_0164.txt b/dataset/labels/train/train_0164.txt new file mode 100644 index 0000000..e03dfb4 --- /dev/null +++ b/dataset/labels/train/train_0164.txt @@ -0,0 +1,2 @@ +19 0.534375 0.252083 0.128125 0.183333 +20 0.706250 0.547917 0.206250 0.237500 \ No newline at end of file diff --git a/dataset/labels/train/train_0165.txt b/dataset/labels/train/train_0165.txt new file mode 100644 index 0000000..a48bbbf --- /dev/null +++ b/dataset/labels/train/train_0165.txt @@ -0,0 +1,2 @@ +1 0.164844 0.675000 0.198437 0.291667 +7 0.762500 0.565625 0.087500 0.172917 \ No newline at end of file diff --git a/dataset/labels/train/train_0166.txt b/dataset/labels/train/train_0166.txt new file mode 100644 index 0000000..34a84a8 --- /dev/null +++ b/dataset/labels/train/train_0166.txt @@ -0,0 +1,2 @@ +27 0.224219 0.286458 0.210938 0.256250 +19 0.595313 0.378125 0.187500 0.268750 \ No newline at end of file diff --git a/dataset/labels/train/train_0167.txt b/dataset/labels/train/train_0167.txt new file mode 100644 index 0000000..6474531 --- /dev/null +++ b/dataset/labels/train/train_0167.txt @@ -0,0 +1,3 @@ +10 0.402344 0.240625 0.095312 0.139583 +22 0.817969 0.440625 0.182812 0.260417 +23 0.832031 0.701042 0.198437 0.235417 \ No newline at end of file diff --git a/dataset/labels/train/train_0168.txt b/dataset/labels/train/train_0168.txt new file mode 100644 index 0000000..384f896 --- /dev/null +++ b/dataset/labels/train/train_0168.txt @@ -0,0 +1 @@ +10 0.901563 0.320833 0.093750 0.116667 \ No newline at end of file diff --git a/dataset/labels/train/train_0169.txt b/dataset/labels/train/train_0169.txt new file mode 100644 index 0000000..aaf0332 --- /dev/null +++ b/dataset/labels/train/train_0169.txt @@ -0,0 +1,3 @@ +21 0.341406 0.703125 0.192188 0.181250 +19 0.125781 0.688542 0.129688 0.206250 +11 0.721875 0.810417 0.184375 0.179167 \ No newline at end of file diff --git a/dataset/labels/train/train_0170.txt b/dataset/labels/train/train_0170.txt new file mode 100644 index 0000000..19c589f --- /dev/null +++ b/dataset/labels/train/train_0170.txt @@ -0,0 +1,3 @@ +25 0.600781 0.475000 0.173437 0.208333 +10 0.374219 0.682292 0.085938 0.106250 +17 0.708594 0.725000 0.254688 0.200000 \ No newline at end of file diff --git a/dataset/labels/train/train_0171.txt b/dataset/labels/train/train_0171.txt new file mode 100644 index 0000000..f10d628 --- /dev/null +++ b/dataset/labels/train/train_0171.txt @@ -0,0 +1 @@ +18 0.469531 0.695833 0.173437 0.275000 \ No newline at end of file diff --git a/dataset/labels/train/train_0172.txt b/dataset/labels/train/train_0172.txt new file mode 100644 index 0000000..ddfc70a --- /dev/null +++ b/dataset/labels/train/train_0172.txt @@ -0,0 +1 @@ +25 0.803125 0.386458 0.184375 0.231250 \ No newline at end of file diff --git a/dataset/labels/train/train_0173.txt b/dataset/labels/train/train_0173.txt new file mode 100644 index 0000000..b5114fd --- /dev/null +++ b/dataset/labels/train/train_0173.txt @@ -0,0 +1,3 @@ +12 0.634375 0.662500 0.112500 0.166667 +17 0.771875 0.208333 0.234375 0.254167 +1 0.820312 0.552083 0.253125 0.308333 \ No newline at end of file diff --git a/dataset/labels/train/train_0174.txt b/dataset/labels/train/train_0174.txt new file mode 100644 index 0000000..ac082c7 --- /dev/null +++ b/dataset/labels/train/train_0174.txt @@ -0,0 +1 @@ +21 0.811719 0.264583 0.164062 0.175000 \ No newline at end of file diff --git a/dataset/labels/train/train_0175.txt b/dataset/labels/train/train_0175.txt new file mode 100644 index 0000000..e17efcf --- /dev/null +++ b/dataset/labels/train/train_0175.txt @@ -0,0 +1 @@ +26 0.482812 0.395833 0.234375 0.258333 \ No newline at end of file diff --git a/dataset/labels/train/train_0176.txt b/dataset/labels/train/train_0176.txt new file mode 100644 index 0000000..067cf4e --- /dev/null +++ b/dataset/labels/train/train_0176.txt @@ -0,0 +1,3 @@ +23 0.165625 0.795833 0.209375 0.250000 +20 0.616406 0.673958 0.167187 0.260417 +1 0.778125 0.680208 0.225000 0.289583 \ No newline at end of file diff --git a/dataset/labels/train/train_0177.txt b/dataset/labels/train/train_0177.txt new file mode 100644 index 0000000..42ab06b --- /dev/null +++ b/dataset/labels/train/train_0177.txt @@ -0,0 +1,2 @@ +20 0.447656 0.547917 0.123438 0.158333 +14 0.687500 0.362500 0.115625 0.187500 \ No newline at end of file diff --git a/dataset/labels/train/train_0178.txt b/dataset/labels/train/train_0178.txt new file mode 100644 index 0000000..db18d40 --- /dev/null +++ b/dataset/labels/train/train_0178.txt @@ -0,0 +1,2 @@ +13 0.647656 0.415625 0.220312 0.285417 +7 0.345313 0.626042 0.106250 0.172917 \ No newline at end of file diff --git a/dataset/labels/train/train_0179.txt b/dataset/labels/train/train_0179.txt new file mode 100644 index 0000000..0a9e42a --- /dev/null +++ b/dataset/labels/train/train_0179.txt @@ -0,0 +1,2 @@ +11 0.532031 0.178125 0.117188 0.222917 +23 0.794531 0.529167 0.167187 0.220833 \ No newline at end of file diff --git a/dataset/labels/train/train_0180.txt b/dataset/labels/train/train_0180.txt new file mode 100644 index 0000000..aec4c7b --- /dev/null +++ b/dataset/labels/train/train_0180.txt @@ -0,0 +1,3 @@ +15 0.803906 0.286458 0.204687 0.089583 +18 0.622656 0.292708 0.139063 0.222917 +24 0.797656 0.680208 0.201563 0.277083 \ No newline at end of file diff --git a/dataset/labels/train/train_0181.txt b/dataset/labels/train/train_0181.txt new file mode 100644 index 0000000..fa440ca --- /dev/null +++ b/dataset/labels/train/train_0181.txt @@ -0,0 +1,3 @@ +25 0.457031 0.367708 0.195312 0.281250 +5 0.146875 0.504167 0.128125 0.245833 +15 0.278906 0.271875 0.257812 0.118750 \ No newline at end of file diff --git a/dataset/labels/train/train_0182.txt b/dataset/labels/train/train_0182.txt new file mode 100644 index 0000000..5097f66 --- /dev/null +++ b/dataset/labels/train/train_0182.txt @@ -0,0 +1,3 @@ +27 0.339844 0.551042 0.173437 0.210417 +8 0.703906 0.726042 0.142187 0.168750 +17 0.867188 0.782292 0.153125 0.243750 \ No newline at end of file diff --git a/dataset/labels/train/train_0183.txt b/dataset/labels/train/train_0183.txt new file mode 100644 index 0000000..fe68c80 --- /dev/null +++ b/dataset/labels/train/train_0183.txt @@ -0,0 +1,3 @@ +27 0.703125 0.728125 0.200000 0.268750 +23 0.294531 0.473958 0.151562 0.202083 +12 0.630469 0.267708 0.170313 0.331250 \ No newline at end of file diff --git a/dataset/labels/train/train_0184.txt b/dataset/labels/train/train_0184.txt new file mode 100644 index 0000000..6c6d9e6 --- /dev/null +++ b/dataset/labels/train/train_0184.txt @@ -0,0 +1,2 @@ +5 0.487500 0.391667 0.156250 0.300000 +9 0.395313 0.725000 0.118750 0.212500 \ No newline at end of file diff --git a/dataset/labels/train/train_0185.txt b/dataset/labels/train/train_0185.txt new file mode 100644 index 0000000..d26657f --- /dev/null +++ b/dataset/labels/train/train_0185.txt @@ -0,0 +1 @@ +13 0.785937 0.585417 0.175000 0.237500 \ No newline at end of file diff --git a/dataset/labels/train/train_0186.txt b/dataset/labels/train/train_0186.txt new file mode 100644 index 0000000..acec2da --- /dev/null +++ b/dataset/labels/train/train_0186.txt @@ -0,0 +1 @@ +2 0.181250 0.623958 0.165625 0.185417 \ No newline at end of file diff --git a/dataset/labels/train/train_0187.txt b/dataset/labels/train/train_0187.txt new file mode 100644 index 0000000..a05a706 --- /dev/null +++ b/dataset/labels/train/train_0187.txt @@ -0,0 +1,3 @@ +22 0.314844 0.411458 0.210938 0.289583 +19 0.624219 0.695833 0.154688 0.170833 +27 0.542188 0.518750 0.171875 0.250000 \ No newline at end of file diff --git a/dataset/labels/train/train_0188.txt b/dataset/labels/train/train_0188.txt new file mode 100644 index 0000000..95b375f --- /dev/null +++ b/dataset/labels/train/train_0188.txt @@ -0,0 +1,2 @@ +20 0.218750 0.592708 0.125000 0.156250 +0 0.378125 0.648958 0.134375 0.218750 \ No newline at end of file diff --git a/dataset/labels/train/train_0189.txt b/dataset/labels/train/train_0189.txt new file mode 100644 index 0000000..eb4910f --- /dev/null +++ b/dataset/labels/train/train_0189.txt @@ -0,0 +1 @@ +16 0.871094 0.788542 0.114062 0.185417 \ No newline at end of file diff --git a/dataset/labels/train/train_0190.txt b/dataset/labels/train/train_0190.txt new file mode 100644 index 0000000..a0b7d3e --- /dev/null +++ b/dataset/labels/train/train_0190.txt @@ -0,0 +1,2 @@ +11 0.767188 0.854167 0.171875 0.158333 +8 0.882812 0.165625 0.090625 0.164583 \ No newline at end of file diff --git a/dataset/labels/train/train_0191.txt b/dataset/labels/train/train_0191.txt new file mode 100644 index 0000000..a88a95e --- /dev/null +++ b/dataset/labels/train/train_0191.txt @@ -0,0 +1 @@ +19 0.312500 0.408333 0.162500 0.262500 \ No newline at end of file diff --git a/dataset/labels/train/train_0192.txt b/dataset/labels/train/train_0192.txt new file mode 100644 index 0000000..1d09ef8 --- /dev/null +++ b/dataset/labels/train/train_0192.txt @@ -0,0 +1,3 @@ +5 0.755469 0.682292 0.123438 0.235417 +22 0.264844 0.587500 0.185938 0.266667 +6 0.467969 0.407292 0.207813 0.277083 \ No newline at end of file diff --git a/dataset/labels/train/train_0193.txt b/dataset/labels/train/train_0193.txt new file mode 100644 index 0000000..7d88e9a --- /dev/null +++ b/dataset/labels/train/train_0193.txt @@ -0,0 +1,3 @@ +5 0.453125 0.441667 0.190625 0.195833 +0 0.334375 0.609375 0.215625 0.256250 +6 0.176563 0.483333 0.187500 0.250000 \ No newline at end of file diff --git a/dataset/labels/train/train_0194.txt b/dataset/labels/train/train_0194.txt new file mode 100644 index 0000000..6d020d6 --- /dev/null +++ b/dataset/labels/train/train_0194.txt @@ -0,0 +1,3 @@ +13 0.418750 0.277083 0.156250 0.187500 +26 0.236719 0.638542 0.107813 0.239583 +6 0.455469 0.550000 0.201563 0.266667 \ No newline at end of file diff --git a/dataset/labels/train/train_0195.txt b/dataset/labels/train/train_0195.txt new file mode 100644 index 0000000..96bc893 --- /dev/null +++ b/dataset/labels/train/train_0195.txt @@ -0,0 +1,2 @@ +3 0.574219 0.453125 0.176563 0.281250 +25 0.450781 0.791667 0.198437 0.237500 \ No newline at end of file diff --git a/dataset/labels/train/train_0196.txt b/dataset/labels/train/train_0196.txt new file mode 100644 index 0000000..d7ff5df --- /dev/null +++ b/dataset/labels/train/train_0196.txt @@ -0,0 +1 @@ +4 0.692969 0.736458 0.129688 0.231250 \ No newline at end of file diff --git a/dataset/labels/train/train_0197.txt b/dataset/labels/train/train_0197.txt new file mode 100644 index 0000000..619acaa --- /dev/null +++ b/dataset/labels/train/train_0197.txt @@ -0,0 +1,3 @@ +26 0.673438 0.818750 0.218750 0.133333 +26 0.784375 0.614583 0.068750 0.212500 +6 0.575000 0.525000 0.175000 0.233333 \ No newline at end of file diff --git a/dataset/labels/train/train_0198.txt b/dataset/labels/train/train_0198.txt new file mode 100644 index 0000000..903c7ef --- /dev/null +++ b/dataset/labels/train/train_0198.txt @@ -0,0 +1,3 @@ +8 0.184375 0.150000 0.184375 0.166667 +2 0.434375 0.640625 0.150000 0.222917 +20 0.877344 0.553125 0.123438 0.193750 \ No newline at end of file diff --git a/dataset/labels/train/train_0199.txt b/dataset/labels/train/train_0199.txt new file mode 100644 index 0000000..9948f28 --- /dev/null +++ b/dataset/labels/train/train_0199.txt @@ -0,0 +1,2 @@ +18 0.391406 0.548958 0.117188 0.185417 +13 0.478906 0.720833 0.167187 0.191667 \ No newline at end of file diff --git a/dataset/labels/train/user_capture_1780003783840.txt b/dataset/labels/train/user_capture_1780003783840.txt new file mode 100644 index 0000000..e6f0974 --- /dev/null +++ b/dataset/labels/train/user_capture_1780003783840.txt @@ -0,0 +1 @@ +16 0.500000 0.500000 0.650000 0.650000 diff --git a/dataset/labels/train/user_capture_1780003803459.txt b/dataset/labels/train/user_capture_1780003803459.txt new file mode 100644 index 0000000..e6f0974 --- /dev/null +++ b/dataset/labels/train/user_capture_1780003803459.txt @@ -0,0 +1 @@ +16 0.500000 0.500000 0.650000 0.650000 diff --git a/dataset/labels/train/user_capture_1780003806546.txt b/dataset/labels/train/user_capture_1780003806546.txt new file mode 100644 index 0000000..e6f0974 --- /dev/null +++ b/dataset/labels/train/user_capture_1780003806546.txt @@ -0,0 +1 @@ +16 0.500000 0.500000 0.650000 0.650000 diff --git a/dataset/labels/train/user_capture_1780003809723.txt b/dataset/labels/train/user_capture_1780003809723.txt new file mode 100644 index 0000000..e6f0974 --- /dev/null +++ b/dataset/labels/train/user_capture_1780003809723.txt @@ -0,0 +1 @@ +16 0.500000 0.500000 0.650000 0.650000 diff --git a/dataset/labels/train/user_capture_1780003812605.txt b/dataset/labels/train/user_capture_1780003812605.txt new file mode 100644 index 0000000..e6f0974 --- /dev/null +++ b/dataset/labels/train/user_capture_1780003812605.txt @@ -0,0 +1 @@ +16 0.500000 0.500000 0.650000 0.650000 diff --git a/dataset/labels/train/user_capture_1780003815582.txt b/dataset/labels/train/user_capture_1780003815582.txt new file mode 100644 index 0000000..e6f0974 --- /dev/null +++ b/dataset/labels/train/user_capture_1780003815582.txt @@ -0,0 +1 @@ +16 0.500000 0.500000 0.650000 0.650000 diff --git a/dataset/labels/train/user_capture_1780003818633.txt b/dataset/labels/train/user_capture_1780003818633.txt new file mode 100644 index 0000000..e6f0974 --- /dev/null +++ b/dataset/labels/train/user_capture_1780003818633.txt @@ -0,0 +1 @@ +16 0.500000 0.500000 0.650000 0.650000 diff --git a/dataset/labels/train/user_capture_1780003821623.txt b/dataset/labels/train/user_capture_1780003821623.txt new file mode 100644 index 0000000..e6f0974 --- /dev/null +++ b/dataset/labels/train/user_capture_1780003821623.txt @@ -0,0 +1 @@ +16 0.500000 0.500000 0.650000 0.650000 diff --git a/dataset/labels/train/user_capture_1780003824834.txt b/dataset/labels/train/user_capture_1780003824834.txt new file mode 100644 index 0000000..e6f0974 --- /dev/null +++ b/dataset/labels/train/user_capture_1780003824834.txt @@ -0,0 +1 @@ +16 0.500000 0.500000 0.650000 0.650000 diff --git a/dataset/labels/train/user_capture_1780003828388.txt b/dataset/labels/train/user_capture_1780003828388.txt new file mode 100644 index 0000000..e6f0974 --- /dev/null +++ b/dataset/labels/train/user_capture_1780003828388.txt @@ -0,0 +1 @@ +16 0.500000 0.500000 0.650000 0.650000 diff --git a/dataset/labels/train/user_capture_1780003830953.txt b/dataset/labels/train/user_capture_1780003830953.txt new file mode 100644 index 0000000..e6f0974 --- /dev/null +++ b/dataset/labels/train/user_capture_1780003830953.txt @@ -0,0 +1 @@ +16 0.500000 0.500000 0.650000 0.650000 diff --git a/dataset/labels/train/user_capture_1780003833933.txt b/dataset/labels/train/user_capture_1780003833933.txt new file mode 100644 index 0000000..e6f0974 --- /dev/null +++ b/dataset/labels/train/user_capture_1780003833933.txt @@ -0,0 +1 @@ +16 0.500000 0.500000 0.650000 0.650000 diff --git a/dataset/labels/train/user_capture_1780003836384.txt b/dataset/labels/train/user_capture_1780003836384.txt new file mode 100644 index 0000000..e6f0974 --- /dev/null +++ b/dataset/labels/train/user_capture_1780003836384.txt @@ -0,0 +1 @@ +16 0.500000 0.500000 0.650000 0.650000 diff --git a/dataset/labels/train/user_capture_1780003838945.txt b/dataset/labels/train/user_capture_1780003838945.txt new file mode 100644 index 0000000..e6f0974 --- /dev/null +++ b/dataset/labels/train/user_capture_1780003838945.txt @@ -0,0 +1 @@ +16 0.500000 0.500000 0.650000 0.650000 diff --git a/dataset/labels/train/user_capture_1780003841632.txt b/dataset/labels/train/user_capture_1780003841632.txt new file mode 100644 index 0000000..e6f0974 --- /dev/null +++ b/dataset/labels/train/user_capture_1780003841632.txt @@ -0,0 +1 @@ +16 0.500000 0.500000 0.650000 0.650000 diff --git a/dataset/labels/train/user_capture_1780004908498.txt b/dataset/labels/train/user_capture_1780004908498.txt new file mode 100644 index 0000000..e6f0974 --- /dev/null +++ b/dataset/labels/train/user_capture_1780004908498.txt @@ -0,0 +1 @@ +16 0.500000 0.500000 0.650000 0.650000 diff --git a/dataset/labels/train/user_capture_1780007172322.txt b/dataset/labels/train/user_capture_1780007172322.txt new file mode 100644 index 0000000..e6f0974 --- /dev/null +++ b/dataset/labels/train/user_capture_1780007172322.txt @@ -0,0 +1 @@ +16 0.500000 0.500000 0.650000 0.650000 diff --git a/dataset/labels/train/user_capture_1780007176250.txt b/dataset/labels/train/user_capture_1780007176250.txt new file mode 100644 index 0000000..e6f0974 --- /dev/null +++ b/dataset/labels/train/user_capture_1780007176250.txt @@ -0,0 +1 @@ +16 0.500000 0.500000 0.650000 0.650000 diff --git a/dataset/labels/train/user_capture_1780007179850.txt b/dataset/labels/train/user_capture_1780007179850.txt new file mode 100644 index 0000000..e6f0974 --- /dev/null +++ b/dataset/labels/train/user_capture_1780007179850.txt @@ -0,0 +1 @@ +16 0.500000 0.500000 0.650000 0.650000 diff --git a/dataset/labels/train/user_capture_1780007182800.txt b/dataset/labels/train/user_capture_1780007182800.txt new file mode 100644 index 0000000..e6f0974 --- /dev/null +++ b/dataset/labels/train/user_capture_1780007182800.txt @@ -0,0 +1 @@ +16 0.500000 0.500000 0.650000 0.650000 diff --git a/dataset/labels/train/user_capture_1780007185911.txt b/dataset/labels/train/user_capture_1780007185911.txt new file mode 100644 index 0000000..e6f0974 --- /dev/null +++ b/dataset/labels/train/user_capture_1780007185911.txt @@ -0,0 +1 @@ +16 0.500000 0.500000 0.650000 0.650000 diff --git a/dataset/labels/train/user_capture_1780007193199.txt b/dataset/labels/train/user_capture_1780007193199.txt new file mode 100644 index 0000000..e6f0974 --- /dev/null +++ b/dataset/labels/train/user_capture_1780007193199.txt @@ -0,0 +1 @@ +16 0.500000 0.500000 0.650000 0.650000 diff --git a/dataset/labels/train/user_capture_1780007197515.txt b/dataset/labels/train/user_capture_1780007197515.txt new file mode 100644 index 0000000..e6f0974 --- /dev/null +++ b/dataset/labels/train/user_capture_1780007197515.txt @@ -0,0 +1 @@ +16 0.500000 0.500000 0.650000 0.650000 diff --git a/dataset/labels/train/user_capture_1780007201191.txt b/dataset/labels/train/user_capture_1780007201191.txt new file mode 100644 index 0000000..e6f0974 --- /dev/null +++ b/dataset/labels/train/user_capture_1780007201191.txt @@ -0,0 +1 @@ +16 0.500000 0.500000 0.650000 0.650000 diff --git a/dataset/labels/train/user_capture_1780007204503.txt b/dataset/labels/train/user_capture_1780007204503.txt new file mode 100644 index 0000000..e6f0974 --- /dev/null +++ b/dataset/labels/train/user_capture_1780007204503.txt @@ -0,0 +1 @@ +16 0.500000 0.500000 0.650000 0.650000 diff --git a/dataset/labels/val/val_0000.txt b/dataset/labels/val/val_0000.txt new file mode 100644 index 0000000..2bc3cfe --- /dev/null +++ b/dataset/labels/val/val_0000.txt @@ -0,0 +1 @@ +27 0.839063 0.261458 0.140625 0.197917 \ No newline at end of file diff --git a/dataset/labels/val/val_0001.txt b/dataset/labels/val/val_0001.txt new file mode 100644 index 0000000..a1f5c45 --- /dev/null +++ b/dataset/labels/val/val_0001.txt @@ -0,0 +1 @@ +0 0.746094 0.427083 0.207813 0.262500 \ No newline at end of file diff --git a/dataset/labels/val/val_0002.txt b/dataset/labels/val/val_0002.txt new file mode 100644 index 0000000..cd6258a --- /dev/null +++ b/dataset/labels/val/val_0002.txt @@ -0,0 +1,2 @@ +21 0.179688 0.613542 0.140625 0.277083 +16 0.817969 0.652083 0.151562 0.183333 \ No newline at end of file diff --git a/dataset/labels/val/val_0003.txt b/dataset/labels/val/val_0003.txt new file mode 100644 index 0000000..327623b --- /dev/null +++ b/dataset/labels/val/val_0003.txt @@ -0,0 +1,2 @@ +15 0.740625 0.337500 0.178125 0.083333 +0 0.182031 0.525000 0.210938 0.320833 \ No newline at end of file diff --git a/dataset/labels/val/val_0004.txt b/dataset/labels/val/val_0004.txt new file mode 100644 index 0000000..6ad255c --- /dev/null +++ b/dataset/labels/val/val_0004.txt @@ -0,0 +1 @@ +26 0.582812 0.751042 0.112500 0.343750 \ No newline at end of file diff --git a/dataset/labels/val/val_0005.txt b/dataset/labels/val/val_0005.txt new file mode 100644 index 0000000..9309f25 --- /dev/null +++ b/dataset/labels/val/val_0005.txt @@ -0,0 +1 @@ +17 0.313281 0.689583 0.176563 0.241667 \ No newline at end of file diff --git a/dataset/labels/val/val_0006.txt b/dataset/labels/val/val_0006.txt new file mode 100644 index 0000000..61cf078 --- /dev/null +++ b/dataset/labels/val/val_0006.txt @@ -0,0 +1,2 @@ +19 0.804688 0.643750 0.153125 0.237500 +11 0.635938 0.223958 0.218750 0.202083 \ No newline at end of file diff --git a/dataset/labels/val/val_0007.txt b/dataset/labels/val/val_0007.txt new file mode 100644 index 0000000..4a20abf --- /dev/null +++ b/dataset/labels/val/val_0007.txt @@ -0,0 +1 @@ +23 0.666406 0.457292 0.132812 0.193750 \ No newline at end of file diff --git a/dataset/labels/val/val_0008.txt b/dataset/labels/val/val_0008.txt new file mode 100644 index 0000000..ccfbdf4 --- /dev/null +++ b/dataset/labels/val/val_0008.txt @@ -0,0 +1,2 @@ +23 0.738281 0.818750 0.160938 0.200000 +16 0.403906 0.479167 0.173437 0.212500 \ No newline at end of file diff --git a/dataset/labels/val/val_0009.txt b/dataset/labels/val/val_0009.txt new file mode 100644 index 0000000..d181618 --- /dev/null +++ b/dataset/labels/val/val_0009.txt @@ -0,0 +1,2 @@ +24 0.661719 0.672917 0.207813 0.270833 +21 0.142969 0.652083 0.101562 0.179167 \ No newline at end of file diff --git a/dataset/labels/val/val_0010.txt b/dataset/labels/val/val_0010.txt new file mode 100644 index 0000000..5959966 --- /dev/null +++ b/dataset/labels/val/val_0010.txt @@ -0,0 +1,3 @@ +18 0.617969 0.529167 0.126562 0.195833 +2 0.221875 0.439583 0.196875 0.258333 +6 0.435156 0.769792 0.192188 0.256250 \ No newline at end of file diff --git a/dataset/labels/val/val_0011.txt b/dataset/labels/val/val_0011.txt new file mode 100644 index 0000000..7293207 --- /dev/null +++ b/dataset/labels/val/val_0011.txt @@ -0,0 +1 @@ +13 0.246094 0.230208 0.148438 0.193750 \ No newline at end of file diff --git a/dataset/labels/val/val_0012.txt b/dataset/labels/val/val_0012.txt new file mode 100644 index 0000000..fe4b502 --- /dev/null +++ b/dataset/labels/val/val_0012.txt @@ -0,0 +1,2 @@ +21 0.839063 0.648958 0.218750 0.306250 +14 0.769531 0.258333 0.182812 0.204167 \ No newline at end of file diff --git a/dataset/labels/val/val_0013.txt b/dataset/labels/val/val_0013.txt new file mode 100644 index 0000000..072700d --- /dev/null +++ b/dataset/labels/val/val_0013.txt @@ -0,0 +1,2 @@ +8 0.706250 0.448958 0.128125 0.106250 +2 0.444531 0.559375 0.210938 0.331250 \ No newline at end of file diff --git a/dataset/labels/val/val_0014.txt b/dataset/labels/val/val_0014.txt new file mode 100644 index 0000000..6f28607 --- /dev/null +++ b/dataset/labels/val/val_0014.txt @@ -0,0 +1,3 @@ +17 0.260156 0.737500 0.089063 0.354167 +24 0.689063 0.493750 0.134375 0.191667 +24 0.584375 0.777083 0.181250 0.254167 \ No newline at end of file diff --git a/dataset/labels/val/val_0015.txt b/dataset/labels/val/val_0015.txt new file mode 100644 index 0000000..2ba7a69 --- /dev/null +++ b/dataset/labels/val/val_0015.txt @@ -0,0 +1,2 @@ +12 0.535937 0.622917 0.196875 0.179167 +9 0.472656 0.180208 0.145313 0.231250 \ No newline at end of file diff --git a/dataset/labels/val/val_0016.txt b/dataset/labels/val/val_0016.txt new file mode 100644 index 0000000..d6a4015 --- /dev/null +++ b/dataset/labels/val/val_0016.txt @@ -0,0 +1 @@ +23 0.835938 0.352083 0.193750 0.233333 \ No newline at end of file diff --git a/dataset/labels/val/val_0017.txt b/dataset/labels/val/val_0017.txt new file mode 100644 index 0000000..88a528d --- /dev/null +++ b/dataset/labels/val/val_0017.txt @@ -0,0 +1,3 @@ +19 0.198437 0.806250 0.137500 0.220833 +20 0.161719 0.572917 0.207813 0.237500 +10 0.692969 0.588542 0.104688 0.147917 \ No newline at end of file diff --git a/dataset/labels/val/val_0018.txt b/dataset/labels/val/val_0018.txt new file mode 100644 index 0000000..cf19af6 --- /dev/null +++ b/dataset/labels/val/val_0018.txt @@ -0,0 +1,2 @@ +0 0.447656 0.572917 0.204687 0.308333 +0 0.218750 0.634375 0.200000 0.222917 \ No newline at end of file diff --git a/dataset/labels/val/val_0019.txt b/dataset/labels/val/val_0019.txt new file mode 100644 index 0000000..d1358e2 --- /dev/null +++ b/dataset/labels/val/val_0019.txt @@ -0,0 +1 @@ +26 0.218750 0.212500 0.140625 0.237500 \ No newline at end of file diff --git a/dataset/labels/val/val_0020.txt b/dataset/labels/val/val_0020.txt new file mode 100644 index 0000000..708ffe4 --- /dev/null +++ b/dataset/labels/val/val_0020.txt @@ -0,0 +1 @@ +12 0.308594 0.383333 0.185938 0.170833 \ No newline at end of file diff --git a/dataset/labels/val/val_0021.txt b/dataset/labels/val/val_0021.txt new file mode 100644 index 0000000..7fae6bd --- /dev/null +++ b/dataset/labels/val/val_0021.txt @@ -0,0 +1,2 @@ +27 0.161719 0.785417 0.182812 0.266667 +5 0.425781 0.789583 0.173437 0.183333 \ No newline at end of file diff --git a/dataset/labels/val/val_0022.txt b/dataset/labels/val/val_0022.txt new file mode 100644 index 0000000..fa06cbb --- /dev/null +++ b/dataset/labels/val/val_0022.txt @@ -0,0 +1,3 @@ +11 0.608594 0.715625 0.160938 0.306250 +7 0.554688 0.216667 0.171875 0.195833 +4 0.860156 0.587500 0.173437 0.108333 \ No newline at end of file diff --git a/dataset/labels/val/val_0023.txt b/dataset/labels/val/val_0023.txt new file mode 100644 index 0000000..ce72ad8 --- /dev/null +++ b/dataset/labels/val/val_0023.txt @@ -0,0 +1,2 @@ +22 0.634375 0.735417 0.134375 0.179167 +23 0.457031 0.771875 0.154688 0.202083 \ No newline at end of file diff --git a/dataset/labels/val/val_0024.txt b/dataset/labels/val/val_0024.txt new file mode 100644 index 0000000..27df534 --- /dev/null +++ b/dataset/labels/val/val_0024.txt @@ -0,0 +1,2 @@ +2 0.221875 0.685417 0.184375 0.287500 +8 0.599219 0.251042 0.176563 0.135417 \ No newline at end of file diff --git a/dataset/labels/val/val_0025.txt b/dataset/labels/val/val_0025.txt new file mode 100644 index 0000000..787c496 --- /dev/null +++ b/dataset/labels/val/val_0025.txt @@ -0,0 +1 @@ +9 0.250781 0.379167 0.160938 0.175000 \ No newline at end of file diff --git a/dataset/labels/val/val_0026.txt b/dataset/labels/val/val_0026.txt new file mode 100644 index 0000000..40aefa1 --- /dev/null +++ b/dataset/labels/val/val_0026.txt @@ -0,0 +1,2 @@ +7 0.128125 0.308333 0.146875 0.120833 +14 0.268750 0.432292 0.156250 0.210417 \ No newline at end of file diff --git a/dataset/labels/val/val_0027.txt b/dataset/labels/val/val_0027.txt new file mode 100644 index 0000000..85c0302 --- /dev/null +++ b/dataset/labels/val/val_0027.txt @@ -0,0 +1,3 @@ +26 0.715625 0.487500 0.071875 0.216667 +23 0.469531 0.445833 0.223438 0.266667 +25 0.677344 0.803125 0.135937 0.164583 \ No newline at end of file diff --git a/dataset/labels/val/val_0028.txt b/dataset/labels/val/val_0028.txt new file mode 100644 index 0000000..4704a15 --- /dev/null +++ b/dataset/labels/val/val_0028.txt @@ -0,0 +1,2 @@ +13 0.789062 0.184375 0.181250 0.206250 +10 0.666406 0.541667 0.117188 0.145833 \ No newline at end of file diff --git a/dataset/labels/val/val_0029.txt b/dataset/labels/val/val_0029.txt new file mode 100644 index 0000000..7e792b3 --- /dev/null +++ b/dataset/labels/val/val_0029.txt @@ -0,0 +1,2 @@ +19 0.864844 0.432292 0.164062 0.264583 +1 0.557813 0.423958 0.209375 0.281250 \ No newline at end of file diff --git a/dataset/labels/val/val_0030.txt b/dataset/labels/val/val_0030.txt new file mode 100644 index 0000000..3fe08da --- /dev/null +++ b/dataset/labels/val/val_0030.txt @@ -0,0 +1,3 @@ +1 0.534375 0.515625 0.184375 0.268750 +20 0.596875 0.223958 0.209375 0.247917 +1 0.336719 0.323958 0.189062 0.293750 \ No newline at end of file diff --git a/dataset/labels/val/val_0031.txt b/dataset/labels/val/val_0031.txt new file mode 100644 index 0000000..ce2ed65 --- /dev/null +++ b/dataset/labels/val/val_0031.txt @@ -0,0 +1,3 @@ +9 0.185156 0.766667 0.189062 0.183333 +12 0.418750 0.559375 0.125000 0.185417 +22 0.333594 0.702083 0.157812 0.208333 \ No newline at end of file diff --git a/dataset/labels/val/val_0032.txt b/dataset/labels/val/val_0032.txt new file mode 100644 index 0000000..0bdfadb --- /dev/null +++ b/dataset/labels/val/val_0032.txt @@ -0,0 +1 @@ +27 0.840625 0.347917 0.134375 0.183333 \ No newline at end of file diff --git a/dataset/labels/val/val_0033.txt b/dataset/labels/val/val_0033.txt new file mode 100644 index 0000000..fef7dff --- /dev/null +++ b/dataset/labels/val/val_0033.txt @@ -0,0 +1,3 @@ +9 0.255469 0.641667 0.160938 0.270833 +25 0.172656 0.473958 0.182812 0.252083 +25 0.729688 0.327083 0.193750 0.283333 \ No newline at end of file diff --git a/dataset/labels/val/val_0034.txt b/dataset/labels/val/val_0034.txt new file mode 100644 index 0000000..98d4e29 --- /dev/null +++ b/dataset/labels/val/val_0034.txt @@ -0,0 +1 @@ +16 0.859375 0.439583 0.178125 0.258333 \ No newline at end of file diff --git a/dataset/labels/val/val_0035.txt b/dataset/labels/val/val_0035.txt new file mode 100644 index 0000000..4c1ee45 --- /dev/null +++ b/dataset/labels/val/val_0035.txt @@ -0,0 +1,3 @@ +26 0.578125 0.492708 0.087500 0.310417 +15 0.832031 0.735417 0.089063 0.195833 +24 0.207813 0.308333 0.140625 0.187500 \ No newline at end of file diff --git a/dataset/labels/val/val_0036.txt b/dataset/labels/val/val_0036.txt new file mode 100644 index 0000000..d0a9b47 --- /dev/null +++ b/dataset/labels/val/val_0036.txt @@ -0,0 +1 @@ +16 0.412500 0.809375 0.134375 0.189583 \ No newline at end of file diff --git a/dataset/labels/val/val_0037.txt b/dataset/labels/val/val_0037.txt new file mode 100644 index 0000000..d1a91d8 --- /dev/null +++ b/dataset/labels/val/val_0037.txt @@ -0,0 +1 @@ +25 0.157031 0.555208 0.201563 0.243750 \ No newline at end of file diff --git a/dataset/labels/val/val_0038.txt b/dataset/labels/val/val_0038.txt new file mode 100644 index 0000000..8269e45 --- /dev/null +++ b/dataset/labels/val/val_0038.txt @@ -0,0 +1,2 @@ +9 0.705469 0.239583 0.173437 0.316667 +27 0.752344 0.507292 0.151562 0.185417 \ No newline at end of file diff --git a/dataset/labels/val/val_0039.txt b/dataset/labels/val/val_0039.txt new file mode 100644 index 0000000..daa95cd --- /dev/null +++ b/dataset/labels/val/val_0039.txt @@ -0,0 +1,2 @@ +0 0.188281 0.322917 0.160938 0.200000 +13 0.389062 0.382292 0.190625 0.235417 \ No newline at end of file diff --git a/dataset/labels/val/val_0040.txt b/dataset/labels/val/val_0040.txt new file mode 100644 index 0000000..49462af --- /dev/null +++ b/dataset/labels/val/val_0040.txt @@ -0,0 +1,2 @@ +14 0.744531 0.808333 0.167187 0.204167 +9 0.612500 0.440625 0.134375 0.214583 \ No newline at end of file diff --git a/dataset/labels/val/val_0041.txt b/dataset/labels/val/val_0041.txt new file mode 100644 index 0000000..aef8085 --- /dev/null +++ b/dataset/labels/val/val_0041.txt @@ -0,0 +1,2 @@ +1 0.375000 0.615625 0.212500 0.272917 +5 0.764844 0.344792 0.226562 0.210417 \ No newline at end of file diff --git a/dataset/labels/val/val_0042.txt b/dataset/labels/val/val_0042.txt new file mode 100644 index 0000000..c13277b --- /dev/null +++ b/dataset/labels/val/val_0042.txt @@ -0,0 +1,3 @@ +8 0.596875 0.235417 0.118750 0.154167 +17 0.658594 0.617708 0.085938 0.343750 +8 0.124219 0.580208 0.132812 0.118750 \ No newline at end of file diff --git a/dataset/labels/val/val_0043.txt b/dataset/labels/val/val_0043.txt new file mode 100644 index 0000000..17e0e26 --- /dev/null +++ b/dataset/labels/val/val_0043.txt @@ -0,0 +1,3 @@ +11 0.263281 0.582292 0.145313 0.168750 +6 0.761719 0.626042 0.182812 0.243750 +20 0.142969 0.318750 0.167187 0.245833 \ No newline at end of file diff --git a/dataset/labels/val/val_0044.txt b/dataset/labels/val/val_0044.txt new file mode 100644 index 0000000..ee8037d --- /dev/null +++ b/dataset/labels/val/val_0044.txt @@ -0,0 +1,3 @@ +10 0.261719 0.383333 0.073438 0.108333 +27 0.620313 0.764583 0.162500 0.208333 +20 0.314063 0.747917 0.181250 0.237500 \ No newline at end of file diff --git a/dataset/labels/val/val_0045.txt b/dataset/labels/val/val_0045.txt new file mode 100644 index 0000000..8456a4a --- /dev/null +++ b/dataset/labels/val/val_0045.txt @@ -0,0 +1,3 @@ +19 0.684375 0.617708 0.165625 0.247917 +5 0.323437 0.287500 0.153125 0.291667 +0 0.803125 0.491667 0.200000 0.320833 \ No newline at end of file diff --git a/dataset/labels/val/val_0046.txt b/dataset/labels/val/val_0046.txt new file mode 100644 index 0000000..ad991a7 --- /dev/null +++ b/dataset/labels/val/val_0046.txt @@ -0,0 +1 @@ +23 0.582812 0.330208 0.134375 0.177083 \ No newline at end of file diff --git a/dataset/labels/val/val_0047.txt b/dataset/labels/val/val_0047.txt new file mode 100644 index 0000000..849c782 --- /dev/null +++ b/dataset/labels/val/val_0047.txt @@ -0,0 +1,3 @@ +7 0.433594 0.615625 0.139063 0.118750 +17 0.402344 0.881250 0.239063 0.100000 +8 0.108594 0.761458 0.089063 0.202083 \ No newline at end of file diff --git a/dataset/labels/val/val_0048.txt b/dataset/labels/val/val_0048.txt new file mode 100644 index 0000000..c82e9c3 --- /dev/null +++ b/dataset/labels/val/val_0048.txt @@ -0,0 +1,3 @@ +27 0.672656 0.398958 0.135937 0.164583 +4 0.532031 0.392708 0.182812 0.131250 +18 0.342187 0.693750 0.153125 0.200000 \ No newline at end of file diff --git a/dataset/labels/val/val_0049.txt b/dataset/labels/val/val_0049.txt new file mode 100644 index 0000000..bc55fc7 --- /dev/null +++ b/dataset/labels/val/val_0049.txt @@ -0,0 +1,2 @@ +11 0.203125 0.679167 0.143750 0.233333 +13 0.606250 0.780208 0.146875 0.227083 \ No newline at end of file diff --git a/dummy.onnx b/dummy.onnx new file mode 100644 index 0000000..7d3ac49 Binary files /dev/null and b/dummy.onnx differ diff --git a/dummy2.onnx b/dummy2.onnx new file mode 100644 index 0000000..4a2e075 Binary files /dev/null and b/dummy2.onnx differ diff --git a/export.py b/export.py new file mode 100644 index 0000000..1cb84c4 --- /dev/null +++ b/export.py @@ -0,0 +1,114 @@ +import os +import time +import argparse +import torch +import torchvision +import onnx +import onnxruntime as ort +import numpy as np + +def export_to_onnx(model_path, onnx_path): + print(f"Loading PyTorch checkpoint from {model_path}...") + from data_generator import CLASSES + num_classes = len(CLASSES) + 1 + + # Recreate the model structure + model = torchvision.models.detection.ssdlite320_mobilenet_v3_large( + num_classes=num_classes, + weights_backbone=torchvision.models.MobileNet_V3_Large_Weights.DEFAULT + ) + + # Load state dict + state_dict = torch.load(model_path, map_location='cpu') + model.load_state_dict(state_dict) + model.eval() + + # Dummy input: list of 1 tensor of size [3, 320, 320] + # SSDLite in torchvision expects a list of tensors during export + dummy_input = [torch.randn(3, 320, 320)] + + print("Exporting model to ONNX...") + os.makedirs(os.path.dirname(onnx_path), exist_ok=True) + + torch.onnx.export( + model, + (dummy_input,), + onnx_path, + opset_version=12, + input_names=["images"], + output_names=["boxes", "scores", "labels"], + dynamic_axes={ + "images": {0: "batch_size"} + } + ) + + print(f"Successfully saved ONNX model to {onnx_path}") + + # Verify ONNX model + print("Verifying ONNX model graph structure...") + onnx_model = onnx.load(onnx_path) + onnx.checker.check_model(onnx_model) + + print("Inputs:") + for input_node in onnx_model.graph.input: + print(f" - Name: {input_node.name}") + print("Outputs:") + for output_node in onnx_model.graph.output: + print(f" - Name: {output_node.name}") + +def benchmark_onnx(onnx_path): + print(f"Benchmarking ONNX inference speed using ONNX Runtime...") + + # Create inference session + providers = ['CPUExecutionProvider'] + if 'DirectMLExecutionProvider' in ort.get_available_providers(): + providers = ['DirectMLExecutionProvider', 'CPUExecutionProvider'] + print("Using DirectML hardware acceleration!") + + session = ort.InferenceSession(onnx_path, providers=providers) + + # Prepare dummy input matching the shape of the exported model input + # Note: torchvision SSD ONNX export expects list of images. + # The input node shape in ONNX has dynamic axes. Let's create a float32 array + # corresponding to the image. SSDLite internally resizes and batches. + # Let's see the input signature. The input 'images' expects a 3D or 4D float tensor. + # In our export script, the dummy input was [torch.randn(3, 320, 320)] + # In ONNX, a list of Tensors gets mapped to a single concatenated batch tensor or similar. + # Let's generate a random array of shape (1, 3, 320, 320) + input_name = session.get_inputs()[0].name + dummy_in = np.random.randn(3, 320, 320).astype(np.float32) + + # Warmup + for _ in range(5): + _ = session.run(None, {input_name: dummy_in}) + + # Measure latency + num_runs = 50 + start_time = time.time() + for _ in range(num_runs): + _ = session.run(None, {input_name: dummy_in}) + elapsed = time.time() - start_time + avg_latency_ms = (elapsed / num_runs) * 1000 + + print(f"Average ONNX Runtime inference latency: {avg_latency_ms:.2f} ms") + if avg_latency_ms < 50.0: + print("Success: Inference latency is under the 50 ms limit!") + else: + print("Warning: Inference latency is above the 50 ms limit. Optimize hardware providers.") + + return avg_latency_ms + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="Export PyTorch SSDLite model to ONNX") + parser.add_argument("--pytorch-model", type=str, default=os.path.join("models", "model.pt"), help="Path to PyTorch model weights") + parser.add_argument("--onnx-model", type=str, default=os.path.join("models", "model.onnx"), help="Path to save ONNX model") + + args = parser.parse_args() + + try: + export_to_onnx(args.pytorch_model, args.onnx_model) + benchmark_onnx(args.onnx_model) + except Exception as e: + print(f"Error during export: {e}") + import sys + sys.exit(1) diff --git a/inference.py b/inference.py new file mode 100644 index 0000000..33d65ea --- /dev/null +++ b/inference.py @@ -0,0 +1,131 @@ +import os +import cv2 +import numpy as np +import onnxruntime as ort + +from data_generator import CLASSES + +class FruitVegetableDetector: + def __init__(self, model_path=os.path.join("models", "model.onnx")): + self.model_path = model_path + self.session = None + self.input_name = None + self.load_model() + + def load_model(self): + if not os.path.exists(self.model_path): + print(f"Model file {self.model_path} not found. Running in SIMULATED mode.") + self.session = None + return + + try: + # Set providers. SSDLite ONNX Runtime runs extremely fast on CPU + providers = ['CPUExecutionProvider'] + if 'DirectMLExecutionProvider' in ort.get_available_providers(): + providers = ['DirectMLExecutionProvider', 'CPUExecutionProvider'] + + self.session = ort.InferenceSession(self.model_path, providers=providers) + self.input_name = self.session.get_inputs()[0].name + print(f"ONNX model loaded successfully from {self.model_path}") + except Exception as e: + print(f"Failed to load ONNX model: {e}. Falling back to SIMULATED mode.") + self.session = None + + def detect(self, image_rgb, confidence_threshold=0.10): + """ + Runs inference on an RGB image. + Args: + image_rgb (np.ndarray): HWC RGB image. + confidence_threshold (float): Minimum confidence to report. + Returns: + list: List of predictions with class, confidence, and box [xmin, ymin, xmax, ymax] + """ + orig_h, orig_w, _ = image_rgb.shape + + # If no model is loaded, run simulation fallback + if self.session is None: + return self._simulate_detection(orig_w, orig_h, confidence_threshold) + + # Preprocessing: Resize to 320x320 + resized = cv2.resize(image_rgb, (320, 320)) + # Scale to [0.0, 1.0] and transpose to [C, H, W] + input_tensor = resized.astype(np.float32) / 255.0 + input_tensor = np.transpose(input_tensor, (2, 0, 1)) # shape: (3, 320, 320) + + # Run inference + outputs = self.session.run(None, {self.input_name: input_tensor}) + boxes, scores, labels = outputs + + predictions = [] + for i in range(len(scores)): + score = float(scores[i]) + if score < confidence_threshold: + continue + + # Class ID is 1-indexed, convert to 0-indexed + class_id = int(labels[i]) - 1 + if class_id < 0 or class_id >= len(CLASSES): + continue + + class_name = CLASSES[class_id] + box_320 = boxes[i] + + # Scale box back to original coordinates + xmin = int(round((box_320[0] / 320.0) * orig_w)) + ymin = int(round((box_320[1] / 320.0) * orig_h)) + xmax = int(round((box_320[2] / 320.0) * orig_w)) + ymax = int(round((box_320[3] / 320.0) * orig_h)) + + # Clip to image boundaries + xmin = max(0, min(xmin, orig_w - 1)) + ymin = max(0, min(ymin, orig_h - 1)) + xmax = max(xmin + 1, min(xmax, orig_w)) + ymax = max(ymin + 1, min(ymax, orig_h)) + + predictions.append({ + "class": class_name, + "confidence": round(score, 3), + "box": [xmin, ymin, xmax, ymax] + }) + + # Sort predictions by confidence descending + predictions = sorted(predictions, key=lambda x: x["confidence"], reverse=True) + return predictions + + def _simulate_detection(self, width, height, confidence_threshold): + """ + Generates simulated detections based on random chances. + Used as a fallback when the model hasn't been trained yet. + """ + # Seed a pseudo-random detection based on image size to look semi-stable + seed_factor = (width + height) % 6 + + # Simulate 1 to 2 detections + predictions = [] + + # 1. First main prediction (high confidence) + class_idx = seed_factor + conf = 0.85 + (seed_factor * 0.02) + + # Simulate reasonable bounding box centered on scale + cx, cy = int(width * 0.5), int(height * 0.5) + w, h = int(width * 0.35), int(height * 0.45) + + predictions.append({ + "class": CLASSES[class_idx], + "confidence": round(conf, 3), + "box": [cx - w//2, cy - h//2, cx + w//2, cy + h//2] + }) + + # 2. Second prediction (low confidence, e.g. alternative suggestion) + alt_class_idx = (class_idx + 1) % len(CLASSES) + alt_conf = 0.12 + (seed_factor * 0.01) + + if alt_conf >= confidence_threshold: + predictions.append({ + "class": CLASSES[alt_class_idx], + "confidence": round(alt_conf, 3), + "box": [cx - w//2 + 20, cy - h//2 + 10, cx + w//2 + 20, cy + h//2 + 10] + }) + + return predictions diff --git a/models/model.onnx b/models/model.onnx new file mode 100644 index 0000000..ef63f8d Binary files /dev/null and b/models/model.onnx differ diff --git a/models/model.pt b/models/model.pt new file mode 100644 index 0000000..d341626 Binary files /dev/null and b/models/model.pt differ diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..467468c --- /dev/null +++ b/requirements.txt @@ -0,0 +1,3 @@ +fastapi +uvicorn +albumentations diff --git a/train.py b/train.py new file mode 100644 index 0000000..8bb1273 --- /dev/null +++ b/train.py @@ -0,0 +1,199 @@ +import os +import sys +import json +import time +import argparse +import torch +import torchvision +from torch.utils.data import DataLoader +import albumentations as A +import numpy as np + +from dataset import FruitVegetableDataset, collate_fn +from data_generator import build_dataset + +STATUS_FILE = "training_status.json" + +def update_status(status, epoch=0, total_epochs=0, train_loss=[], val_loss=[], progress=0.0, message=""): + """ + Saves current training status to a JSON file so that the FastAPI server + can read it and report it to the frontend UI in real-time. + """ + status_data = { + "status": status, + "epoch": epoch, + "total_epochs": total_epochs, + "train_loss": train_loss, + "val_loss": val_loss, + "progress": progress, + "message": message, + "timestamp": time.time() + } + with open(STATUS_FILE, "w") as f: + json.dump(status_data, f, indent=2) + +def train(args): + # Ensure dataset exists + if not os.path.exists(args.dataset_dir) or len(os.listdir(os.path.join(args.dataset_dir, "images", "train"))) == 0: + update_status("generating_data", message="Generating synthetic fruit & vegetable dataset...") + print("Generating dataset...") + build_dataset(base_dir=args.dataset_dir, train_count=200, val_count=50) + + update_status("training", epoch=0, total_epochs=args.epochs, progress=5.0, message="Initializing model and loading dataset...") + + # Define augmentations using Albumentations + train_transform = A.Compose([ + A.Resize(320, 320), + A.HorizontalFlip(p=0.5), + A.ShiftScaleRotate(shift_limit=0.1, scale_limit=0.15, rotate_limit=30, p=0.7), + A.RandomBrightnessContrast(brightness_limit=0.2, contrast_limit=0.2, p=0.7), + A.GaussNoise(p=0.3), + ], bbox_params=A.BboxParams(format='pascal_voc', label_fields=['category_ids'])) + + val_transform = A.Compose([ + A.Resize(320, 320), + ], bbox_params=A.BboxParams(format='pascal_voc', label_fields=['category_ids'])) + + # Datasets and loaders + train_dataset = FruitVegetableDataset( + images_dir=os.path.join(args.dataset_dir, "images", "train"), + labels_dir=os.path.join(args.dataset_dir, "labels", "train"), + transform=train_transform + ) + + val_dataset = FruitVegetableDataset( + images_dir=os.path.join(args.dataset_dir, "images", "val"), + labels_dir=os.path.join(args.dataset_dir, "labels", "val"), + transform=val_transform + ) + + train_loader = DataLoader( + train_dataset, + batch_size=args.batch_size, + shuffle=True, + num_workers=0, # 0 works best on Windows to avoid multi-processing issues + collate_fn=collate_fn, + drop_last=True + ) + + val_loader = DataLoader( + val_dataset, + batch_size=args.batch_size, + shuffle=False, + num_workers=0, + collate_fn=collate_fn + ) + + # Set number of classes dynamically (classes + 1 background) + from data_generator import CLASSES + num_classes = len(CLASSES) + 1 + + print("Building SSDLite MobileNetV3 model...") + # Load pretrained model with backbone weights + model = torchvision.models.detection.ssdlite320_mobilenet_v3_large( + num_classes=num_classes, + weights_backbone=torchvision.models.MobileNet_V3_Large_Weights.DEFAULT + ) + + # Send to GPU if available, else CPU + device = torch.device('cuda') if torch.cuda.is_available() else torch.device('cpu') + model.to(device) + + # Optimizer and learning rate scheduler + params = [p for p in model.parameters() if p.requires_grad] + optimizer = torch.optim.AdamW(params, lr=args.lr, weight_decay=0.0005) + lr_scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=args.epochs) + + train_loss_history = [] + val_loss_history = [] + + print(f"Starting training on {device} for {args.epochs} epochs...") + for epoch in range(1, args.epochs + 1): + # 1. Training Phase + model.train() + epoch_train_losses = [] + + for batch_idx, (images, targets) in enumerate(train_loader): + images = [img.to(device) for img in images] + targets = [{k: v.to(device) for k, v in t.items()} for t in targets] + + # Forward pass: model returns a dict of losses in training mode + loss_dict = model(images, targets) + losses = sum(loss for loss in loss_dict.values()) + + optimizer.zero_grad() + losses.backward() + optimizer.step() + + epoch_train_losses.append(losses.item()) + + train_loss = np.mean(epoch_train_losses) + train_loss_history.append(train_loss) + + # 2. Validation Phase (compute validation loss by running model in train mode with no grad) + model.train() # Must remain in train mode to output losses + epoch_val_losses = [] + with torch.no_grad(): + for images, targets in val_loader: + images = [img.to(device) for img in images] + targets = [{k: v.to(device) for k, v in t.items()} for t in targets] + + loss_dict = model(images, targets) + losses = sum(loss for loss in loss_dict.values()) + epoch_val_losses.append(losses.item()) + + val_loss = np.mean(epoch_val_losses) + val_loss_history.append(val_loss) + + # Step the scheduler + lr_scheduler.step() + + # Update progress reporting + progress = 10.0 + (epoch / args.epochs) * 80.0 # scale 10% to 90% + msg = f"Epoch {epoch}/{args.epochs} - Train Loss: {train_loss:.4f}, Val Loss: {val_loss:.4f}" + print(msg) + update_status( + status="training", + epoch=epoch, + total_epochs=args.epochs, + train_loss=train_loss_history, + val_loss=val_loss_history, + progress=progress, + message=msg + ) + + # Save the PyTorch weights + os.makedirs("models", exist_ok=True) + pytorch_model_path = os.path.join("models", "model.pt") + torch.save(model.state_dict(), pytorch_model_path) + + msg = f"Training completed successfully! Saved PyTorch model to {pytorch_model_path}" + print(msg) + update_status( + status="completed", + epoch=args.epochs, + total_epochs=args.epochs, + train_loss=train_loss_history, + val_loss=val_loss_history, + progress=100.0, + message=msg + ) + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="Train SSDLite MobileNetV3 on Fruit & Vegetable Dataset") + parser.add_argument("--dataset-dir", type=str, default="dataset", help="Path to dataset directory") + parser.add_argument("--epochs", type=int, default=15, help="Number of training epochs") + parser.add_argument("--batch-size", type=int, default=8, help="Batch size for training") + parser.add_argument("--lr", type=float, default=0.001, help="Learning rate") + + args = parser.parse_args() + + try: + # Initial status write + update_status("idle", message="Starting training script...") + train(args) + except Exception as e: + err_msg = f"Error during training: {str(e)}" + print(err_msg, file=sys.stderr) + update_status("failed", message=err_msg) + sys.exit(1) diff --git a/training_status.json b/training_status.json new file mode 100644 index 0000000..b817b2a --- /dev/null +++ b/training_status.json @@ -0,0 +1,172 @@ +{ + "status": "completed", + "epoch": 80, + "total_epochs": 80, + "train_loss": [ + 14.416558946881976, + 8.560535499027797, + 6.1590442316872736, + 4.979522909436907, + 4.018168040684292, + 3.480345674923488, + 3.073960338320051, + 2.7360907111849104, + 2.557032789502825, + 2.243378366742815, + 2.1308790956224715, + 2.1955452987125943, + 2.0070086462157115, + 2.0185878106525967, + 1.8345478347369604, + 1.6559349298477173, + 1.5849260262080602, + 1.5635022521018982, + 1.6062596610614233, + 1.726163855620793, + 1.538249773638589, + 1.4960618615150452, + 1.4468259130205428, + 1.4194436711924416, + 1.2881800532341003, + 1.3486164723123824, + 1.2451901946749007, + 1.239103044782366, + 1.2390668647629874, + 1.2033049719674247, + 1.1581505239009857, + 1.2257465635027205, + 1.2348976390702384, + 1.2129942263875688, + 1.1189724377223425, + 1.1739094257354736, + 1.0684803128242493, + 1.0584009460040502, + 1.0583988513265337, + 1.0612394085952215, + 1.0146875594343459, + 1.0530114897659846, + 1.0255295463970728, + 0.9540680178574154, + 0.9820051533835275, + 0.9030428443636213, + 0.9445878054414477, + 0.9593135033335004, + 0.9215684916291919, + 0.898622704403741, + 0.8534730630261558, + 0.9186239157404218, + 0.8841125326497214, + 0.952531350510461, + 0.8495224756853921, + 0.9096398566450391, + 0.8117819002696446, + 0.8971408520426069, + 0.8703128184591021, + 0.9266059909548078, + 0.8670538536139897, + 0.8467714020184108, + 0.786924170596259, + 0.7829203350203378, + 0.7780132591724396, + 0.8383871998105731, + 0.8371244583811078, + 0.8669620113713401, + 0.7904618041855949, + 0.7480435158525195, + 0.8140954801014492, + 0.7576784746987479, + 0.8081949864115033, + 0.8191582986286708, + 0.8439824794019971, + 0.7994476173605237, + 0.7453874221869877, + 0.788932808807918, + 0.7627504255090441, + 0.7890771670000893 + ], + "val_loss": [ + 11.423399448394775, + 7.716830611228943, + 6.559785723686218, + 5.9326852560043335, + 6.204100728034973, + 5.083087205886841, + 4.765932559967041, + 4.626651465892792, + 4.4000959396362305, + 4.538154661655426, + 4.298968076705933, + 4.25590717792511, + 4.733014106750488, + 4.8199251890182495, + 4.057524085044861, + 4.768541395664215, + 4.158342659473419, + 3.7549831867218018, + 3.689927816390991, + 5.621420621871948, + 4.643145322799683, + 4.396498441696167, + 4.417411983013153, + 3.994734764099121, + 3.5355687141418457, + 3.8406707048416138, + 3.744269847869873, + 4.08042448759079, + 3.5711975693702698, + 3.6882749795913696, + 3.4119914174079895, + 3.999879002571106, + 3.16350781917572, + 3.732041835784912, + 3.61198091506958, + 3.769675314426422, + 3.559831738471985, + 3.63018000125885, + 3.461347460746765, + 3.9509286880493164, + 3.793315291404724, + 3.543702006340027, + 3.4955060482025146, + 3.7790576815605164, + 3.9144787192344666, + 3.552132308483124, + 3.7025479078292847, + 3.5490792393684387, + 3.4633408784866333, + 3.6982257962226868, + 3.4715570211410522, + 3.678580343723297, + 3.5512651801109314, + 3.491621494293213, + 3.6497156023979187, + 3.6593204140663147, + 3.6703805327415466, + 3.7796921133995056, + 3.7331241965293884, + 3.2891265153884888, + 3.8539904356002808, + 3.4467931985855103, + 3.6037285923957825, + 3.654494881629944, + 3.483547568321228, + 3.555329144001007, + 3.2837223410606384, + 3.514080762863159, + 3.4075995087623596, + 3.4499229192733765, + 3.481794774532318, + 3.490117132663727, + 3.5257052779197693, + 3.493154466152191, + 3.50936621427536, + 3.54010146856308, + 3.5379744172096252, + 3.5357993245124817, + 3.5334702134132385, + 3.5319539308547974 + ], + "progress": 100.0, + "message": "Training completed successfully! Saved PyTorch model to models\\model.pt", + "timestamp": 1780007552.618948 +} \ No newline at end of file