From 2be2d0a0c409ffab21a79336cfa8c0ce55245385 Mon Sep 17 00:00:00 2001 From: Ronan Date: Fri, 28 Jun 2024 17:45:27 +0200 Subject: [PATCH 01/21] feat: use new api-client functions --- pyroengine/engine.py | 29 +++++------------------------ tests/test_engine.py | 4 ++-- 2 files changed, 7 insertions(+), 26 deletions(-) diff --git a/pyroengine/engine.py b/pyroengine/engine.py index 372e304e..6ad28511 100644 --- a/pyroengine/engine.py +++ b/pyroengine/engine.py @@ -297,8 +297,7 @@ def _stage_alert(self, frame: Image.Image, cam_id: str, ts: int, localization: l "frame": frame, "cam_id": cam_id, "ts": ts, - "media_id": None, - "alert_id": None, + "detection_id": None, "localization": localization, } ) @@ -308,39 +307,21 @@ def _process_alerts(self) -> None: # try to upload the oldest element frame_info = self._alerts[0] cam_id = frame_info["cam_id"] - logging.info(f"Camera '{cam_id}' - Sending alert from {frame_info['ts']}...") + logging.info(f"Camera '{cam_id}' - Create detection from {frame_info['ts']}...") # Save alert on device self._local_backup(frame_info["frame"], cam_id) try: - # Media creation - if not isinstance(self._alerts[0]["media_id"], int): - self._alerts[0]["media_id"] = self.api_client[cam_id].create_media_from_device().json()["id"] - # Alert creation - if not isinstance(self._alerts[0]["alert_id"], int): - self._alerts[0]["alert_id"] = ( - self.api_client[cam_id] - .send_alert_from_device( - lat=self.latitude, - lon=self.longitude, - media_id=self._alerts[0]["media_id"], - localization=self._alerts[0]["localization"], - ) - .json()["id"] - ) - # Media upload + # Detection creation stream = io.BytesIO() frame_info["frame"].save(stream, format="JPEG", quality=self.jpeg_quality) - response = self.api_client[cam_id].upload_media( - self._alerts[0]["media_id"], - media_data=stream.getvalue(), - ) + response = self.api_client[cam_id].create_detection(stream.getvalue(), 123.2) # Force a KeyError if the request failed response.json()["id"] # Clear self._alerts.popleft() - logging.info(f"Camera '{cam_id}' - alert sent") + logging.info(f"Camera '{cam_id}' - detection created") stream.seek(0) # "Rewind" the stream to the beginning so we can read its content except (KeyError, ConnectionError) as e: logging.warning(f"Camera '{cam_id}' - unable to upload cache") diff --git a/tests/test_engine.py b/tests/test_engine.py index 1f2a48ee..55320308 100644 --- a/tests/test_engine.py +++ b/tests/test_engine.py @@ -20,8 +20,8 @@ def test_engine_offline(tmpdir_factory, mock_wildfire_image, mock_forest_image): engine._stage_alert(mock_wildfire_image, 0, datetime.now().isoformat(), localization="dummy") assert len(engine._alerts) == 1 assert engine._alerts[0]["ts"] < datetime.now().isoformat() and _ts < engine._alerts[0]["ts"] - assert engine._alerts[0]["media_id"] is None - assert engine._alerts[0]["alert_id"] is None + assert engine._alerts[0]["detection_id"] is None + # Cache dump engine._dump_cache() From 1173f46f117c57437ec1865b30b8b799400472b0 Mon Sep 17 00:00:00 2001 From: Ronan Date: Tue, 2 Jul 2024 13:37:56 +0200 Subject: [PATCH 02/21] fix error with pose_id --- pyproject.toml | 2 +- pyroengine/core.py | 20 +-- pyroengine/engine.py | 45 ++++--- pyroengine/vision.py | 12 +- src/control_reolink_cam.py | 14 +-- src/poetry.lock | 251 +++++++++++++++++++------------------ src/pyproject.toml | 2 +- src/requirements.txt | 10 +- src/run.py | 13 +- tests/test_engine.py | 1 - 10 files changed, 193 insertions(+), 177 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index f3ff323e..8feab5af 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -33,7 +33,7 @@ dependencies = [ "Pillow>=8.4.0", "onnxruntime>=1.10.0,<2.0.0", "numpy>=1.19.5,<2.0.0", - "pyroclient @ git+https://github.com/pyronear/pyro-api.git@767be30a781b52b29d68579d543e3f45ac8c4713#egg=pyroclient&subdirectory=client", + "pyroclient @ git+https://github.com/pyronear/pyro-api.git@21e83622c0b057d3ae767c8a8061130e267d8a8a#egg=pyroclient&subdirectory=client", "requests>=2.20.0,<3.0.0", "opencv-python==4.5.5.64", "tqdm>=4.62.0", diff --git a/pyroengine/core.py b/pyroengine/core.py index 8789acca..2c860566 100644 --- a/pyroengine/core.py +++ b/pyroengine/core.py @@ -84,14 +84,13 @@ def capture_camera_image(args: Tuple[ReolinkCamera, MPQueue]) -> None: try: if camera.cam_type == "ptz": for pose_id in camera.cam_poses: - cam_id = f"{camera.ip_address}_{pose_id}" frame = camera.capture(pose_id) if frame is not None: - queue.put((cam_id, frame)) + queue.put((cam_id, pose_id, frame)) else: frame = camera.capture() if frame is not None: - queue.put((cam_id, frame)) + queue.put((cam_id, None, frame)) except Exception as e: logging.exception(f"Error during image capture from camera {cam_id}: {e}") @@ -137,16 +136,17 @@ def capture_images(self) -> MPQueue: return queue - def analyze_stream(self, img: Image.Image, cam_id: str) -> None: + def analyze_stream(self, img: Image.Image, cam_id: str, pose_id: int) -> None: """ Analyzes the image stream from a specific camera. Args: img (Image.Image): The image to analyze. cam_id (str): The ID of the camera. + pose_id (int) : position of the camera, for ptz camera """ # Run the prediction using the engine - self.engine.predict(img, cam_id) + self.engine.predict(img, cam_id, pose_id) def check_day_time(self) -> None: try: @@ -178,17 +178,17 @@ def run(self, period: int = 30) -> None: try: queue = self.capture_images() except Exception as e: - logging.error(f"Error capturing images: {e}") + logging.exception(f"Error capturing images: {e}") # Analyze each captured frame if queue: while not queue.empty(): - cam_id, frame = queue.get() + cam_id, pose_id, frame = queue.get() try: if frame is not None: - self.analyze_stream(frame, cam_id) + self.analyze_stream(frame, cam_id, pose_id) except Exception as e: - logging.error(f"Error running prediction: {e}") + logging.exception(f"Error running prediction: {e}") # Use the last frame to check if it's day_time if frame is not None: @@ -198,7 +198,7 @@ def run(self, period: int = 30) -> None: try: self.engine._process_alerts() except Exception as e: - logging.error(f"Error processing alerts: {e}") + logging.exception(f"Error processing alerts: {e}") # Disable the alarm signal.alarm(0) diff --git a/pyroengine/engine.py b/pyroengine/engine.py index 6ad28511..92c1818b 100644 --- a/pyroengine/engine.py +++ b/pyroengine/engine.py @@ -21,7 +21,6 @@ from pyroclient import client from requests.exceptions import ConnectionError from requests.models import Response - from pyroengine.utils import box_iou, nms from .vision import Classifier @@ -64,7 +63,7 @@ def __init__( self, model_path: Optional[str] = "data/model.onnx", conf_thresh: float = 0.25, - api_url: Optional[str] = None, + api_host: Optional[str] = None, cam_creds: Optional[Dict[str, Dict[str, str]]] = None, latitude: Optional[float] = None, longitude: Optional[float] = None, @@ -87,15 +86,15 @@ def __init__( self.conf_thresh = conf_thresh # API Setup - if isinstance(api_url, str): + if isinstance(api_host, str): assert isinstance(latitude, float) and isinstance(longitude, float) and isinstance(cam_creds, dict) self.latitude = latitude self.longitude = longitude self.api_client = {} - if isinstance(api_url, str) and isinstance(cam_creds, dict): + if isinstance(api_host, str) and isinstance(cam_creds, dict): # Instantiate clients for each camera - for _id, vals in cam_creds.items(): - self.api_client[_id] = client.Client(api_url, vals["login"], vals["password"]) + for _id, camera_token in cam_creds.items(): + self.api_client[_id] = client.Client(camera_token, api_host) # Cache & relaxation self.frame_saving_period = frame_saving_period @@ -236,12 +235,13 @@ def _update_states(self, frame: Image.Image, preds: np.ndarray, cam_key: str) -> return conf - def predict(self, frame: Image.Image, cam_id: Optional[str] = None) -> float: + def predict(self, frame: Image.Image, cam_id: str, pose_id: int) -> float: """Computes the confidence that the image contains wildfire cues Args: frame: a PIL image cam_id: the name of the camera that sent this image + pose_id (int) : position of the camera, for ptz camera Returns: the predicted confidence """ @@ -251,7 +251,7 @@ def predict(self, frame: Image.Image, cam_id: Optional[str] = None) -> float: try: self.heartbeat(cam_id) except ConnectionError: - logging.warning(f"Unable to reach the pyro-api with {cam_id}") + logging.exception(f"Unable to reach the pyro-api with {cam_id}") cam_key = cam_id or "-1" # Reduce image size to save bandwidth @@ -276,7 +276,7 @@ def predict(self, frame: Image.Image, cam_id: Optional[str] = None) -> float: self._states[cam_key]["last_predictions"] ): if not is_staged: - self._stage_alert(frame, cam_id, ts, localization) + self._stage_alert(frame, cam_id, pose_id, ts, localization) self._states[cam_key]["last_predictions"][idx] = frame, preds, localization, ts, True # Check if it's time to backup pending alerts @@ -286,16 +286,17 @@ def predict(self, frame: Image.Image, cam_id: Optional[str] = None) -> float: self.last_cache_dump = ts if self.save_captured_frames: - self._local_backup(frame_resize, cam_id, is_alert=False) + self._local_backup(frame_resize, cam_id, pose_id, is_alert=False) return float(conf) - def _stage_alert(self, frame: Image.Image, cam_id: str, ts: int, localization: list) -> None: + def _stage_alert(self, frame: Image.Image, cam_id: str, pose_id: int, ts: int, localization: list) -> None: # Store information in the queue self._alerts.append( { "frame": frame, "cam_id": cam_id, + "pose_id": pose_id, "ts": ts, "detection_id": None, "localization": localization, @@ -307,39 +308,47 @@ def _process_alerts(self) -> None: # try to upload the oldest element frame_info = self._alerts[0] cam_id = frame_info["cam_id"] + pose_id = frame_info["pose_id"] logging.info(f"Camera '{cam_id}' - Create detection from {frame_info['ts']}...") # Save alert on device - self._local_backup(frame_info["frame"], cam_id) + self._local_backup(frame_info["frame"], cam_id, pose_id) try: # Detection creation stream = io.BytesIO() frame_info["frame"].save(stream, format="JPEG", quality=self.jpeg_quality) response = self.api_client[cam_id].create_detection(stream.getvalue(), 123.2) + # Force a KeyError if the request failed - response.json()["id"] - # Clear + detection_id = response.json().get("id") + if detection_id is None: + raise KeyError(f"Missing 'id' in response from camera '{cam_id}'") # Clear self._alerts.popleft() logging.info(f"Camera '{cam_id}' - detection created") stream.seek(0) # "Rewind" the stream to the beginning so we can read its content except (KeyError, ConnectionError) as e: - logging.warning(f"Camera '{cam_id}' - unable to upload cache") - logging.warning(e) + logging.exception(f"Camera '{cam_id}' - unable to upload cache") + logging.exception(e) + break + except Exception as e: + logging.exception(f"Camera '{cam_id}' - unable to create detection") + logging.exception(e) break - def _local_backup(self, img: Image.Image, cam_id: Optional[str], is_alert: bool = True) -> None: + def _local_backup(self, img: Image.Image, cam_id: Optional[str], pose_id: int, is_alert: bool = True) -> None: """Save image on device Args: img (Image.Image): Image to save cam_id (str): camera id (ip address) + pose_id (int) : position of the camera, for ptz camera is_alert (bool): is the frame an alert ? """ folder = "alerts" if is_alert else "save" backup_cache = self._cache.joinpath(f"backup/{folder}/") self._clean_local_backup(backup_cache) # Dump old cache - backup_cache = backup_cache.joinpath(f"{time.strftime('%Y%m%d')}/{cam_id}") + backup_cache = backup_cache.joinpath(f"{time.strftime('%Y%m%d')}/{cam_id}/{pose_id}") backup_cache.mkdir(parents=True, exist_ok=True) file = backup_cache.joinpath(f"{time.strftime('%Y%m%d-%H%M%S')}.jpg") img.save(file) diff --git a/pyroengine/vision.py b/pyroengine/vision.py index 9bac5dc8..8fd53584 100644 --- a/pyroengine/vision.py +++ b/pyroengine/vision.py @@ -7,7 +7,7 @@ import os from typing import Optional, Tuple from urllib.request import urlretrieve - +import logging import numpy as np import onnxruntime from huggingface_hub import HfApi # type: ignore[import-untyped] @@ -57,9 +57,9 @@ def __init__(self, model_path: Optional[str] = "data/model.onnx", img_size: tupl # Load existing metadata metadata = self.load_metadata(METADATA_PATH) if metadata and metadata.get("sha256") == expected_sha256: - print("Model already exists and the SHA256 hash matches. No download needed.") + logging.info("Model already exists and the SHA256 hash matches. No download needed.") else: - print("Model exists but the SHA256 hash does not match or the file doesn't exist.") + logging.info("Model exists but the SHA256 hash does not match or the file doesn't exist.") os.remove(model_path) self.download_model(model_path, expected_sha256) else: @@ -81,15 +81,15 @@ def download_model(self, model_path, expected_sha256): os.makedirs(os.path.split(model_path)[0], exist_ok=True) # Download the model - print(f"Downloading model from {MODEL_URL} ...") + logging.info(f"Downloading model from {MODEL_URL} ...") with DownloadProgressBar(unit="B", unit_scale=True, miniters=1, desc=model_path) as t: urlretrieve(MODEL_URL, model_path, reporthook=t.update_to) - print("Model downloaded!") + logging.info("Model downloaded!") # Save the metadata metadata = {"sha256": expected_sha256} save_metadata(METADATA_PATH, metadata) - print("Metadata saved!") + logging.info("Metadata saved!") # Utility function to load metadata def load_metadata(self, metadata_path): diff --git a/src/control_reolink_cam.py b/src/control_reolink_cam.py index c928d4d6..a8c206cd 100644 --- a/src/control_reolink_cam.py +++ b/src/control_reolink_cam.py @@ -5,7 +5,7 @@ import argparse - +import logging from pyroengine.sensors import ReolinkCamera @@ -30,7 +30,7 @@ def main(): parser.add_argument("--duration", type=int, help="Duration in seconds for moving the camera", default=1) args = parser.parse_args() - print(args) + logging.info(args) # Create an instance of ReolinkCamera camera_controller = ReolinkCamera( @@ -43,25 +43,25 @@ def main(): if image is not None: image.save("im.jpg") else: - print("Failed to capture image.") + logging.info("Failed to capture image.") elif args.action == "move_camera": if args.operation: camera_controller.move_camera(operation=args.operation, speed=args.speed, idx=args.pos_id) else: - print("Operation type must be specified for moving the camera.") + logging.info("Operation type must be specified for moving the camera.") elif args.action == "move_in_seconds": if args.operation and args.duration: camera_controller.move_in_seconds(s=args.duration, operation=args.operation, speed=args.speed) else: - print("Operation type and duration must be specified for moving the camera.") + logging.info("Operation type and duration must be specified for moving the camera.") elif args.action == "get_ptz_preset": presets = camera_controller.get_ptz_preset() - print("PTZ Presets:", presets) + logging.info("PTZ Presets:", presets) elif args.action == "set_ptz_preset": if args.pos_id is not None: camera_controller.set_ptz_preset(idx=args.pos_id) else: - print("Position ID must be provided for setting a PTZ preset.") + logging.info("Position ID must be provided for setting a PTZ preset.") if __name__ == "__main__": diff --git a/src/poetry.lock b/src/poetry.lock index ec4c8e49..66d86c84 100644 --- a/src/poetry.lock +++ b/src/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. [[package]] name = "certifi" @@ -167,13 +167,13 @@ files = [ [[package]] name = "fsspec" -version = "2024.6.0" +version = "2024.6.1" description = "File-system specification" optional = false python-versions = ">=3.8" files = [ - {file = "fsspec-2024.6.0-py3-none-any.whl", hash = "sha256:58d7122eb8a1a46f7f13453187bfea4972d66bf01618d37366521b1998034cee"}, - {file = "fsspec-2024.6.0.tar.gz", hash = "sha256:f579960a56e6d8038a9efc8f9c77279ec12e6299aa86b0769a7e9c46b94527c2"}, + {file = "fsspec-2024.6.1-py3-none-any.whl", hash = "sha256:3cb443f8bcd2efb31295a5b9fdb02aee81d8452c80d28f97a6d0959e6cee101e"}, + {file = "fsspec-2024.6.1.tar.gz", hash = "sha256:fad7d7e209dd4c1208e3bbfda706620e0da5142bebbd9c384afb95b07e798e49"}, ] [package.extras] @@ -319,42 +319,42 @@ files = [ [[package]] name = "onnxruntime" -version = "1.18.0" +version = "1.18.1" description = "ONNX Runtime is a runtime accelerator for Machine Learning models" optional = false python-versions = "*" files = [ - {file = "onnxruntime-1.18.0-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:5a3b7993a5ecf4a90f35542a4757e29b2d653da3efe06cdd3164b91167bbe10d"}, - {file = "onnxruntime-1.18.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:15b944623b2cdfe7f7945690bfb71c10a4531b51997c8320b84e7b0bb59af902"}, - {file = "onnxruntime-1.18.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e61ce5005118064b1a0ed73ebe936bc773a102f067db34108ea6c64dd62a179"}, - {file = "onnxruntime-1.18.0-cp310-cp310-win32.whl", hash = "sha256:a4fc8a2a526eb442317d280610936a9f73deece06c7d5a91e51570860802b93f"}, - {file = "onnxruntime-1.18.0-cp310-cp310-win_amd64.whl", hash = "sha256:71ed219b768cab004e5cd83e702590734f968679bf93aa488c1a7ffbe6e220c3"}, - {file = "onnxruntime-1.18.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:3d24bd623872a72a7fe2f51c103e20fcca2acfa35d48f2accd6be1ec8633d960"}, - {file = "onnxruntime-1.18.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f15e41ca9b307a12550bfd2ec93f88905d9fba12bab7e578f05138ad0ae10d7b"}, - {file = "onnxruntime-1.18.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1f45ca2887f62a7b847d526965686b2923efa72538c89b7703c7b3fe970afd59"}, - {file = "onnxruntime-1.18.0-cp311-cp311-win32.whl", hash = "sha256:9e24d9ecc8781323d9e2eeda019b4b24babc4d624e7d53f61b1fe1a929b0511a"}, - {file = "onnxruntime-1.18.0-cp311-cp311-win_amd64.whl", hash = "sha256:f8608398976ed18aef450d83777ff6f77d0b64eced1ed07a985e1a7db8ea3771"}, - {file = "onnxruntime-1.18.0-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:f1d79941f15fc40b1ee67738b2ca26b23e0181bf0070b5fb2984f0988734698f"}, - {file = "onnxruntime-1.18.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:99e8caf3a8565c853a22d323a3eebc2a81e3de7591981f085a4f74f7a60aab2d"}, - {file = "onnxruntime-1.18.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:498d2b8380635f5e6ebc50ec1b45f181588927280f32390fb910301d234f97b8"}, - {file = "onnxruntime-1.18.0-cp312-cp312-win32.whl", hash = "sha256:ba7cc0ce2798a386c082aaa6289ff7e9bedc3dee622eef10e74830cff200a72e"}, - {file = "onnxruntime-1.18.0-cp312-cp312-win_amd64.whl", hash = "sha256:1fa175bd43f610465d5787ae06050c81f7ce09da2bf3e914eb282cb8eab363ef"}, - {file = "onnxruntime-1.18.0-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:0284c579c20ec8b1b472dd190290a040cc68b6caec790edb960f065d15cf164a"}, - {file = "onnxruntime-1.18.0-cp38-cp38-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d47353d036d8c380558a5643ea5f7964d9d259d31c86865bad9162c3e916d1f6"}, - {file = "onnxruntime-1.18.0-cp38-cp38-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:885509d2b9ba4b01f08f7fa28d31ee54b6477953451c7ccf124a84625f07c803"}, - {file = "onnxruntime-1.18.0-cp38-cp38-win32.whl", hash = "sha256:8614733de3695656411d71fc2f39333170df5da6c7efd6072a59962c0bc7055c"}, - {file = "onnxruntime-1.18.0-cp38-cp38-win_amd64.whl", hash = "sha256:47af3f803752fce23ea790fd8d130a47b2b940629f03193f780818622e856e7a"}, - {file = "onnxruntime-1.18.0-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:9153eb2b4d5bbab764d0aea17adadffcfc18d89b957ad191b1c3650b9930c59f"}, - {file = "onnxruntime-1.18.0-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2c7fd86eca727c989bb8d9c5104f3c45f7ee45f445cc75579ebe55d6b99dfd7c"}, - {file = "onnxruntime-1.18.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ac67a4de9c1326c4d87bcbfb652c923039b8a2446bb28516219236bec3b494f5"}, - {file = "onnxruntime-1.18.0-cp39-cp39-win32.whl", hash = "sha256:6ffb445816d06497df7a6dd424b20e0b2c39639e01e7fe210e247b82d15a23b9"}, - {file = "onnxruntime-1.18.0-cp39-cp39-win_amd64.whl", hash = "sha256:46de6031cb6745f33f7eca9e51ab73e8c66037fb7a3b6b4560887c5b55ab5d5d"}, + {file = "onnxruntime-1.18.1-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:29ef7683312393d4ba04252f1b287d964bd67d5e6048b94d2da3643986c74d80"}, + {file = "onnxruntime-1.18.1-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fc706eb1df06ddf55776e15a30519fb15dda7697f987a2bbda4962845e3cec05"}, + {file = "onnxruntime-1.18.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7de69f5ced2a263531923fa68bbec52a56e793b802fcd81a03487b5e292bc3a"}, + {file = "onnxruntime-1.18.1-cp310-cp310-win32.whl", hash = "sha256:221e5b16173926e6c7de2cd437764492aa12b6811f45abd37024e7cf2ae5d7e3"}, + {file = "onnxruntime-1.18.1-cp310-cp310-win_amd64.whl", hash = "sha256:75211b619275199c861ee94d317243b8a0fcde6032e5a80e1aa9ded8ab4c6060"}, + {file = "onnxruntime-1.18.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:f26582882f2dc581b809cfa41a125ba71ad9e715738ec6402418df356969774a"}, + {file = "onnxruntime-1.18.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef36f3a8b768506d02be349ac303fd95d92813ba3ba70304d40c3cd5c25d6a4c"}, + {file = "onnxruntime-1.18.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:170e711393e0618efa8ed27b59b9de0ee2383bd2a1f93622a97006a5ad48e434"}, + {file = "onnxruntime-1.18.1-cp311-cp311-win32.whl", hash = "sha256:9b6a33419b6949ea34e0dc009bc4470e550155b6da644571ecace4b198b0d88f"}, + {file = "onnxruntime-1.18.1-cp311-cp311-win_amd64.whl", hash = "sha256:5c1380a9f1b7788da742c759b6a02ba771fe1ce620519b2b07309decbd1a2fe1"}, + {file = "onnxruntime-1.18.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:31bd57a55e3f983b598675dfc7e5d6f0877b70ec9864b3cc3c3e1923d0a01919"}, + {file = "onnxruntime-1.18.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b9e03c4ba9f734500691a4d7d5b381cd71ee2f3ce80a1154ac8f7aed99d1ecaa"}, + {file = "onnxruntime-1.18.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:781aa9873640f5df24524f96f6070b8c550c66cb6af35710fd9f92a20b4bfbf6"}, + {file = "onnxruntime-1.18.1-cp312-cp312-win32.whl", hash = "sha256:3a2d9ab6254ca62adbb448222e630dc6883210f718065063518c8f93a32432be"}, + {file = "onnxruntime-1.18.1-cp312-cp312-win_amd64.whl", hash = "sha256:ad93c560b1c38c27c0275ffd15cd7f45b3ad3fc96653c09ce2931179982ff204"}, + {file = "onnxruntime-1.18.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:3b55dc9d3c67626388958a3eb7ad87eb7c70f75cb0f7ff4908d27b8b42f2475c"}, + {file = "onnxruntime-1.18.1-cp38-cp38-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f80dbcfb6763cc0177a31168b29b4bd7662545b99a19e211de8c734b657e0669"}, + {file = "onnxruntime-1.18.1-cp38-cp38-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f1ff2c61a16d6c8631796c54139bafea41ee7736077a0fc64ee8ae59432f5c58"}, + {file = "onnxruntime-1.18.1-cp38-cp38-win32.whl", hash = "sha256:219855bd272fe0c667b850bf1a1a5a02499269a70d59c48e6f27f9c8bcb25d02"}, + {file = "onnxruntime-1.18.1-cp38-cp38-win_amd64.whl", hash = "sha256:afdf16aa607eb9a2c60d5ca2d5abf9f448e90c345b6b94c3ed14f4fb7e6a2d07"}, + {file = "onnxruntime-1.18.1-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:128df253ade673e60cea0955ec9d0e89617443a6d9ce47c2d79eb3f72a3be3de"}, + {file = "onnxruntime-1.18.1-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9839491e77e5c5a175cab3621e184d5a88925ee297ff4c311b68897197f4cde9"}, + {file = "onnxruntime-1.18.1-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ad3187c1faff3ac15f7f0e7373ef4788c582cafa655a80fdbb33eaec88976c66"}, + {file = "onnxruntime-1.18.1-cp39-cp39-win32.whl", hash = "sha256:34657c78aa4e0b5145f9188b550ded3af626651b15017bf43d280d7e23dbf195"}, + {file = "onnxruntime-1.18.1-cp39-cp39-win_amd64.whl", hash = "sha256:9c14fd97c3ddfa97da5feef595e2c73f14c2d0ec1d4ecbea99c8d96603c89589"}, ] [package.dependencies] coloredlogs = "*" flatbuffers = "*" -numpy = ">=1.21.6" +numpy = ">=1.21.6,<2.0" packaging = "*" protobuf = "*" sympy = "*" @@ -417,84 +417,95 @@ files = [ [[package]] name = "pillow" -version = "10.3.0" +version = "10.4.0" description = "Python Imaging Library (Fork)" optional = false python-versions = ">=3.8" files = [ - {file = "pillow-10.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:90b9e29824800e90c84e4022dd5cc16eb2d9605ee13f05d47641eb183cd73d45"}, - {file = "pillow-10.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a2c405445c79c3f5a124573a051062300936b0281fee57637e706453e452746c"}, - {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78618cdbccaa74d3f88d0ad6cb8ac3007f1a6fa5c6f19af64b55ca170bfa1edf"}, - {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261ddb7ca91fcf71757979534fb4c128448b5b4c55cb6152d280312062f69599"}, - {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:ce49c67f4ea0609933d01c0731b34b8695a7a748d6c8d186f95e7d085d2fe475"}, - {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b14f16f94cbc61215115b9b1236f9c18403c15dd3c52cf629072afa9d54c1cbf"}, - {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d33891be6df59d93df4d846640f0e46f1a807339f09e79a8040bc887bdcd7ed3"}, - {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b50811d664d392f02f7761621303eba9d1b056fb1868c8cdf4231279645c25f5"}, - {file = "pillow-10.3.0-cp310-cp310-win32.whl", hash = "sha256:ca2870d5d10d8726a27396d3ca4cf7976cec0f3cb706debe88e3a5bd4610f7d2"}, - {file = "pillow-10.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:f0d0591a0aeaefdaf9a5e545e7485f89910c977087e7de2b6c388aec32011e9f"}, - {file = "pillow-10.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:ccce24b7ad89adb5a1e34a6ba96ac2530046763912806ad4c247356a8f33a67b"}, - {file = "pillow-10.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:5f77cf66e96ae734717d341c145c5949c63180842a545c47a0ce7ae52ca83795"}, - {file = "pillow-10.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e4b878386c4bf293578b48fc570b84ecfe477d3b77ba39a6e87150af77f40c57"}, - {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdcbb4068117dfd9ce0138d068ac512843c52295ed996ae6dd1faf537b6dbc27"}, - {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9797a6c8fe16f25749b371c02e2ade0efb51155e767a971c61734b1bf6293994"}, - {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:9e91179a242bbc99be65e139e30690e081fe6cb91a8e77faf4c409653de39451"}, - {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:1b87bd9d81d179bd8ab871603bd80d8645729939f90b71e62914e816a76fc6bd"}, - {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:81d09caa7b27ef4e61cb7d8fbf1714f5aec1c6b6c5270ee53504981e6e9121ad"}, - {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:048ad577748b9fa4a99a0548c64f2cb8d672d5bf2e643a739ac8faff1164238c"}, - {file = "pillow-10.3.0-cp311-cp311-win32.whl", hash = "sha256:7161ec49ef0800947dc5570f86568a7bb36fa97dd09e9827dc02b718c5643f09"}, - {file = "pillow-10.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:8eb0908e954d093b02a543dc963984d6e99ad2b5e36503d8a0aaf040505f747d"}, - {file = "pillow-10.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:4e6f7d1c414191c1199f8996d3f2282b9ebea0945693fb67392c75a3a320941f"}, - {file = "pillow-10.3.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:e46f38133e5a060d46bd630faa4d9fa0202377495df1f068a8299fd78c84de84"}, - {file = "pillow-10.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:50b8eae8f7334ec826d6eeffaeeb00e36b5e24aa0b9df322c247539714c6df19"}, - {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d3bea1c75f8c53ee4d505c3e67d8c158ad4df0d83170605b50b64025917f338"}, - {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19aeb96d43902f0a783946a0a87dbdad5c84c936025b8419da0a0cd7724356b1"}, - {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:74d28c17412d9caa1066f7a31df8403ec23d5268ba46cd0ad2c50fb82ae40462"}, - {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:ff61bfd9253c3915e6d41c651d5f962da23eda633cf02262990094a18a55371a"}, - {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d886f5d353333b4771d21267c7ecc75b710f1a73d72d03ca06df49b09015a9ef"}, - {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4b5ec25d8b17217d635f8935dbc1b9aa5907962fae29dff220f2659487891cd3"}, - {file = "pillow-10.3.0-cp312-cp312-win32.whl", hash = "sha256:51243f1ed5161b9945011a7360e997729776f6e5d7005ba0c6879267d4c5139d"}, - {file = "pillow-10.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:412444afb8c4c7a6cc11a47dade32982439925537e483be7c0ae0cf96c4f6a0b"}, - {file = "pillow-10.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:798232c92e7665fe82ac085f9d8e8ca98826f8e27859d9a96b41d519ecd2e49a"}, - {file = "pillow-10.3.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:4eaa22f0d22b1a7e93ff0a596d57fdede2e550aecffb5a1ef1106aaece48e96b"}, - {file = "pillow-10.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cd5e14fbf22a87321b24c88669aad3a51ec052eb145315b3da3b7e3cc105b9a2"}, - {file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1530e8f3a4b965eb6a7785cf17a426c779333eb62c9a7d1bbcf3ffd5bf77a4aa"}, - {file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d512aafa1d32efa014fa041d38868fda85028e3f930a96f85d49c7d8ddc0383"}, - {file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:339894035d0ede518b16073bdc2feef4c991ee991a29774b33e515f1d308e08d"}, - {file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:aa7e402ce11f0885305bfb6afb3434b3cd8f53b563ac065452d9d5654c7b86fd"}, - {file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0ea2a783a2bdf2a561808fe4a7a12e9aa3799b701ba305de596bc48b8bdfce9d"}, - {file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c78e1b00a87ce43bb37642c0812315b411e856a905d58d597750eb79802aaaa3"}, - {file = "pillow-10.3.0-cp38-cp38-win32.whl", hash = "sha256:72d622d262e463dfb7595202d229f5f3ab4b852289a1cd09650362db23b9eb0b"}, - {file = "pillow-10.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:2034f6759a722da3a3dbd91a81148cf884e91d1b747992ca288ab88c1de15999"}, - {file = "pillow-10.3.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:2ed854e716a89b1afcedea551cd85f2eb2a807613752ab997b9974aaa0d56936"}, - {file = "pillow-10.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dc1a390a82755a8c26c9964d457d4c9cbec5405896cba94cf51f36ea0d855002"}, - {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4203efca580f0dd6f882ca211f923168548f7ba334c189e9eab1178ab840bf60"}, - {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3102045a10945173d38336f6e71a8dc71bcaeed55c3123ad4af82c52807b9375"}, - {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:6fb1b30043271ec92dc65f6d9f0b7a830c210b8a96423074b15c7bc999975f57"}, - {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:1dfc94946bc60ea375cc39cff0b8da6c7e5f8fcdc1d946beb8da5c216156ddd8"}, - {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b09b86b27a064c9624d0a6c54da01c1beaf5b6cadfa609cf63789b1d08a797b9"}, - {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d3b2348a78bc939b4fed6552abfd2e7988e0f81443ef3911a4b8498ca084f6eb"}, - {file = "pillow-10.3.0-cp39-cp39-win32.whl", hash = "sha256:45ebc7b45406febf07fef35d856f0293a92e7417ae7933207e90bf9090b70572"}, - {file = "pillow-10.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:0ba26351b137ca4e0db0342d5d00d2e355eb29372c05afd544ebf47c0956ffeb"}, - {file = "pillow-10.3.0-cp39-cp39-win_arm64.whl", hash = "sha256:50fd3f6b26e3441ae07b7c979309638b72abc1a25da31a81a7fbd9495713ef4f"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:6b02471b72526ab8a18c39cb7967b72d194ec53c1fd0a70b050565a0f366d355"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8ab74c06ffdab957d7670c2a5a6e1a70181cd10b727cd788c4dd9005b6a8acd9"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:048eeade4c33fdf7e08da40ef402e748df113fd0b4584e32c4af74fe78baaeb2"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e2ec1e921fd07c7cda7962bad283acc2f2a9ccc1b971ee4b216b75fad6f0463"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:4c8e73e99da7db1b4cad7f8d682cf6abad7844da39834c288fbfa394a47bbced"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:16563993329b79513f59142a6b02055e10514c1a8e86dca8b48a893e33cf91e3"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:dd78700f5788ae180b5ee8902c6aea5a5726bac7c364b202b4b3e3ba2d293170"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:aff76a55a8aa8364d25400a210a65ff59d0168e0b4285ba6bf2bd83cf675ba32"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:b7bc2176354defba3edc2b9a777744462da2f8e921fbaf61e52acb95bafa9828"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:793b4e24db2e8742ca6423d3fde8396db336698c55cd34b660663ee9e45ed37f"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d93480005693d247f8346bc8ee28c72a2191bdf1f6b5db469c096c0c867ac015"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c83341b89884e2b2e55886e8fbbf37c3fa5efd6c8907124aeb72f285ae5696e5"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1a1d1915db1a4fdb2754b9de292642a39a7fb28f1736699527bb649484fb966a"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a0eaa93d054751ee9964afa21c06247779b90440ca41d184aeb5d410f20ff591"}, - {file = "pillow-10.3.0.tar.gz", hash = "sha256:9d2455fbf44c914840c793e89aa82d0e1763a14253a000743719ae5946814b2d"}, + {file = "pillow-10.4.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e"}, + {file = "pillow-10.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7928ecbf1ece13956b95d9cbcfc77137652b02763ba384d9ab508099a2eca856"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4d49b85c4348ea0b31ea63bc75a9f3857869174e2bf17e7aba02945cd218e6f"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:6c762a5b0997f5659a5ef2266abc1d8851ad7749ad9a6a5506eb23d314e4f46b"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a985e028fc183bf12a77a8bbf36318db4238a3ded7fa9df1b9a133f1cb79f8fc"}, + {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:812f7342b0eee081eaec84d91423d1b4650bb9828eb53d8511bcef8ce5aecf1e"}, + {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ac1452d2fbe4978c2eec89fb5a23b8387aba707ac72810d9490118817d9c0b46"}, + {file = "pillow-10.4.0-cp310-cp310-win32.whl", hash = "sha256:bcd5e41a859bf2e84fdc42f4edb7d9aba0a13d29a2abadccafad99de3feff984"}, + {file = "pillow-10.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:ecd85a8d3e79cd7158dec1c9e5808e821feea088e2f69a974db5edf84dc53141"}, + {file = "pillow-10.4.0-cp310-cp310-win_arm64.whl", hash = "sha256:ff337c552345e95702c5fde3158acb0625111017d0e5f24bf3acdb9cc16b90d1"}, + {file = "pillow-10.4.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:0a9ec697746f268507404647e531e92889890a087e03681a3606d9b920fbee3c"}, + {file = "pillow-10.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe91cb65544a1321e631e696759491ae04a2ea11d36715eca01ce07284738be"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dc6761a6efc781e6a1544206f22c80c3af4c8cf461206d46a1e6006e4429ff3"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e84b6cc6a4a3d76c153a6b19270b3526a5a8ed6b09501d3af891daa2a9de7d6"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:bbc527b519bd3aa9d7f429d152fea69f9ad37c95f0b02aebddff592688998abe"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:76a911dfe51a36041f2e756b00f96ed84677cdeb75d25c767f296c1c1eda1319"}, + {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:59291fb29317122398786c2d44427bbd1a6d7ff54017075b22be9d21aa59bd8d"}, + {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:416d3a5d0e8cfe4f27f574362435bc9bae57f679a7158e0096ad2beb427b8696"}, + {file = "pillow-10.4.0-cp311-cp311-win32.whl", hash = "sha256:7086cc1d5eebb91ad24ded9f58bec6c688e9f0ed7eb3dbbf1e4800280a896496"}, + {file = "pillow-10.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cbed61494057c0f83b83eb3a310f0bf774b09513307c434d4366ed64f4128a91"}, + {file = "pillow-10.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:f5f0c3e969c8f12dd2bb7e0b15d5c468b51e5017e01e2e867335c81903046a22"}, + {file = "pillow-10.4.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94"}, + {file = "pillow-10.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29dbdc4207642ea6aad70fbde1a9338753d33fb23ed6956e706936706f52dd80"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf2342ac639c4cf38799a44950bbc2dfcb685f052b9e262f446482afaf4bffca"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:f5b92f4d70791b4a67157321c4e8225d60b119c5cc9aee8ecf153aace4aad4ef"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:86dcb5a1eb778d8b25659d5e4341269e8590ad6b4e8b44d9f4b07f8d136c414a"}, + {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:780c072c2e11c9b2c7ca37f9a2ee8ba66f44367ac3e5c7832afcfe5104fd6d1b"}, + {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:37fb69d905be665f68f28a8bba3c6d3223c8efe1edf14cc4cfa06c241f8c81d9"}, + {file = "pillow-10.4.0-cp312-cp312-win32.whl", hash = "sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42"}, + {file = "pillow-10.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a"}, + {file = "pillow-10.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9"}, + {file = "pillow-10.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8bc1a764ed8c957a2e9cacf97c8b2b053b70307cf2996aafd70e91a082e70df3"}, + {file = "pillow-10.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6209bb41dc692ddfee4942517c19ee81b86c864b626dbfca272ec0f7cff5d9fb"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bee197b30783295d2eb680b311af15a20a8b24024a19c3a26431ff83eb8d1f70"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ef61f5dd14c300786318482456481463b9d6b91ebe5ef12f405afbba77ed0be"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:297e388da6e248c98bc4a02e018966af0c5f92dfacf5a5ca22fa01cb3179bca0"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:e4db64794ccdf6cb83a59d73405f63adbe2a1887012e308828596100a0b2f6cc"}, + {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd2880a07482090a3bcb01f4265f1936a903d70bc740bfcb1fd4e8a2ffe5cf5a"}, + {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b35b21b819ac1dbd1233317adeecd63495f6babf21b7b2512d244ff6c6ce309"}, + {file = "pillow-10.4.0-cp313-cp313-win32.whl", hash = "sha256:551d3fd6e9dc15e4c1eb6fc4ba2b39c0c7933fa113b220057a34f4bb3268a060"}, + {file = "pillow-10.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:030abdbe43ee02e0de642aee345efa443740aa4d828bfe8e2eb11922ea6a21ea"}, + {file = "pillow-10.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:5b001114dd152cfd6b23befeb28d7aee43553e2402c9f159807bf55f33af8a8d"}, + {file = "pillow-10.4.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:8d4d5063501b6dd4024b8ac2f04962d661222d120381272deea52e3fc52d3736"}, + {file = "pillow-10.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7c1ee6f42250df403c5f103cbd2768a28fe1a0ea1f0f03fe151c8741e1469c8b"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b15e02e9bb4c21e39876698abf233c8c579127986f8207200bc8a8f6bb27acf2"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a8d4bade9952ea9a77d0c3e49cbd8b2890a399422258a77f357b9cc9be8d680"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:43efea75eb06b95d1631cb784aa40156177bf9dd5b4b03ff38979e048258bc6b"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:950be4d8ba92aca4b2bb0741285a46bfae3ca699ef913ec8416c1b78eadd64cd"}, + {file = "pillow-10.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d7480af14364494365e89d6fddc510a13e5a2c3584cb19ef65415ca57252fb84"}, + {file = "pillow-10.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:73664fe514b34c8f02452ffb73b7a92c6774e39a647087f83d67f010eb9a0cf0"}, + {file = "pillow-10.4.0-cp38-cp38-win32.whl", hash = "sha256:e88d5e6ad0d026fba7bdab8c3f225a69f063f116462c49892b0149e21b6c0a0e"}, + {file = "pillow-10.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:5161eef006d335e46895297f642341111945e2c1c899eb406882a6c61a4357ab"}, + {file = "pillow-10.4.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0ae24a547e8b711ccaaf99c9ae3cd975470e1a30caa80a6aaee9a2f19c05701d"}, + {file = "pillow-10.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:298478fe4f77a4408895605f3482b6cc6222c018b2ce565c2b6b9c354ac3229b"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:134ace6dc392116566980ee7436477d844520a26a4b1bd4053f6f47d096997fd"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:930044bb7679ab003b14023138b50181899da3f25de50e9dbee23b61b4de2126"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:c76e5786951e72ed3686e122d14c5d7012f16c8303a674d18cdcd6d89557fc5b"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b2724fdb354a868ddf9a880cb84d102da914e99119211ef7ecbdc613b8c96b3c"}, + {file = "pillow-10.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dbc6ae66518ab3c5847659e9988c3b60dc94ffb48ef9168656e0019a93dbf8a1"}, + {file = "pillow-10.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:06b2f7898047ae93fad74467ec3d28fe84f7831370e3c258afa533f81ef7f3df"}, + {file = "pillow-10.4.0-cp39-cp39-win32.whl", hash = "sha256:7970285ab628a3779aecc35823296a7869f889b8329c16ad5a71e4901a3dc4ef"}, + {file = "pillow-10.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:961a7293b2457b405967af9c77dcaa43cc1a8cd50d23c532e62d48ab6cdd56f5"}, + {file = "pillow-10.4.0-cp39-cp39-win_arm64.whl", hash = "sha256:32cda9e3d601a52baccb2856b8ea1fc213c90b340c542dcef77140dfa3278a9e"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5b4815f2e65b30f5fbae9dfffa8636d992d49705723fe86a3661806e069352d4"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8f0aef4ef59694b12cadee839e2ba6afeab89c0f39a3adc02ed51d109117b8da"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f4727572e2918acaa9077c919cbbeb73bd2b3ebcfe033b72f858fc9fbef0026"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff25afb18123cea58a591ea0244b92eb1e61a1fd497bf6d6384f09bc3262ec3e"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dc3e2db6ba09ffd7d02ae9141cfa0ae23393ee7687248d46a7507b75d610f4f5"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:02a2be69f9c9b8c1e97cf2713e789d4e398c751ecfd9967c18d0ce304efbf885"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:0755ffd4a0c6f267cccbae2e9903d95477ca2f77c4fcf3a3a09570001856c8a5"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:a02364621fe369e06200d4a16558e056fe2805d3468350df3aef21e00d26214b"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:1b5dea9831a90e9d0721ec417a80d4cbd7022093ac38a568db2dd78363b00908"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b885f89040bb8c4a1573566bbb2f44f5c505ef6e74cec7ab9068c900047f04b"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87dd88ded2e6d74d31e1e0a99a726a6765cda32d00ba72dc37f0651f306daaa8"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:2db98790afc70118bd0255c2eeb465e9767ecf1f3c25f9a1abb8ffc8cfd1fe0a"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f7baece4ce06bade126fb84b8af1c33439a76d8a6fd818970215e0560ca28c27"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:cfdd747216947628af7b259d274771d84db2268ca062dd5faf373639d00113a3"}, + {file = "pillow-10.4.0.tar.gz", hash = "sha256:166c1cd4d24309b30d61f79f4a9114b7b2313d7450912277855ff5dfd7cd4a06"}, ] [package.extras] -docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] +docs = ["furo", "olefile", "sphinx (>=7.3)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"] fpx = ["olefile"] mic = ["olefile"] tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] @@ -503,22 +514,22 @@ xmp = ["defusedxml"] [[package]] name = "protobuf" -version = "5.27.1" +version = "5.27.2" description = "" optional = false python-versions = ">=3.8" files = [ - {file = "protobuf-5.27.1-cp310-abi3-win32.whl", hash = "sha256:3adc15ec0ff35c5b2d0992f9345b04a540c1e73bfee3ff1643db43cc1d734333"}, - {file = "protobuf-5.27.1-cp310-abi3-win_amd64.whl", hash = "sha256:25236b69ab4ce1bec413fd4b68a15ef8141794427e0b4dc173e9d5d9dffc3bcd"}, - {file = "protobuf-5.27.1-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:4e38fc29d7df32e01a41cf118b5a968b1efd46b9c41ff515234e794011c78b17"}, - {file = "protobuf-5.27.1-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:917ed03c3eb8a2d51c3496359f5b53b4e4b7e40edfbdd3d3f34336e0eef6825a"}, - {file = "protobuf-5.27.1-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:ee52874a9e69a30271649be88ecbe69d374232e8fd0b4e4b0aaaa87f429f1631"}, - {file = "protobuf-5.27.1-cp38-cp38-win32.whl", hash = "sha256:7a97b9c5aed86b9ca289eb5148df6c208ab5bb6906930590961e08f097258107"}, - {file = "protobuf-5.27.1-cp38-cp38-win_amd64.whl", hash = "sha256:f6abd0f69968792da7460d3c2cfa7d94fd74e1c21df321eb6345b963f9ec3d8d"}, - {file = "protobuf-5.27.1-cp39-cp39-win32.whl", hash = "sha256:dfddb7537f789002cc4eb00752c92e67885badcc7005566f2c5de9d969d3282d"}, - {file = "protobuf-5.27.1-cp39-cp39-win_amd64.whl", hash = "sha256:39309898b912ca6febb0084ea912e976482834f401be35840a008da12d189340"}, - {file = "protobuf-5.27.1-py3-none-any.whl", hash = "sha256:4ac7249a1530a2ed50e24201d6630125ced04b30619262f06224616e0030b6cf"}, - {file = "protobuf-5.27.1.tar.gz", hash = "sha256:df5e5b8e39b7d1c25b186ffdf9f44f40f810bbcc9d2b71d9d3156fee5a9adf15"}, + {file = "protobuf-5.27.2-cp310-abi3-win32.whl", hash = "sha256:354d84fac2b0d76062e9b3221f4abbbacdfd2a4d8af36bab0474f3a0bb30ab38"}, + {file = "protobuf-5.27.2-cp310-abi3-win_amd64.whl", hash = "sha256:0e341109c609749d501986b835f667c6e1e24531096cff9d34ae411595e26505"}, + {file = "protobuf-5.27.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:a109916aaac42bff84702fb5187f3edadbc7c97fc2c99c5ff81dd15dcce0d1e5"}, + {file = "protobuf-5.27.2-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:176c12b1f1c880bf7a76d9f7c75822b6a2bc3db2d28baa4d300e8ce4cde7409b"}, + {file = "protobuf-5.27.2-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:b848dbe1d57ed7c191dfc4ea64b8b004a3f9ece4bf4d0d80a367b76df20bf36e"}, + {file = "protobuf-5.27.2-cp38-cp38-win32.whl", hash = "sha256:4fadd8d83e1992eed0248bc50a4a6361dc31bcccc84388c54c86e530b7f58863"}, + {file = "protobuf-5.27.2-cp38-cp38-win_amd64.whl", hash = "sha256:610e700f02469c4a997e58e328cac6f305f649826853813177e6290416e846c6"}, + {file = "protobuf-5.27.2-cp39-cp39-win32.whl", hash = "sha256:9e8f199bf7f97bd7ecebffcae45ebf9527603549b2b562df0fbc6d4d688f14ca"}, + {file = "protobuf-5.27.2-cp39-cp39-win_amd64.whl", hash = "sha256:7fc3add9e6003e026da5fc9e59b131b8f22b428b991ccd53e2af8071687b4fce"}, + {file = "protobuf-5.27.2-py3-none-any.whl", hash = "sha256:54330f07e4949d09614707c48b06d1a22f8ffb5763c159efd5c0928326a91470"}, + {file = "protobuf-5.27.2.tar.gz", hash = "sha256:f3ecdef226b9af856075f28227ff2c90ce3a594d092c39bee5513573f25e2714"}, ] [[package]] @@ -545,16 +556,16 @@ develop = false requests = ">=2.31.0,<3.0.0" [package.extras] -dev = ["Jinja2 (<3.1)", "black (==23.3.0)", "docutils (<0.18)", "furo (>=2022.3.4)", "mypy (==1.4.1)", "pytest (>=5.3.2)", "pytest-cov (>=3.0.0,<5.0.0)", "pytest-pretty (>=1.0.0,<2.0.0)", "pytest-xdist (>=2.0.0,<4.0.0)", "ruff (==0.0.290)", "sphinx (>=3.0.0,!=3.5.0)", "sphinx-copybutton (>=0.3.1)", "sphinxemoji (>=0.1.8)"] +dev = ["Jinja2 (<3.1)", "docutils (<0.18)", "furo (>=2022.3.4)", "mypy (==1.4.1)", "pytest (>=5.3.2)", "pytest-cov (>=3.0.0,<5.0.0)", "pytest-pretty (>=1.0.0,<2.0.0)", "sphinx (>=3.0.0,!=3.5.0)", "sphinx-copybutton (>=0.3.1)", "sphinxemoji (>=0.1.8)"] docs = ["Jinja2 (<3.1)", "docutils (<0.18)", "furo (>=2022.3.4)", "sphinx (>=3.0.0,!=3.5.0)", "sphinx-copybutton (>=0.3.1)", "sphinxemoji (>=0.1.8)"] -quality = ["black (==23.3.0)", "mypy (==1.4.1)", "ruff (==0.0.290)"] -test = ["pytest (>=5.3.2)", "pytest-cov (>=3.0.0,<5.0.0)", "pytest-pretty (>=1.0.0,<2.0.0)", "pytest-xdist (>=2.0.0,<4.0.0)"] +quality = ["mypy (==1.4.1)"] +test = ["pytest (>=5.3.2)", "pytest-cov (>=3.0.0,<5.0.0)", "pytest-pretty (>=1.0.0,<2.0.0)"] [package.source] type = "git" url = "https://github.com/pyronear/pyro-api.git" -reference = "767be30a781b52b29d68579d543e3f45ac8c4713" -resolved_reference = "767be30a781b52b29d68579d543e3f45ac8c4713" +reference = "e3198fbb358013cca671b969372a0245848eec03" +resolved_reference = "e3198fbb358013cca671b969372a0245848eec03" subdirectory = "client" [[package]] @@ -741,4 +752,4 @@ zstd = ["zstandard (>=0.18.0)"] [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "f3a09ed219569aaca9e560ec4da8e73bc3a15209cdc1a69c65b9aeb6b15e9ef3" +content-hash = "27666dec769a2d77e0fc365de5e9aa67181f751a059616d254dc57782d5371b8" diff --git a/src/pyproject.toml b/src/pyproject.toml index fe3b3242..fff31470 100644 --- a/src/pyproject.toml +++ b/src/pyproject.toml @@ -11,7 +11,7 @@ license = "Apache-2.0" [tool.poetry.dependencies] python = "^3.8" -pyroclient = { git = "https://github.com/pyronear/pyro-api.git", rev = "767be30a781b52b29d68579d543e3f45ac8c4713", subdirectory = "client" } +pyroclient = { git = "https://github.com/pyronear/pyro-api.git", rev = "21e83622c0b057d3ae767c8a8061130e267d8a8a", subdirectory = "client" } pyroengine = "^0.2.0" python-dotenv = ">=0.15.0" opencv-python = "^4.5.5.64" diff --git a/src/requirements.txt b/src/requirements.txt index 1065651b..45d4c561 100644 --- a/src/requirements.txt +++ b/src/requirements.txt @@ -4,19 +4,19 @@ colorama==0.4.6 ; python_version >= "3.8" and python_version < "4" and platform_ coloredlogs==15.0.1 ; python_version >= "3.8" and python_version < "4" filelock==3.15.4 ; python_version >= "3.8" and python_version < "4" flatbuffers==24.3.25 ; python_version >= "3.8" and python_version < "4" -fsspec==2024.6.0 ; python_version >= "3.8" and python_version < "4" +fsspec==2024.6.1 ; python_version >= "3.8" and python_version < "4" huggingface-hub==0.23.4 ; python_version >= "3.8" and python_version < "4" humanfriendly==10.0 ; python_version >= "3.8" and python_version < "4" idna==3.7 ; python_version >= "3.8" and python_version < "4" mpmath==1.3.0 ; python_version >= "3.8" and python_version < "4" numpy==1.24.4 ; python_version >= "3.8" and python_version < "4" -onnxruntime==1.18.0 ; python_version >= "3.8" and python_version < "4" +onnxruntime==1.18.1 ; python_version >= "3.8" and python_version < "4" opencv-python==4.10.0.84 ; python_version >= "3.8" and python_version < "4.0" packaging==24.1 ; python_version >= "3.8" and python_version < "4" -pillow==10.3.0 ; python_version >= "3.8" and python_version < "4" -protobuf==5.27.1 ; python_version >= "3.8" and python_version < "4" +pillow==10.4.0 ; python_version >= "3.8" and python_version < "4" +protobuf==5.27.2 ; python_version >= "3.8" and python_version < "4" pyreadline3==3.4.1 ; sys_platform == "win32" and python_version >= "3.8" and python_version < "4" -pyroclient @ git+https://github.com/pyronear/pyro-api.git@767be30a781b52b29d68579d543e3f45ac8c4713#subdirectory=client ; python_version >= "3.8" and python_version < "4" +pyroclient @ git+https://github.com/pyronear/pyro-api.git@e3198fbb358013cca671b969372a0245848eec03#subdirectory=client ; python_version >= "3.8" and python_version < "4" pyroengine==0.2.0 ; python_version >= "3.8" and python_version < "4" python-dotenv==1.0.1 ; python_version >= "3.8" and python_version < "4.0" pyyaml==6.0.1 ; python_version >= "3.8" and python_version < "4" diff --git a/src/run.py b/src/run.py index 64a1f121..4aabf1cb 100644 --- a/src/run.py +++ b/src/run.py @@ -41,16 +41,13 @@ def main(args): splitted_cam_creds = {} cameras = [] + cam_poses = [] for _ip, cam_data in cameras_credentials.items(): - cam_poses = [] - for creds in cam_data["credentials"]: + if _ip != "organization": if cam_data["type"] == "ptz": - splitted_cam_creds[_ip + "_" + str(creds["posid"])] = creds - cam_poses.append(creds["posid"]) - else: - splitted_cam_creds[_ip] = creds - - cameras.append(ReolinkCamera(_ip, CAM_USER, CAM_PWD, cam_data["type"], cam_poses, args.protocol)) + cam_poses = cam_data["poses"] + splitted_cam_creds[_ip] = cam_data["token"] + cameras.append(ReolinkCamera(_ip, CAM_USER, CAM_PWD, cam_data["type"], cam_poses, args.protocol)) # Check if model is available in cache cache = Path(args.cache) diff --git a/tests/test_engine.py b/tests/test_engine.py index 55320308..fbc45bc2 100644 --- a/tests/test_engine.py +++ b/tests/test_engine.py @@ -22,7 +22,6 @@ def test_engine_offline(tmpdir_factory, mock_wildfire_image, mock_forest_image): assert engine._alerts[0]["ts"] < datetime.now().isoformat() and _ts < engine._alerts[0]["ts"] assert engine._alerts[0]["detection_id"] is None - # Cache dump engine._dump_cache() assert engine._cache.joinpath("pending_alerts.json").is_file() From 2c84589d778814e3328736f426cef3fd9bd4ec60 Mon Sep 17 00:00:00 2001 From: Ronan Date: Tue, 2 Jul 2024 17:07:58 +0200 Subject: [PATCH 03/21] feat: upgrade Client and add some logs --- pyroengine/engine.py | 1 + pyroengine/sensors.py | 4 ++-- pyroengine/vision.py | 3 ++- src/control_reolink_cam.py | 1 + src/poetry.lock | 6 +++--- src/requirements.txt | 2 +- 6 files changed, 10 insertions(+), 7 deletions(-) diff --git a/pyroengine/engine.py b/pyroengine/engine.py index 92c1818b..c3fb7c35 100644 --- a/pyroengine/engine.py +++ b/pyroengine/engine.py @@ -21,6 +21,7 @@ from pyroclient import client from requests.exceptions import ConnectionError from requests.models import Response + from pyroengine.utils import box_iou, nms from .vision import Classifier diff --git a/pyroengine/sensors.py b/pyroengine/sensors.py index bf4b65c2..69a0903c 100644 --- a/pyroengine/sensors.py +++ b/pyroengine/sensors.py @@ -69,10 +69,10 @@ def _handle_response(self, response, success_message: str): if response_data[0]["code"] == 0: logging.debug(success_message) else: - logging.error(f"Error: {response_data}") + logging.error(f"Error in camera call: {response_data}") return response_data else: - logging.error(f"Failed operation: {response.status_code}, {response.text}") + logging.error(f"Failed operation during camera control: {response.status_code}, {response.text}") return None def capture(self, pos_id: Optional[int] = None, timeout: int = 2) -> Optional[Image.Image]: diff --git a/pyroengine/vision.py b/pyroengine/vision.py index 8fd53584..1b4dec39 100644 --- a/pyroengine/vision.py +++ b/pyroengine/vision.py @@ -4,10 +4,11 @@ # See LICENSE or go to for full license details. import json +import logging import os from typing import Optional, Tuple from urllib.request import urlretrieve -import logging + import numpy as np import onnxruntime from huggingface_hub import HfApi # type: ignore[import-untyped] diff --git a/src/control_reolink_cam.py b/src/control_reolink_cam.py index a8c206cd..e1170afc 100644 --- a/src/control_reolink_cam.py +++ b/src/control_reolink_cam.py @@ -6,6 +6,7 @@ import argparse import logging + from pyroengine.sensors import ReolinkCamera diff --git a/src/poetry.lock b/src/poetry.lock index 66d86c84..4c0550be 100644 --- a/src/poetry.lock +++ b/src/poetry.lock @@ -564,8 +564,8 @@ test = ["pytest (>=5.3.2)", "pytest-cov (>=3.0.0,<5.0.0)", "pytest-pretty (>=1.0 [package.source] type = "git" url = "https://github.com/pyronear/pyro-api.git" -reference = "e3198fbb358013cca671b969372a0245848eec03" -resolved_reference = "e3198fbb358013cca671b969372a0245848eec03" +reference = "21e83622c0b057d3ae767c8a8061130e267d8a8a" +resolved_reference = "21e83622c0b057d3ae767c8a8061130e267d8a8a" subdirectory = "client" [[package]] @@ -752,4 +752,4 @@ zstd = ["zstandard (>=0.18.0)"] [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "27666dec769a2d77e0fc365de5e9aa67181f751a059616d254dc57782d5371b8" +content-hash = "16b629a3552b57dd7ba296815e1e7cdf83ee33c2b560ceb58336b632c433dbbc" diff --git a/src/requirements.txt b/src/requirements.txt index 45d4c561..c795201e 100644 --- a/src/requirements.txt +++ b/src/requirements.txt @@ -16,7 +16,7 @@ packaging==24.1 ; python_version >= "3.8" and python_version < "4" pillow==10.4.0 ; python_version >= "3.8" and python_version < "4" protobuf==5.27.2 ; python_version >= "3.8" and python_version < "4" pyreadline3==3.4.1 ; sys_platform == "win32" and python_version >= "3.8" and python_version < "4" -pyroclient @ git+https://github.com/pyronear/pyro-api.git@e3198fbb358013cca671b969372a0245848eec03#subdirectory=client ; python_version >= "3.8" and python_version < "4" +pyroclient @ git+https://github.com/pyronear/pyro-api.git@21e83622c0b057d3ae767c8a8061130e267d8a8a#subdirectory=client ; python_version >= "3.8" and python_version < "4" pyroengine==0.2.0 ; python_version >= "3.8" and python_version < "4" python-dotenv==1.0.1 ; python_version >= "3.8" and python_version < "4.0" pyyaml==6.0.1 ; python_version >= "3.8" and python_version < "4" From 89538014de8db33d6af5f1ef234c0a8ac56f46e1 Mon Sep 17 00:00:00 2001 From: Ronan Date: Tue, 2 Jul 2024 18:32:20 +0200 Subject: [PATCH 04/21] fix error following merge --- pyroengine/engine.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/pyroengine/engine.py b/pyroengine/engine.py index 732d1383..892cf559 100644 --- a/pyroengine/engine.py +++ b/pyroengine/engine.py @@ -264,7 +264,7 @@ def predict(self, frame: Image.Image, cam_id: str, pose_id: int) -> float: conf = self._update_states(frame, preds, cam_key) if self.save_captured_frames: - self._local_backup(frame, cam_id, is_alert=False) + self._local_backup(frame, cam_id, pose_id, is_alert=False) # Log analysis result device_str = f"Camera '{cam_id}' - " if isinstance(cam_id, str) else "" @@ -287,10 +287,6 @@ def predict(self, frame: Image.Image, cam_id: str, pose_id: int) -> float: self._dump_cache() self.last_cache_dump = ts - if self.save_captured_frames: - self._local_backup(frame_resize, cam_id, pose_id, is_alert=False) - - return float(conf) def _stage_alert(self, frame: Image.Image, cam_id: str, pose_id: int, ts: int, localization: list) -> None: From a23c4cf3acfbd25eaf3bca631312341a49599bc1 Mon Sep 17 00:00:00 2001 From: Ronan Date: Tue, 2 Jul 2024 18:56:21 +0200 Subject: [PATCH 05/21] fix test_core.py --- tests/test_core.py | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/tests/test_core.py b/tests/test_core.py index 20615db4..b3de62fe 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -79,8 +79,9 @@ def test_capture_images(system_controller): capture_camera_image((camera, queue)) assert queue.qsize() == 1 - cam_id, frame = queue.get(timeout=1) # Use timeout to wait for the item + cam_id, pose_id, frame = queue.get(timeout=1) # Use timeout to wait for the item assert cam_id == "192.168.1.1" + assert pose_id == None assert isinstance(frame, Image.Image) @@ -96,16 +97,18 @@ def test_capture_images_ptz(system_controller_ptz): retries -= 1 assert queue.qsize() == 2 - cam_id, frame = queue.get(timeout=1) # Use timeout to wait for the item - assert cam_id == "192.168.1.1_1" + cam_id, pose_id, frame = queue.get(timeout=1) # Use timeout to wait for the item + assert cam_id == "192.168.1.1" + assert pose_id == 1 assert isinstance(frame, Image.Image) def test_analyze_stream(system_controller): mock_frame = Image.new("RGB", (100, 100)) cam_id = "192.168.1.1" - system_controller.analyze_stream(mock_frame, cam_id) - system_controller.engine.predict.assert_called_once_with(mock_frame, cam_id) + pose_id = None + system_controller.analyze_stream(mock_frame, cam_id, pose_id) + system_controller.engine.predict.assert_called_once_with(mock_frame, cam_id, pose_id) def test_run(system_controller): @@ -186,8 +189,9 @@ def test_capture_camera_image(): capture_camera_image((camera, queue)) assert queue.qsize() == 1 - cam_id, frame = queue.get(timeout=1) # Use timeout to wait for the item + cam_id, pose_id, frame = queue.get(timeout=1) # Use timeout to wait for the item assert cam_id == "192.168.1.1" + assert pose_id == None assert isinstance(frame, Image.Image) @@ -208,8 +212,9 @@ def test_capture_camera_image_ptz(): retries -= 1 assert queue.qsize() == 2 - cam_id, frame = queue.get(timeout=1) # Use timeout to wait for the item - assert cam_id == "192.168.1.1_1" + cam_id, pose_id, frame = queue.get(timeout=1) # Use timeout to wait for the item + assert cam_id == "192.168.1.1" + assert pose_id == 1 assert isinstance(frame, Image.Image) From a67cc1ba724fbb8dfe87f94c6c98ea074411ab19 Mon Sep 17 00:00:00 2001 From: Ronan Date: Wed, 3 Jul 2024 10:34:42 +0200 Subject: [PATCH 06/21] fix test engine --- pyroengine/engine.py | 16 +++++++++++++--- tests/test_core.py | 4 ++-- tests/test_engine.py | 43 ++++++++++++++++++++++++++++++++++++++----- 3 files changed, 53 insertions(+), 10 deletions(-) diff --git a/pyroengine/engine.py b/pyroengine/engine.py index 892cf559..e616466b 100644 --- a/pyroengine/engine.py +++ b/pyroengine/engine.py @@ -92,9 +92,12 @@ def __init__( self.latitude = latitude self.longitude = longitude self.api_client = {} + print("AVANT IS INSTANCE") if isinstance(api_host, str) and isinstance(cam_creds, dict): # Instantiate clients for each camera + print("AVANT FOR") for _id, camera_token in cam_creds.items(): + print(_id) self.api_client[_id] = client.Client(camera_token, api_host) # Cache & relaxation @@ -162,6 +165,7 @@ def _dump_cache(self) -> None: { "frame_path": str(self._cache.joinpath(f"pending_frame{idx}.jpg")), "cam_id": info["cam_id"], + "pose_id": info["pose_id"], "ts": info["ts"], "localization": info["localization"], } @@ -186,6 +190,8 @@ def _load_cache(self) -> None: def heartbeat(self, cam_id: str) -> Response: """Updates last ping of device""" + print("ICI") + print(self.api_client) return self.api_client[cam_id].heartbeat() def _update_states(self, frame: Image.Image, preds: np.ndarray, cam_key: str) -> int: @@ -236,7 +242,7 @@ def _update_states(self, frame: Image.Image, preds: np.ndarray, cam_key: str) -> return conf - def predict(self, frame: Image.Image, cam_id: str, pose_id: int) -> float: + def predict(self, frame: Image.Image, cam_id: Optional[str] = None, pose_id: Optional[int] = None) -> float: """Computes the confidence that the image contains wildfire cues Args: @@ -289,7 +295,9 @@ def predict(self, frame: Image.Image, cam_id: str, pose_id: int) -> float: return float(conf) - def _stage_alert(self, frame: Image.Image, cam_id: str, pose_id: int, ts: int, localization: list) -> None: + def _stage_alert( + self, frame: Image.Image, cam_id: Optional[str], pose_id: Optional[int], ts: int, localization: list + ) -> None: # Store information in the queue self._alerts.append( { @@ -335,7 +343,9 @@ def _process_alerts(self) -> None: logging.exception(e) break - def _local_backup(self, img: Image.Image, cam_id: Optional[str], pose_id: int, is_alert: bool = True) -> None: + def _local_backup( + self, img: Image.Image, cam_id: Optional[str], pose_id: Optional[int], is_alert: bool = True + ) -> None: """Save image on device Args: diff --git a/tests/test_core.py b/tests/test_core.py index b3de62fe..69013789 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -81,7 +81,7 @@ def test_capture_images(system_controller): assert queue.qsize() == 1 cam_id, pose_id, frame = queue.get(timeout=1) # Use timeout to wait for the item assert cam_id == "192.168.1.1" - assert pose_id == None + assert pose_id is None assert isinstance(frame, Image.Image) @@ -191,7 +191,7 @@ def test_capture_camera_image(): assert queue.qsize() == 1 cam_id, pose_id, frame = queue.get(timeout=1) # Use timeout to wait for the item assert cam_id == "192.168.1.1" - assert pose_id == None + assert pose_id is None assert isinstance(frame, Image.Image) diff --git a/tests/test_engine.py b/tests/test_engine.py index fbc45bc2..1ef25532 100644 --- a/tests/test_engine.py +++ b/tests/test_engine.py @@ -3,6 +3,7 @@ from datetime import datetime, timezone from pathlib import Path +import requests from dotenv import load_dotenv from PIL import Image @@ -17,7 +18,7 @@ def test_engine_offline(tmpdir_factory, mock_wildfire_image, mock_forest_image): # Cache saving _ts = datetime.now().isoformat() - engine._stage_alert(mock_wildfire_image, 0, datetime.now().isoformat(), localization="dummy") + engine._stage_alert(mock_wildfire_image, 0, None, datetime.now().isoformat(), localization="dummy") assert len(engine._alerts) == 1 assert engine._alerts[0]["ts"] < datetime.now().isoformat() and _ts < engine._alerts[0]["ts"] assert engine._alerts[0]["detection_id"] is None @@ -31,6 +32,7 @@ def test_engine_offline(tmpdir_factory, mock_wildfire_image, mock_forest_image): assert cache_dump[0] == { "frame_path": str(engine._cache.joinpath("pending_frame0.jpg")), "cam_id": 0, + "pose_id": None, "ts": engine._alerts[0]["ts"], "localization": "dummy", } @@ -78,21 +80,52 @@ def test_engine_offline(tmpdir_factory, mock_wildfire_image, mock_forest_image): assert engine._states["-1"]["last_predictions"][2][4] is False +def get_token(api_url: str, login: str, pwd: str) -> str: + response = requests.post( + f"{api_url}/login/creds", + data={"username": login, "password": pwd}, + timeout=5, + ) + if response.status_code != 200: + raise ValueError(response.json()["detail"]) + return response.json()["access_token"] + + def test_engine_online(tmpdir_factory, mock_wildfire_stream, mock_wildfire_image): # Cache folder = str(tmpdir_factory.mktemp("engine_cache")) # With API load_dotenv(Path(__file__).parent.parent.joinpath(".env").absolute()) - api_url = os.environ.get("API_URL") + api_host = os.environ.get("API_URL") + camera_id = os.environ.get("CAMERA_ID") + superuser_login = os.environ.get("SUPERADMIN_LOGIN") + superuser_pwd = os.environ.get("SUPERADMIN_PWD") lat = os.environ.get("LAT") lon = os.environ.get("LON") - cam_creds = {"dummy_cam": {"login": os.environ.get("API_LOGIN"), "password": os.environ.get("API_PWD")}} + # Skip the API-related tests if the URL is not specified + if isinstance(api_host, str): + api_url = api_host + "/api/v1" + + superuser_auth = { + "Authorization": f"Bearer {get_token(api_url, superuser_login, superuser_pwd)}", + "Content-Type": "application/json", + } + + token = requests.post(f"{api_url}/cameras/{camera_id}/token", headers=superuser_auth)["access_token"] + + cam_creds = { + "dummy_cam": { + "brand": "reolink", + "name": "cam-1", + "type": "static", + "token": token, + } + } - if isinstance(api_url, str): engine = Engine( folder + "model.onnx", - api_url=api_url, + api_host=api_host, cam_creds=cam_creds, latitude=float(lat), longitude=float(lon), From f5794ff83ee769fd994d5bd12c502e7f75c6c08a Mon Sep 17 00:00:00 2001 From: Ronan Date: Wed, 3 Jul 2024 16:29:53 +0200 Subject: [PATCH 07/21] fix: error with azimuth & pose --- pyroengine/core.py | 2 +- pyroengine/engine.py | 16 ++++++++-------- pyroengine/sensors.py | 3 +++ src/run.py | 6 +++++- 4 files changed, 17 insertions(+), 10 deletions(-) diff --git a/pyroengine/core.py b/pyroengine/core.py index 2c860566..3f22436b 100644 --- a/pyroengine/core.py +++ b/pyroengine/core.py @@ -196,7 +196,7 @@ def run(self, period: int = 30) -> None: # Process alerts try: - self.engine._process_alerts() + self.engine._process_alerts(self.cameras) except Exception as e: logging.exception(f"Error processing alerts: {e}") diff --git a/pyroengine/engine.py b/pyroengine/engine.py index e616466b..32408951 100644 --- a/pyroengine/engine.py +++ b/pyroengine/engine.py @@ -13,7 +13,7 @@ from collections import deque from datetime import datetime, timedelta, timezone from pathlib import Path -from typing import Any, Dict, Optional, Tuple +from typing import Any, Dict, List, Optional, Tuple import cv2 # type: ignore[import-untyped] import numpy as np @@ -24,6 +24,7 @@ from pyroengine.utils import box_iou, nms +from .sensors import ReolinkCamera from .vision import Classifier __all__ = ["Engine"] @@ -92,12 +93,9 @@ def __init__( self.latitude = latitude self.longitude = longitude self.api_client = {} - print("AVANT IS INSTANCE") if isinstance(api_host, str) and isinstance(cam_creds, dict): # Instantiate clients for each camera - print("AVANT FOR") for _id, camera_token in cam_creds.items(): - print(_id) self.api_client[_id] = client.Client(camera_token, api_host) # Cache & relaxation @@ -190,8 +188,6 @@ def _load_cache(self) -> None: def heartbeat(self, cam_id: str) -> Response: """Updates last ping of device""" - print("ICI") - print(self.api_client) return self.api_client[cam_id].heartbeat() def _update_states(self, frame: Image.Image, preds: np.ndarray, cam_key: str) -> int: @@ -310,7 +306,7 @@ def _stage_alert( } ) - def _process_alerts(self) -> None: + def _process_alerts(self, cameras: List[ReolinkCamera]) -> None: for _ in range(len(self._alerts)): # try to upload the oldest element frame_info = self._alerts[0] @@ -325,7 +321,11 @@ def _process_alerts(self) -> None: # Detection creation stream = io.BytesIO() frame_info["frame"].save(stream, format="JPEG", quality=self.jpeg_quality) - response = self.api_client[cam_id].create_detection(stream.getvalue(), 123.2) + for camera in cameras: + if camera.ip_address == cam_id: + azimuth = camera.cam_azimuths[pose_id - 1] if pose_id is not None else None + response = self.api_client[cam_id].create_detection(stream.getvalue(), azimuth) + break # Force a KeyError if the request failed detection_id = response.json().get("id") diff --git a/pyroengine/sensors.py b/pyroengine/sensors.py index 69a0903c..01035679 100644 --- a/pyroengine/sensors.py +++ b/pyroengine/sensors.py @@ -29,6 +29,7 @@ class ReolinkCamera: password (str): Password for accessing the camera. cam_type (str): Type of the camera, e.g., 'static' or 'ptz' (pan-tilt-zoom). cam_poses (Optional[List[int]]): List of preset positions for PTZ cameras. + cam_azimuths (Optional[List[float]]): List of preset azimuths for PTZ cameras. protocol (str): Protocol used for communication, defaults to 'https'. Methods: @@ -46,6 +47,7 @@ def __init__( password: str, cam_type: str, cam_poses: Optional[List[int]] = None, + cam_azimuths: Optional[List[float]] = None, protocol: str = "https", ): self.ip_address = ip_address @@ -53,6 +55,7 @@ def __init__( self.password = password self.cam_type = cam_type self.cam_poses = cam_poses if cam_poses is not None else [] + self.cam_azimuths = cam_azimuths if cam_azimuths is not None else [] self.protocol = protocol def _build_url(self, command: str) -> str: diff --git a/src/run.py b/src/run.py index 4aabf1cb..0577fb93 100644 --- a/src/run.py +++ b/src/run.py @@ -42,12 +42,16 @@ def main(args): splitted_cam_creds = {} cameras = [] cam_poses = [] + cam_azimuths = [] for _ip, cam_data in cameras_credentials.items(): if _ip != "organization": if cam_data["type"] == "ptz": cam_poses = cam_data["poses"] + cam_azimuths = cam_data["azimuths"] splitted_cam_creds[_ip] = cam_data["token"] - cameras.append(ReolinkCamera(_ip, CAM_USER, CAM_PWD, cam_data["type"], cam_poses, args.protocol)) + cameras.append( + ReolinkCamera(_ip, CAM_USER, CAM_PWD, cam_data["type"], cam_poses, cam_azimuths, args.protocol) + ) # Check if model is available in cache cache = Path(args.cache) From aa8d4994ffc81b407165e85d7df759e00a45bcad Mon Sep 17 00:00:00 2001 From: Ronan Date: Wed, 10 Jul 2024 01:46:02 +0200 Subject: [PATCH 08/21] fix localization error + new model --- pyproject.toml | 2 +- pyroengine/engine.py | 17 ++++++++++++++--- pyroengine/vision.py | 9 +++++++-- src/poetry.lock | 23 +++++++++++++---------- src/pyproject.toml | 2 +- src/requirements.txt | 6 +++--- tests/test_engine.py | 3 +-- tests/test_vision.py | 4 ++-- 8 files changed, 42 insertions(+), 24 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 8feab5af..252fc1e1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -33,7 +33,7 @@ dependencies = [ "Pillow>=8.4.0", "onnxruntime>=1.10.0,<2.0.0", "numpy>=1.19.5,<2.0.0", - "pyroclient @ git+https://github.com/pyronear/pyro-api.git@21e83622c0b057d3ae767c8a8061130e267d8a8a#egg=pyroclient&subdirectory=client", + "pyroclient @ git+https://github.com/pyronear/pyro-api.git@5c492a57d6454d953c81d9f75968babcaab6dfec#egg=pyroclient&subdirectory=client", "requests>=2.20.0,<3.0.0", "opencv-python==4.5.5.64", "tqdm>=4.62.0", diff --git a/pyroengine/engine.py b/pyroengine/engine.py index 32408951..f1d1fc21 100644 --- a/pyroengine/engine.py +++ b/pyroengine/engine.py @@ -184,7 +184,15 @@ def _load_cache(self) -> None: for entry in data: # Open image frame = Image.open(entry["frame_path"], mode="r") - self._alerts.append({"frame": frame, "cam_id": entry["cam_id"], "ts": entry["ts"]}) + self._alerts.append( + { + "frame": frame, + "cam_id": entry["cam_id"], + "pose_id": entry["pose_id"], + "localization": entry["localization"], + "ts": entry["ts"], + } + ) def heartbeat(self, cam_id: str) -> Response: """Updates last ping of device""" @@ -295,13 +303,13 @@ def _stage_alert( self, frame: Image.Image, cam_id: Optional[str], pose_id: Optional[int], ts: int, localization: list ) -> None: # Store information in the queue + self._alerts.append( { "frame": frame, "cam_id": cam_id, "pose_id": pose_id, "ts": ts, - "detection_id": None, "localization": localization, } ) @@ -324,7 +332,10 @@ def _process_alerts(self, cameras: List[ReolinkCamera]) -> None: for camera in cameras: if camera.ip_address == cam_id: azimuth = camera.cam_azimuths[pose_id - 1] if pose_id is not None else None - response = self.api_client[cam_id].create_detection(stream.getvalue(), azimuth) + localization = self._alerts[0]["localization"] + response = self.api_client[cam_id].create_detection(stream.getvalue(), azimuth, localization) + logging.info(f"Azimuth : {azimuth} , localization : {localization}") + logging.info(f"Response : {response.json()}") break # Force a KeyError if the request failed diff --git a/pyroengine/vision.py b/pyroengine/vision.py index 1b4dec39..1135147c 100644 --- a/pyroengine/vision.py +++ b/pyroengine/vision.py @@ -18,9 +18,9 @@ __all__ = ["Classifier"] -MODEL_URL = "https://huggingface.co/pyronear/yolov8s/resolve/main/model.onnx" +MODEL_NAME = "yolov8s.onnx" MODEL_ID = "pyronear/yolov8s" -MODEL_NAME = "model.onnx" +MODEL_URL = f"https://huggingface.co/{MODEL_ID}/resolve/main/{MODEL_NAME}" METADATA_PATH = "data/model_metadata.json" @@ -75,6 +75,11 @@ def get_sha(self, siblings): if file.rfilename == os.path.basename(MODEL_NAME): expected_sha256 = file.lfs.sha256 break + if expected_sha256 is None: + raise ValueError( + f"""No file matching {os.path.basename(MODEL_NAME)} found. + Ask your colleagues if they update the model in Hugging Face :) """ + ) return expected_sha256 def download_model(self, model_path, expected_sha256): diff --git a/src/poetry.lock b/src/poetry.lock index 4c0550be..1521ab31 100644 --- a/src/poetry.lock +++ b/src/poetry.lock @@ -2,13 +2,13 @@ [[package]] name = "certifi" -version = "2024.6.2" +version = "2024.7.4" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.6.2-py3-none-any.whl", hash = "sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56"}, - {file = "certifi-2024.6.2.tar.gz", hash = "sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516"}, + {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"}, + {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, ] [[package]] @@ -564,8 +564,8 @@ test = ["pytest (>=5.3.2)", "pytest-cov (>=3.0.0,<5.0.0)", "pytest-pretty (>=1.0 [package.source] type = "git" url = "https://github.com/pyronear/pyro-api.git" -reference = "21e83622c0b057d3ae767c8a8061130e267d8a8a" -resolved_reference = "21e83622c0b057d3ae767c8a8061130e267d8a8a" +reference = "5c492a57d6454d953c81d9f75968babcaab6dfec" +resolved_reference = "5c492a57d6454d953c81d9f75968babcaab6dfec" subdirectory = "client" [[package]] @@ -689,17 +689,20 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "sympy" -version = "1.12.1" +version = "1.13.0" description = "Computer algebra system (CAS) in Python" optional = false python-versions = ">=3.8" files = [ - {file = "sympy-1.12.1-py3-none-any.whl", hash = "sha256:9b2cbc7f1a640289430e13d2a56f02f867a1da0190f2f99d8968c2f74da0e515"}, - {file = "sympy-1.12.1.tar.gz", hash = "sha256:2877b03f998cd8c08f07cd0de5b767119cd3ef40d09f41c30d722f6686b0fb88"}, + {file = "sympy-1.13.0-py3-none-any.whl", hash = "sha256:6b0b32a4673fb91bd3cac3b55406c8e01d53ae22780be467301cc452f6680c92"}, + {file = "sympy-1.13.0.tar.gz", hash = "sha256:3b6af8f4d008b9a1a6a4268b335b984b23835f26d1d60b0526ebc71d48a25f57"}, ] [package.dependencies] -mpmath = ">=1.1.0,<1.4.0" +mpmath = ">=1.1.0,<1.4" + +[package.extras] +dev = ["hypothesis (>=6.70.0)", "pytest (>=7.1.0)"] [[package]] name = "tqdm" @@ -752,4 +755,4 @@ zstd = ["zstandard (>=0.18.0)"] [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "16b629a3552b57dd7ba296815e1e7cdf83ee33c2b560ceb58336b632c433dbbc" +content-hash = "4ef1ccbfee88a1e28f9292e4729b05c296a4a048e0d220a9d297393ff66098aa" diff --git a/src/pyproject.toml b/src/pyproject.toml index fff31470..9676eceb 100644 --- a/src/pyproject.toml +++ b/src/pyproject.toml @@ -11,7 +11,7 @@ license = "Apache-2.0" [tool.poetry.dependencies] python = "^3.8" -pyroclient = { git = "https://github.com/pyronear/pyro-api.git", rev = "21e83622c0b057d3ae767c8a8061130e267d8a8a", subdirectory = "client" } +pyroclient = { git = "https://github.com/pyronear/pyro-api.git", rev = "5c492a57d6454d953c81d9f75968babcaab6dfec", subdirectory = "client" } pyroengine = "^0.2.0" python-dotenv = ">=0.15.0" opencv-python = "^4.5.5.64" diff --git a/src/requirements.txt b/src/requirements.txt index c795201e..07a4e8c3 100644 --- a/src/requirements.txt +++ b/src/requirements.txt @@ -1,4 +1,4 @@ -certifi==2024.6.2 ; python_version >= "3.8" and python_version < "4" +certifi==2024.7.4 ; python_version >= "3.8" and python_version < "4" charset-normalizer==3.3.2 ; python_version >= "3.8" and python_version < "4" colorama==0.4.6 ; python_version >= "3.8" and python_version < "4" and platform_system == "Windows" coloredlogs==15.0.1 ; python_version >= "3.8" and python_version < "4" @@ -16,12 +16,12 @@ packaging==24.1 ; python_version >= "3.8" and python_version < "4" pillow==10.4.0 ; python_version >= "3.8" and python_version < "4" protobuf==5.27.2 ; python_version >= "3.8" and python_version < "4" pyreadline3==3.4.1 ; sys_platform == "win32" and python_version >= "3.8" and python_version < "4" -pyroclient @ git+https://github.com/pyronear/pyro-api.git@21e83622c0b057d3ae767c8a8061130e267d8a8a#subdirectory=client ; python_version >= "3.8" and python_version < "4" +pyroclient @ git+https://github.com/pyronear/pyro-api.git@5c492a57d6454d953c81d9f75968babcaab6dfec#subdirectory=client ; python_version >= "3.8" and python_version < "4" pyroengine==0.2.0 ; python_version >= "3.8" and python_version < "4" python-dotenv==1.0.1 ; python_version >= "3.8" and python_version < "4.0" pyyaml==6.0.1 ; python_version >= "3.8" and python_version < "4" requests==2.32.3 ; python_version >= "3.8" and python_version < "4" -sympy==1.12.1 ; python_version >= "3.8" and python_version < "4" +sympy==1.13.0 ; python_version >= "3.8" and python_version < "4" tqdm==4.66.4 ; python_version >= "3.8" and python_version < "4" typing-extensions==4.12.2 ; python_version >= "3.8" and python_version < "4" urllib3==2.2.2 ; python_version >= "3.8" and python_version < "4" diff --git a/tests/test_engine.py b/tests/test_engine.py index 1ef25532..ed28b95f 100644 --- a/tests/test_engine.py +++ b/tests/test_engine.py @@ -21,8 +21,7 @@ def test_engine_offline(tmpdir_factory, mock_wildfire_image, mock_forest_image): engine._stage_alert(mock_wildfire_image, 0, None, datetime.now().isoformat(), localization="dummy") assert len(engine._alerts) == 1 assert engine._alerts[0]["ts"] < datetime.now().isoformat() and _ts < engine._alerts[0]["ts"] - assert engine._alerts[0]["detection_id"] is None - + # Cache dump engine._dump_cache() assert engine._cache.joinpath("pending_alerts.json").is_file() diff --git a/tests/test_vision.py b/tests/test_vision.py index 98a378ff..5aef4bc7 100644 --- a/tests/test_vision.py +++ b/tests/test_vision.py @@ -8,7 +8,7 @@ METADATA_PATH = "data/model_metadata.json" model_path = "data/model.onnx" -sha = "9f1b1c2654d98bbed91e514ce20ea73a0a5fbd1111880f230d516ed40ea2dc58" +sha = "a79cedbe557230f2e16af2a3506cd524dcb6afd2a8fdd9c1c5b9173b5d8c94e6" def custom_isfile_false(path): @@ -54,7 +54,7 @@ def test_classifier(mock_wildfire_image): os.remove(METADATA_PATH) -# Test that the model is not loaded +# Test that the model is not loaded. you need the updated hash def test_no_download(): print("test_no_download") data = {"sha256": sha} From cfb9005e668b68c4598dc1f8accbfeabc6bfc588 Mon Sep 17 00:00:00 2001 From: Ronan Date: Fri, 12 Jul 2024 17:19:52 +0200 Subject: [PATCH 09/21] fix: bug azimuth camera non ptz --- pyroengine/engine.py | 2 +- src/run.py | 3 +++ tests/test_engine.py | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/pyroengine/engine.py b/pyroengine/engine.py index f1d1fc21..1a6d2713 100644 --- a/pyroengine/engine.py +++ b/pyroengine/engine.py @@ -331,7 +331,7 @@ def _process_alerts(self, cameras: List[ReolinkCamera]) -> None: frame_info["frame"].save(stream, format="JPEG", quality=self.jpeg_quality) for camera in cameras: if camera.ip_address == cam_id: - azimuth = camera.cam_azimuths[pose_id - 1] if pose_id is not None else None + azimuth = camera.cam_azimuths[pose_id - 1] if pose_id is not None else camera.cam_azimuths[0] localization = self._alerts[0]["localization"] response = self.api_client[cam_id].create_detection(stream.getvalue(), azimuth, localization) logging.info(f"Azimuth : {azimuth} , localization : {localization}") diff --git a/src/run.py b/src/run.py index 0577fb93..45d76504 100644 --- a/src/run.py +++ b/src/run.py @@ -48,6 +48,9 @@ def main(args): if cam_data["type"] == "ptz": cam_poses = cam_data["poses"] cam_azimuths = cam_data["azimuths"] + else: + cam_poses = [] + cam_azimuths = [cam_data["azimuth"]] splitted_cam_creds[_ip] = cam_data["token"] cameras.append( ReolinkCamera(_ip, CAM_USER, CAM_PWD, cam_data["type"], cam_poses, cam_azimuths, args.protocol) diff --git a/tests/test_engine.py b/tests/test_engine.py index ed28b95f..d8206591 100644 --- a/tests/test_engine.py +++ b/tests/test_engine.py @@ -21,7 +21,7 @@ def test_engine_offline(tmpdir_factory, mock_wildfire_image, mock_forest_image): engine._stage_alert(mock_wildfire_image, 0, None, datetime.now().isoformat(), localization="dummy") assert len(engine._alerts) == 1 assert engine._alerts[0]["ts"] < datetime.now().isoformat() and _ts < engine._alerts[0]["ts"] - + # Cache dump engine._dump_cache() assert engine._cache.joinpath("pending_alerts.json").is_file() From 17ec5e11a7daacb86becfe5068578516ea090c8e Mon Sep 17 00:00:00 2001 From: Ronan Date: Sun, 14 Jul 2024 16:40:32 +0200 Subject: [PATCH 10/21] feat: update client commit --- pyproject.toml | 2 +- pyroengine/engine.py | 1 - src/pyproject.toml | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 252fc1e1..bd8d327f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -33,7 +33,7 @@ dependencies = [ "Pillow>=8.4.0", "onnxruntime>=1.10.0,<2.0.0", "numpy>=1.19.5,<2.0.0", - "pyroclient @ git+https://github.com/pyronear/pyro-api.git@5c492a57d6454d953c81d9f75968babcaab6dfec#egg=pyroclient&subdirectory=client", + "pyroclient @ git+https://github.com/pyronear/pyro-api.git@8d50d923d3fef81343ed78b6b364c83ebea07c0b#egg=pyroclient&subdirectory=client", "requests>=2.20.0,<3.0.0", "opencv-python==4.5.5.64", "tqdm>=4.62.0", diff --git a/pyroengine/engine.py b/pyroengine/engine.py index 1a6d2713..0bc4e2bb 100644 --- a/pyroengine/engine.py +++ b/pyroengine/engine.py @@ -335,7 +335,6 @@ def _process_alerts(self, cameras: List[ReolinkCamera]) -> None: localization = self._alerts[0]["localization"] response = self.api_client[cam_id].create_detection(stream.getvalue(), azimuth, localization) logging.info(f"Azimuth : {azimuth} , localization : {localization}") - logging.info(f"Response : {response.json()}") break # Force a KeyError if the request failed diff --git a/src/pyproject.toml b/src/pyproject.toml index 9676eceb..d3d70283 100644 --- a/src/pyproject.toml +++ b/src/pyproject.toml @@ -11,7 +11,7 @@ license = "Apache-2.0" [tool.poetry.dependencies] python = "^3.8" -pyroclient = { git = "https://github.com/pyronear/pyro-api.git", rev = "5c492a57d6454d953c81d9f75968babcaab6dfec", subdirectory = "client" } +pyroclient = { git = "https://github.com/pyronear/pyro-api.git", rev = "8d50d923d3fef81343ed78b6b364c83ebea07c0b", subdirectory = "client" } pyroengine = "^0.2.0" python-dotenv = ">=0.15.0" opencv-python = "^4.5.5.64" From c21e257fda000141f56f39a4afc9938e5f964ce3 Mon Sep 17 00:00:00 2001 From: Ronan Date: Sun, 14 Jul 2024 21:48:26 +0200 Subject: [PATCH 11/21] upgrade Client --- pyproject.toml | 2 +- src/pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index bd8d327f..6363c418 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -33,7 +33,7 @@ dependencies = [ "Pillow>=8.4.0", "onnxruntime>=1.10.0,<2.0.0", "numpy>=1.19.5,<2.0.0", - "pyroclient @ git+https://github.com/pyronear/pyro-api.git@8d50d923d3fef81343ed78b6b364c83ebea07c0b#egg=pyroclient&subdirectory=client", + "pyroclient @ git+https://github.com/pyronear/pyro-api.git@963e666f6f27b281e58aa98bb97710c43b480b81#egg=pyroclient&subdirectory=client", "requests>=2.20.0,<3.0.0", "opencv-python==4.5.5.64", "tqdm>=4.62.0", diff --git a/src/pyproject.toml b/src/pyproject.toml index d3d70283..b8158444 100644 --- a/src/pyproject.toml +++ b/src/pyproject.toml @@ -11,7 +11,7 @@ license = "Apache-2.0" [tool.poetry.dependencies] python = "^3.8" -pyroclient = { git = "https://github.com/pyronear/pyro-api.git", rev = "8d50d923d3fef81343ed78b6b364c83ebea07c0b", subdirectory = "client" } +pyroclient = { git = "https://github.com/pyronear/pyro-api.git", rev = "963e666f6f27b281e58aa98bb97710c43b480b81", subdirectory = "client" } pyroengine = "^0.2.0" python-dotenv = ">=0.15.0" opencv-python = "^4.5.5.64" From f7b9b595e8c7c0b142876170f369ff9bb513b048 Mon Sep 17 00:00:00 2001 From: Ronan Date: Mon, 22 Jul 2024 13:58:53 +0200 Subject: [PATCH 12/21] localization -> bboxes --- pyproject.toml | 2 +- pyroengine/engine.py | 22 ++++++++++------------ src/poetry.lock | 6 +++--- src/pyproject.toml | 2 +- src/requirements.txt | 2 +- tests/test_core.py | 2 +- tests/test_engine.py | 4 ++-- 7 files changed, 19 insertions(+), 21 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index a534585b..1b278cfa 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -32,7 +32,7 @@ dynamic = ["version"] dependencies = [ "ultralytics==8.2.50", "opencv-python", - "pyroclient @ git+https://github.com/pyronear/pyro-api.git@5da3d23d38cb78a4a4e15cf2f9f83bf2da7cdaee#egg=pyroclient&subdirectory=client", + "pyroclient @ git+https://github.com/pyronear/pyro-api.git@f809a399bf8928e93da8e95056e811217f6c2a17#egg=pyroclient&subdirectory=client", "requests>=2.20.0,<3.0.0", "tqdm>=4.62.0", "huggingface_hub==0.23.1", diff --git a/pyroengine/engine.py b/pyroengine/engine.py index bdec9c6f..89b6d53c 100644 --- a/pyroengine/engine.py +++ b/pyroengine/engine.py @@ -164,7 +164,7 @@ def _dump_cache(self) -> None: "cam_id": info["cam_id"], "pose_id": info["pose_id"], "ts": info["ts"], - "localization": info["localization"], + "bboxes": info["bboxes"], } ) @@ -188,7 +188,7 @@ def _load_cache(self) -> None: "frame": frame, "cam_id": entry["cam_id"], "pose_id": entry["pose_id"], - "localization": entry["localization"], + "bboxes": entry["bboxes"], "ts": entry["ts"], } ) @@ -283,12 +283,10 @@ def predict(self, frame: Image.Image, cam_id: Optional[str] = None, pose_id: Opt # Alert if conf > self.conf_thresh and len(self.api_client) > 0 and isinstance(cam_id, str): # Save the alert in cache to avoid connection issues - for idx, (frame, preds, localization, ts, is_staged) in enumerate( - self._states[cam_key]["last_predictions"] - ): + for idx, (frame, preds, bboxes, ts, is_staged) in enumerate(self._states[cam_key]["last_predictions"]): if not is_staged: - self._stage_alert(frame, cam_id, pose_id, ts, localization) - self._states[cam_key]["last_predictions"][idx] = frame, preds, localization, ts, True + self._stage_alert(frame, cam_id, pose_id, ts, bboxes) + self._states[cam_key]["last_predictions"][idx] = frame, preds, bboxes, ts, True # Check if it's time to backup pending alerts ts = datetime.now(timezone.utc) @@ -299,7 +297,7 @@ def predict(self, frame: Image.Image, cam_id: Optional[str] = None, pose_id: Opt return float(conf) def _stage_alert( - self, frame: Image.Image, cam_id: Optional[str], pose_id: Optional[int], ts: int, localization: list + self, frame: Image.Image, cam_id: Optional[str], pose_id: Optional[int], ts: int, bboxes: list ) -> None: # Store information in the queue @@ -309,7 +307,7 @@ def _stage_alert( "cam_id": cam_id, "pose_id": pose_id, "ts": ts, - "localization": localization, + "bboxes": bboxes, } ) @@ -331,9 +329,9 @@ def _process_alerts(self, cameras: List[ReolinkCamera]) -> None: for camera in cameras: if camera.ip_address == cam_id: azimuth = camera.cam_azimuths[pose_id - 1] if pose_id is not None else camera.cam_azimuths[0] - localization = self._alerts[0]["localization"] - response = self.api_client[cam_id].create_detection(stream.getvalue(), azimuth, localization) - logging.info(f"Azimuth : {azimuth} , localization : {localization}") + bboxes = self._alerts[0]["bboxes"] + response = self.api_client[cam_id].create_detection(stream.getvalue(), azimuth, bboxes) + logging.info(f"Azimuth : {azimuth} , bboxes : {bboxes}") break # Force a KeyError if the request failed diff --git a/src/poetry.lock b/src/poetry.lock index 6141bbb9..42b75d1f 100644 --- a/src/poetry.lock +++ b/src/poetry.lock @@ -1376,8 +1376,8 @@ test = ["pytest (>=5.3.2)", "pytest-cov (>=3.0.0,<5.0.0)", "pytest-pretty (>=1.0 [package.source] type = "git" url = "https://github.com/pyronear/pyro-api.git" -reference = "5da3d23d38cb78a4a4e15cf2f9f83bf2da7cdaee" -resolved_reference = "5da3d23d38cb78a4a4e15cf2f9f83bf2da7cdaee" +reference = "f809a399bf8928e93da8e95056e811217f6c2a17" +resolved_reference = "f809a399bf8928e93da8e95056e811217f6c2a17" subdirectory = "client" [[package]] @@ -1865,4 +1865,4 @@ test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "80ad1e637eef8c91462c9b2952b2795800eb6a0a10d06a514af6ef3997b8b0de" +content-hash = "5a2878fef12e172376b702ef6e9295cb229ae6fec68e815cfdcda1997577471d" diff --git a/src/pyproject.toml b/src/pyproject.toml index 40b242b8..9fefce06 100644 --- a/src/pyproject.toml +++ b/src/pyproject.toml @@ -11,7 +11,7 @@ license = "Apache-2.0" [tool.poetry.dependencies] python = "^3.8" -pyroclient = { git = "https://github.com/pyronear/pyro-api.git", rev = "5da3d23d38cb78a4a4e15cf2f9f83bf2da7cdaee", subdirectory = "client" } +pyroclient = { git = "https://github.com/pyronear/pyro-api.git", rev = "f809a399bf8928e93da8e95056e811217f6c2a17", subdirectory = "client" } pyroengine = "^0.2.0" python-dotenv = ">=0.15.0" ultralytics = "8.2.50" diff --git a/src/requirements.txt b/src/requirements.txt index d2ae62b1..c8219682 100644 --- a/src/requirements.txt +++ b/src/requirements.txt @@ -43,7 +43,7 @@ psutil==6.0.0 ; python_version >= "3.8" and python_version < "4.0" py-cpuinfo==9.0.0 ; python_version >= "3.8" and python_version < "4.0" pyparsing==3.1.2 ; python_version >= "3.8" and python_version < "4.0" pyreadline3==3.4.1 ; sys_platform == "win32" and python_version >= "3.8" and python_version < "4" -pyroclient @ git+https://github.com/pyronear/pyro-api.git@5da3d23d38cb78a4a4e15cf2f9f83bf2da7cdaee#subdirectory=client ; python_version >= "3.8" and python_version < "4" +pyroclient @ git+https://github.com/pyronear/pyro-api.git@f809a399bf8928e93da8e95056e811217f6c2a17#subdirectory=client ; python_version >= "3.8" and python_version < "4" pyroengine==0.2.0 ; python_version >= "3.8" and python_version < "4" python-dateutil==2.9.0.post0 ; python_version >= "3.8" and python_version < "4.0" python-dotenv==1.0.1 ; python_version >= "3.8" and python_version < "4.0" diff --git a/tests/test_core.py b/tests/test_core.py index 25654973..d63a2114 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -89,7 +89,7 @@ async def test_capture_images_ptz(system_controller_ptz): assert queue.qsize() == 2 cam_id, frame = await queue.get() # Use timeout to wait for the item - assert cam_id == "192.168.1.1_1" + assert cam_id == "192.168.1.1" assert isinstance(frame, Image.Image) diff --git a/tests/test_engine.py b/tests/test_engine.py index 4c178811..5a6920fa 100644 --- a/tests/test_engine.py +++ b/tests/test_engine.py @@ -18,7 +18,7 @@ def test_engine_offline(tmpdir_factory, mock_wildfire_image, mock_forest_image): # Cache saving _ts = datetime.now().isoformat() - engine._stage_alert(mock_wildfire_image, 0, None, datetime.now().isoformat(), localization="dummy") + engine._stage_alert(mock_wildfire_image, 0, None, datetime.now().isoformat(), bboxes="dummy") assert len(engine._alerts) == 1 assert engine._alerts[0]["ts"] < datetime.now().isoformat() and _ts < engine._alerts[0]["ts"] @@ -33,7 +33,7 @@ def test_engine_offline(tmpdir_factory, mock_wildfire_image, mock_forest_image): "cam_id": 0, "pose_id": None, "ts": engine._alerts[0]["ts"], - "localization": "dummy", + "bboxes": "dummy", } # Overrites cache files engine._dump_cache() From 5c38997947aab5fa5fa1ce5c238db45959196ecb Mon Sep 17 00:00:00 2001 From: Ronan Date: Mon, 9 Sep 2024 17:50:27 +0200 Subject: [PATCH 13/21] fix create detection --- Makefile | 3 +- pyproject.toml | 2 +- pyroengine/engine.py | 20 +- src/poetry.lock | 692 +++++++++++++++++++++---------------------- src/pyproject.toml | 2 +- src/requirements.txt | 46 ++- 6 files changed, 382 insertions(+), 383 deletions(-) diff --git a/Makefile b/Makefile index d740a3c0..fa39487e 100644 --- a/Makefile +++ b/Makefile @@ -26,7 +26,8 @@ lock: cd src; poetry export -f requirements.txt --without-hashes --output requirements.txt # Build the docker -build-app: +build-app: + $(info if you need to update the client change the hash in the .toml and use make lock before) docker build . -t pyronear/pyro-engine:latest build-lib: diff --git a/pyproject.toml b/pyproject.toml index 1b278cfa..c06269d9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -32,7 +32,7 @@ dynamic = ["version"] dependencies = [ "ultralytics==8.2.50", "opencv-python", - "pyroclient @ git+https://github.com/pyronear/pyro-api.git@f809a399bf8928e93da8e95056e811217f6c2a17#egg=pyroclient&subdirectory=client", + "pyroclient @ git+https://github.com/pyronear/pyro-api.git@92b9e28fe4b329aa28c7833b28f3bc89ab1b756c#egg=pyroclient&subdirectory=client", "requests>=2.20.0,<3.0.0", "tqdm>=4.62.0", "huggingface_hub==0.23.1", diff --git a/pyroengine/engine.py b/pyroengine/engine.py index 89b6d53c..7ced6cec 100644 --- a/pyroengine/engine.py +++ b/pyroengine/engine.py @@ -232,9 +232,10 @@ def _update_states(self, frame: Image.Image, preds: np.ndarray, cam_key: str) -> # Limit bbox size for api output_predictions = np.round(output_predictions, 3) # max 3 digit output_predictions = output_predictions[:5, :] # max 5 bbox + output_predictions_tuples = [tuple(row) for row in output_predictions] self._states[cam_key]["last_predictions"].append( - (frame, preds, output_predictions.tolist(), datetime.now(timezone.utc).isoformat(), False) + (frame, preds, output_predictions_tuples, datetime.now(timezone.utc).isoformat(), False) ) # update state @@ -317,7 +318,7 @@ def _process_alerts(self, cameras: List[ReolinkCamera]) -> None: frame_info = self._alerts[0] cam_id = frame_info["cam_id"] pose_id = frame_info["pose_id"] - logging.info(f"Camera '{cam_id}' - Create detection from {frame_info['ts']}...") + logging.info(f"Camera '{cam_id}' - Process detection from {frame_info['ts']}...") # Save alert on device self._local_backup(frame_info["frame"], cam_id, pose_id) @@ -330,16 +331,19 @@ def _process_alerts(self, cameras: List[ReolinkCamera]) -> None: if camera.ip_address == cam_id: azimuth = camera.cam_azimuths[pose_id - 1] if pose_id is not None else camera.cam_azimuths[0] bboxes = self._alerts[0]["bboxes"] - response = self.api_client[cam_id].create_detection(stream.getvalue(), azimuth, bboxes) logging.info(f"Azimuth : {azimuth} , bboxes : {bboxes}") + if len(bboxes) != 0: + response = self.api_client[cam_id].create_detection(stream.getvalue(), azimuth, bboxes) + # Force a KeyError if the request failed + detection_id = response.json().get("id") + if detection_id is None: + print(response.json()) + raise KeyError(f"Missing 'id' in response from camera '{cam_id}'") # Clear + else: + logging.info(f"Camera '{cam_id}' - detection created") break - # Force a KeyError if the request failed - detection_id = response.json().get("id") - if detection_id is None: - raise KeyError(f"Missing 'id' in response from camera '{cam_id}'") # Clear self._alerts.popleft() - logging.info(f"Camera '{cam_id}' - detection created") stream.seek(0) # "Rewind" the stream to the beginning so we can read its content except (KeyError, ConnectionError) as e: logging.exception(f"Camera '{cam_id}' - unable to upload cache") diff --git a/src/poetry.lock b/src/poetry.lock index 42b75d1f..8afcd8b9 100644 --- a/src/poetry.lock +++ b/src/poetry.lock @@ -2,13 +2,13 @@ [[package]] name = "certifi" -version = "2024.7.4" +version = "2024.8.30" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"}, - {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, + {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"}, + {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"}, ] [[package]] @@ -288,19 +288,19 @@ tests = ["pytest", "pytest-cov", "pytest-xdist"] [[package]] name = "filelock" -version = "3.15.4" +version = "3.16.0" description = "A platform independent file lock." optional = false python-versions = ">=3.8" files = [ - {file = "filelock-3.15.4-py3-none-any.whl", hash = "sha256:6ca1fffae96225dab4c6eaf1c4f4f28cd2568d3ec2a44e15a08520504de468e7"}, - {file = "filelock-3.15.4.tar.gz", hash = "sha256:2207938cbc1844345cb01a5a95524dae30f0ce089eba5b00378295a17e3e90cb"}, + {file = "filelock-3.16.0-py3-none-any.whl", hash = "sha256:f6ed4c963184f4c84dd5557ce8fece759a3724b37b80c6c4f20a2f63a4dc6609"}, + {file = "filelock-3.16.0.tar.gz", hash = "sha256:81de9eb8453c769b63369f87f11131a7ab04e367f8d97ad39dc230daa07e3bec"}, ] [package.extras] -docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pytest-asyncio (>=0.21)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)", "virtualenv (>=20.26.2)"] -typing = ["typing-extensions (>=4.8)"] +docs = ["furo (>=2024.8.6)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.6.1)", "diff-cover (>=9.1.1)", "pytest (>=8.3.2)", "pytest-asyncio (>=0.24)", "pytest-cov (>=5)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.26.3)"] +typing = ["typing-extensions (>=4.12.2)"] [[package]] name = "flatbuffers" @@ -380,13 +380,13 @@ woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] [[package]] name = "fsspec" -version = "2024.6.1" +version = "2024.9.0" description = "File-system specification" optional = false python-versions = ">=3.8" files = [ - {file = "fsspec-2024.6.1-py3-none-any.whl", hash = "sha256:3cb443f8bcd2efb31295a5b9fdb02aee81d8452c80d28f97a6d0959e6cee101e"}, - {file = "fsspec-2024.6.1.tar.gz", hash = "sha256:fad7d7e209dd4c1208e3bbfda706620e0da5142bebbd9c384afb95b07e798e49"}, + {file = "fsspec-2024.9.0-py3-none-any.whl", hash = "sha256:a0947d552d8a6efa72cc2c730b12c41d043509156966cca4fb157b0f2a0c574b"}, + {file = "fsspec-2024.9.0.tar.gz", hash = "sha256:4b0afb90c2f21832df142f292649035d80b421f60a9e1c027802e5a0da2b04e8"}, ] [package.extras] @@ -419,13 +419,13 @@ tqdm = ["tqdm"] [[package]] name = "huggingface-hub" -version = "0.24.0" +version = "0.24.6" description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" optional = false python-versions = ">=3.8.0" files = [ - {file = "huggingface_hub-0.24.0-py3-none-any.whl", hash = "sha256:7ad92edefb93d8145c061f6df8d99df2ff85f8379ba5fac8a95aca0642afa5d7"}, - {file = "huggingface_hub-0.24.0.tar.gz", hash = "sha256:6c7092736b577d89d57b3cdfea026f1b0dc2234ae783fa0d59caf1bf7d52dfa7"}, + {file = "huggingface_hub-0.24.6-py3-none-any.whl", hash = "sha256:a990f3232aa985fe749bc9474060cbad75e8b2f115f6665a9fda5b9c97818970"}, + {file = "huggingface_hub-0.24.6.tar.gz", hash = "sha256:cc2579e761d070713eaa9c323e3debe39d5b464ae3a7261c39a9195b27bb8000"}, ] [package.dependencies] @@ -467,46 +467,36 @@ pyreadline3 = {version = "*", markers = "sys_platform == \"win32\" and python_ve [[package]] name = "idna" -version = "3.7" +version = "3.8" description = "Internationalized Domain Names in Applications (IDNA)" optional = false -python-versions = ">=3.5" +python-versions = ">=3.6" files = [ - {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, - {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, + {file = "idna-3.8-py3-none-any.whl", hash = "sha256:050b4e5baadcd44d760cedbd2b8e639f2ff89bbc7a5730fcc662954303377aac"}, + {file = "idna-3.8.tar.gz", hash = "sha256:d838c2c0ed6fced7693d5e8ab8e734d5f8fda53a039c0164afb0b82e771e3603"}, ] [[package]] name = "importlib-resources" -version = "6.4.0" +version = "6.4.4" description = "Read resources from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_resources-6.4.0-py3-none-any.whl", hash = "sha256:50d10f043df931902d4194ea07ec57960f66a80449ff867bfe782b4c486ba78c"}, - {file = "importlib_resources-6.4.0.tar.gz", hash = "sha256:cdb2b453b8046ca4e3798eb1d84f3cce1446a0e8e7b5ef4efb600f19fc398145"}, + {file = "importlib_resources-6.4.4-py3-none-any.whl", hash = "sha256:dda242603d1c9cd836c3368b1174ed74cb4049ecd209e7a1a0104620c18c5c11"}, + {file = "importlib_resources-6.4.4.tar.gz", hash = "sha256:20600c8b7361938dc0bb2d5ec0297802e575df486f5a544fa414da65e13721f7"}, ] [package.dependencies] zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["jaraco.test (>=5.4)", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)", "zipp (>=3.17)"] - -[[package]] -name = "intel-openmp" -version = "2021.4.0" -description = "Intel OpenMP* Runtime Library" -optional = false -python-versions = "*" -files = [ - {file = "intel_openmp-2021.4.0-py2.py3-none-macosx_10_15_x86_64.macosx_11_0_x86_64.whl", hash = "sha256:41c01e266a7fdb631a7609191709322da2bbf24b252ba763f125dd651bcc7675"}, - {file = "intel_openmp-2021.4.0-py2.py3-none-manylinux1_i686.whl", hash = "sha256:3b921236a38384e2016f0f3d65af6732cf2c12918087128a9163225451e776f2"}, - {file = "intel_openmp-2021.4.0-py2.py3-none-manylinux1_x86_64.whl", hash = "sha256:e2240ab8d01472fed04f3544a878cda5da16c26232b7ea1b59132dbfb48b186e"}, - {file = "intel_openmp-2021.4.0-py2.py3-none-win32.whl", hash = "sha256:6e863d8fd3d7e8ef389d52cf97a50fe2afe1a19247e8c0d168ce021546f96fc9"}, - {file = "intel_openmp-2021.4.0-py2.py3-none-win_amd64.whl", hash = "sha256:eef4c8bcc8acefd7f5cd3b9384dbf73d59e2c99fc56545712ded913f43c4a94f"}, -] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["jaraco.test (>=5.4)", "pytest (>=6,!=8.1.*)", "zipp (>=3.17)"] +type = ["pytest-mypy"] [[package]] name = "jinja2" @@ -527,115 +517,125 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "kiwisolver" -version = "1.4.5" +version = "1.4.7" description = "A fast implementation of the Cassowary constraint solver" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:05703cf211d585109fcd72207a31bb170a0f22144d68298dc5e61b3c946518af"}, - {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:146d14bebb7f1dc4d5fbf74f8a6cb15ac42baadee8912eb84ac0b3b2a3dc6ac3"}, - {file = "kiwisolver-1.4.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ef7afcd2d281494c0a9101d5c571970708ad911d028137cd558f02b851c08b4"}, - {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9eaa8b117dc8337728e834b9c6e2611f10c79e38f65157c4c38e9400286f5cb1"}, - {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ec20916e7b4cbfb1f12380e46486ec4bcbaa91a9c448b97023fde0d5bbf9e4ff"}, - {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39b42c68602539407884cf70d6a480a469b93b81b7701378ba5e2328660c847a"}, - {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa12042de0171fad672b6c59df69106d20d5596e4f87b5e8f76df757a7c399aa"}, - {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a40773c71d7ccdd3798f6489aaac9eee213d566850a9533f8d26332d626b82c"}, - {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:19df6e621f6d8b4b9c4d45f40a66839294ff2bb235e64d2178f7522d9170ac5b"}, - {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:83d78376d0d4fd884e2c114d0621624b73d2aba4e2788182d286309ebdeed770"}, - {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e391b1f0a8a5a10ab3b9bb6afcfd74f2175f24f8975fb87ecae700d1503cdee0"}, - {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:852542f9481f4a62dbb5dd99e8ab7aedfeb8fb6342349a181d4036877410f525"}, - {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59edc41b24031bc25108e210c0def6f6c2191210492a972d585a06ff246bb79b"}, - {file = "kiwisolver-1.4.5-cp310-cp310-win32.whl", hash = "sha256:a6aa6315319a052b4ee378aa171959c898a6183f15c1e541821c5c59beaa0238"}, - {file = "kiwisolver-1.4.5-cp310-cp310-win_amd64.whl", hash = "sha256:d0ef46024e6a3d79c01ff13801cb19d0cad7fd859b15037aec74315540acc276"}, - {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:11863aa14a51fd6ec28688d76f1735f8f69ab1fabf388851a595d0721af042f5"}, - {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8ab3919a9997ab7ef2fbbed0cc99bb28d3c13e6d4b1ad36e97e482558a91be90"}, - {file = "kiwisolver-1.4.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fcc700eadbbccbf6bc1bcb9dbe0786b4b1cb91ca0dcda336eef5c2beed37b797"}, - {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dfdd7c0b105af050eb3d64997809dc21da247cf44e63dc73ff0fd20b96be55a9"}, - {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76c6a5964640638cdeaa0c359382e5703e9293030fe730018ca06bc2010c4437"}, - {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbea0db94288e29afcc4c28afbf3a7ccaf2d7e027489c449cf7e8f83c6346eb9"}, - {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ceec1a6bc6cab1d6ff5d06592a91a692f90ec7505d6463a88a52cc0eb58545da"}, - {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:040c1aebeda72197ef477a906782b5ab0d387642e93bda547336b8957c61022e"}, - {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f91de7223d4c7b793867797bacd1ee53bfe7359bd70d27b7b58a04efbb9436c8"}, - {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:faae4860798c31530dd184046a900e652c95513796ef51a12bc086710c2eec4d"}, - {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b0157420efcb803e71d1b28e2c287518b8808b7cf1ab8af36718fd0a2c453eb0"}, - {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:06f54715b7737c2fecdbf140d1afb11a33d59508a47bf11bb38ecf21dc9ab79f"}, - {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fdb7adb641a0d13bdcd4ef48e062363d8a9ad4a182ac7647ec88f695e719ae9f"}, - {file = "kiwisolver-1.4.5-cp311-cp311-win32.whl", hash = "sha256:bb86433b1cfe686da83ce32a9d3a8dd308e85c76b60896d58f082136f10bffac"}, - {file = "kiwisolver-1.4.5-cp311-cp311-win_amd64.whl", hash = "sha256:6c08e1312a9cf1074d17b17728d3dfce2a5125b2d791527f33ffbe805200a355"}, - {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:32d5cf40c4f7c7b3ca500f8985eb3fb3a7dfc023215e876f207956b5ea26632a"}, - {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f846c260f483d1fd217fe5ed7c173fb109efa6b1fc8381c8b7552c5781756192"}, - {file = "kiwisolver-1.4.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5ff5cf3571589b6d13bfbfd6bcd7a3f659e42f96b5fd1c4830c4cf21d4f5ef45"}, - {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7269d9e5f1084a653d575c7ec012ff57f0c042258bf5db0954bf551c158466e7"}, - {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da802a19d6e15dffe4b0c24b38b3af68e6c1a68e6e1d8f30148c83864f3881db"}, - {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3aba7311af82e335dd1e36ffff68aaca609ca6290c2cb6d821a39aa075d8e3ff"}, - {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:763773d53f07244148ccac5b084da5adb90bfaee39c197554f01b286cf869228"}, - {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2270953c0d8cdab5d422bee7d2007f043473f9d2999631c86a223c9db56cbd16"}, - {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d099e745a512f7e3bbe7249ca835f4d357c586d78d79ae8f1dcd4d8adeb9bda9"}, - {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:74db36e14a7d1ce0986fa104f7d5637aea5c82ca6326ed0ec5694280942d1162"}, - {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7e5bab140c309cb3a6ce373a9e71eb7e4873c70c2dda01df6820474f9889d6d4"}, - {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0f114aa76dc1b8f636d077979c0ac22e7cd8f3493abbab152f20eb8d3cda71f3"}, - {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:88a2df29d4724b9237fc0c6eaf2a1adae0cdc0b3e9f4d8e7dc54b16812d2d81a"}, - {file = "kiwisolver-1.4.5-cp312-cp312-win32.whl", hash = "sha256:72d40b33e834371fd330fb1472ca19d9b8327acb79a5821d4008391db8e29f20"}, - {file = "kiwisolver-1.4.5-cp312-cp312-win_amd64.whl", hash = "sha256:2c5674c4e74d939b9d91dda0fae10597ac7521768fec9e399c70a1f27e2ea2d9"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3a2b053a0ab7a3960c98725cfb0bf5b48ba82f64ec95fe06f1d06c99b552e130"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cd32d6c13807e5c66a7cbb79f90b553642f296ae4518a60d8d76243b0ad2898"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59ec7b7c7e1a61061850d53aaf8e93db63dce0c936db1fda2658b70e4a1be709"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da4cfb373035def307905d05041c1d06d8936452fe89d464743ae7fb8371078b"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2400873bccc260b6ae184b2b8a4fec0e4082d30648eadb7c3d9a13405d861e89"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1b04139c4236a0f3aff534479b58f6f849a8b351e1314826c2d230849ed48985"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:4e66e81a5779b65ac21764c295087de82235597a2293d18d943f8e9e32746265"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:7931d8f1f67c4be9ba1dd9c451fb0eeca1a25b89e4d3f89e828fe12a519b782a"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:b3f7e75f3015df442238cca659f8baa5f42ce2a8582727981cbfa15fee0ee205"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:bbf1d63eef84b2e8c89011b7f2235b1e0bf7dacc11cac9431fc6468e99ac77fb"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4c380469bd3f970ef677bf2bcba2b6b0b4d5c75e7a020fb863ef75084efad66f"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-win32.whl", hash = "sha256:9408acf3270c4b6baad483865191e3e582b638b1654a007c62e3efe96f09a9a3"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-win_amd64.whl", hash = "sha256:5b94529f9b2591b7af5f3e0e730a4e0a41ea174af35a4fd067775f9bdfeee01a"}, - {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:11c7de8f692fc99816e8ac50d1d1aef4f75126eefc33ac79aac02c099fd3db71"}, - {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:53abb58632235cd154176ced1ae8f0d29a6657aa1aa9decf50b899b755bc2b93"}, - {file = "kiwisolver-1.4.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:88b9f257ca61b838b6f8094a62418421f87ac2a1069f7e896c36a7d86b5d4c29"}, - {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3195782b26fc03aa9c6913d5bad5aeb864bdc372924c093b0f1cebad603dd712"}, - {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc579bf0f502e54926519451b920e875f433aceb4624a3646b3252b5caa9e0b6"}, - {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a580c91d686376f0f7c295357595c5a026e6cbc3d77b7c36e290201e7c11ecb"}, - {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cfe6ab8da05c01ba6fbea630377b5da2cd9bcbc6338510116b01c1bc939a2c18"}, - {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d2e5a98f0ec99beb3c10e13b387f8db39106d53993f498b295f0c914328b1333"}, - {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a51a263952b1429e429ff236d2f5a21c5125437861baeed77f5e1cc2d2c7c6da"}, - {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3edd2fa14e68c9be82c5b16689e8d63d89fe927e56debd6e1dbce7a26a17f81b"}, - {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:74d1b44c6cfc897df648cc9fdaa09bc3e7679926e6f96df05775d4fb3946571c"}, - {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:76d9289ed3f7501012e05abb8358bbb129149dbd173f1f57a1bf1c22d19ab7cc"}, - {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:92dea1ffe3714fa8eb6a314d2b3c773208d865a0e0d35e713ec54eea08a66250"}, - {file = "kiwisolver-1.4.5-cp38-cp38-win32.whl", hash = "sha256:5c90ae8c8d32e472be041e76f9d2f2dbff4d0b0be8bd4041770eddb18cf49a4e"}, - {file = "kiwisolver-1.4.5-cp38-cp38-win_amd64.whl", hash = "sha256:c7940c1dc63eb37a67721b10d703247552416f719c4188c54e04334321351ced"}, - {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9407b6a5f0d675e8a827ad8742e1d6b49d9c1a1da5d952a67d50ef5f4170b18d"}, - {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:15568384086b6df3c65353820a4473575dbad192e35010f622c6ce3eebd57af9"}, - {file = "kiwisolver-1.4.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0dc9db8e79f0036e8173c466d21ef18e1befc02de8bf8aa8dc0813a6dc8a7046"}, - {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cdc8a402aaee9a798b50d8b827d7ecf75edc5fb35ea0f91f213ff927c15f4ff0"}, - {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6c3bd3cde54cafb87d74d8db50b909705c62b17c2099b8f2e25b461882e544ff"}, - {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:955e8513d07a283056b1396e9a57ceddbd272d9252c14f154d450d227606eb54"}, - {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:346f5343b9e3f00b8db8ba359350eb124b98c99efd0b408728ac6ebf38173958"}, - {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b9098e0049e88c6a24ff64545cdfc50807818ba6c1b739cae221bbbcbc58aad3"}, - {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:00bd361b903dc4bbf4eb165f24d1acbee754fce22ded24c3d56eec268658a5cf"}, - {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7b8b454bac16428b22560d0a1cf0a09875339cab69df61d7805bf48919415901"}, - {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f1d072c2eb0ad60d4c183f3fb44ac6f73fb7a8f16a2694a91f988275cbf352f9"}, - {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:31a82d498054cac9f6d0b53d02bb85811185bcb477d4b60144f915f3b3126342"}, - {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6512cb89e334e4700febbffaaa52761b65b4f5a3cf33f960213d5656cea36a77"}, - {file = "kiwisolver-1.4.5-cp39-cp39-win32.whl", hash = "sha256:9db8ea4c388fdb0f780fe91346fd438657ea602d58348753d9fb265ce1bca67f"}, - {file = "kiwisolver-1.4.5-cp39-cp39-win_amd64.whl", hash = "sha256:59415f46a37f7f2efeec758353dd2eae1b07640d8ca0f0c42548ec4125492635"}, - {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5c7b3b3a728dc6faf3fc372ef24f21d1e3cee2ac3e9596691d746e5a536de920"}, - {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:620ced262a86244e2be10a676b646f29c34537d0d9cc8eb26c08f53d98013390"}, - {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:378a214a1e3bbf5ac4a8708304318b4f890da88c9e6a07699c4ae7174c09a68d"}, - {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf7be1207676ac608a50cd08f102f6742dbfc70e8d60c4db1c6897f62f71523"}, - {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ba55dce0a9b8ff59495ddd050a0225d58bd0983d09f87cfe2b6aec4f2c1234e4"}, - {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fd32ea360bcbb92d28933fc05ed09bffcb1704ba3fc7942e81db0fd4f81a7892"}, - {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5e7139af55d1688f8b960ee9ad5adafc4ac17c1c473fe07133ac092310d76544"}, - {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dced8146011d2bc2e883f9bd68618b8247387f4bbec46d7392b3c3b032640126"}, - {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9bf3325c47b11b2e51bca0824ea217c7cd84491d8ac4eefd1e409705ef092bd"}, - {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5794cf59533bc3f1b1c821f7206a3617999db9fbefc345360aafe2e067514929"}, - {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e368f200bbc2e4f905b8e71eb38b3c04333bddaa6a2464a6355487b02bb7fb09"}, - {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5d706eba36b4c4d5bc6c6377bb6568098765e990cfc21ee16d13963fab7b3e7"}, - {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85267bd1aa8880a9c88a8cb71e18d3d64d2751a790e6ca6c27b8ccc724bcd5ad"}, - {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210ef2c3a1f03272649aff1ef992df2e724748918c4bc2d5a90352849eb40bea"}, - {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:11d011a7574eb3b82bcc9c1a1d35c1d7075677fdd15de527d91b46bd35e935ee"}, - {file = "kiwisolver-1.4.5.tar.gz", hash = "sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec"}, + {file = "kiwisolver-1.4.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8a9c83f75223d5e48b0bc9cb1bf2776cf01563e00ade8775ffe13b0b6e1af3a6"}, + {file = "kiwisolver-1.4.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:58370b1ffbd35407444d57057b57da5d6549d2d854fa30249771775c63b5fe17"}, + {file = "kiwisolver-1.4.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:aa0abdf853e09aff551db11fce173e2177d00786c688203f52c87ad7fcd91ef9"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8d53103597a252fb3ab8b5845af04c7a26d5e7ea8122303dd7a021176a87e8b9"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:88f17c5ffa8e9462fb79f62746428dd57b46eb931698e42e990ad63103f35e6c"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88a9ca9c710d598fd75ee5de59d5bda2684d9db36a9f50b6125eaea3969c2599"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f4d742cb7af1c28303a51b7a27aaee540e71bb8e24f68c736f6f2ffc82f2bf05"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e28c7fea2196bf4c2f8d46a0415c77a1c480cc0724722f23d7410ffe9842c407"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e968b84db54f9d42046cf154e02911e39c0435c9801681e3fc9ce8a3c4130278"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0c18ec74c0472de033e1bebb2911c3c310eef5649133dd0bedf2a169a1b269e5"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8f0ea6da6d393d8b2e187e6a5e3fb81f5862010a40c3945e2c6d12ae45cfb2ad"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:f106407dda69ae456dd1227966bf445b157ccc80ba0dff3802bb63f30b74e895"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:84ec80df401cfee1457063732d90022f93951944b5b58975d34ab56bb150dfb3"}, + {file = "kiwisolver-1.4.7-cp310-cp310-win32.whl", hash = "sha256:71bb308552200fb2c195e35ef05de12f0c878c07fc91c270eb3d6e41698c3bcc"}, + {file = "kiwisolver-1.4.7-cp310-cp310-win_amd64.whl", hash = "sha256:44756f9fd339de0fb6ee4f8c1696cfd19b2422e0d70b4cefc1cc7f1f64045a8c"}, + {file = "kiwisolver-1.4.7-cp310-cp310-win_arm64.whl", hash = "sha256:78a42513018c41c2ffd262eb676442315cbfe3c44eed82385c2ed043bc63210a"}, + {file = "kiwisolver-1.4.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d2b0e12a42fb4e72d509fc994713d099cbb15ebf1103545e8a45f14da2dfca54"}, + {file = "kiwisolver-1.4.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2a8781ac3edc42ea4b90bc23e7d37b665d89423818e26eb6df90698aa2287c95"}, + {file = "kiwisolver-1.4.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:46707a10836894b559e04b0fd143e343945c97fd170d69a2d26d640b4e297935"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef97b8df011141c9b0f6caf23b29379f87dd13183c978a30a3c546d2c47314cb"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ab58c12a2cd0fc769089e6d38466c46d7f76aced0a1f54c77652446733d2d02"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:803b8e1459341c1bb56d1c5c010406d5edec8a0713a0945851290a7930679b51"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f9a9e8a507420fe35992ee9ecb302dab68550dedc0da9e2880dd88071c5fb052"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18077b53dc3bb490e330669a99920c5e6a496889ae8c63b58fbc57c3d7f33a18"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6af936f79086a89b3680a280c47ea90b4df7047b5bdf3aa5c524bbedddb9e545"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:3abc5b19d24af4b77d1598a585b8a719beb8569a71568b66f4ebe1fb0449460b"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:933d4de052939d90afbe6e9d5273ae05fb836cc86c15b686edd4b3560cc0ee36"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:65e720d2ab2b53f1f72fb5da5fb477455905ce2c88aaa671ff0a447c2c80e8e3"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3bf1ed55088f214ba6427484c59553123fdd9b218a42bbc8c6496d6754b1e523"}, + {file = "kiwisolver-1.4.7-cp311-cp311-win32.whl", hash = "sha256:4c00336b9dd5ad96d0a558fd18a8b6f711b7449acce4c157e7343ba92dd0cf3d"}, + {file = "kiwisolver-1.4.7-cp311-cp311-win_amd64.whl", hash = "sha256:929e294c1ac1e9f615c62a4e4313ca1823ba37326c164ec720a803287c4c499b"}, + {file = "kiwisolver-1.4.7-cp311-cp311-win_arm64.whl", hash = "sha256:e33e8fbd440c917106b237ef1a2f1449dfbb9b6f6e1ce17c94cd6a1e0d438376"}, + {file = "kiwisolver-1.4.7-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:5360cc32706dab3931f738d3079652d20982511f7c0ac5711483e6eab08efff2"}, + {file = "kiwisolver-1.4.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:942216596dc64ddb25adb215c3c783215b23626f8d84e8eff8d6d45c3f29f75a"}, + {file = "kiwisolver-1.4.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:48b571ecd8bae15702e4f22d3ff6a0f13e54d3d00cd25216d5e7f658242065ee"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ad42ba922c67c5f219097b28fae965e10045ddf145d2928bfac2eb2e17673640"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:612a10bdae23404a72941a0fc8fa2660c6ea1217c4ce0dbcab8a8f6543ea9e7f"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9e838bba3a3bac0fe06d849d29772eb1afb9745a59710762e4ba3f4cb8424483"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:22f499f6157236c19f4bbbd472fa55b063db77a16cd74d49afe28992dff8c258"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693902d433cf585133699972b6d7c42a8b9f8f826ebcaf0132ff55200afc599e"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4e77f2126c3e0b0d055f44513ed349038ac180371ed9b52fe96a32aa071a5107"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:657a05857bda581c3656bfc3b20e353c232e9193eb167766ad2dc58b56504948"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4bfa75a048c056a411f9705856abfc872558e33c055d80af6a380e3658766038"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:34ea1de54beef1c104422d210c47c7d2a4999bdecf42c7b5718fbe59a4cac383"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:90da3b5f694b85231cf93586dad5e90e2d71b9428f9aad96952c99055582f520"}, + {file = "kiwisolver-1.4.7-cp312-cp312-win32.whl", hash = "sha256:18e0cca3e008e17fe9b164b55735a325140a5a35faad8de92dd80265cd5eb80b"}, + {file = "kiwisolver-1.4.7-cp312-cp312-win_amd64.whl", hash = "sha256:58cb20602b18f86f83a5c87d3ee1c766a79c0d452f8def86d925e6c60fbf7bfb"}, + {file = "kiwisolver-1.4.7-cp312-cp312-win_arm64.whl", hash = "sha256:f5a8b53bdc0b3961f8b6125e198617c40aeed638b387913bf1ce78afb1b0be2a"}, + {file = "kiwisolver-1.4.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2e6039dcbe79a8e0f044f1c39db1986a1b8071051efba3ee4d74f5b365f5226e"}, + {file = "kiwisolver-1.4.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a1ecf0ac1c518487d9d23b1cd7139a6a65bc460cd101ab01f1be82ecf09794b6"}, + {file = "kiwisolver-1.4.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7ab9ccab2b5bd5702ab0803676a580fffa2aa178c2badc5557a84cc943fcf750"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f816dd2277f8d63d79f9c8473a79fe54047bc0467754962840782c575522224d"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf8bcc23ceb5a1b624572a1623b9f79d2c3b337c8c455405ef231933a10da379"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dea0bf229319828467d7fca8c7c189780aa9ff679c94539eed7532ebe33ed37c"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c06a4c7cf15ec739ce0e5971b26c93638730090add60e183530d70848ebdd34"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:913983ad2deb14e66d83c28b632fd35ba2b825031f2fa4ca29675e665dfecbe1"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5337ec7809bcd0f424c6b705ecf97941c46279cf5ed92311782c7c9c2026f07f"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4c26ed10c4f6fa6ddb329a5120ba3b6db349ca192ae211e882970bfc9d91420b"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c619b101e6de2222c1fcb0531e1b17bbffbe54294bfba43ea0d411d428618c27"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:073a36c8273647592ea332e816e75ef8da5c303236ec0167196793eb1e34657a"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3ce6b2b0231bda412463e152fc18335ba32faf4e8c23a754ad50ffa70e4091ee"}, + {file = "kiwisolver-1.4.7-cp313-cp313-win32.whl", hash = "sha256:f4c9aee212bc89d4e13f58be11a56cc8036cabad119259d12ace14b34476fd07"}, + {file = "kiwisolver-1.4.7-cp313-cp313-win_amd64.whl", hash = "sha256:8a3ec5aa8e38fc4c8af308917ce12c536f1c88452ce554027e55b22cbbfbff76"}, + {file = "kiwisolver-1.4.7-cp313-cp313-win_arm64.whl", hash = "sha256:76c8094ac20ec259471ac53e774623eb62e6e1f56cd8690c67ce6ce4fcb05650"}, + {file = "kiwisolver-1.4.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5d5abf8f8ec1f4e22882273c423e16cae834c36856cac348cfbfa68e01c40f3a"}, + {file = "kiwisolver-1.4.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:aeb3531b196ef6f11776c21674dba836aeea9d5bd1cf630f869e3d90b16cfade"}, + {file = "kiwisolver-1.4.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b7d755065e4e866a8086c9bdada157133ff466476a2ad7861828e17b6026e22c"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08471d4d86cbaec61f86b217dd938a83d85e03785f51121e791a6e6689a3be95"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7bbfcb7165ce3d54a3dfbe731e470f65739c4c1f85bb1018ee912bae139e263b"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d34eb8494bea691a1a450141ebb5385e4b69d38bb8403b5146ad279f4b30fa3"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9242795d174daa40105c1d86aba618e8eab7bf96ba8c3ee614da8302a9f95503"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a0f64a48bb81af7450e641e3fe0b0394d7381e342805479178b3d335d60ca7cf"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8e045731a5416357638d1700927529e2b8ab304811671f665b225f8bf8d8f933"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:4322872d5772cae7369f8351da1edf255a604ea7087fe295411397d0cfd9655e"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:e1631290ee9271dffe3062d2634c3ecac02c83890ada077d225e081aca8aab89"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:edcfc407e4eb17e037bca59be0e85a2031a2ac87e4fed26d3e9df88b4165f92d"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:4d05d81ecb47d11e7f8932bd8b61b720bf0b41199358f3f5e36d38e28f0532c5"}, + {file = "kiwisolver-1.4.7-cp38-cp38-win32.whl", hash = "sha256:b38ac83d5f04b15e515fd86f312479d950d05ce2368d5413d46c088dda7de90a"}, + {file = "kiwisolver-1.4.7-cp38-cp38-win_amd64.whl", hash = "sha256:d83db7cde68459fc803052a55ace60bea2bae361fc3b7a6d5da07e11954e4b09"}, + {file = "kiwisolver-1.4.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3f9362ecfca44c863569d3d3c033dbe8ba452ff8eed6f6b5806382741a1334bd"}, + {file = "kiwisolver-1.4.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e8df2eb9b2bac43ef8b082e06f750350fbbaf2887534a5be97f6cf07b19d9583"}, + {file = "kiwisolver-1.4.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f32d6edbc638cde7652bd690c3e728b25332acbadd7cad670cc4a02558d9c417"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e2e6c39bd7b9372b0be21456caab138e8e69cc0fc1190a9dfa92bd45a1e6e904"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dda56c24d869b1193fcc763f1284b9126550eaf84b88bbc7256e15028f19188a"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79849239c39b5e1fd906556c474d9b0439ea6792b637511f3fe3a41158d89ca8"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5e3bc157fed2a4c02ec468de4ecd12a6e22818d4f09cde2c31ee3226ffbefab2"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3da53da805b71e41053dc670f9a820d1157aae77b6b944e08024d17bcd51ef88"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8705f17dfeb43139a692298cb6637ee2e59c0194538153e83e9ee0c75c2eddde"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:82a5c2f4b87c26bb1a0ef3d16b5c4753434633b83d365cc0ddf2770c93829e3c"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce8be0466f4c0d585cdb6c1e2ed07232221df101a4c6f28821d2aa754ca2d9e2"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:409afdfe1e2e90e6ee7fc896f3df9a7fec8e793e58bfa0d052c8a82f99c37abb"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5b9c3f4ee0b9a439d2415012bd1b1cc2df59e4d6a9939f4d669241d30b414327"}, + {file = "kiwisolver-1.4.7-cp39-cp39-win32.whl", hash = "sha256:a79ae34384df2b615eefca647a2873842ac3b596418032bef9a7283675962644"}, + {file = "kiwisolver-1.4.7-cp39-cp39-win_amd64.whl", hash = "sha256:cf0438b42121a66a3a667de17e779330fc0f20b0d97d59d2f2121e182b0505e4"}, + {file = "kiwisolver-1.4.7-cp39-cp39-win_arm64.whl", hash = "sha256:764202cc7e70f767dab49e8df52c7455e8de0df5d858fa801a11aa0d882ccf3f"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:94252291e3fe68001b1dd747b4c0b3be12582839b95ad4d1b641924d68fd4643"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:5b7dfa3b546da08a9f622bb6becdb14b3e24aaa30adba66749d38f3cc7ea9706"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd3de6481f4ed8b734da5df134cd5a6a64fe32124fe83dde1e5b5f29fe30b1e6"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a91b5f9f1205845d488c928e8570dcb62b893372f63b8b6e98b863ebd2368ff2"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40fa14dbd66b8b8f470d5fc79c089a66185619d31645f9b0773b88b19f7223c4"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:eb542fe7933aa09d8d8f9d9097ef37532a7df6497819d16efe4359890a2f417a"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bfa1acfa0c54932d5607e19a2c24646fb4c1ae2694437789129cf099789a3b00"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:eee3ea935c3d227d49b4eb85660ff631556841f6e567f0f7bda972df6c2c9935"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f3160309af4396e0ed04db259c3ccbfdc3621b5559b5453075e5de555e1f3a1b"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a17f6a29cf8935e587cc8a4dbfc8368c55edc645283db0ce9801016f83526c2d"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10849fb2c1ecbfae45a693c070e0320a91b35dd4bcf58172c023b994283a124d"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:ac542bf38a8a4be2dc6b15248d36315ccc65f0743f7b1a76688ffb6b5129a5c2"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:8b01aac285f91ca889c800042c35ad3b239e704b150cfd3382adfc9dcc780e39"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:48be928f59a1f5c8207154f935334d374e79f2b5d212826307d072595ad76a2e"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f37cfe618a117e50d8c240555331160d73d0411422b59b5ee217843d7b693608"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:599b5c873c63a1f6ed7eead644a8a380cfbdf5db91dcb6f85707aaab213b1674"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:801fa7802e5cfabe3ab0c81a34c323a319b097dfb5004be950482d882f3d7225"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:0c6c43471bc764fad4bc99c5c2d6d16a676b1abf844ca7c8702bdae92df01ee0"}, + {file = "kiwisolver-1.4.7.tar.gz", hash = "sha256:9893ff81bd7107f7b685d3017cc6583daadb4fc26e4a888350df530e41980a60"}, ] [[package]] @@ -775,24 +775,6 @@ pillow = ">=6.2.0" pyparsing = ">=2.3.1" python-dateutil = ">=2.7" -[[package]] -name = "mkl" -version = "2021.4.0" -description = "IntelĀ® oneAPI Math Kernel Library" -optional = false -python-versions = "*" -files = [ - {file = "mkl-2021.4.0-py2.py3-none-macosx_10_15_x86_64.macosx_11_0_x86_64.whl", hash = "sha256:67460f5cd7e30e405b54d70d1ed3ca78118370b65f7327d495e9c8847705e2fb"}, - {file = "mkl-2021.4.0-py2.py3-none-manylinux1_i686.whl", hash = "sha256:636d07d90e68ccc9630c654d47ce9fdeb036bb46e2b193b3a9ac8cfea683cce5"}, - {file = "mkl-2021.4.0-py2.py3-none-manylinux1_x86_64.whl", hash = "sha256:398dbf2b0d12acaf54117a5210e8f191827f373d362d796091d161f610c1ebfb"}, - {file = "mkl-2021.4.0-py2.py3-none-win32.whl", hash = "sha256:439c640b269a5668134e3dcbcea4350459c4a8bc46469669b2d67e07e3d330e8"}, - {file = "mkl-2021.4.0-py2.py3-none-win_amd64.whl", hash = "sha256:ceef3cafce4c009dd25f65d7ad0d833a0fbadc3d8903991ec92351fe5de1e718"}, -] - -[package.dependencies] -intel-openmp = "==2021.*" -tbb = "==2021.*" - [[package]] name = "mpmath" version = "1.3.0" @@ -911,12 +893,13 @@ files = [ [[package]] name = "nvidia-cudnn-cu12" -version = "8.9.2.26" +version = "9.1.0.70" description = "cuDNN runtime libraries" optional = false python-versions = ">=3" files = [ - {file = "nvidia_cudnn_cu12-8.9.2.26-py3-none-manylinux1_x86_64.whl", hash = "sha256:5ccb288774fdfb07a7e7025ffec286971c06d8d7b4fb162525334616d7629ff9"}, + {file = "nvidia_cudnn_cu12-9.1.0.70-py3-none-manylinux2014_x86_64.whl", hash = "sha256:165764f44ef8c61fcdfdfdbe769d687e06374059fbb388b6c89ecb0e28793a6f"}, + {file = "nvidia_cudnn_cu12-9.1.0.70-py3-none-win_amd64.whl", hash = "sha256:6278562929433d68365a07a4a1546c237ba2849852c0d4b2262a486e805b977a"}, ] [package.dependencies] @@ -987,14 +970,14 @@ files = [ [[package]] name = "nvidia-nvjitlink-cu12" -version = "12.5.82" +version = "12.6.68" description = "Nvidia JIT LTO Library" optional = false python-versions = ">=3" files = [ - {file = "nvidia_nvjitlink_cu12-12.5.82-py3-none-manylinux2014_aarch64.whl", hash = "sha256:98103729cc5226e13ca319a10bbf9433bbbd44ef64fe72f45f067cacc14b8d27"}, - {file = "nvidia_nvjitlink_cu12-12.5.82-py3-none-manylinux2014_x86_64.whl", hash = "sha256:f9b37bc5c8cf7509665cb6ada5aaa0ce65618f2332b7d3e78e9790511f111212"}, - {file = "nvidia_nvjitlink_cu12-12.5.82-py3-none-win_amd64.whl", hash = "sha256:e782564d705ff0bf61ac3e1bf730166da66dd2fe9012f111ede5fc49b64ae697"}, + {file = "nvidia_nvjitlink_cu12-12.6.68-py3-none-manylinux2014_aarch64.whl", hash = "sha256:b3fd0779845f68b92063ab1393abab1ed0a23412fc520df79a8190d098b5cd6b"}, + {file = "nvidia_nvjitlink_cu12-12.6.68-py3-none-manylinux2014_x86_64.whl", hash = "sha256:125a6c2a44e96386dda634e13d944e60b07a0402d391a070e8fb4104b34ea1ab"}, + {file = "nvidia_nvjitlink_cu12-12.6.68-py3-none-win_amd64.whl", hash = "sha256:a55744c98d70317c5e23db14866a8cc2b733f7324509e941fc96276f9f37801d"}, ] [[package]] @@ -1010,42 +993,42 @@ files = [ [[package]] name = "onnxruntime" -version = "1.18.1" +version = "1.19.2" description = "ONNX Runtime is a runtime accelerator for Machine Learning models" optional = false python-versions = "*" files = [ - {file = "onnxruntime-1.18.1-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:29ef7683312393d4ba04252f1b287d964bd67d5e6048b94d2da3643986c74d80"}, - {file = "onnxruntime-1.18.1-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fc706eb1df06ddf55776e15a30519fb15dda7697f987a2bbda4962845e3cec05"}, - {file = "onnxruntime-1.18.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7de69f5ced2a263531923fa68bbec52a56e793b802fcd81a03487b5e292bc3a"}, - {file = "onnxruntime-1.18.1-cp310-cp310-win32.whl", hash = "sha256:221e5b16173926e6c7de2cd437764492aa12b6811f45abd37024e7cf2ae5d7e3"}, - {file = "onnxruntime-1.18.1-cp310-cp310-win_amd64.whl", hash = "sha256:75211b619275199c861ee94d317243b8a0fcde6032e5a80e1aa9ded8ab4c6060"}, - {file = "onnxruntime-1.18.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:f26582882f2dc581b809cfa41a125ba71ad9e715738ec6402418df356969774a"}, - {file = "onnxruntime-1.18.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef36f3a8b768506d02be349ac303fd95d92813ba3ba70304d40c3cd5c25d6a4c"}, - {file = "onnxruntime-1.18.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:170e711393e0618efa8ed27b59b9de0ee2383bd2a1f93622a97006a5ad48e434"}, - {file = "onnxruntime-1.18.1-cp311-cp311-win32.whl", hash = "sha256:9b6a33419b6949ea34e0dc009bc4470e550155b6da644571ecace4b198b0d88f"}, - {file = "onnxruntime-1.18.1-cp311-cp311-win_amd64.whl", hash = "sha256:5c1380a9f1b7788da742c759b6a02ba771fe1ce620519b2b07309decbd1a2fe1"}, - {file = "onnxruntime-1.18.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:31bd57a55e3f983b598675dfc7e5d6f0877b70ec9864b3cc3c3e1923d0a01919"}, - {file = "onnxruntime-1.18.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b9e03c4ba9f734500691a4d7d5b381cd71ee2f3ce80a1154ac8f7aed99d1ecaa"}, - {file = "onnxruntime-1.18.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:781aa9873640f5df24524f96f6070b8c550c66cb6af35710fd9f92a20b4bfbf6"}, - {file = "onnxruntime-1.18.1-cp312-cp312-win32.whl", hash = "sha256:3a2d9ab6254ca62adbb448222e630dc6883210f718065063518c8f93a32432be"}, - {file = "onnxruntime-1.18.1-cp312-cp312-win_amd64.whl", hash = "sha256:ad93c560b1c38c27c0275ffd15cd7f45b3ad3fc96653c09ce2931179982ff204"}, - {file = "onnxruntime-1.18.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:3b55dc9d3c67626388958a3eb7ad87eb7c70f75cb0f7ff4908d27b8b42f2475c"}, - {file = "onnxruntime-1.18.1-cp38-cp38-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f80dbcfb6763cc0177a31168b29b4bd7662545b99a19e211de8c734b657e0669"}, - {file = "onnxruntime-1.18.1-cp38-cp38-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f1ff2c61a16d6c8631796c54139bafea41ee7736077a0fc64ee8ae59432f5c58"}, - {file = "onnxruntime-1.18.1-cp38-cp38-win32.whl", hash = "sha256:219855bd272fe0c667b850bf1a1a5a02499269a70d59c48e6f27f9c8bcb25d02"}, - {file = "onnxruntime-1.18.1-cp38-cp38-win_amd64.whl", hash = "sha256:afdf16aa607eb9a2c60d5ca2d5abf9f448e90c345b6b94c3ed14f4fb7e6a2d07"}, - {file = "onnxruntime-1.18.1-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:128df253ade673e60cea0955ec9d0e89617443a6d9ce47c2d79eb3f72a3be3de"}, - {file = "onnxruntime-1.18.1-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9839491e77e5c5a175cab3621e184d5a88925ee297ff4c311b68897197f4cde9"}, - {file = "onnxruntime-1.18.1-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ad3187c1faff3ac15f7f0e7373ef4788c582cafa655a80fdbb33eaec88976c66"}, - {file = "onnxruntime-1.18.1-cp39-cp39-win32.whl", hash = "sha256:34657c78aa4e0b5145f9188b550ded3af626651b15017bf43d280d7e23dbf195"}, - {file = "onnxruntime-1.18.1-cp39-cp39-win_amd64.whl", hash = "sha256:9c14fd97c3ddfa97da5feef595e2c73f14c2d0ec1d4ecbea99c8d96603c89589"}, + {file = "onnxruntime-1.19.2-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:84fa57369c06cadd3c2a538ae2a26d76d583e7c34bdecd5769d71ca5c0fc750e"}, + {file = "onnxruntime-1.19.2-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bdc471a66df0c1cdef774accef69e9f2ca168c851ab5e4f2f3341512c7ef4666"}, + {file = "onnxruntime-1.19.2-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e3a4ce906105d99ebbe817f536d50a91ed8a4d1592553f49b3c23c4be2560ae6"}, + {file = "onnxruntime-1.19.2-cp310-cp310-win32.whl", hash = "sha256:4b3d723cc154c8ddeb9f6d0a8c0d6243774c6b5930847cc83170bfe4678fafb3"}, + {file = "onnxruntime-1.19.2-cp310-cp310-win_amd64.whl", hash = "sha256:17ed7382d2c58d4b7354fb2b301ff30b9bf308a1c7eac9546449cd122d21cae5"}, + {file = "onnxruntime-1.19.2-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:d863e8acdc7232d705d49e41087e10b274c42f09e259016a46f32c34e06dc4fd"}, + {file = "onnxruntime-1.19.2-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c1dfe4f660a71b31caa81fc298a25f9612815215a47b286236e61d540350d7b6"}, + {file = "onnxruntime-1.19.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a36511dc07c5c964b916697e42e366fa43c48cdb3d3503578d78cef30417cb84"}, + {file = "onnxruntime-1.19.2-cp311-cp311-win32.whl", hash = "sha256:50cbb8dc69d6befad4746a69760e5b00cc3ff0a59c6c3fb27f8afa20e2cab7e7"}, + {file = "onnxruntime-1.19.2-cp311-cp311-win_amd64.whl", hash = "sha256:1c3e5d415b78337fa0b1b75291e9ea9fb2a4c1f148eb5811e7212fed02cfffa8"}, + {file = "onnxruntime-1.19.2-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:68e7051bef9cfefcbb858d2d2646536829894d72a4130c24019219442b1dd2ed"}, + {file = "onnxruntime-1.19.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d2d366fbcc205ce68a8a3bde2185fd15c604d9645888703785b61ef174265168"}, + {file = "onnxruntime-1.19.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:477b93df4db467e9cbf34051662a4b27c18e131fa1836e05974eae0d6e4cf29b"}, + {file = "onnxruntime-1.19.2-cp312-cp312-win32.whl", hash = "sha256:9a174073dc5608fad05f7cf7f320b52e8035e73d80b0a23c80f840e5a97c0147"}, + {file = "onnxruntime-1.19.2-cp312-cp312-win_amd64.whl", hash = "sha256:190103273ea4507638ffc31d66a980594b237874b65379e273125150eb044857"}, + {file = "onnxruntime-1.19.2-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:636bc1d4cc051d40bc52e1f9da87fbb9c57d9d47164695dfb1c41646ea51ea66"}, + {file = "onnxruntime-1.19.2-cp38-cp38-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5bd8b875757ea941cbcfe01582970cc299893d1b65bd56731e326a8333f638a3"}, + {file = "onnxruntime-1.19.2-cp38-cp38-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b2046fc9560f97947bbc1acbe4c6d48585ef0f12742744307d3364b131ac5778"}, + {file = "onnxruntime-1.19.2-cp38-cp38-win32.whl", hash = "sha256:31c12840b1cde4ac1f7d27d540c44e13e34f2345cf3642762d2a3333621abb6a"}, + {file = "onnxruntime-1.19.2-cp38-cp38-win_amd64.whl", hash = "sha256:016229660adea180e9a32ce218b95f8f84860a200f0f13b50070d7d90e92956c"}, + {file = "onnxruntime-1.19.2-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:006c8d326835c017a9e9f74c9c77ebb570a71174a1e89fe078b29a557d9c3848"}, + {file = "onnxruntime-1.19.2-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:df2a94179a42d530b936f154615b54748239c2908ee44f0d722cb4df10670f68"}, + {file = "onnxruntime-1.19.2-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fae4b4de45894b9ce7ae418c5484cbf0341db6813effec01bb2216091c52f7fb"}, + {file = "onnxruntime-1.19.2-cp39-cp39-win32.whl", hash = "sha256:dc5430f473e8706fff837ae01323be9dcfddd3ea471c900a91fa7c9b807ec5d3"}, + {file = "onnxruntime-1.19.2-cp39-cp39-win_amd64.whl", hash = "sha256:38475e29a95c5f6c62c2c603d69fc7d4c6ccbf4df602bd567b86ae1138881c49"}, ] [package.dependencies] coloredlogs = "*" flatbuffers = "*" -numpy = ">=1.21.6,<2.0" +numpy = ">=1.21.6" packaging = "*" protobuf = "*" sympy = "*" @@ -1272,22 +1255,22 @@ xmp = ["defusedxml"] [[package]] name = "protobuf" -version = "5.27.2" +version = "5.28.0" description = "" optional = false python-versions = ">=3.8" files = [ - {file = "protobuf-5.27.2-cp310-abi3-win32.whl", hash = "sha256:354d84fac2b0d76062e9b3221f4abbbacdfd2a4d8af36bab0474f3a0bb30ab38"}, - {file = "protobuf-5.27.2-cp310-abi3-win_amd64.whl", hash = "sha256:0e341109c609749d501986b835f667c6e1e24531096cff9d34ae411595e26505"}, - {file = "protobuf-5.27.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:a109916aaac42bff84702fb5187f3edadbc7c97fc2c99c5ff81dd15dcce0d1e5"}, - {file = "protobuf-5.27.2-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:176c12b1f1c880bf7a76d9f7c75822b6a2bc3db2d28baa4d300e8ce4cde7409b"}, - {file = "protobuf-5.27.2-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:b848dbe1d57ed7c191dfc4ea64b8b004a3f9ece4bf4d0d80a367b76df20bf36e"}, - {file = "protobuf-5.27.2-cp38-cp38-win32.whl", hash = "sha256:4fadd8d83e1992eed0248bc50a4a6361dc31bcccc84388c54c86e530b7f58863"}, - {file = "protobuf-5.27.2-cp38-cp38-win_amd64.whl", hash = "sha256:610e700f02469c4a997e58e328cac6f305f649826853813177e6290416e846c6"}, - {file = "protobuf-5.27.2-cp39-cp39-win32.whl", hash = "sha256:9e8f199bf7f97bd7ecebffcae45ebf9527603549b2b562df0fbc6d4d688f14ca"}, - {file = "protobuf-5.27.2-cp39-cp39-win_amd64.whl", hash = "sha256:7fc3add9e6003e026da5fc9e59b131b8f22b428b991ccd53e2af8071687b4fce"}, - {file = "protobuf-5.27.2-py3-none-any.whl", hash = "sha256:54330f07e4949d09614707c48b06d1a22f8ffb5763c159efd5c0928326a91470"}, - {file = "protobuf-5.27.2.tar.gz", hash = "sha256:f3ecdef226b9af856075f28227ff2c90ce3a594d092c39bee5513573f25e2714"}, + {file = "protobuf-5.28.0-cp310-abi3-win32.whl", hash = "sha256:66c3edeedb774a3508ae70d87b3a19786445fe9a068dd3585e0cefa8a77b83d0"}, + {file = "protobuf-5.28.0-cp310-abi3-win_amd64.whl", hash = "sha256:6d7cc9e60f976cf3e873acb9a40fed04afb5d224608ed5c1a105db4a3f09c5b6"}, + {file = "protobuf-5.28.0-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:532627e8fdd825cf8767a2d2b94d77e874d5ddb0adefb04b237f7cc296748681"}, + {file = "protobuf-5.28.0-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:018db9056b9d75eb93d12a9d35120f97a84d9a919bcab11ed56ad2d399d6e8dd"}, + {file = "protobuf-5.28.0-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:6206afcb2d90181ae8722798dcb56dc76675ab67458ac24c0dd7d75d632ac9bd"}, + {file = "protobuf-5.28.0-cp38-cp38-win32.whl", hash = "sha256:eef7a8a2f4318e2cb2dee8666d26e58eaf437c14788f3a2911d0c3da40405ae8"}, + {file = "protobuf-5.28.0-cp38-cp38-win_amd64.whl", hash = "sha256:d001a73c8bc2bf5b5c1360d59dd7573744e163b3607fa92788b7f3d5fefbd9a5"}, + {file = "protobuf-5.28.0-cp39-cp39-win32.whl", hash = "sha256:dde9fcaa24e7a9654f4baf2a55250b13a5ea701493d904c54069776b99a8216b"}, + {file = "protobuf-5.28.0-cp39-cp39-win_amd64.whl", hash = "sha256:853db610214e77ee817ecf0514e0d1d052dff7f63a0c157aa6eabae98db8a8de"}, + {file = "protobuf-5.28.0-py3-none-any.whl", hash = "sha256:510ed78cd0980f6d3218099e874714cdf0d8a95582e7b059b06cabad855ed0a0"}, + {file = "protobuf-5.28.0.tar.gz", hash = "sha256:dde74af0fa774fa98892209992295adbfb91da3fa98c8f67a88afe8f5a349add"}, ] [[package]] @@ -1332,13 +1315,13 @@ files = [ [[package]] name = "pyparsing" -version = "3.1.2" +version = "3.1.4" description = "pyparsing module - Classes and methods to define and execute parsing grammars" optional = false python-versions = ">=3.6.8" files = [ - {file = "pyparsing-3.1.2-py3-none-any.whl", hash = "sha256:f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742"}, - {file = "pyparsing-3.1.2.tar.gz", hash = "sha256:a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad"}, + {file = "pyparsing-3.1.4-py3-none-any.whl", hash = "sha256:a6a7ee4235a3f944aa1fa2249307708f893fe5717dc603503c6c7969c070fb7c"}, + {file = "pyparsing-3.1.4.tar.gz", hash = "sha256:f86ec8d1a83f11977c9a6ea7598e8c27fc5cddfa5b07ea2241edbbde1d7bc032"}, ] [package.extras] @@ -1376,8 +1359,8 @@ test = ["pytest (>=5.3.2)", "pytest-cov (>=3.0.0,<5.0.0)", "pytest-pretty (>=1.0 [package.source] type = "git" url = "https://github.com/pyronear/pyro-api.git" -reference = "f809a399bf8928e93da8e95056e811217f6c2a17" -resolved_reference = "f809a399bf8928e93da8e95056e811217f6c2a17" +reference = "92b9e28fe4b329aa28c7833b28f3bc89ab1b756c" +resolved_reference = "92b9e28fe4b329aa28c7833b28f3bc89ab1b756c" subdirectory = "client" [[package]] @@ -1445,62 +1428,64 @@ files = [ [[package]] name = "pyyaml" -version = "6.0.1" +version = "6.0.2" description = "YAML parser and emitter for Python" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, - {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, - {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, - {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, - {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, - {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, - {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, - {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, - {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, - {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, - {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, - {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, - {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, - {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, - {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, - {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, - {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, - {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, - {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, - {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, - {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, + {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, + {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, + {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, + {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, + {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, + {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, + {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, + {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, + {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, + {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, + {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, + {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, + {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, + {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, + {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, ] [[package]] @@ -1583,6 +1568,26 @@ dev = ["flake8", "flit", "mypy", "pandas-stubs", "pre-commit", "pytest", "pytest docs = ["ipykernel", "nbconvert", "numpydoc", "pydata_sphinx_theme (==0.10.0rc2)", "pyyaml", "sphinx (<6.0.0)", "sphinx-copybutton", "sphinx-design", "sphinx-issues"] stats = ["scipy (>=1.7)", "statsmodels (>=0.12)"] +[[package]] +name = "setuptools" +version = "74.1.2" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "setuptools-74.1.2-py3-none-any.whl", hash = "sha256:5f4c08aa4d3ebcb57a50c33b1b07e94315d7fc7230f7115e47fc99776c8ce308"}, + {file = "setuptools-74.1.2.tar.gz", hash = "sha256:95b40ed940a1c67eb70fc099094bd6e99c6ee7c23aa2306f4d2697ba7916f9c6"}, +] + +[package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.5.2)"] +core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.text (>=3.7)", "more-itertools (>=8.8)", "packaging (>=24)", "platformdirs (>=2.6.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] +type = ["importlib-metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (==1.11.*)", "pytest-mypy"] + [[package]] name = "six" version = "1.16.0" @@ -1596,13 +1601,13 @@ files = [ [[package]] name = "sympy" -version = "1.13.1" +version = "1.13.2" description = "Computer algebra system (CAS) in Python" optional = false python-versions = ">=3.8" files = [ - {file = "sympy-1.13.1-py3-none-any.whl", hash = "sha256:db36cdc64bf61b9b24578b6f7bab1ecdd2452cf008f34faa33776680c26d66f8"}, - {file = "sympy-1.13.1.tar.gz", hash = "sha256:9cebf7e04ff162015ce31c9c6c9144daa34a93bd082f54fd8f12deca4f47515f"}, + {file = "sympy-1.13.2-py3-none-any.whl", hash = "sha256:c51d75517712f1aed280d4ce58506a4a88d635d6b5dd48b39102a7ae1f3fcfe9"}, + {file = "sympy-1.13.2.tar.gz", hash = "sha256:401449d84d07be9d0c7a46a64bd54fe097667d5e7181bfe67ec777be9e01cb13"}, ] [package.dependencies] @@ -1611,119 +1616,107 @@ mpmath = ">=1.1.0,<1.4" [package.extras] dev = ["hypothesis (>=6.70.0)", "pytest (>=7.1.0)"] -[[package]] -name = "tbb" -version = "2021.13.0" -description = "IntelĀ® oneAPI Threading Building Blocks (oneTBB)" -optional = false -python-versions = "*" -files = [ - {file = "tbb-2021.13.0-py2.py3-none-manylinux1_i686.whl", hash = "sha256:a2567725329639519d46d92a2634cf61e76601dac2f777a05686fea546c4fe4f"}, - {file = "tbb-2021.13.0-py2.py3-none-manylinux1_x86_64.whl", hash = "sha256:aaf667e92849adb012b8874d6393282afc318aca4407fc62f912ee30a22da46a"}, - {file = "tbb-2021.13.0-py3-none-win32.whl", hash = "sha256:6669d26703e9943f6164c6407bd4a237a45007e79b8d3832fe6999576eaaa9ef"}, - {file = "tbb-2021.13.0-py3-none-win_amd64.whl", hash = "sha256:3528a53e4bbe64b07a6112b4c5a00ff3c61924ee46c9c68e004a1ac7ad1f09c3"}, -] - [[package]] name = "torch" -version = "2.3.1" +version = "2.4.1" description = "Tensors and Dynamic neural networks in Python with strong GPU acceleration" optional = false python-versions = ">=3.8.0" files = [ - {file = "torch-2.3.1-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:605a25b23944be5ab7c3467e843580e1d888b8066e5aaf17ff7bf9cc30001cc3"}, - {file = "torch-2.3.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:f2357eb0965583a0954d6f9ad005bba0091f956aef879822274b1bcdb11bd308"}, - {file = "torch-2.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:32b05fe0d1ada7f69c9f86c14ff69b0ef1957a5a54199bacba63d22d8fab720b"}, - {file = "torch-2.3.1-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:7c09a94362778428484bcf995f6004b04952106aee0ef45ff0b4bab484f5498d"}, - {file = "torch-2.3.1-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:b2ec81b61bb094ea4a9dee1cd3f7b76a44555375719ad29f05c0ca8ef596ad39"}, - {file = "torch-2.3.1-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:490cc3d917d1fe0bd027057dfe9941dc1d6d8e3cae76140f5dd9a7e5bc7130ab"}, - {file = "torch-2.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:5802530783bd465fe66c2df99123c9a54be06da118fbd785a25ab0a88123758a"}, - {file = "torch-2.3.1-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:a7dd4ed388ad1f3d502bf09453d5fe596c7b121de7e0cfaca1e2017782e9bbac"}, - {file = "torch-2.3.1-cp312-cp312-manylinux1_x86_64.whl", hash = "sha256:a486c0b1976a118805fc7c9641d02df7afbb0c21e6b555d3bb985c9f9601b61a"}, - {file = "torch-2.3.1-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:224259821fe3e4c6f7edf1528e4fe4ac779c77addaa74215eb0b63a5c474d66c"}, - {file = "torch-2.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:e5fdccbf6f1334b2203a61a0e03821d5845f1421defe311dabeae2fc8fbeac2d"}, - {file = "torch-2.3.1-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:3c333dc2ebc189561514eda06e81df22bf8fb64e2384746b2cb9f04f96d1d4c8"}, - {file = "torch-2.3.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:07e9ba746832b8d069cacb45f312cadd8ad02b81ea527ec9766c0e7404bb3feb"}, - {file = "torch-2.3.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:462d1c07dbf6bb5d9d2f3316fee73a24f3d12cd8dacf681ad46ef6418f7f6626"}, - {file = "torch-2.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:ff60bf7ce3de1d43ad3f6969983f321a31f0a45df3690921720bcad6a8596cc4"}, - {file = "torch-2.3.1-cp38-none-macosx_11_0_arm64.whl", hash = "sha256:bee0bd33dc58aa8fc8a7527876e9b9a0e812ad08122054a5bff2ce5abf005b10"}, - {file = "torch-2.3.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:aaa872abde9a3d4f91580f6396d54888620f4a0b92e3976a6034759df4b961ad"}, - {file = "torch-2.3.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:3d7a7f7ef21a7520510553dc3938b0c57c116a7daee20736a9e25cbc0e832bdc"}, - {file = "torch-2.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:4777f6cefa0c2b5fa87223c213e7b6f417cf254a45e5829be4ccd1b2a4ee1011"}, - {file = "torch-2.3.1-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:2bb5af780c55be68fe100feb0528d2edebace1d55cb2e351de735809ba7391eb"}, + {file = "torch-2.4.1-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:362f82e23a4cd46341daabb76fba08f04cd646df9bfaf5da50af97cb60ca4971"}, + {file = "torch-2.4.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:e8ac1985c3ff0f60d85b991954cfc2cc25f79c84545aead422763148ed2759e3"}, + {file = "torch-2.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:91e326e2ccfb1496e3bee58f70ef605aeb27bd26be07ba64f37dcaac3d070ada"}, + {file = "torch-2.4.1-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:d36a8ef100f5bff3e9c3cea934b9e0d7ea277cb8210c7152d34a9a6c5830eadd"}, + {file = "torch-2.4.1-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:0b5f88afdfa05a335d80351e3cea57d38e578c8689f751d35e0ff36bce872113"}, + {file = "torch-2.4.1-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:ef503165f2341942bfdf2bd520152f19540d0c0e34961232f134dc59ad435be8"}, + {file = "torch-2.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:092e7c2280c860eff762ac08c4bdcd53d701677851670695e0c22d6d345b269c"}, + {file = "torch-2.4.1-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:ddddbd8b066e743934a4200b3d54267a46db02106876d21cf31f7da7a96f98ea"}, + {file = "torch-2.4.1-cp312-cp312-manylinux1_x86_64.whl", hash = "sha256:fdc4fe11db3eb93c1115d3e973a27ac7c1a8318af8934ffa36b0370efe28e042"}, + {file = "torch-2.4.1-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:18835374f599207a9e82c262153c20ddf42ea49bc76b6eadad8e5f49729f6e4d"}, + {file = "torch-2.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:ebea70ff30544fc021d441ce6b219a88b67524f01170b1c538d7d3ebb5e7f56c"}, + {file = "torch-2.4.1-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:72b484d5b6cec1a735bf3fa5a1c4883d01748698c5e9cfdbeb4ffab7c7987e0d"}, + {file = "torch-2.4.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:c99e1db4bf0c5347107845d715b4aa1097e601bdc36343d758963055e9599d93"}, + {file = "torch-2.4.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:b57f07e92858db78c5b72857b4f0b33a65b00dc5d68e7948a8494b0314efb880"}, + {file = "torch-2.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:f18197f3f7c15cde2115892b64f17c80dbf01ed72b008020e7da339902742cf6"}, + {file = "torch-2.4.1-cp38-none-macosx_11_0_arm64.whl", hash = "sha256:5fc1d4d7ed265ef853579caf272686d1ed87cebdcd04f2a498f800ffc53dab71"}, + {file = "torch-2.4.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:40f6d3fe3bae74efcf08cb7f8295eaddd8a838ce89e9d26929d4edd6d5e4329d"}, + {file = "torch-2.4.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:c9299c16c9743001ecef515536ac45900247f4338ecdf70746f2461f9e4831db"}, + {file = "torch-2.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:6bce130f2cd2d52ba4e2c6ada461808de7e5eccbac692525337cfb4c19421846"}, + {file = "torch-2.4.1-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:a38de2803ee6050309aac032676536c3d3b6a9804248537e38e098d0e14817ec"}, ] [package.dependencies] filelock = "*" fsspec = "*" jinja2 = "*" -mkl = {version = ">=2021.1.1,<=2021.4.0", markers = "platform_system == \"Windows\""} networkx = "*" nvidia-cublas-cu12 = {version = "12.1.3.1", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} nvidia-cuda-cupti-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} nvidia-cuda-nvrtc-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} nvidia-cuda-runtime-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} -nvidia-cudnn-cu12 = {version = "8.9.2.26", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cudnn-cu12 = {version = "9.1.0.70", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} nvidia-cufft-cu12 = {version = "11.0.2.54", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} nvidia-curand-cu12 = {version = "10.3.2.106", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} nvidia-cusolver-cu12 = {version = "11.4.5.107", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} nvidia-cusparse-cu12 = {version = "12.1.0.106", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} nvidia-nccl-cu12 = {version = "2.20.5", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} nvidia-nvtx-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +setuptools = "*" sympy = "*" -triton = {version = "2.3.1", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and python_version < \"3.12\""} +triton = {version = "3.0.0", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and python_version < \"3.13\""} typing-extensions = ">=4.8.0" [package.extras] opt-einsum = ["opt-einsum (>=3.3)"] -optree = ["optree (>=0.9.1)"] +optree = ["optree (>=0.11.0)"] [[package]] name = "torchvision" -version = "0.18.1" +version = "0.19.1" description = "image and video datasets and models for torch deep learning" optional = false python-versions = ">=3.8" files = [ - {file = "torchvision-0.18.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3e694e54b0548dad99c12af6bf0c8e4f3350137d391dcd19af22a1c5f89322b3"}, - {file = "torchvision-0.18.1-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:0b3bda0aa5b416eeb547143b8eeaf17720bdba9cf516dc991aacb81811aa96a5"}, - {file = "torchvision-0.18.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:573ff523c739405edb085f65cb592f482d28a30e29b0be4c4ba08040b3ae785f"}, - {file = "torchvision-0.18.1-cp310-cp310-win_amd64.whl", hash = "sha256:ef7bbbc60b38e831a75e547c66ca1784f2ac27100f9e4ddbe9614cef6cbcd942"}, - {file = "torchvision-0.18.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:80b5d794dd0fdba787adc22f1a367a5ead452327686473cb260dd94364bc56a6"}, - {file = "torchvision-0.18.1-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:9077cf590cdb3a5e8fdf5cdb71797f8c67713f974cf0228ecb17fcd670ab42f9"}, - {file = "torchvision-0.18.1-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:ceb993a882f1ae7ae373ed39c28d7e3e802205b0e59a7ed84ef4028f0bba8d7f"}, - {file = "torchvision-0.18.1-cp311-cp311-win_amd64.whl", hash = "sha256:52f7436140045dc2239cdc502aa76b2bd8bd676d64244ff154d304aa69852046"}, - {file = "torchvision-0.18.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2be6f0bf7c455c89a51a1dbb6f668d36c6edc479f49ac912d745d10df5715657"}, - {file = "torchvision-0.18.1-cp312-cp312-manylinux1_x86_64.whl", hash = "sha256:f118d887bfde3a948a41d56587525401e5cac1b7db2eaca203324d6ed2b1caca"}, - {file = "torchvision-0.18.1-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:13d24d904f65e62d66a1e0c41faec630bc193867b8a4a01166769e8a8e8df8e9"}, - {file = "torchvision-0.18.1-cp312-cp312-win_amd64.whl", hash = "sha256:ed6340b69a63a625e512a66127210d412551d9c5f2ad2978130c6a45bf56cd4a"}, - {file = "torchvision-0.18.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b1c3864fa9378c88bce8ad0ef3599f4f25397897ce612e1c245c74b97092f35e"}, - {file = "torchvision-0.18.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:02085a2ffc7461f5c0edb07d6f3455ee1806561f37736b903da820067eea58c7"}, - {file = "torchvision-0.18.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:9726c316a2501df8503e5a5dc46a631afd4c515a958972e5b7f7b9c87d2125c0"}, - {file = "torchvision-0.18.1-cp38-cp38-win_amd64.whl", hash = "sha256:64a2662dbf30db9055d8b201d6e56f312a504e5ccd9d144c57c41622d3c524cb"}, - {file = "torchvision-0.18.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:975b8594c0f5288875408acbb74946eea786c5b008d129c0d045d0ead23742bc"}, - {file = "torchvision-0.18.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:da83c8bbd34d8bee48bfa1d1b40e0844bc3cba10ed825a5a8cbe3ce7b62264cd"}, - {file = "torchvision-0.18.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:54bfcd352abb396d5c9c237d200167c178bd136051b138e1e8ef46ce367c2773"}, - {file = "torchvision-0.18.1-cp39-cp39-win_amd64.whl", hash = "sha256:5c8366a1aeee49e9ea9e64b30d199debdf06b1bd7610a76165eb5d7869c3bde5"}, + {file = "torchvision-0.19.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:54e8513099e6f586356c70f809d34f391af71ad182fe071cc328a28af2c40608"}, + {file = "torchvision-0.19.1-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:20a1f5e02bfdad7714e55fa3fa698347c11d829fa65e11e5a84df07d93350eed"}, + {file = "torchvision-0.19.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:7b063116164be52fc6deb4762de7f8c90bfa3a65f8d5caf17f8e2d5aadc75a04"}, + {file = "torchvision-0.19.1-cp310-cp310-win_amd64.whl", hash = "sha256:f40b6acabfa886da1bc3768f47679c61feee6bde90deb979d9f300df8c8a0145"}, + {file = "torchvision-0.19.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:40514282b4896d62765b8e26d7091c32e17c35817d00ec4be2362ea3ba3d1787"}, + {file = "torchvision-0.19.1-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:5a91be061ae5d6d5b95e833b93e57ca4d3c56c5a57444dd15da2e3e7fba96050"}, + {file = "torchvision-0.19.1-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:d71a6a6fe3a5281ca3487d4c56ad4aad20ff70f82f1d7c79bcb6e7b0c2af00c8"}, + {file = "torchvision-0.19.1-cp311-cp311-win_amd64.whl", hash = "sha256:70dea324174f5e9981b68e4b7cd524512c106ba64aedef560a86a0bbf2fbf62c"}, + {file = "torchvision-0.19.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:27ece277ff0f6cdc7fed0627279c632dcb2e58187da771eca24b0fbcf3f8590d"}, + {file = "torchvision-0.19.1-cp312-cp312-manylinux1_x86_64.whl", hash = "sha256:c659ff92a61f188a1a7baef2850f3c0b6c85685447453c03d0e645ba8f1dcc1c"}, + {file = "torchvision-0.19.1-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:c07bf43c2a145d792ecd9d0503d6c73577147ece508d45600d8aac77e4cdfcf9"}, + {file = "torchvision-0.19.1-cp312-cp312-win_amd64.whl", hash = "sha256:b4283d283675556bb0eae31d29996f53861b17cbdcdf3509e6bc050414ac9289"}, + {file = "torchvision-0.19.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4c4e4f5b24ea6b087b02ed492ab1e21bba3352c4577e2def14248cfc60732338"}, + {file = "torchvision-0.19.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:9281d63ead929bb19143731154cd1d8bf0b5e9873dff8578a40e90a6bec3c6fa"}, + {file = "torchvision-0.19.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:4d10bc9083c4d5fadd7edd7b729700a7be48dab4f62278df3bc73fa48e48a155"}, + {file = "torchvision-0.19.1-cp38-cp38-win_amd64.whl", hash = "sha256:ccf085ef1824fb9e16f1901285bf89c298c62dfd93267a39e8ee42c71255242f"}, + {file = "torchvision-0.19.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:731f434d91586769e255b5d70ed1a4457e0a1394a95f4aacf0e1e7e21f80c098"}, + {file = "torchvision-0.19.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:febe4f14d4afcb47cc861d8be7760ab6a123cd0817f97faf5771488cb6aa90f4"}, + {file = "torchvision-0.19.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:e328309b8670a2e889b2fe76a1c2744a099c11c984da9a822357bd9debd699a5"}, + {file = "torchvision-0.19.1-cp39-cp39-win_amd64.whl", hash = "sha256:6616f12e00a22e7f3fedbd0fccb0804c05e8fe22871668f10eae65cf3f283614"}, ] [package.dependencies] numpy = "*" pillow = ">=5.3.0,<8.3.dev0 || >=8.4.dev0" -torch = "2.3.1" +torch = "2.4.1" [package.extras] +gdown = ["gdown (>=4.7.3)"] scipy = ["scipy"] [[package]] name = "tqdm" -version = "4.66.4" +version = "4.66.5" description = "Fast, Extensible Progress Meter" optional = false python-versions = ">=3.7" files = [ - {file = "tqdm-4.66.4-py3-none-any.whl", hash = "sha256:b75ca56b413b030bc3f00af51fd2c1a1a5eac6a0c1cca83cbb37a5c52abce644"}, - {file = "tqdm-4.66.4.tar.gz", hash = "sha256:e4d936c9de8727928f3be6079590e97d9abfe8d39a590be678eb5919ffc186bb"}, + {file = "tqdm-4.66.5-py3-none-any.whl", hash = "sha256:90279a3770753eafc9194a0364852159802111925aa30eb3f9d85b0e805ac7cd"}, + {file = "tqdm-4.66.5.tar.gz", hash = "sha256:e1020aef2e5096702d8a025ac7d16b1577279c9d63f8375b63083e9a5f0fcbad"}, ] [package.dependencies] @@ -1737,17 +1730,16 @@ telegram = ["requests"] [[package]] name = "triton" -version = "2.3.1" +version = "3.0.0" description = "A language and compiler for custom Deep Learning operations" optional = false python-versions = "*" files = [ - {file = "triton-2.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c84595cbe5e546b1b290d2a58b1494df5a2ef066dd890655e5b8a8a92205c33"}, - {file = "triton-2.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9d64ae33bcb3a7a18081e3a746e8cf87ca8623ca13d2c362413ce7a486f893e"}, - {file = "triton-2.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eaf80e8761a9e3498aa92e7bf83a085b31959c61f5e8ac14eedd018df6fccd10"}, - {file = "triton-2.3.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b13bf35a2b659af7159bf78e92798dc62d877aa991de723937329e2d382f1991"}, - {file = "triton-2.3.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63381e35ded3304704ea867ffde3b7cfc42c16a55b3062d41e017ef510433d66"}, - {file = "triton-2.3.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d968264523c7a07911c8fb51b4e0d1b920204dae71491b1fe7b01b62a31e124"}, + {file = "triton-3.0.0-1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e1efef76935b2febc365bfadf74bcb65a6f959a9872e5bddf44cc9e0adce1e1a"}, + {file = "triton-3.0.0-1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5ce8520437c602fb633f1324cc3871c47bee3b67acf9756c1a66309b60e3216c"}, + {file = "triton-3.0.0-1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:34e509deb77f1c067d8640725ef00c5cbfcb2052a1a3cb6a6d343841f92624eb"}, + {file = "triton-3.0.0-1-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bcbf3b1c48af6a28011a5c40a5b3b9b5330530c3827716b5fbf6d7adcc1e53e9"}, + {file = "triton-3.0.0-1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6e5727202f7078c56f91ff13ad0c1abab14a0e7f2c87e91b12b6f64f3e8ae609"}, ] [package.dependencies] @@ -1755,8 +1747,8 @@ filelock = "*" [package.extras] build = ["cmake (>=3.20)", "lit"] -tests = ["autopep8", "flake8", "isort", "numpy", "pytest", "scipy (>=1.7.1)", "torch"] -tutorials = ["matplotlib", "pandas", "tabulate", "torch"] +tests = ["autopep8", "flake8", "isort", "llnl-hatchet", "numpy", "pytest", "scipy (>=1.7.1)"] +tutorials = ["matplotlib", "pandas", "tabulate"] [[package]] name = "typing-extensions" @@ -1817,13 +1809,13 @@ logging = ["comet", "dvclive (>=2.12.0)", "tensorboard (>=2.13.0)"] [[package]] name = "ultralytics-thop" -version = "2.0.0" +version = "2.0.6" description = "Ultralytics THOP package for fast computation of PyTorch model FLOPs and parameters." optional = false python-versions = ">=3.8" files = [ - {file = "ultralytics_thop-2.0.0-py3-none-any.whl", hash = "sha256:a3432c5e6f3f5f45470bdcaa7e90bc3a0b7a65a9c9896bd83f381b8fc9030ee9"}, - {file = "ultralytics_thop-2.0.0.tar.gz", hash = "sha256:49ee1f2c37d92e2e03b407c610e7184dc3dea68aa3d9127d2694ca1ea4120889"}, + {file = "ultralytics_thop-2.0.6-py3-none-any.whl", hash = "sha256:07a94ac34f503859c36430b3049f8701389e6a5af8c9c683625aad373daeb99c"}, + {file = "ultralytics_thop-2.0.6.tar.gz", hash = "sha256:2194c6f620c09c075f5814f013a36275a49d1102313d7977fc548fade9ead06f"}, ] [package.dependencies] @@ -1849,20 +1841,24 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "zipp" -version = "3.19.2" +version = "3.20.1" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" files = [ - {file = "zipp-3.19.2-py3-none-any.whl", hash = "sha256:f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c"}, - {file = "zipp-3.19.2.tar.gz", hash = "sha256:bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19"}, + {file = "zipp-3.20.1-py3-none-any.whl", hash = "sha256:9960cd8967c8f85a56f920d5d507274e74f9ff813a0ab8889a5b5be2daf44064"}, + {file = "zipp-3.20.1.tar.gz", hash = "sha256:c22b14cc4763c5a5b04134207736c107db42e9d3ef2d9779d465f5f1bcba572b"}, ] [package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] +type = ["pytest-mypy"] [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "5a2878fef12e172376b702ef6e9295cb229ae6fec68e815cfdcda1997577471d" +content-hash = "a9f6e6f4225ae56eca61a369c9febf3e6351e88d13cf19c291c54fea1a4d4a8a" diff --git a/src/pyproject.toml b/src/pyproject.toml index 9fefce06..98017471 100644 --- a/src/pyproject.toml +++ b/src/pyproject.toml @@ -11,7 +11,7 @@ license = "Apache-2.0" [tool.poetry.dependencies] python = "^3.8" -pyroclient = { git = "https://github.com/pyronear/pyro-api.git", rev = "f809a399bf8928e93da8e95056e811217f6c2a17", subdirectory = "client" } +pyroclient = { git = "https://github.com/pyronear/pyro-api.git", rev = "92b9e28fe4b329aa28c7833b28f3bc89ab1b756c", subdirectory = "client" } pyroengine = "^0.2.0" python-dotenv = ">=0.15.0" ultralytics = "8.2.50" diff --git a/src/requirements.txt b/src/requirements.txt index c8219682..40a4f954 100644 --- a/src/requirements.txt +++ b/src/requirements.txt @@ -1,23 +1,21 @@ -certifi==2024.7.4 ; python_version >= "3.8" and python_version < "4" +certifi==2024.8.30 ; python_version >= "3.8" and python_version < "4" charset-normalizer==3.3.2 ; python_version >= "3.8" and python_version < "4" colorama==0.4.6 ; python_version >= "3.8" and python_version < "4.0" and platform_system == "Windows" coloredlogs==15.0.1 ; python_version >= "3.8" and python_version < "4" contourpy==1.1.1 ; python_version >= "3.8" and python_version < "4.0" cycler==0.12.1 ; python_version >= "3.8" and python_version < "4.0" -filelock==3.15.4 ; python_version >= "3.8" and python_version < "4" +filelock==3.16.0 ; python_version >= "3.8" and python_version < "4" flatbuffers==24.3.25 ; python_version >= "3.8" and python_version < "4" fonttools==4.53.1 ; python_version >= "3.8" and python_version < "4.0" -fsspec==2024.6.1 ; python_version >= "3.8" and python_version < "4" -huggingface-hub==0.24.0 ; python_version >= "3.8" and python_version < "4" +fsspec==2024.9.0 ; python_version >= "3.8" and python_version < "4" +huggingface-hub==0.24.6 ; python_version >= "3.8" and python_version < "4" humanfriendly==10.0 ; python_version >= "3.8" and python_version < "4" -idna==3.7 ; python_version >= "3.8" and python_version < "4" -importlib-resources==6.4.0 ; python_version >= "3.8" and python_version < "3.10" -intel-openmp==2021.4.0 ; python_version >= "3.8" and python_version < "4.0" and platform_system == "Windows" +idna==3.8 ; python_version >= "3.8" and python_version < "4" +importlib-resources==6.4.4 ; python_version >= "3.8" and python_version < "3.10" jinja2==3.1.4 ; python_version >= "3.8" and python_version < "4.0" -kiwisolver==1.4.5 ; python_version >= "3.8" and python_version < "4.0" +kiwisolver==1.4.7 ; python_version >= "3.8" and python_version < "4.0" markupsafe==2.1.5 ; python_version >= "3.8" and python_version < "4.0" matplotlib==3.7.5 ; python_version >= "3.8" and python_version < "4.0" -mkl==2021.4.0 ; python_version >= "3.8" and python_version < "4.0" and platform_system == "Windows" mpmath==1.3.0 ; python_version >= "3.8" and python_version < "4" networkx==3.1 ; python_version >= "3.8" and python_version < "4.0" numpy==1.24.4 ; python_version >= "3.8" and python_version < "4" @@ -25,43 +23,43 @@ nvidia-cublas-cu12==12.1.3.1 ; platform_system == "Linux" and platform_machine = nvidia-cuda-cupti-cu12==12.1.105 ; platform_system == "Linux" and platform_machine == "x86_64" and python_version >= "3.8" and python_version < "4.0" nvidia-cuda-nvrtc-cu12==12.1.105 ; platform_system == "Linux" and platform_machine == "x86_64" and python_version >= "3.8" and python_version < "4.0" nvidia-cuda-runtime-cu12==12.1.105 ; platform_system == "Linux" and platform_machine == "x86_64" and python_version >= "3.8" and python_version < "4.0" -nvidia-cudnn-cu12==8.9.2.26 ; platform_system == "Linux" and platform_machine == "x86_64" and python_version >= "3.8" and python_version < "4.0" +nvidia-cudnn-cu12==9.1.0.70 ; platform_system == "Linux" and platform_machine == "x86_64" and python_version >= "3.8" and python_version < "4.0" nvidia-cufft-cu12==11.0.2.54 ; platform_system == "Linux" and platform_machine == "x86_64" and python_version >= "3.8" and python_version < "4.0" nvidia-curand-cu12==10.3.2.106 ; platform_system == "Linux" and platform_machine == "x86_64" and python_version >= "3.8" and python_version < "4.0" nvidia-cusolver-cu12==11.4.5.107 ; platform_system == "Linux" and platform_machine == "x86_64" and python_version >= "3.8" and python_version < "4.0" nvidia-cusparse-cu12==12.1.0.106 ; platform_system == "Linux" and platform_machine == "x86_64" and python_version >= "3.8" and python_version < "4.0" nvidia-nccl-cu12==2.20.5 ; platform_system == "Linux" and platform_machine == "x86_64" and python_version >= "3.8" and python_version < "4.0" -nvidia-nvjitlink-cu12==12.5.82 ; platform_system == "Linux" and platform_machine == "x86_64" and python_version >= "3.8" and python_version < "4.0" +nvidia-nvjitlink-cu12==12.6.68 ; platform_system == "Linux" and platform_machine == "x86_64" and python_version >= "3.8" and python_version < "4.0" nvidia-nvtx-cu12==12.1.105 ; platform_system == "Linux" and platform_machine == "x86_64" and python_version >= "3.8" and python_version < "4.0" -onnxruntime==1.18.1 ; python_version >= "3.8" and python_version < "4" +onnxruntime==1.19.2 ; python_version >= "3.8" and python_version < "4" opencv-python==4.10.0.84 ; python_version >= "3.8" and python_version < "4.0" packaging==24.1 ; python_version >= "3.8" and python_version < "4" pandas==2.0.3 ; python_version >= "3.8" and python_version < "4.0" pillow==10.4.0 ; python_version >= "3.8" and python_version < "4" -protobuf==5.27.2 ; python_version >= "3.8" and python_version < "4" +protobuf==5.28.0 ; python_version >= "3.8" and python_version < "4" psutil==6.0.0 ; python_version >= "3.8" and python_version < "4.0" py-cpuinfo==9.0.0 ; python_version >= "3.8" and python_version < "4.0" -pyparsing==3.1.2 ; python_version >= "3.8" and python_version < "4.0" +pyparsing==3.1.4 ; python_version >= "3.8" and python_version < "4.0" pyreadline3==3.4.1 ; sys_platform == "win32" and python_version >= "3.8" and python_version < "4" -pyroclient @ git+https://github.com/pyronear/pyro-api.git@f809a399bf8928e93da8e95056e811217f6c2a17#subdirectory=client ; python_version >= "3.8" and python_version < "4" +pyroclient @ git+https://github.com/pyronear/pyro-api.git@92b9e28fe4b329aa28c7833b28f3bc89ab1b756c#subdirectory=client ; python_version >= "3.8" and python_version < "4" pyroengine==0.2.0 ; python_version >= "3.8" and python_version < "4" python-dateutil==2.9.0.post0 ; python_version >= "3.8" and python_version < "4.0" python-dotenv==1.0.1 ; python_version >= "3.8" and python_version < "4.0" pytz==2024.1 ; python_version >= "3.8" and python_version < "4.0" -pyyaml==6.0.1 ; python_version >= "3.8" and python_version < "4.0" +pyyaml==6.0.2 ; python_version >= "3.8" and python_version < "4.0" requests==2.32.3 ; python_version >= "3.8" and python_version < "4" scipy==1.9.3 ; python_version >= "3.8" and python_version < "4.0" seaborn==0.13.2 ; python_version >= "3.8" and python_version < "4.0" +setuptools==74.1.2 ; python_version >= "3.8" and python_version < "4.0" six==1.16.0 ; python_version >= "3.8" and python_version < "4.0" -sympy==1.13.1 ; python_version >= "3.8" and python_version < "4" -tbb==2021.13.0 ; python_version >= "3.8" and python_version < "4.0" and platform_system == "Windows" -torch==2.3.1 ; python_version >= "3.8" and python_version < "4.0" -torchvision==0.18.1 ; python_version >= "3.8" and python_version < "4.0" -tqdm==4.66.4 ; python_version >= "3.8" and python_version < "4.0" -triton==2.3.1 ; platform_system == "Linux" and platform_machine == "x86_64" and python_version < "3.12" and python_version >= "3.8" +sympy==1.13.2 ; python_version >= "3.8" and python_version < "4" +torch==2.4.1 ; python_version >= "3.8" and python_version < "4.0" +torchvision==0.19.1 ; python_version >= "3.8" and python_version < "4.0" +tqdm==4.66.5 ; python_version >= "3.8" and python_version < "4.0" +triton==3.0.0 ; platform_system == "Linux" and platform_machine == "x86_64" and python_version < "3.13" and python_version >= "3.8" typing-extensions==4.12.2 ; python_version >= "3.8" and python_version < "4" tzdata==2024.1 ; python_version >= "3.8" and python_version < "4.0" -ultralytics-thop==2.0.0 ; python_version >= "3.8" and python_version < "4.0" +ultralytics-thop==2.0.6 ; python_version >= "3.8" and python_version < "4.0" ultralytics==8.2.50 ; python_version >= "3.8" and python_version < "4.0" urllib3==2.2.2 ; python_version >= "3.8" and python_version < "4" -zipp==3.19.2 ; python_version >= "3.8" and python_version < "3.10" +zipp==3.20.1 ; python_version >= "3.8" and python_version < "3.10" From 410e9e61ff3320b740d6c2238fb21425017dae4c Mon Sep 17 00:00:00 2001 From: Ronan Date: Mon, 16 Sep 2024 17:52:42 +0200 Subject: [PATCH 14/21] Rm LAT / LONG from env var --- pyroengine/engine.py | 7 ++----- src/run.py | 6 +----- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/pyroengine/engine.py b/pyroengine/engine.py index 7ced6cec..b396db3e 100644 --- a/pyroengine/engine.py +++ b/pyroengine/engine.py @@ -66,8 +66,6 @@ def __init__( conf_thresh: float = 0.25, api_host: Optional[str] = None, cam_creds: Optional[Dict[str, Dict[str, str]]] = None, - latitude: Optional[float] = None, - longitude: Optional[float] = None, nb_consecutive_frames: int = 4, frame_size: Optional[Tuple[int, int]] = None, cache_backup_period: int = 60, @@ -88,9 +86,8 @@ def __init__( # API Setup if isinstance(api_host, str): - assert isinstance(latitude, float) and isinstance(longitude, float) and isinstance(cam_creds, dict) - self.latitude = latitude - self.longitude = longitude + assert isinstance(cam_creds, dict) + self.api_client = {} if isinstance(api_host, str) and isinstance(cam_creds, dict): # Instantiate clients for each camera diff --git a/src/run.py b/src/run.py index 55269634..d2a5aca6 100644 --- a/src/run.py +++ b/src/run.py @@ -27,9 +27,7 @@ def main(args): # .env loading load_dotenv(".env") API_URL = os.environ.get("API_URL") - LAT = float(os.environ.get("LAT")) - LON = float(os.environ.get("LON")) - assert isinstance(API_URL, str) and isinstance(LAT, float) and isinstance(LON, float) + assert isinstance(API_URL, str) CAM_USER = os.environ.get("CAM_USER") CAM_PWD = os.environ.get("CAM_PWD") assert isinstance(CAM_USER, str) and isinstance(CAM_PWD, str) @@ -60,8 +58,6 @@ def main(args): args.thresh, API_URL, splitted_cam_creds, - LAT, - LON, cache_folder=args.cache, backup_size=args.backup_size, nb_consecutive_frames=args.nb_consecutive_frames, From 59a5e1e2da9154fd50389592f1fa3457fb2e56ce Mon Sep 17 00:00:00 2001 From: Ronan Date: Tue, 17 Sep 2024 15:41:04 +0200 Subject: [PATCH 15/21] feat: add custom logger in order to save in file --- pyroengine/__init__.py | 1 + pyroengine/core.py | 17 +++++++---------- pyroengine/engine.py | 23 ++++++++++------------- pyroengine/logger_config.py | 26 ++++++++++++++++++++++++++ pyroengine/sensors.py | 15 +++++++-------- pyroengine/vision.py | 17 +++++++---------- src/run.py | 3 --- 7 files changed, 58 insertions(+), 44 deletions(-) create mode 100644 pyroengine/logger_config.py diff --git a/pyroengine/__init__.py b/pyroengine/__init__.py index 56f77dcd..847e4b6f 100644 --- a/pyroengine/__init__.py +++ b/pyroengine/__init__.py @@ -1,3 +1,4 @@ +from .logger_config import logger # Ensure logger is initialized first from .core import * from . import engine, sensors, utils from .version import __version__ diff --git a/pyroengine/core.py b/pyroengine/core.py index a41fec7c..b853f2b6 100644 --- a/pyroengine/core.py +++ b/pyroengine/core.py @@ -4,7 +4,6 @@ # See LICENSE or go to for full license details. import asyncio -import logging import time from datetime import datetime from typing import Any, List @@ -13,15 +12,13 @@ import urllib3 from .engine import Engine +from .logger_config import logger from .sensors import ReolinkCamera __all__ = ["SystemController", "is_day_time"] urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) -# Configure logging -logging.basicConfig(format="%(asctime)s | %(levelname)s: %(message)s", level=logging.INFO, force=True) - def is_day_time(cache, frame, strategy, delta=0): """ @@ -84,7 +81,7 @@ async def capture_camera_image(camera: ReolinkCamera, image_queue: asyncio.Queue await image_queue.put((cam_id, frame)) await asyncio.sleep(0) # Yield control except Exception as e: - logging.exception(f"Error during image capture from camera {cam_id}: {e}") + logger.exception(f"Error during image capture from camera {cam_id}: {e}") class SystemController: @@ -133,7 +130,7 @@ async def analyze_stream(self, image_queue: asyncio.Queue) -> None: try: self.engine.predict(frame, cam_id) except Exception as e: - logging.error(f"Error running prediction: {e}") + logger.error(f"Error running prediction: {e}") finally: image_queue.task_done() # Mark the task as done @@ -146,7 +143,7 @@ def check_day_time(self) -> None: if frame is not None: self.day_time = is_day_time(None, frame, "ir") except Exception as e: - logging.exception(f"Exception during initial day time check: {e}") + logger.exception(f"Exception during initial day time check: {e}") async def run(self, period: int = 30, send_alerts: bool = True) -> None: """ @@ -181,10 +178,10 @@ async def run(self, period: int = 30, send_alerts: bool = True) -> None: if send_alerts: self.engine._process_alerts(self.cameras) except Exception as e: - logging.exception(f"Error processing alerts: {e}") + logger.exception(f"Error processing alerts: {e}") except Exception as e: - logging.warning(f"Analyze stream error: {e}") + logger.warning(f"Analyze stream error: {e}") async def main_loop(self, period: int, send_alerts: bool = True) -> None: """ @@ -200,7 +197,7 @@ async def main_loop(self, period: int, send_alerts: bool = True) -> None: # Sleep only once all images are processed loop_time = time.time() - start_ts sleep_time = max(period - (loop_time), 0) - logging.info(f"Loop run under {loop_time:.2f} seconds, sleeping for {sleep_time:.2f}") + logger.info(f"Loop run under {loop_time:.2f} seconds, sleeping for {sleep_time:.2f}") await asyncio.sleep(sleep_time) def __repr__(self) -> str: diff --git a/pyroengine/engine.py b/pyroengine/engine.py index b396db3e..34d4fd0e 100644 --- a/pyroengine/engine.py +++ b/pyroengine/engine.py @@ -6,7 +6,6 @@ import glob import io import json -import logging import os import shutil import time @@ -23,13 +22,12 @@ from pyroengine.utils import box_iou, nms +from .logger_config import logger from .sensors import ReolinkCamera from .vision import Classifier __all__ = ["Engine"] -logging.basicConfig(format="%(asctime)s | %(levelname)s: %(message)s", level=logging.INFO, force=True) - class Engine: """This implements an object to manage predictions and API interactions for wildfire alerts. @@ -80,7 +78,6 @@ def __init__( ) -> None: """Init engine""" # Engine Setup - self.model = Classifier(model_path=model_path) self.conf_thresh = conf_thresh @@ -259,7 +256,7 @@ def predict(self, frame: Image.Image, cam_id: Optional[str] = None, pose_id: Opt try: self.heartbeat(cam_id) except ConnectionError: - logging.exception(f"Unable to reach the pyro-api with {cam_id}") + logger.exception(f"Unable to reach the pyro-api with {cam_id}") cam_key = cam_id or "-1" # Reduce image size to save bandwidth @@ -276,7 +273,7 @@ def predict(self, frame: Image.Image, cam_id: Optional[str] = None, pose_id: Opt # Log analysis result device_str = f"Camera '{cam_id}' - " if isinstance(cam_id, str) else "" pred_str = "Wildfire detected" if conf > self.conf_thresh else "No wildfire" - logging.info(f"{device_str}{pred_str} (confidence: {conf:.2%})") + logger.info(f"{device_str}{pred_str} (confidence: {conf:.2%})") # Alert if conf > self.conf_thresh and len(self.api_client) > 0 and isinstance(cam_id, str): @@ -315,7 +312,7 @@ def _process_alerts(self, cameras: List[ReolinkCamera]) -> None: frame_info = self._alerts[0] cam_id = frame_info["cam_id"] pose_id = frame_info["pose_id"] - logging.info(f"Camera '{cam_id}' - Process detection from {frame_info['ts']}...") + logger.info(f"Camera '{cam_id}' - Process detection from {frame_info['ts']}...") # Save alert on device self._local_backup(frame_info["frame"], cam_id, pose_id) @@ -328,7 +325,7 @@ def _process_alerts(self, cameras: List[ReolinkCamera]) -> None: if camera.ip_address == cam_id: azimuth = camera.cam_azimuths[pose_id - 1] if pose_id is not None else camera.cam_azimuths[0] bboxes = self._alerts[0]["bboxes"] - logging.info(f"Azimuth : {azimuth} , bboxes : {bboxes}") + logger.info(f"Azimuth : {azimuth} , bboxes : {bboxes}") if len(bboxes) != 0: response = self.api_client[cam_id].create_detection(stream.getvalue(), azimuth, bboxes) # Force a KeyError if the request failed @@ -337,18 +334,18 @@ def _process_alerts(self, cameras: List[ReolinkCamera]) -> None: print(response.json()) raise KeyError(f"Missing 'id' in response from camera '{cam_id}'") # Clear else: - logging.info(f"Camera '{cam_id}' - detection created") + logger.info(f"Camera '{cam_id}' - detection created") break self._alerts.popleft() stream.seek(0) # "Rewind" the stream to the beginning so we can read its content except (KeyError, ConnectionError) as e: - logging.exception(f"Camera '{cam_id}' - unable to upload cache") - logging.exception(e) + logger.exception(f"Camera '{cam_id}' - unable to upload cache") + logger.exception(e) break except Exception as e: - logging.exception(f"Camera '{cam_id}' - unable to create detection") - logging.exception(e) + logger.exception(f"Camera '{cam_id}' - unable to create detection") + logger.exception(e) break def _local_backup( diff --git a/pyroengine/logger_config.py b/pyroengine/logger_config.py new file mode 100644 index 00000000..c42a4f9d --- /dev/null +++ b/pyroengine/logger_config.py @@ -0,0 +1,26 @@ +import logging +import os +from logging.handlers import TimedRotatingFileHandler + +# Define the logging format +log_format = "%(asctime)s | %(levelname)s: %(message)s" +os.makedirs(os.path.dirname("/var/log/engine.log"), exist_ok=True) + +# Create a StreamHandler (for stdout) +stream_handler = logging.StreamHandler() +stream_handler.setFormatter(logging.Formatter(log_format)) + +# Create a TimedRotatingFileHandler (for writing logs to a new file every day) +file_handler = TimedRotatingFileHandler("/var/log/engine.log", when="midnight", interval=1, backupCount=5) +file_handler.setFormatter(logging.Formatter(log_format)) +file_handler.suffix = "%Y-%m-%d" # Adds a date suffix to the log file name + +# Export the logger instance +logger = logging.getLogger() # Get the root logger + +# Ensure we only add handlers once +logger.addHandler(stream_handler) +logger.addHandler(file_handler) + +logger.setLevel(logging.INFO) +logger.info("Logger is set up correctly.") diff --git a/pyroengine/sensors.py b/pyroengine/sensors.py index 9af14752..04d70399 100644 --- a/pyroengine/sensors.py +++ b/pyroengine/sensors.py @@ -3,7 +3,6 @@ # This program is licensed under the Apache License 2.0. # See LICENSE or go to for full license details. -import logging import time from io import BytesIO from typing import List, Optional @@ -16,7 +15,7 @@ urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) # Configure logging -logging.basicConfig(level=logging.DEBUG) +from .logger_config import logger class ReolinkCamera: @@ -73,12 +72,12 @@ def _handle_response(self, response, success_message: str): if response.status_code == 200: response_data = response.json() if response_data[0]["code"] == 0: - logging.debug(success_message) + logger.debug(success_message) else: - logging.error(f"Error in camera call: {response_data}") + logger.error(f"Error in camera call: {response_data}") return response_data else: - logging.error(f"Failed operation during camera control: {response.status_code}, {response.text}") + logger.error(f"Failed operation during camera control: {response.status_code}, {response.text}") return None def capture(self, pos_id: Optional[int] = None, timeout: int = 2) -> Optional[Image.Image]: @@ -96,7 +95,7 @@ def capture(self, pos_id: Optional[int] = None, timeout: int = 2) -> Optional[Im self.move_camera("ToPos", idx=int(pos_id), speed=50) time.sleep(1) url = self._build_url("Snap") - logging.debug("Start capture") + logger.debug("Start capture") try: response = requests.get(url, verify=False, timeout=timeout) # nosec: B501 @@ -105,9 +104,9 @@ def capture(self, pos_id: Optional[int] = None, timeout: int = 2) -> Optional[Im image = Image.open(image_data).convert("RGB") return image else: - logging.error(f"Failed to capture image: {response.status_code}, {response.text}") + logger.error(f"Failed to capture image: {response.status_code}, {response.text}") except requests.RequestException as e: - logging.error(f"Request failed: {e}") + logger.error(f"Request failed: {e}") return None def move_camera(self, operation: str, speed: int = 20, idx: int = 0): diff --git a/pyroengine/vision.py b/pyroengine/vision.py index e8f405c8..e9b75a17 100644 --- a/pyroengine/vision.py +++ b/pyroengine/vision.py @@ -4,7 +4,6 @@ # See LICENSE or go to for full license details. import json -import logging import os import platform import shutil @@ -16,6 +15,7 @@ from PIL import Image from ultralytics import YOLO # type: ignore[import-untyped] +from .logger_config import logger from .utils import DownloadProgressBar __all__ = ["Classifier"] @@ -26,9 +26,6 @@ METADATA_NAME = "model_metadata.json" -logging.basicConfig(format="%(asctime)s | %(levelname)s: %(message)s", level=logging.INFO, force=True) - - # Utility function to save metadata def save_metadata(metadata_path, metadata): with open(metadata_path, "w") as f: @@ -52,7 +49,7 @@ def __init__(self, model_folder="data", imgsz=1024, conf=0.15, iou=0.05, format= if self.is_arm_architecture(): model = "yolov8s_ncnn_model.zip" else: - logging.info("NCNN format is optimized for arm architecture only, switching to onnx") + logger.info("NCNN format is optimized for arm architecture only, switching to onnx") model = "yolov8s.onnx" elif format in ["onnx", "pt"]: model = f"yolov8s.{format}" @@ -74,9 +71,9 @@ def __init__(self, model_folder="data", imgsz=1024, conf=0.15, iou=0.05, format= # Load existing metadata metadata = self.load_metadata(metadata_path) if metadata and metadata.get("sha256") == expected_sha256: - logging.info("Model already exists and the SHA256 hash matches. No download needed.") + logger.info("Model already exists and the SHA256 hash matches. No download needed.") else: - logging.info("Model exists but the SHA256 hash does not match or the file doesn't exist.") + logger.info("Model exists but the SHA256 hash does not match or the file doesn't exist.") os.remove(model_path) self.download_model(model_url, model_path, expected_sha256, metadata_path) else: @@ -110,15 +107,15 @@ def download_model(self, model_url, model_path, expected_sha256, metadata_path): os.makedirs(os.path.split(model_path)[0], exist_ok=True) # Download the model - logging.info(f"Downloading model from {model_url} ...") + logger.info(f"Downloading model from {model_url} ...") with DownloadProgressBar(unit="B", unit_scale=True, miniters=1, desc=model_path) as t: urlretrieve(model_url, model_path, reporthook=t.update_to) - logging.info("Model downloaded!") + logger.info("Model downloaded!") # Save the metadata metadata = {"sha256": expected_sha256} save_metadata(metadata_path, metadata) - logging.info("Metadata saved!") + logger.info("Metadata saved!") # Utility function to load metadata def load_metadata(self, metadata_path): diff --git a/src/run.py b/src/run.py index d2a5aca6..08cf9e82 100644 --- a/src/run.py +++ b/src/run.py @@ -6,7 +6,6 @@ import argparse import asyncio import json -import logging import os import urllib3 @@ -18,8 +17,6 @@ urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) -logging.basicConfig(format="%(asctime)s | %(levelname)s: %(message)s", level=logging.INFO, force=True) - def main(args): print(args) From c6e628626665197083171f70bdefd4c5397566ab Mon Sep 17 00:00:00 2001 From: Ronan Date: Wed, 18 Sep 2024 14:58:01 +0200 Subject: [PATCH 16/21] fix style & quality --- pyroengine/core.py | 1 + pyroengine/engine.py | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/pyroengine/core.py b/pyroengine/core.py index d1041de1..37f20434 100644 --- a/pyroengine/core.py +++ b/pyroengine/core.py @@ -91,6 +91,7 @@ async def capture_camera_image(camera: ReolinkCamera, image_queue: asyncio.Queue logger.exception(f"Error during image capture from camera {cam_id}: {e}") return True + class SystemController: """ Controls the system for capturing and analyzing camera streams. diff --git a/pyroengine/engine.py b/pyroengine/engine.py index d0208ea1..d3f36d5f 100644 --- a/pyroengine/engine.py +++ b/pyroengine/engine.py @@ -252,7 +252,6 @@ def _update_states(self, frame: Image.Image, preds: np.ndarray, cam_key: str) -> output_predictions = output_predictions[:5, :] # max 5 bbox output_predictions_tuples = [tuple(row) for row in output_predictions] - self._states[cam_key]["last_predictions"].append( (frame, preds, output_predictions_tuples, datetime.now(timezone.utc).isoformat(), False) ) From 137636623d9ecc48e12d9c6c0705da3bf9f8fe38 Mon Sep 17 00:00:00 2001 From: Ronan Date: Thu, 19 Sep 2024 10:33:53 +0200 Subject: [PATCH 17/21] fix gitAction build --- pyroengine/logger_config.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pyroengine/logger_config.py b/pyroengine/logger_config.py index c42a4f9d..e384c25a 100644 --- a/pyroengine/logger_config.py +++ b/pyroengine/logger_config.py @@ -6,6 +6,11 @@ log_format = "%(asctime)s | %(levelname)s: %(message)s" os.makedirs(os.path.dirname("/var/log/engine.log"), exist_ok=True) +if not os.path.exists("/var/log/engine.log"): + open("/var/log/engine.log", "a").close() # Create the file if it doesn't exist + +os.chmod("/var/log/engine.log", 0o664) + # Create a StreamHandler (for stdout) stream_handler = logging.StreamHandler() stream_handler.setFormatter(logging.Formatter(log_format)) From 26cfbe33e3d10f3a3e5764baf85dfa6e9ac9ca1a Mon Sep 17 00:00:00 2001 From: Ronan Date: Thu, 19 Sep 2024 11:04:35 +0200 Subject: [PATCH 18/21] fix permission error when used locally --- pyroengine/logger_config.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/pyroengine/logger_config.py b/pyroengine/logger_config.py index e384c25a..2f385181 100644 --- a/pyroengine/logger_config.py +++ b/pyroengine/logger_config.py @@ -4,19 +4,13 @@ # Define the logging format log_format = "%(asctime)s | %(levelname)s: %(message)s" -os.makedirs(os.path.dirname("/var/log/engine.log"), exist_ok=True) - -if not os.path.exists("/var/log/engine.log"): - open("/var/log/engine.log", "a").close() # Create the file if it doesn't exist - -os.chmod("/var/log/engine.log", 0o664) # Create a StreamHandler (for stdout) stream_handler = logging.StreamHandler() stream_handler.setFormatter(logging.Formatter(log_format)) # Create a TimedRotatingFileHandler (for writing logs to a new file every day) -file_handler = TimedRotatingFileHandler("/var/log/engine.log", when="midnight", interval=1, backupCount=5) +file_handler = TimedRotatingFileHandler("engine.log", when="midnight", interval=1, backupCount=5) file_handler.setFormatter(logging.Formatter(log_format)) file_handler.suffix = "%Y-%m-%d" # Adds a date suffix to the log file name From e948c6160504e62ab40bc99909ac72c62f2e688f Mon Sep 17 00:00:00 2001 From: Ronan Date: Thu, 19 Sep 2024 11:17:39 +0200 Subject: [PATCH 19/21] fix gitAction error --- .github/workflows/tests.yml | 2 +- pyroengine/logger_config.py | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 4d5af5ae..54793f0e 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -41,7 +41,7 @@ jobs: run: | coverage run -m pytest tests/ coverage xml - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v4 with: name: coverage-main path: ./coverage.xml diff --git a/pyroengine/logger_config.py b/pyroengine/logger_config.py index 2f385181..0165c4b7 100644 --- a/pyroengine/logger_config.py +++ b/pyroengine/logger_config.py @@ -1,5 +1,4 @@ import logging -import os from logging.handlers import TimedRotatingFileHandler # Define the logging format From 156daaa0ded52357da1bfafae5cdc3d419d279b0 Mon Sep 17 00:00:00 2001 From: Ronan Date: Thu, 19 Sep 2024 11:47:36 +0200 Subject: [PATCH 20/21] fix header --- pyroengine/logger_config.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pyroengine/logger_config.py b/pyroengine/logger_config.py index 0165c4b7..b6743bb3 100644 --- a/pyroengine/logger_config.py +++ b/pyroengine/logger_config.py @@ -1,3 +1,8 @@ +# Copyright (C) -2024, Pyronear. + +# This program is licensed under the Apache License 2.0. +# See LICENSE or go to for full license details. + import logging from logging.handlers import TimedRotatingFileHandler From 5f17e8819ef132ad372ba168cd023e26efd45299 Mon Sep 17 00:00:00 2001 From: Ronan Date: Thu, 19 Sep 2024 12:08:19 +0200 Subject: [PATCH 21/21] fix headers --- pyroengine/logger_config.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyroengine/logger_config.py b/pyroengine/logger_config.py index b6743bb3..cb6a3313 100644 --- a/pyroengine/logger_config.py +++ b/pyroengine/logger_config.py @@ -1,7 +1,7 @@ -# Copyright (C) -2024, Pyronear. +# Copyright (C) 2022-2024, Pyronear. # This program is licensed under the Apache License 2.0. -# See LICENSE or go to for full license details. +# See LICENSE or go to for full license details. import logging from logging.handlers import TimedRotatingFileHandler