diff --git a/docker-compose.yml b/docker-compose.yml index 9331acf..1195f45 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -14,15 +14,15 @@ services: depends_on: - redis environment: -# stream_url: "rtsp://admin:labvision2019@10.1.8.182:554" - stream_url: "/videos/video.mp4" + stream_url: "rtsp://admin:labvision2019@10.1.8.182:554" +# stream_url: "/videos/video.mp4" stream_label: "pelea3" redis_host: "redis" redis_port: "6379" redis_db: "0" restart: unless-stopped - volumes: - - /home/ifiguero/DIA/dia3/DIA0205 - VISIÓN COMPUTACIONAL APLICADA/Profesor Cristian Aguilera/dataset/pelea3.mp4:/videos/video.mp4:ro + # volumes: + # - /home/ifiguero/DIA/dia3/DIA0205 - VISIÓN COMPUTACIONAL APLICADA/Profesor Cristian Aguilera/dataset/pelea3.mp4:/videos/video.mp4:ro stream_preprocess: build: @@ -32,6 +32,7 @@ services: depends_on: - redis - stream_reader + - stream_inference environment: stream_label: "pelea3" redis_host: "redis" @@ -39,15 +40,45 @@ services: redis_db: "0" restart: unless-stopped - dataset_builder: + stream_inference: build: dockerfile: Dockerfile - context: dataset - container_name: dataset_builder + context: inference + container_name: stream_inference + # deploy: + # resources: + # reservations: + # devices: + # - driver: nvidia + # count: all + # capabilities: [gpu] depends_on: - redis - - stream_preprocess environment: + model_folder: "/app/models" + model_name: "tuned" + out_folder: "/app/out_folder" + stream_label: "pelea3" + threshold: "0.75" + redis_host: "redis" + redis_port: "6379" + redis_db: "0" + restart: unless-stopped + volumes: + - ./rt_out:/app/out_folder + - ./models:/app/models + + web_inference: + build: + dockerfile: Dockerfile + context: web + container_name: web_inference + depends_on: + - redis + - stream_inference + environment: + stream_url: "rtsp://admin:labvision2019@10.1.8.182:554" +# stream_url: "/videos/video.mp4" out_folder: "/app/out_folder" stream_label: "pelea3" redis_host: "redis" @@ -55,4 +86,6 @@ services: redis_db: "0" restart: unless-stopped volumes: - - ./out_folder:/app/out_folder + - ./rt_out:/app/out_folder + ports: + - "8080:8080" diff --git a/Inference/Dockerfile b/inference/Dockerfile similarity index 91% rename from Inference/Dockerfile rename to inference/Dockerfile index ec68654..4b66242 100644 --- a/Inference/Dockerfile +++ b/inference/Dockerfile @@ -26,10 +26,10 @@ RUN /opt/conda/bin/pip install --upgrade pip && \ pillow RUN /opt/conda/bin/conda install -y -c conda-forge opencv -RUN /opt/conda/bin/pip install --force-reinstall --no-cache-dir tqdm +RUN /opt/conda/bin/pip install --force-reinstall --no-cache-dir redis # Copy project files into container -COPY evaluate.py /app/evaluate.py +COPY inference.py /app/inference.py # Default command (you can override with docker run) -CMD ["python", "/app/evaluate.py"] +CMD ["python", "/app/inference.py"] diff --git a/Inference/infrence.py b/inference/inference.py similarity index 55% rename from Inference/infrence.py rename to inference/inference.py index 17b64a9..c268b13 100644 --- a/Inference/infrence.py +++ b/inference/inference.py @@ -17,16 +17,19 @@ redis_host = os.getenv("redis_host", "localhost") redis_port = int(os.getenv("redis_port", 6379)) stream_label = os.getenv("stream_label", "cropped_stream") output_folder = os.getenv("out_folder", "/app/out_folder") -model_folder = os.getenv("model_folder", "base_model") -model_path = os.path.join(output_folder, model_folder) -threshold = float(os.getenv("threshold", "0.5")) -queue_label = f"{stream_label}_cubes" +model_folder = os.getenv("model_folder", "/app/models") +model_name = os.getenv("model_name", "base_model") +threshold = float(os.getenv("threshold", "0.5")) + +queue_label = f"{stream_label}_cubes" +model_path = os.path.join(model_folder, model_name) sqlite_path = os.path.join(output_folder, f"{stream_label}_results.db") stream_folder = os.path.join(output_folder, stream_label) os.makedirs(output_folder, exist_ok=True) os.makedirs(stream_folder, exist_ok=True) +os.makedirs(model_path, exist_ok=True) # ----------------------------- # CONNECT TO REDIS @@ -43,7 +46,7 @@ model.eval() # Warm up with torch.no_grad(): - dummy = torch.randn(1, 3, 16, 224, 224).to(device) + dummy = torch.randn(1, 16, 3, 224, 224).to(device) _ = model(pixel_values=dummy) # ----------------------------- @@ -55,7 +58,7 @@ cursor.execute(""" CREATE TABLE IF NOT EXISTS inference_results ( id INTEGER PRIMARY KEY AUTOINCREMENT, gif_name TEXT, - timestamp TEXT, + timestamp TIMESTAMP, prediction INTEGER ) """) @@ -69,6 +72,7 @@ def from_redis_list(queue_label): while True: compressed_data = redis_conn.lpop(queue_label) if compressed_data: + retry = 0 buffer = io.BytesIO(compressed_data) loaded_data = np.load(buffer) frames = [loaded_data[key] for key in sorted(loaded_data.files)] @@ -78,49 +82,53 @@ def from_redis_list(queue_label): if retry % 50 == 0: print(f"[WAIT] Queue {queue_label} empty for {retry/50:.1f} seconds...") time.sleep(1/50.0) - if retry > 2000: - raise TimeoutError(f"Queue {queue_label} empty for over 40s") + if retry > 3000: + raise TimeoutError(f"Queue {queue_label} empty for over 1m") # ----------------------------- # SAVE GIF # ----------------------------- def save_gif(frames, gif_path): - images = [Image.fromarray(frame.astype(np.uint8)) for frame in frames] - images[0].save(gif_path, save_all=True, append_images=images[1:], duration=50, loop=0) + images = [Image.fromarray(frame[:, :, ::-1]) for frame in frames] + images[0].save(gif_path, save_all=True, append_images=images[1:], duration=1, loop=0) + # images = [Image.fromarray(frame.astype(np.uint8)) for frame in frames] + # images[0].save(gif_path, save_all=True, append_images=images[1:], duration=50, loop=0) # ----------------------------- # MAIN LOOP # ----------------------------- print(f"[INFO] Listening on Redis queue: {queue_label}") -while True: - try: - frames = from_redis_list(queue_label) - if not all(frame.shape == (224, 224, 3) for frame in frames): - print("[WARN] Skipped frame batch due to incorrect shape") - continue +if __name__ == "__main__": + while True: + try: + frames = from_redis_list(queue_label) + # if not all(frame.shape == (224, 224, 3) for frame in frames): + # print("[WARN] Skipped frame batch due to incorrect shape") + # continue - timestamp = datetime.utcnow().strftime("%y%m%d_%H%M%S_%f")[:-3] - gif_filename = f"{stream_label}/{stream_label}_{timestamp}.gif" - gif_path = os.path.join(stream_folder, gif_filename) + now = datetime.utcnow() + timestamp = now.strftime("%y%m%d_%H%M%S_%f")[:-3] + gif_filename = f"{stream_label}_{timestamp}.gif" + gif_path = os.path.join(stream_folder, gif_filename) - # Save GIF - save_gif(frames, gif_path) + # Save GIF + save_gif(frames, gif_path) - # Preprocess and predict - with torch.no_grad(): - inputs = processor(images=[frame[:, :, ::-1] for frame in frames], return_tensors="pt") # convert BGR to RGB - pixel_values = inputs["pixel_values"].to(device) # [1, 3, 16, 224, 224] - logits = model(pixel_values=pixel_values).logits - prob = torch.softmax(logits, dim=-1)[0][1].item() - prediction = int(prob > threshold) + # Preprocess and predict + with torch.no_grad(): + inputs = processor(images=[frame[:, :, ::-1] for frame in frames], return_tensors="pt") # convert BGR to RGB + pixel_values = inputs["pixel_values"].to(device) # [1, 3, 16, 224, 224] + logits = model(pixel_values=pixel_values).logits + prob = torch.softmax(logits, dim=-1)[0][1].item() + prediction = int(prob > threshold) - # Insert into SQLite - cursor.execute("INSERT INTO inference_results (gif_name, timestamp, prediction) VALUES (?, ?, ?)", - (gif_filename, timestamp, prediction)) - conn.commit() + # Insert into SQLite + cursor.execute("INSERT INTO inference_results (gif_name, timestamp, prediction) VALUES (?, ?, ?)", + (gif_filename, now, prediction)) + conn.commit() - print(f"[INFO] Saved {gif_filename} | Class={prediction} | Prob={prob:.3f}") - - except Exception as e: - print(f"[ERROR] {e}") - time.sleep(1) + print(f"[INFO] Saved {gif_filename} | Class={prediction} | Prob={prob:.3f}") + except TimeoutError as e: + print(f"[TimeoutError] {e}") + except Exception as e: + print(f"[ERROR] {e}") diff --git a/preprocess/preprocess.py b/preprocess/preprocess.py index aa90b90..2403f6e 100644 --- a/preprocess/preprocess.py +++ b/preprocess/preprocess.py @@ -31,7 +31,7 @@ def fromRedis(queue_label): compressed_data = redis_conn.lpop(queue_label) if compressed_data: retry = 0 - print(f"Popped data from queue: {queue_label}") +# print(f"Popped data from queue: {queue_label}") buffer = io.BytesIO(compressed_data) loaded_data = np.load(buffer) return loaded_data['data'] @@ -41,10 +41,10 @@ def fromRedis(queue_label): print(f"Queue {queue_label} empty for {retry/50} seconds") time.sleep(1/50.0) if retry > 1000: - raise(f'Queue {queue_label} 20s empty') + raise TimeoutError(f'Queue {queue_label} 20s empty') def toRedisList(queue_label, data_list): - print(f"Pushed data to queue: {queue_label}") +# print(f"Pushed data to queue: {queue_label}") buffer = io.BytesIO() np.savez(buffer, *data_list) # Use *data_list to unpack the list into arguments for savez_compressed compressed_data = buffer.getvalue() @@ -57,7 +57,7 @@ def fromRedisList(queue_label): compressed_data = redis_conn.lpop(queue_label) if compressed_data: retry = 0 - print(f"Popped data from queue: {queue_label}") +# print(f"Popped data from queue: {queue_label}") buffer = io.BytesIO(compressed_data) loaded_data = np.load(buffer) data_list = [loaded_data[key] for key in loaded_data.files] @@ -69,7 +69,7 @@ def fromRedisList(queue_label): time.sleep(1/50.0) if retry > 1000: - raise(f'Queue {queue_label} 20s empty') + raise TimeoutError(f'Queue {queue_label} 20s empty') import mediapipe as mp @@ -106,7 +106,7 @@ def detect_person_bbox(image_frame: np.ndarray) -> list: width, height = bbox.width, bbox.height padding = int(max(10, width//10)) - + width += 2 * padding height += 2 * padding left = max(0, left-padding) @@ -163,6 +163,8 @@ def crop_and_resize_frames(frames, box, target_size=224): cropped.append(crop) return cropped +import collections + if __name__ == "__main__": frame_list = [] frame_count = 0 @@ -173,33 +175,39 @@ if __name__ == "__main__": lap_time = start_time print(f"[INFO] Starting consumer for stream: {stream_label}") - while frame_lag < 100: - frame = fromRedis(stream_label) - if frame is None: - frame_lag += 1 - wait_time = frame_lag * 0.01 - time.sleep(wait_time) - continue - frame_lag = 0 + try: + while True: + frame = fromRedis(stream_label) - frame_list.append(frame) - frame_count += 1 + frame_list.append(frame) + frame_count += 1 - if len(frame_list) == 16: - for box in detect_person_bbox(frame_list[0]): - frame_hits += 1 - cropped_frames = crop_and_resize_frames(frame_list, box) - toRedisList(stream_label_queue, cropped_frames) + if len(frame_list) == 16: + hits = frame_hits + for box in detect_person_bbox(frame_list[0]): + frame_hits += 1 + cropped_frames = crop_and_resize_frames(list(frame_list), box) + toRedisList(stream_label_queue, cropped_frames) - frame_list.pop(0) + if frame_hits > hits: + frame_list.clear() + else: + frame_list.pop(0) + frame_list.pop(0) + frame_list.pop(0) + frame_list.pop(0) - if frame_count % 15 == 0: - current_hits = frame_hits - last_hits - last_hits = frame_hits - last_lap = lap_time - lap_time = time.time() - elapsed = lap_time - last_lap - print(f"[INFO] {frame_count} frames, {frame_hits} hits. {current_hits} in {elapsed:.2f} seconds.") + if frame_count % 15 == 0: + current_hits = frame_hits - last_hits + last_hits = frame_hits + last_lap = lap_time + lap_time = time.time() + elapsed = lap_time - last_lap + print(f"[INFO] {frame_count} frames, {frame_hits} hits. {current_hits} in {elapsed:.2f} seconds.") + except TimeoutError as e: + print(f"[TimeoutError] {e}") + except Exception as e: + print(f"[ERROR] {e}") total_time = time.time() - start_time print(f"[INFO] Finished. Total frames: {frame_count}. Total Hits {frame_hits}. Total time: {total_time:.2f} seconds.") diff --git a/reader/reader.py b/reader/reader.py index ff75efb..076f8be 100644 --- a/reader/reader.py +++ b/reader/reader.py @@ -23,7 +23,7 @@ redis_conn.delete(stream_label) print(f"[INFO] Cleared Redis queue for label: {stream_label}") def toRedis(queue_label, data): - print(f"Pushed data to queue: {queue_label}") +# print(f"Pushed data to queue: {queue_label}") buffer = io.BytesIO() np.savez(buffer, data=data) compressed_data = buffer.getvalue() @@ -38,11 +38,9 @@ def fromRedis(queue_label): buffer = io.BytesIO(compressed_data) loaded_data = np.load(buffer) return loaded_data['data'] - else: - time.sleep(1/50.0) def toRedisList(queue_label, data_list): - print(f"Pushed data to queue: {queue_label}") +# print(f"Pushed data to queue: {queue_label}") buffer = io.BytesIO() np.savez(buffer, *data_list) # Use *data_list to unpack the list into arguments for savez_compressed compressed_data = buffer.getvalue() @@ -58,8 +56,6 @@ def fromRedisList(queue_label): loaded_data = np.load(buffer) data_list = [loaded_data[key] for key in loaded_data.files] return data_list - else: - time.sleep(1/50.0) # Main frame processing function @@ -86,14 +82,14 @@ def stream_frames(video_url, label): toRedis(label,frame) frame_count += 1 - time.sleep(1/30.0) +# time.sleep(1/30.0) # Log every 500 frames - if frame_count % 100 == 0: + if frame_count % 16 == 0: last_lap = lap_time lap_time = time.time() elapsed = lap_time - last_lap - print(f"[INFO] 100 frames processed in {elapsed:.2f} seconds.") + print(f"[INFO] 16 frames processed in {elapsed:.2f} seconds.") # if frame_count % 16 and (redis_len := redis_conn.llen(label)) > 75: # print(f"[WARN] {redis_len} items in queue. Pruning to 50 latest.") diff --git a/rt_out/pelea3/pelea3_250721_182856_857.gif b/rt_out/pelea3/pelea3_250721_182856_857.gif new file mode 100644 index 0000000..8b33472 Binary files /dev/null and b/rt_out/pelea3/pelea3_250721_182856_857.gif differ diff --git a/rt_out/pelea3/pelea3_250721_184038_180.gif b/rt_out/pelea3/pelea3_250721_184038_180.gif new file mode 100644 index 0000000..8b33472 Binary files /dev/null and b/rt_out/pelea3/pelea3_250721_184038_180.gif differ diff --git a/rt_out/pelea3/pelea3_250721_184041_957.gif b/rt_out/pelea3/pelea3_250721_184041_957.gif new file mode 100644 index 0000000..f704a03 Binary files /dev/null and b/rt_out/pelea3/pelea3_250721_184041_957.gif differ diff --git a/rt_out/pelea3/pelea3_250721_184044_649.gif b/rt_out/pelea3/pelea3_250721_184044_649.gif new file mode 100644 index 0000000..e5aa6a2 Binary files /dev/null and b/rt_out/pelea3/pelea3_250721_184044_649.gif differ diff --git a/rt_out/pelea3/pelea3_250721_184047_211.gif b/rt_out/pelea3/pelea3_250721_184047_211.gif new file mode 100644 index 0000000..9647d0b Binary files /dev/null and b/rt_out/pelea3/pelea3_250721_184047_211.gif differ diff --git a/rt_out/pelea3/pelea3_250721_184049_907.gif b/rt_out/pelea3/pelea3_250721_184049_907.gif new file mode 100644 index 0000000..a10412b Binary files /dev/null and b/rt_out/pelea3/pelea3_250721_184049_907.gif differ diff --git a/rt_out/pelea3/pelea3_250721_184052_657.gif b/rt_out/pelea3/pelea3_250721_184052_657.gif new file mode 100644 index 0000000..38f548c Binary files /dev/null and b/rt_out/pelea3/pelea3_250721_184052_657.gif differ diff --git a/rt_out/pelea3/pelea3_250721_184055_342.gif b/rt_out/pelea3/pelea3_250721_184055_342.gif new file mode 100644 index 0000000..2dafd55 Binary files /dev/null and b/rt_out/pelea3/pelea3_250721_184055_342.gif differ diff --git a/rt_out/pelea3/pelea3_250721_184058_442.gif b/rt_out/pelea3/pelea3_250721_184058_442.gif new file mode 100644 index 0000000..895cca2 Binary files /dev/null and b/rt_out/pelea3/pelea3_250721_184058_442.gif differ diff --git a/rt_out/pelea3/pelea3_250721_184101_825.gif b/rt_out/pelea3/pelea3_250721_184101_825.gif new file mode 100644 index 0000000..7eb31af Binary files /dev/null and b/rt_out/pelea3/pelea3_250721_184101_825.gif differ diff --git a/rt_out/pelea3/pelea3_250721_184105_261.gif b/rt_out/pelea3/pelea3_250721_184105_261.gif new file mode 100644 index 0000000..63d7504 Binary files /dev/null and b/rt_out/pelea3/pelea3_250721_184105_261.gif differ diff --git a/rt_out/pelea3/pelea3_250721_184108_355.gif b/rt_out/pelea3/pelea3_250721_184108_355.gif new file mode 100644 index 0000000..a2a5b0f Binary files /dev/null and b/rt_out/pelea3/pelea3_250721_184108_355.gif differ diff --git a/rt_out/pelea3/pelea3_250721_184111_471.gif b/rt_out/pelea3/pelea3_250721_184111_471.gif new file mode 100644 index 0000000..658bb28 Binary files /dev/null and b/rt_out/pelea3/pelea3_250721_184111_471.gif differ diff --git a/rt_out/pelea3/pelea3_250721_184732_755.gif b/rt_out/pelea3/pelea3_250721_184732_755.gif new file mode 100644 index 0000000..8b33472 Binary files /dev/null and b/rt_out/pelea3/pelea3_250721_184732_755.gif differ diff --git a/rt_out/pelea3/pelea3_250721_184736_540.gif b/rt_out/pelea3/pelea3_250721_184736_540.gif new file mode 100644 index 0000000..f704a03 Binary files /dev/null and b/rt_out/pelea3/pelea3_250721_184736_540.gif differ diff --git a/rt_out/pelea3/pelea3_250721_184739_588.gif b/rt_out/pelea3/pelea3_250721_184739_588.gif new file mode 100644 index 0000000..e5aa6a2 Binary files /dev/null and b/rt_out/pelea3/pelea3_250721_184739_588.gif differ diff --git a/rt_out/pelea3/pelea3_250721_184742_041.gif b/rt_out/pelea3/pelea3_250721_184742_041.gif new file mode 100644 index 0000000..9647d0b Binary files /dev/null and b/rt_out/pelea3/pelea3_250721_184742_041.gif differ diff --git a/rt_out/pelea3/pelea3_250721_184744_549.gif b/rt_out/pelea3/pelea3_250721_184744_549.gif new file mode 100644 index 0000000..a10412b Binary files /dev/null and b/rt_out/pelea3/pelea3_250721_184744_549.gif differ diff --git a/rt_out/pelea3/pelea3_250721_184747_075.gif b/rt_out/pelea3/pelea3_250721_184747_075.gif new file mode 100644 index 0000000..38f548c Binary files /dev/null and b/rt_out/pelea3/pelea3_250721_184747_075.gif differ diff --git a/rt_out/pelea3/pelea3_250721_184749_616.gif b/rt_out/pelea3/pelea3_250721_184749_616.gif new file mode 100644 index 0000000..2dafd55 Binary files /dev/null and b/rt_out/pelea3/pelea3_250721_184749_616.gif differ diff --git a/rt_out/pelea3/pelea3_250721_184752_153.gif b/rt_out/pelea3/pelea3_250721_184752_153.gif new file mode 100644 index 0000000..895cca2 Binary files /dev/null and b/rt_out/pelea3/pelea3_250721_184752_153.gif differ diff --git a/rt_out/pelea3/pelea3_250721_184754_803.gif b/rt_out/pelea3/pelea3_250721_184754_803.gif new file mode 100644 index 0000000..7eb31af Binary files /dev/null and b/rt_out/pelea3/pelea3_250721_184754_803.gif differ diff --git a/rt_out/pelea3/pelea3_250721_184757_424.gif b/rt_out/pelea3/pelea3_250721_184757_424.gif new file mode 100644 index 0000000..63d7504 Binary files /dev/null and b/rt_out/pelea3/pelea3_250721_184757_424.gif differ diff --git a/rt_out/pelea3/pelea3_250721_184800_125.gif b/rt_out/pelea3/pelea3_250721_184800_125.gif new file mode 100644 index 0000000..a2a5b0f Binary files /dev/null and b/rt_out/pelea3/pelea3_250721_184800_125.gif differ diff --git a/rt_out/pelea3/pelea3_250721_184803_069.gif b/rt_out/pelea3/pelea3_250721_184803_069.gif new file mode 100644 index 0000000..658bb28 Binary files /dev/null and b/rt_out/pelea3/pelea3_250721_184803_069.gif differ diff --git a/rt_out/pelea3/pelea3_250721_185443_730.gif b/rt_out/pelea3/pelea3_250721_185443_730.gif new file mode 100644 index 0000000..aaf00fa Binary files /dev/null and b/rt_out/pelea3/pelea3_250721_185443_730.gif differ diff --git a/rt_out/pelea3/pelea3_250721_185447_307.gif b/rt_out/pelea3/pelea3_250721_185447_307.gif new file mode 100644 index 0000000..9391169 Binary files /dev/null and b/rt_out/pelea3/pelea3_250721_185447_307.gif differ diff --git a/rt_out/pelea3/pelea3_250721_185450_165.gif b/rt_out/pelea3/pelea3_250721_185450_165.gif new file mode 100644 index 0000000..d99fdcf Binary files /dev/null and b/rt_out/pelea3/pelea3_250721_185450_165.gif differ diff --git a/rt_out/pelea3/pelea3_250721_185452_748.gif b/rt_out/pelea3/pelea3_250721_185452_748.gif new file mode 100644 index 0000000..87cc040 Binary files /dev/null and b/rt_out/pelea3/pelea3_250721_185452_748.gif differ diff --git a/rt_out/pelea3/pelea3_250721_185455_445.gif b/rt_out/pelea3/pelea3_250721_185455_445.gif new file mode 100644 index 0000000..6a6cbaa Binary files /dev/null and b/rt_out/pelea3/pelea3_250721_185455_445.gif differ diff --git a/rt_out/pelea3/pelea3_250721_185457_977.gif b/rt_out/pelea3/pelea3_250721_185457_977.gif new file mode 100644 index 0000000..6c39b5b Binary files /dev/null and b/rt_out/pelea3/pelea3_250721_185457_977.gif differ diff --git a/rt_out/pelea3/pelea3_250721_185500_682.gif b/rt_out/pelea3/pelea3_250721_185500_682.gif new file mode 100644 index 0000000..8b800b7 Binary files /dev/null and b/rt_out/pelea3/pelea3_250721_185500_682.gif differ diff --git a/rt_out/pelea3/pelea3_250721_185503_308.gif b/rt_out/pelea3/pelea3_250721_185503_308.gif new file mode 100644 index 0000000..e94545a Binary files /dev/null and b/rt_out/pelea3/pelea3_250721_185503_308.gif differ diff --git a/rt_out/pelea3/pelea3_250721_185506_054.gif b/rt_out/pelea3/pelea3_250721_185506_054.gif new file mode 100644 index 0000000..e544e9b Binary files /dev/null and b/rt_out/pelea3/pelea3_250721_185506_054.gif differ diff --git a/rt_out/pelea3/pelea3_250721_185508_733.gif b/rt_out/pelea3/pelea3_250721_185508_733.gif new file mode 100644 index 0000000..049c847 Binary files /dev/null and b/rt_out/pelea3/pelea3_250721_185508_733.gif differ diff --git a/rt_out/pelea3/pelea3_250721_185511_508.gif b/rt_out/pelea3/pelea3_250721_185511_508.gif new file mode 100644 index 0000000..b02eb5b Binary files /dev/null and b/rt_out/pelea3/pelea3_250721_185511_508.gif differ diff --git a/rt_out/pelea3/pelea3_250721_185514_478.gif b/rt_out/pelea3/pelea3_250721_185514_478.gif new file mode 100644 index 0000000..1c1526b Binary files /dev/null and b/rt_out/pelea3/pelea3_250721_185514_478.gif differ diff --git a/rt_out/pelea3/pelea3_250721_223328_118.gif b/rt_out/pelea3/pelea3_250721_223328_118.gif new file mode 100644 index 0000000..df25c65 Binary files /dev/null and b/rt_out/pelea3/pelea3_250721_223328_118.gif differ diff --git a/rt_out/pelea3/pelea3_250721_223332_376.gif b/rt_out/pelea3/pelea3_250721_223332_376.gif new file mode 100644 index 0000000..a1625f9 Binary files /dev/null and b/rt_out/pelea3/pelea3_250721_223332_376.gif differ diff --git a/rt_out/pelea3/pelea3_250721_223336_766.gif b/rt_out/pelea3/pelea3_250721_223336_766.gif new file mode 100644 index 0000000..7a5565f Binary files /dev/null and b/rt_out/pelea3/pelea3_250721_223336_766.gif differ diff --git a/rt_out/pelea3/pelea3_250721_223341_175.gif b/rt_out/pelea3/pelea3_250721_223341_175.gif new file mode 100644 index 0000000..93be5f6 Binary files /dev/null and b/rt_out/pelea3/pelea3_250721_223341_175.gif differ diff --git a/rt_out/pelea3/pelea3_250721_223416_727.gif b/rt_out/pelea3/pelea3_250721_223416_727.gif new file mode 100644 index 0000000..56537aa Binary files /dev/null and b/rt_out/pelea3/pelea3_250721_223416_727.gif differ diff --git a/rt_out/pelea3/pelea3_250721_223421_104.gif b/rt_out/pelea3/pelea3_250721_223421_104.gif new file mode 100644 index 0000000..5856cc8 Binary files /dev/null and b/rt_out/pelea3/pelea3_250721_223421_104.gif differ diff --git a/rt_out/pelea3/pelea3_250721_223425_091.gif b/rt_out/pelea3/pelea3_250721_223425_091.gif new file mode 100644 index 0000000..5b8118b Binary files /dev/null and b/rt_out/pelea3/pelea3_250721_223425_091.gif differ diff --git a/rt_out/pelea3/pelea3_250721_223429_014.gif b/rt_out/pelea3/pelea3_250721_223429_014.gif new file mode 100644 index 0000000..0bb33a0 Binary files /dev/null and b/rt_out/pelea3/pelea3_250721_223429_014.gif differ diff --git a/rt_out/pelea3/pelea3_250721_223432_970.gif b/rt_out/pelea3/pelea3_250721_223432_970.gif new file mode 100644 index 0000000..f80300c Binary files /dev/null and b/rt_out/pelea3/pelea3_250721_223432_970.gif differ diff --git a/rt_out/pelea3/pelea3_250721_223437_469.gif b/rt_out/pelea3/pelea3_250721_223437_469.gif new file mode 100644 index 0000000..b77e52e Binary files /dev/null and b/rt_out/pelea3/pelea3_250721_223437_469.gif differ diff --git a/rt_out/pelea3/pelea3_250721_223441_988.gif b/rt_out/pelea3/pelea3_250721_223441_988.gif new file mode 100644 index 0000000..fc0862d Binary files /dev/null and b/rt_out/pelea3/pelea3_250721_223441_988.gif differ diff --git a/rt_out/pelea3/pelea3_250721_223526_883.gif b/rt_out/pelea3/pelea3_250721_223526_883.gif new file mode 100644 index 0000000..bf0fd9b Binary files /dev/null and b/rt_out/pelea3/pelea3_250721_223526_883.gif differ diff --git a/rt_out/pelea3/pelea3_250721_223533_403.gif b/rt_out/pelea3/pelea3_250721_223533_403.gif new file mode 100644 index 0000000..e7b725f Binary files /dev/null and b/rt_out/pelea3/pelea3_250721_223533_403.gif differ diff --git a/rt_out/pelea3/pelea3_250721_223538_145.gif b/rt_out/pelea3/pelea3_250721_223538_145.gif new file mode 100644 index 0000000..c079f83 Binary files /dev/null and b/rt_out/pelea3/pelea3_250721_223538_145.gif differ diff --git a/rt_out/pelea3/pelea3_250721_223543_175.gif b/rt_out/pelea3/pelea3_250721_223543_175.gif new file mode 100644 index 0000000..070fd30 Binary files /dev/null and b/rt_out/pelea3/pelea3_250721_223543_175.gif differ diff --git a/rt_out/pelea3/pelea3_250721_223547_640.gif b/rt_out/pelea3/pelea3_250721_223547_640.gif new file mode 100644 index 0000000..283216c Binary files /dev/null and b/rt_out/pelea3/pelea3_250721_223547_640.gif differ diff --git a/rt_out/pelea3_results.db b/rt_out/pelea3_results.db new file mode 100644 index 0000000..5fe989d Binary files /dev/null and b/rt_out/pelea3_results.db differ diff --git a/web/Dockerfile b/web/Dockerfile new file mode 100644 index 0000000..b345e8c --- /dev/null +++ b/web/Dockerfile @@ -0,0 +1,21 @@ +# Base Python image +FROM python:3.10-slim + +# Set workdir +WORKDIR /app + + +# Install dependencies +RUN pip install --no-cache-dir flask redis + + +# Copy files into the container +COPY templates /app/templates +COPY web.py /app/web.py + +# Expose port for Flask app +EXPOSE 8080 + + +# Run the Flask app +CMD ["python", "web.py"] diff --git a/web/templates/index.html b/web/templates/index.html new file mode 100644 index 0000000..7f26f61 --- /dev/null +++ b/web/templates/index.html @@ -0,0 +1,126 @@ + + +
+ +Frame queue length: ...
+Inference Queue length: ...
+Waiting for data...
+Waiting for data...
+