Giter Club home page Giter Club logo

geti-sdk's Introduction

python openvino Intel Geti

Pre-merge Tests Status Nightly Tests [Geti latest] Status Nightly Tests [Geti develop] Status

OpenSSF Best Practices


Introduction

Welcome to the Intel® Geti™ SDK! The Intel® Geti™ platform enables teams to rapidly develop AI models. The platform reduces the time needed to build models by easing the complexities of model development and harnessing greater collaboration between teams. Most importantly, the platform unlocks faster time-to-value for digitization initiatives with AI.

The Intel® Geti™ SDK is a python package which contains tools to interact with an Intel® Geti™ server via the REST API. It provides functionality for:

  • Project creation from annotated datasets on disk
  • Project downloading (images, videos, configuration, annotations, predictions and models)
  • Project creation and upload from a previous download
  • Deploying a project for local inference with OpenVINO
  • Getting and setting project and model configuration
  • Launching and monitoring training jobs
  • Media upload and prediction

This repository also contains a set of (tutorial style) Jupyter notebooks that demonstrate how to use the SDK. We highly recommend checking them out to get a feeling for use cases for the package.

Getting started

Installation

Using an environment manager such as Anaconda or venv to create a new Python environment before installing the Intel® Geti™ SDK and its requirements is highly recommended.

NOTE: If you have installed multiple versions of Python, use py -3.9 venv -m <env_name> when creating your virtual environment to specify a supported version (in this case 3.9). Once you activate the virtual environment <venv_path>/Scripts/activate, make sure to upgrade pip to the latest version python -m pip install --upgrade pip wheel setuptools.

Python version compatibility

Make sure to set up your environment using one of the supported Python versions for your operating system, as indicated in the table below.

Python <= 3.8 Python 3.9 Python 3.10 Python 3.11 Python 3.12
Linux ✔️ ✔️ ✔️
Windows ✔️ ✔️ ✔️
MacOS ✔️ ✔️ ✔️

Once you have created and activated a new environment, follow the steps below to install the package.

Installing from PyPI

Use pip install geti-sdk to install the SDK from the Python Package Index (PyPI). To install a specific version (for instance v1.5.0), use the command pip install geti-sdk==1.5.0

Installing from the Git repo

  1. Download or clone the repository and navigate to the root directory of the repo in your terminal.

  2. Base installation Within this directory, install the SDK using pip install . This command will install the package and its base dependencies in your environment.

  3. Notebooks installation (Optional) If you want to be able to run the notebooks, make sure to install the extra requirements using pip install .[notebooks] This will install both the SDK and all other dependencies needed to run the notebooks in your environment

  4. Development installation (Optional) If you plan on running the tests or want to build the documentation, you can install the package extra requirements by doing for example pip install -e .[dev]

    The valid options for the extra requirements are [dev, docs, notebooks], corresponding to the following functionality:

    • dev Install requirements to run the test suite on your local machine
    • notebooks Install requirements to run the Juypter notebooks in the notebooks folder in this repository.
    • docs Install requirements to build the documentation for the SDK from source on your machine

Using the SDK

The SDK contains example code in various forms to help you get familiar with the package.

  • Code examples are short snippets that demonstrate how to perform several common tasks. This also shows how to configure the SDK to connect to your Intel® Geti™ server.

  • Jupyter notebooks are tutorial style notebooks that cover pretty much the full SDK functionality. These are the recommended way to get started with the SDK.

  • Example scripts are more extensive scripts that cover more advanced usage than the code examples, have a look at these if you don't like Jupyter.

Code examples

The package provides a main class Geti that can be used for the following use cases

Connecting to the Intel® Geti™ platform

To establish a connection between the SDK running on your local machine, and the Intel® Geti™ platform running on a remote server, the Geti class needs to know the hostname or IP address for the server and it needs to have some form of authentication.

Instantiating the Geti class will establish the connection and perform authentication.

  • Personal Access Token

    The recommended authentication method is the 'Personal Access Token'. The token can be obtained by following the steps below:

    1. Open the Intel® Geti™ user interface in your browser
    2. Click on the User menu, in the top right corner of the page. The menu is accessible from any page inside the Intel® Geti™ interface.
    3. In the dropdown menu that follows, click on Personal access token, as shown in the image below.
    4. In the screen that follows, go through the steps to create a token.
    5. Make sure to copy the token value!

    Personal access token menu

    Once you created a personal access token, it can be passed to the Geti class as follows:

    from geti_sdk import Geti
    
    geti = Geti(
        host="https://your_server_hostname_or_ip_address",
        token="your_personal_access_token"
    )
  • User Credentials

    NOTE: For optimal security, using the token method outlined above is recommended.

    In addition to the token, your username and password can also be used to connect to the server. They can be passed as follows:

    from geti_sdk import Geti
    
    geti = Geti(
        host="https://your_server_hostname_or_ip_address", username="dummy_user", password="dummy_password"
    )

    Here, "dummy_user" and "dummy_password" should be replaced by your username and password for the Geti server.

  • SSL certificate validation

    By default, the SDK verifies the SSL certificate of your server before establishing a connection over HTTPS. If the certificate can't be validated, this will results in an error and the SDK will not be able to connect to the server.

    However, this may not be appropriate or desirable in all cases, for instance if your Geti server does not have a certificate because you are running it in a private network environment. In that case, certificate validation can be disabled by passing verify_certificate=False to the Geti constructor. Please only disable certificate validation in a secure environment!

Downloading and uploading projects

  • Project download The following python snippet is a minimal example of how to download a project using Geti:

    from geti_sdk import Geti
    
    geti = Geti(
      host="https://your_server_hostname_or_ip_address", token="your_personal_access_token"
    )
    
    geti.download_project(project_name="dummy_project")

    Here, it is assumed that the project with name 'dummy_project' exists on the cluster. The Geti instance will create a folder named 'dummy_project' in your current working directory, and download the project parameters, images, videos, annotations, predictions and the active model for the project (including optimized models derived from it) to that folder.

    The method takes the following optional parameters:

    • target_folder -- Can be specified to change the directory to which the project data is saved.

    • include_predictions -- Set to True to download the predictions for all images and videos in the project. Set to False to not download any predictions.

    • include_active_model -- Set to True to download the active model for the project, and any optimized models derived from it. If set to False, no models are downloaded. False by default.

    NOTE: During project downloading the Geti SDK stores data on local disk. If necessary, please apply additional security control to protect downloaded files (e.g., enforce access control, delete sensitive data securely).

  • Project upload The following python snippet is a minimal example of how to re-create a project on an Intel® Geti™ server using the data from a previously downloaded project:

    from geti_sdk import Geti
    
    geti = Geti(
      host="https://your_server_hostname_or_ip_address", token="your_personal_access_token"
    )
    
    geti.upload_project(target_folder="dummy_project")

    The parameter target_folder must be a valid path to the directory holding the project data. If you want to create the project using a different name than the original project, you can pass an additional parameter project_name to the upload method.

The Geti instance can be used to either back-up a project (by downloading it and later uploading it again to the same cluster), or to migrate a project to a different cluster (download it, and upload it to the target cluster).

Up- or downloading all projects

To up- or download all projects from a cluster, simply use the geti.download_all_projects and geti.upload_all_projects methods instead of the single project methods in the code snippets above.

Deploying a project

The following code snippet shows how to create a deployment for local inference with OpenVINO:

import cv2

from geti_sdk import Geti

geti = Geti(
host="https://your_server_hostname_or_ip_address", token="your_personal_access_token"
)

# Download the model data and create a `Deployment`
deployment = geti.deploy_project(project_name="dummy_project")

# Load the inference models for all tasks in the project, for CPU inference
deployment.load_inference_models(device='CPU')

# Run inference
dummy_image = cv2.imread('dummy_image.png')
prediction = deployment.infer(image=dummy_image)

# Save the deployment to disk
deployment.save(path_to_folder="dummy_project")

The deployment.infer method takes a numpy image as input.

The deployment.save method will save the deployment to the folder named 'dummy_project', on the local disk. The deployment can be reloaded again later using Deployment.from_folder('dummy_project').

Example scripts

The examples folder contains example scripts, showing various use cases for the package. They can be run by navigating to the examples directory in your terminal, and simply running the scripts like any other python script.

Jupyter Notebooks

In addition, the notebooks folder contains Jupyter notebooks with example use cases for the geti_sdk. To run the notebooks, make sure that the requirements for the notebooks are installed in your Python environment. If you have not installed these when you were installing the SDK, you can install them at any time using pip install -r requirements/requirements-notebooks.txt

Once the notebook requirements are installed, navigate to the notebooks directory in your terminal. Then, launch JupyterLab by typing jupyter lab. This should open your browser and take you to the JupyterLab landing page, with the SDK notebooks open (see the screenshot below).

NOTE: Both the example scripts and the notebooks require access to a server running the Intel® Geti™ platform.

Jupyter lab landing page

High level API reference

The Geti class provides the following methods:

  • download_project -- Downloads a project by project name.

  • upload_project -- Uploads project from a folder.

  • download_all_projects -- Downloads all projects found on the server.

  • upload_all_projects -- Uploads all projects found in a specified folder to the server.

  • upload_and_predict_image -- Uploads a single image to an existing project on the server, and requests a prediction for that image. Optionally, the prediction can be visualized as an overlay on the image.

  • upload_and_predict_video -- Uploads a single video to an existing project on the server, and requests predictions for the frames in the video. As with upload_and_predict_image, the predictions can be visualized on the frames. The parameter frame_stride can be used to control which frames are extracted for prediction.

  • upload_and_predict_media_folder -- Uploads all media (images and videos) from a folder on local disk to an existing project on the server, and download predictions for all uploaded media.

  • deploy_project -- Downloads the active model for all tasks in the project as an OpenVINO inference model. The resulting Deployment can be used to run inference for the project on a local machine. Pipeline inference is also supported.

  • create_project_single_task_from_dataset -- Creates a single task project on the server, potentially using labels and uploading annotations from an external dataset.

  • create_task_chain_project_from_dataset -- Creates a task chain project on the server, potentially using labels and uploading annotations from an external dataset.

For further details regarding these methods, please refer to the method documentation, the code snippets, and example scripts provided in this repo.

Please visit the full documentation for a complete API reference.

Using Docker

The Dockerfile can be used to run the package without having to install python on your machine.

First build the docker image

docker build -t geti-sdk .

then run it using,

docker run --rm -ti -v $(pwd):/app geti-sdk:latest /bin/bash

Supported features

What is supported

  • Creating projects. You can pass a variable project_type to control what kind of tasks will be created in the project pipeline. For example, if you want to create a single task segmentation project, you'd pass project_type='segmentation'. For a detection -> segmentation task chain, you can pass project_type=detection_to_segmentation. Please see the scripts in the examples folder for examples on how to do this.

  • Creating datasets and retrieving dataset statistics.

  • Uploading images, videos, annotations for images and video frames and configurations to a project.

  • Downloading images, videos, annotations, models and predictions for all images and videos/video frames in a project. Also downloading the full project configuration is supported.

  • Setting configuration for a project, like turning auto train on/off and setting number of iterations for all tasks.

  • Deploying a project to load OpenVINO inference models for all tasks in the pipeline, and running the full pipeline inference on a local machine.

  • Creating and restoring a backup of an existing project, using the code snippets provided above. Only annotations, media and configurations are backed up, models are not.

  • Launching and monitoring training jobs is straightforward with the TrainingClient. Please refer to the notebook 007_train_project for instructions.

  • Authorization via Personal Access Token is available for both On-Prem and SaaS users.

  • Fetching the active dataset

  • Triggering (post-training) model optimization for model quantization and changing models precision.

  • Running model tests

  • Benchmarking models to measure inference throughput on different hardware. It allows for quick and easy comparison of inference framerates for different model architectures and precision levels for the specified project.

What is not supported

  • Model upload
  • Prediction upload
  • Exporting datasets to COCO/YOLO/VOC format: For this, you can use the export functionality from the Intel® Geti™ user interface instead.

geti-sdk's People

Contributors

adamczap avatar atwinand avatar dependabot[bot] avatar github-actions[bot] avatar harimkang avatar hiteshmanglani123 avatar igor-davidyuk avatar jihyeonyi avatar leoll2 avatar ljcornel avatar markredeman avatar olkham avatar operepel avatar paularamo avatar pskindel avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

geti-sdk's Issues

Failed to execute script .....

Trying to deploy on local. It works fine in IDE, but fails after pyinstaller to exe.

File "demo.py", line 16, in
File "PyInstaller\loader\pyimod02_importers.py", line 385, in exec_module
File "geti_sdk_init_.py", line 79, in
File "PyInstaller\loader\pyimod02_importers.py", line 385, in exec_module
File "geti_sdk\geti.py", line 42, in
File "PyInstaller\loader\pyimod02_importers.py", line 385, in exec_module
File "geti_sdk\deployment_init_.py", line 83, in
File "PyInstaller\loader\pyimod02_importers.py", line 385, in exec_module
File "geti_sdk\deployment\deployed_model.py", line 39, in
File "PyInstaller\loader\pyimod02_importers.py", line 385, in exec_module
File "geti_sdk\deployment\utils.py", line 24, in
File "importlib\resources.py", line 147, in files
File "importlib\resources.py", line 49, in _get_package
File "importlib\resources.py", line 40, in resolve
File "importlib_init
.py", line 127, in import_module
ModuleNotFoundError: No module named 'geti_sdk.deployment.resources'
[18516] Failed to execute script 'demo' due to unhandled exception!

My deploying cods are following the example below:

import cv2
from geti_sdk.deployment import Deployment
from geti_sdk.utils import show_image_with_annotation_scene

if name == "main":
# Step 1: Load the deployment
deployment = Deployment.from_folder("../deployment")

# Step 2: Load the sample image
image = cv2.imread("../sample_image.jpg")
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

# Step 3: Send inference model(s) to CPU
deployment.load_inference_models(device="CPU")

# Step 4: Infer image
prediction = deployment.infer(image_rgb)

# Step 5: Visualization
show_image_with_annotation_scene(image_rgb, prediction)

Unable to save deployment folder

geti-sdk version - 1.2.2
GETi version - 1.0.1

All the artefacts of deployment folder are not saved properly if saved using a separate function call, please refer the code below:

def save():
deployment = geti.deploy_project(project_name="m1_demo")
deployment.save("./")
save()

@ljcornel Looks like the fix to delete temporary deployment folder is deleting the artefacts in this case too.

Unable to create detection project from coco dataset when there are nested folders.

GETi Version - 1.0.1
SDK version - 1.2.0

Task: Trying to create a detection project with COCO dataset using geti-sdk. Images are getting uploaded successfully but getting following error while the annotations are being uploaded:

2023-03-07 20:26:35,383 - INFO - Project created successfully.
2023-03-07 20:26:45,543 - INFO - Starting image upload...
Uploading images: 100%
12/12 [00:05<00:00, 3.48it/s]
2023-03-07 20:26:50,824 - INFO - Upload complete. Uploaded 12 new images in 5.3 seconds.
2023-03-07 20:26:50,826 - INFO - Annotations have been converted to boxes
2023-03-07 20:26:50,827 - INFO - Dataset is prepared for detection task.
2023-03-07 20:26:50,828 - INFO - Starting image annotation upload...
Uploading image annotations: 0%
0/12 [00:00<?, ?it/s]

ValueError Traceback (most recent call last)
Cell In[35], line 1
----> 1 project = client.create_single_task_project_from_dataset(
2 project_name="m1",
3 project_type="detection",
4 path_to_images=dataset_path,
5 annotation_reader=annotation_reader,
6 # number_of_images_to_upload=100,
7 # number_of_images_to_annotate=90,
8 enable_auto_train=False,
9 )

File ~/venvs/geti_env/lib/python3.8/site-packages/geti_sdk/geti.py:638, in Geti.create_single_task_project_from_dataset(self, project_name, project_type, path_to_images, annotation_reader, labels, number_of_images_to_upload, number_of_images_to_annotate, enable_auto_train, upload_videos)
631 # Upload annotations
632 annotation_client = AnnotationClient(
633 session=self.session,
634 project=project,
635 workspace_id=self.workspace_id,
636 annotation_reader=annotation_reader,
637 )
--> 638 annotation_client.upload_annotations_for_images(images)
640 if len(videos) > 0:
641 annotation_client.upload_annotations_for_videos(videos)

File ~/venvs/geti_env/lib/python3.8/site-packages/geti_sdk/rest_clients/annotation_clients/annotation_client.py:148, in AnnotationClient.upload_annotations_for_images(self, images, append_annotations)
146 for image in tqdm(images, desc=tqdm_prefix):
147 if not append_annotations:
--> 148 response = self._upload_annotation_for_2d_media_item(
149 media_item=image
150 )
151 else:
152 response = self._append_annotation_for_2d_media_item(
153 media_item=image
154 )

File ~/venvs/geti_env/lib/python3.8/site-packages/geti_sdk/rest_clients/annotation_clients/base_annotation_client.py:169, in BaseAnnotationClient._upload_annotation_for_2d_media_item(self, media_item, annotation_scene)
167 else:
168 if self.annotation_reader is not None:
--> 169 scene_to_upload = self._read_2d_media_annotation_from_source(
170 media_item=media_item
171 )
172 else:
173 raise ValueError(
174 "You attempted to upload an annotation for a media item, but no "
175 "annotation data was passed directly and no annotation reader was "
176 "defined for the AnnotationClient. Therefore, the "
177 "AnnotationClient is unable to upload any annotation data."
178 )

File ~/venvs/geti_env/lib/python3.8/site-packages/geti_sdk/rest_clients/annotation_clients/base_annotation_client.py:306, in BaseAnnotationClient._read_2d_media_annotation_from_source(self, media_item, preserve_shape_for_global_labels)
293 def _read_2d_media_annotation_from_source(
294 self,
295 media_item: Union[Image, VideoFrame],
296 preserve_shape_for_global_labels: bool = False,
297 ) -> AnnotationScene:
298 """
299 Retrieve the annotation for the media_item, and return it in the
300 proper format to be sent to the GETi /annotations endpoint. This method uses the
(...)
304 :return: Dictionary containing the annotation, in GETi format
305 """
--> 306 annotation_list = self.annotation_reader.get_data(
307 filename=media_item.name,
308 label_name_to_id_mapping=self.label_mapping,
309 media_information=media_item.media_information,
310 preserve_shape_for_global_labels=preserve_shape_for_global_labels,
311 )
312 return AnnotationRESTConverter.from_dict(
313 {
314 "media_identifier": media_item.identifier,
(...)
317 }
318 )

File ~/venvs/geti_env/lib/python3.8/site-packages/geti_sdk/annotation_readers/datumaro_annotation_reader/datumaro_annotation_reader.py:174, in DatumAnnotationReader.get_data(self, filename, label_name_to_id_mapping, media_information, preserve_shape_for_global_labels)
148 def get_data(
149 self,
150 filename: str,
(...)
153 preserve_shape_for_global_labels: bool = False,
154 ) -> List[SCAnnotation]:
155 """
156 Return the annotation data for the dataset item corresponding to filename.
157
(...)
172 dataset item.
173 """
--> 174 ds_item = self.dataset.get_item_by_id(filename)
175 image_size = ds_item.image.size
176 annotation_list: List[SCAnnotation] = []

File ~/venvs/geti_env/lib/python3.8/site-packages/geti_sdk/annotation_readers/datumaro_annotation_reader/datumaro_dataset.py:220, in DatumaroDataset.get_item_by_id(self, datum_id)
218 ds_item = self.dataset.get(id=datum_id, subset=subset_name)
219 if ds_item is None:
--> 220 raise ValueError(
221 f"Dataset item with id {datum_id} was not found in the dataset!"
222 )
223 return ds_item

ValueError: Dataset item with id img1364 was not found in the dataset!

Note: When I use the same "Create Project from Dataset" utility in the GETi UI the same dataset works well.

The dataset has a nested structure and I think the image names ("file_name" key in coco json) are not correctly populated and thus failing to read annotations for them.

Dataset strucure:

├── annotations
│   └── instances_default.json
└── images
└── default
├── images
│   ├── img0009.jpg
│   ├── img0013.jpg
│   ├── img0040.jpg
│   ├── img0051.jpg
│   ├── img0080.jpg
│   ├── img0093.jpg
│   ├── img0114.jpg
│   ├── img0127.jpg
│   ├── img0151.jpg
│   ├── img0178.jpg
│   ├── img0194.jpg
│   ├── img0200.jpg
│   ├── img0208.jpg
│   ├── img0229.jpg
│   └── img0234.jpg
└── train
├── img0896.jpg
├── img0927.jpg
├── img0940.jpg
├── img0959.jpg
├── img1317.jpg
├── img1338.jpg
├── img1364.jpg
├── img1368.jpg
├── img1409.jpg
├── img1424.jpg
├── img1995.jpg
├── img2030.jpg
├── img2100.jpg
├── img3648.jpg
└── img3831.jpg

Ans this is how coco json looks for the "datum_id" mentioned in the error, here you can see that the file_name key has a nested path string:
....
"images": [
{
"id": 225,
"width": 1920,
"height": 1080,
"file_name": "train/img1364.jpg",
"license": 0,
"flickr_url": "",
"coco_url": "",
"date_captured": 0
},
......

Deployment issues using intel openvino(geti_sdk)

While deploying using geti_sdk i am able to install and import it successfuly but during getting server_details_from_environment i am getting error;

ValueError: Unable to load Geti Server details from environment file at path '.env', please make sure the file exists.

In my case I am not able to find .env file as its not generated by geti-sdk. I tried to create a .txt file with name .env but still not able to resolve the issue.
Please help me resolve it.

Documentation feedback

In the readme.md file

This step is not necessary now.

  1. Download or clone the repository and navigate to the sc_api_tools directory.

I suggest this change:

  1. Download or clone the repository.

ModuleNotFoundError: No module named 'ote_sdk' for classification example

geti-sdk 1.5.0

Hello,
After I exported/deployed a classification model, I followed the README instructions on the zip file and after running the demo.py I get the following error:

File "/app/env/lib/python3.8/site-packages/geti_sdk/deployment/deployed_model.py", line 301, in load_inference_model
spec.loader.exec_module(module)
File "", line 843, in exec_module
File "", line 219, in _call_with_frames_removed
File "../deployment/Classification task/python/model_wrappers/init.py", line 15, in
from .classification import Classification
File "/app/example_code/../deployment/Classification task/python/model_wrappers/classification.py", line 18, in
from ote_sdk.utils.argument_checks import check_input_parameters_type
ModuleNotFoundError: No module named 'ote_sdk'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
File "demo.py", line 28, in
deployment.load_inference_models(device="CPU")
File "/app/env/lib/python3.8/site-packages/geti_sdk/deployment/deployment.py", line 172, in load_inference_models
model.load_inference_model(device=device, project=self.project)
File "/app/env/lib/python3.8/site-packages/geti_sdk/deployment/deployed_model.py", line 303, in load_inference_model
raise ImportError(
ImportError: Unable to load inference model for DeployedModel(name='EfficientNet-B0 OpenVINO FP32 with XAI head', fps_throughput='0', latency='0', precision=['FP32'], creation_date=datetime.datetime(2023, 3, 28, 16, 53, 57, 584000, tzinfo=datetime.timezone.utc), size=16252850, target_device='CPU', target_device_type=None, previous_revision_id='64231ba5afd18e20f53cab1c', previous_trained_revision_id='64231ba5afd18e20f53cab1c', score=None, performance={'score': 0.9355980184005662, 'local_score': None, 'global_score': None}, id='64231ba5afd18e20f53cab1d', label_schema_in_sync=None, model_status=<ModelStatus.SUCCESS: 'SUCCESS'>, optimization_methods=[], optimization_objectives={}, optimization_type=<OptimizationType.MO: 'MO'>, version=17, configurations=[], model_format='OpenVINO', has_xai_head=True). A custom model wrapperis required, but could not be found at path ../deployment/Classification task/python/model_wrappers.

There is no clear way to install ote_sdk using pip.
Can I get some help solving this issue? Thanks.

Error running pip3 install -r requirements.txt on downloaded model's example_code directory

Error running pip3 install -r requirements.txt on downloaded model's example_code directory

Running:
Mac M2 Ventura 13.4
Python 3.10.11
pip 23.1.2
numpy 1.22 (I have also tried with 1.23, 1.24, and 1.25

example_code % pip3 install -r requirements.txt

  note: This error originates from a subprocess, and is likely not a problem with pip.
  ERROR: Failed building wheel for numpy
  Failed to build numpy
  ERROR: Could not build wheels for numpy, which is required to install pyproject.toml-based projects

       building 'npymath' library
        compiling C sources
        C compiler: clang -Wno-unused-result -Wsign-compare -Wunreachable-code -fno-common -dynamic -DNDEBUG -g -fwrapv -O3 -Wall -arch arm64 -arch x86_64 -g

        creating build/temp.macosx-10.9-universal2-cpython-310
        creating build/temp.macosx-10.9-universal2-cpython-310/numpy
        creating build/temp.macosx-10.9-universal2-cpython-310/numpy/core
        creating build/temp.macosx-10.9-universal2-cpython-310/numpy/core/src
        creating build/temp.macosx-10.9-universal2-cpython-310/numpy/core/src/npymath
        creating build/temp.macosx-10.9-universal2-cpython-310/build
        creating build/temp.macosx-10.9-universal2-cpython-310/build/src.macosx-10.9-universal2-3.1
        creating build/temp.macosx-10.9-universal2-cpython-310/build/src.macosx-10.9-universal2-3.1/numpy
        creating build/temp.macosx-10.9-universal2-cpython-310/build/src.macosx-10.9-universal2-3.1/numpy/core
        creating build/temp.macosx-10.9-universal2-cpython-310/build/src.macosx-10.9-universal2-3.1/numpy/core/src
        creating build/temp.macosx-10.9-universal2-cpython-310/build/src.macosx-10.9-universal2-3.1/numpy/core/src/npymath
        compile options: '-Ibuild/src.macosx-10.9-universal2-3.1/numpy/core/src/npymath -Inumpy/core/include -Ibuild/src.macosx-10.9-universal2-3.1/numpy/core/include/numpy -Inumpy/core/src/common -Inumpy/core/src -Inumpy/core -Inumpy/core/src/npymath -Inumpy/core/src/multiarray -Inumpy/core/src/umath -Inumpy/core/src/npysort -I/Library/Frameworks/Python.framework/Versions/3.10/include/python3.10 -Ibuild/src.macosx-10.9-universal2-3.1/numpy/core/src/common -Ibuild/src.macosx-10.9-universal2-3.1/numpy/core/src/npymath -Ibuild/src.macosx-10.9-universal2-3.1/numpy/core/src/common -Ibuild/src.macosx-10.9-universal2-3.1/numpy/core/src/npymath -c'
        clang: numpy/core/src/npymath/npy_math.c
        clang: build/src.macosx-10.9-universal2-3.1/numpy/core/src/npymath/ieee754.c
        clang: numpy/core/src/npymath/halffloat.c
        clang: build/src.macosx-10.9-universal2-3.1/numpy/core/src/npymath/npy_math_complex.c
        numpy/core/src/npymath/npy_math_complex.c.src:48:33: warning: unused variable 'tiny' [-Wunused-const-variable]
        static const volatile npy_float tiny = 3.9443045e-31f;
                                        ^
        numpy/core/src/npymath/npy_math_complex.c.src:67:25: warning: unused variable 'c_halff' [-Wunused-const-variable]
        static const npy_cfloat c_halff = {0.5F, 0.0};
                                ^
        numpy/core/src/npymath/npy_math_complex.c.src:68:25: warning: unused variable 'c_if' [-Wunused-const-variable]
        static const npy_cfloat c_if = {0.0, 1.0F};
                                ^
        numpy/core/src/npymath/npy_math_complex.c.src:69:25: warning: unused variable 'c_ihalff' [-Wunused-const-variable]
        static const npy_cfloat c_ihalff = {0.0, 0.5F};
                                ^
        numpy/core/src/npymath/npy_math_complex.c.src:79:1: warning: unused function 'caddf' [-Wunused-function]
        caddf(npy_cfloat a, npy_cfloat b)
        ^
        numpy/core/src/npymath/npy_math_complex.c.src:87:1: warning: unused function 'csubf' [-Wunused-function]
        csubf(npy_cfloat a, npy_cfloat b)
        ^
        numpy/core/src/npymath/npy_math_complex.c.src:137:1: warning: unused function 'cnegf' [-Wunused-function]
        cnegf(npy_cfloat a)
        ^
        numpy/core/src/npymath/npy_math_complex.c.src:144:1: warning: unused function 'cmulif' [-Wunused-function]
        cmulif(npy_cfloat a)
        ^
        numpy/core/src/npymath/npy_math_complex.c.src:67:26: warning: unused variable 'c_half' [-Wunused-const-variable]
        static const npy_cdouble c_half = {0.5, 0.0};
                                 ^
        numpy/core/src/npymath/npy_math_complex.c.src:68:26: warning: unused variable 'c_i' [-Wunused-const-variable]
        static const npy_cdouble c_i = {0.0, 1.0};
                                 ^
        numpy/core/src/npymath/npy_math_complex.c.src:69:26: warning: unused variable 'c_ihalf' [-Wunused-const-variable]
        static const npy_cdouble c_ihalf = {0.0, 0.5};
                                 ^
        numpy/core/src/npymath/npy_math_complex.c.src:79:1: warning: unused function 'cadd' [-Wunused-function]
        cadd(npy_cdouble a, npy_cdouble b)
        ^
        numpy/core/src/npymath/npy_math_complex.c.src:87:1: warning: unused function 'csub' [-Wunused-function]
        csub(npy_cdouble a, npy_cdouble b)
        ^
        numpy/core/src/npymath/npy_math_complex.c.src:137:1: warning: unused function 'cneg' [-Wunused-function]
        cneg(npy_cdouble a)
        ^
        numpy/core/src/npymath/npy_math_complex.c.src:144:1: warning: unused function 'cmuli' [-Wunused-function]
        cmuli(npy_cdouble a)
        ^
        numpy/core/src/npymath/npy_math_complex.c.src:67:30: warning: unused variable 'c_halfl' [-Wunused-const-variable]
        static const npy_clongdouble c_halfl = {0.5L, 0.0};
                                     ^
        numpy/core/src/npymath/npy_math_complex.c.src:68:30: warning: unused variable 'c_il' [-Wunused-const-variable]
        static const npy_clongdouble c_il = {0.0, 1.0L};
                                     ^
        numpy/core/src/npymath/npy_math_complex.c.src:69:30: warning: unused variable 'c_ihalfl' [-Wunused-const-variable]
        static const npy_clongdouble c_ihalfl = {0.0, 0.5L};
                                     ^
        numpy/core/src/npymath/npy_math_complex.c.src:79:1: warning: unused function 'caddl' [-Wunused-function]
        caddl(npy_clongdouble a, npy_clongdouble b)
        ^
        numpy/core/src/npymath/npy_math_complex.c.src:87:1: warning: unused function 'csubl' [-Wunused-function]
        csubl(npy_clongdouble a, npy_clongdouble b)
        ^
        numpy/core/src/npymath/npy_math_complex.c.src:137:1: warning: unused function 'cnegl' [-Wunused-function]
        cnegl(npy_clongdouble a)
        ^
        numpy/core/src/npymath/npy_math_complex.c.src:144:1: warning: unused function 'cmulil' [-Wunused-function]
        cmulil(npy_clongdouble a)
        ^
        22 warnings generated.
        numpy/core/src/npymath/npy_math_complex.c.src:48:33: warning: unused variable 'tiny' [-Wunused-const-variable]
        static const volatile npy_float tiny = 3.9443045e-31f;
                                        ^
        numpy/core/src/npymath/npy_math_complex.c.src:67:25: warning: unused variable 'c_halff' [-Wunused-const-variable]
        static const npy_cfloat c_halff = {0.5F, 0.0};
                                ^
        numpy/core/src/npymath/npy_math_complex.c.src:68:25: warning: unused variable 'c_if' [-Wunused-const-variable]
        static const npy_cfloat c_if = {0.0, 1.0F};
                                ^
        numpy/core/src/npymath/npy_math_complex.c.src:69:25: warning: unused variable 'c_ihalff' [-Wunused-const-variable]
        static const npy_cfloat c_ihalff = {0.0, 0.5F};
                                ^
        numpy/core/src/npymath/npy_math_complex.c.src:79:1: warning: unused function 'caddf' [-Wunused-function]
        caddf(npy_cfloat a, npy_cfloat b)
        ^
        numpy/core/src/npymath/npy_math_complex.c.src:87:1: warning: unused function 'csubf' [-Wunused-function]
        csubf(npy_cfloat a, npy_cfloat b)
        ^
        numpy/core/src/npymath/npy_math_complex.c.src:137:1: warning: unused function 'cnegf' [-Wunused-function]
        cnegf(npy_cfloat a)
        ^
        numpy/core/src/npymath/npy_math_complex.c.src:144:1: warning: unused function 'cmulif' [-Wunused-function]
        cmulif(npy_cfloat a)
        ^
        numpy/core/src/npymath/npy_math_complex.c.src:67:26: warning: unused variable 'c_half' [-Wunused-const-variable]
        static const npy_cdouble c_half = {0.5, 0.0};
                                 ^
        numpy/core/src/npymath/npy_math_complex.c.src:68:26: warning: unused variable 'c_i' [-Wunused-const-variable]
        static const npy_cdouble c_i = {0.0, 1.0};
                                 ^
        numpy/core/src/npymath/npy_math_complex.c.src:69:26: warning: unused variable 'c_ihalf' [-Wunused-const-variable]
        static const npy_cdouble c_ihalf = {0.0, 0.5};
                                 ^
        numpy/core/src/npymath/npy_math_complex.c.src:79:1: warning: unused function 'cadd' [-Wunused-function]
        cadd(npy_cdouble a, npy_cdouble b)
        ^
        numpy/core/src/npymath/npy_math_complex.c.src:87:1: warning: unused function 'csub' [-Wunused-function]
        csub(npy_cdouble a, npy_cdouble b)
        ^
        numpy/core/src/npymath/npy_math_complex.c.src:137:1: warning: unused function 'cneg' [-Wunused-function]
        cneg(npy_cdouble a)
        ^
        numpy/core/src/npymath/npy_math_complex.c.src:144:1: warning: unused function 'cmuli' [-Wunused-function]
        cmuli(npy_cdouble a)
        ^
        numpy/core/src/npymath/npy_math_complex.c.src:67:30: warning: unused variable 'c_halfl' [-Wunused-const-variable]
        static const npy_clongdouble c_halfl = {0.5L, 0.0};
                                     ^
        numpy/core/src/npymath/npy_math_complex.c.src:68:30: warning: unused variable 'c_il' [-Wunused-const-variable]
        static const npy_clongdouble c_il = {0.0, 1.0L};
                                     ^
        numpy/core/src/npymath/npy_math_complex.c.src:69:30: warning: unused variable 'c_ihalfl' [-Wunused-const-variable]
        static const npy_clongdouble c_ihalfl = {0.0, 0.5L};
                                     ^
        numpy/core/src/npymath/npy_math_complex.c.src:79:1: warning: unused function 'caddl' [-Wunused-function]
        caddl(npy_clongdouble a, npy_clongdouble b)
        ^
        numpy/core/src/npymath/npy_math_complex.c.src:87:1: warning: unused function 'csubl' [-Wunused-function]
        csubl(npy_clongdouble a, npy_clongdouble b)
        ^
        numpy/core/src/npymath/npy_math_complex.c.src:137:1: warning: unused function 'cnegl' [-Wunused-function]
        cnegl(npy_clongdouble a)
        ^
        numpy/core/src/npymath/npy_math_complex.c.src:144:1: warning: unused function 'cmulil' [-Wunused-function]
        cmulil(npy_clongdouble a)
        ^
        22 warnings generated.
        xcrun: adding 4 object files to build/temp.macosx-10.9-universal2-cpython-310/libnpymath.a
        warning: /Library/Developer/CommandLineTools/usr/bin/ranlib: archive library: build/temp.macosx-10.9-universal2-cpython-310/libnpymath.a will be fat and ar(1) will not be able to operate on it
        ranlib:@ build/temp.macosx-10.9-universal2-cpython-310/libnpymath.a
        building 'npysort' library
        compiling C sources
        C compiler: clang -Wno-unused-result -Wsign-compare -Wunreachable-code -fno-common -dynamic -DNDEBUG -g -fwrapv -O3 -Wall -arch arm64 -arch x86_64 -g

        creating build/temp.macosx-10.9-universal2-cpython-310/build/src.macosx-10.9-universal2-3.1/numpy/core/src/npysort
        compile options: '-Ibuild/src.macosx-10.9-universal2-3.1/numpy/core/src/common -Inumpy/core/include -Ibuild/src.macosx-10.9-universal2-3.1/numpy/core/include/numpy -Inumpy/core/src/common -Inumpy/core/src -Inumpy/core -Inumpy/core/src/npymath -Inumpy/core/src/multiarray -Inumpy/core/src/umath -Inumpy/core/src/npysort -I/Library/Frameworks/Python.framework/Versions/3.10/include/python3.10 -Ibuild/src.macosx-10.9-universal2-3.1/numpy/core/src/common -Ibuild/src.macosx-10.9-universal2-3.1/numpy/core/src/npymath -Ibuild/src.macosx-10.9-universal2-3.1/numpy/core/src/common -Ibuild/src.macosx-10.9-universal2-3.1/numpy/core/src/npymath -c'
        clang: build/src.macosx-10.9-universal2-3.1/numpy/core/src/npysort/quicksort.c
        clang: build/src.macosx-10.9-universal2-3.1/numpy/core/src/npysort/mergesort.c
        clang: build/src.macosx-10.9-universal2-3.1/numpy/core/src/npysort/heapsort.c
        clang: build/src.macosx-10.9-universal2-3.1/numpy/core/src/npysort/timsort.c
        clang: build/src.macosx-10.9-universal2-3.1/numpy/core/src/npysort/selection.c
        clang: build/src.macosx-10.9-universal2-3.1/numpy/core/src/npysort/binsearch.c
        clang: build/src.macosx-10.9-universal2-3.1/numpy/core/src/npysort/radixsort.c
        numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                npy_intp k;
                ^~~~~~~~~~~
        numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
            else if (0 && kth == num - 1) {
                     ^
                     /* DISABLES CODE */ ( )
        numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                npy_intp k;
                ^~~~~~~~~~~
        numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
            else if (0 && kth == num - 1) {
                     ^
                     /* DISABLES CODE */ ( )
        numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                npy_intp k;
                ^~~~~~~~~~~
        numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
            else if (0 && kth == num - 1) {
                     ^
                     /* DISABLES CODE */ ( )
        numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                npy_intp k;
                ^~~~~~~~~~~
        numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
            else if (0 && kth == num - 1) {
                     ^
                     /* DISABLES CODE */ ( )
        numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                npy_intp k;
                ^~~~~~~~~~~
        numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
            else if (0 && kth == num - 1) {
                     ^
                     /* DISABLES CODE */ ( )
        numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                npy_intp k;
                ^~~~~~~~~~~
        numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
            else if (0 && kth == num - 1) {
                     ^
                     /* DISABLES CODE */ ( )
        numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                npy_intp k;
                ^~~~~~~~~~~
        numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
            else if (0 && kth == num - 1) {
                     ^
                     /* DISABLES CODE */ ( )
        numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                npy_intp k;
                ^~~~~~~~~~~
        numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
            else if (0 && kth == num - 1) {
                     ^
                     /* DISABLES CODE */ ( )
        numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                npy_intp k;
                ^~~~~~~~~~~
        numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
            else if (0 && kth == num - 1) {
                     ^
                     /* DISABLES CODE */ ( )
        numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                npy_intp k;
                ^~~~~~~~~~~
        numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
            else if (0 && kth == num - 1) {
                     ^
                     /* DISABLES CODE */ ( )
        numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                npy_intp k;
                ^~~~~~~~~~~
        numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
            else if (0 && kth == num - 1) {
                     ^
                     /* DISABLES CODE */ ( )
        numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                npy_intp k;
                ^~~~~~~~~~~
        numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
            else if (0 && kth == num - 1) {
                     ^
                     /* DISABLES CODE */ ( )
        numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                npy_intp k;
                ^~~~~~~~~~~
        numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
            else if (0 && kth == num - 1) {
                     ^
                     /* DISABLES CODE */ ( )
        numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                npy_intp k;
                ^~~~~~~~~~~
        numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
            else if (0 && kth == num - 1) {
                     ^
                     /* DISABLES CODE */ ( )
        numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                npy_intp k;
                ^~~~~~~~~~~
        numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
            else if (0 && kth == num - 1) {
                     ^
                     /* DISABLES CODE */ ( )
        numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                npy_intp k;
                ^~~~~~~~~~~
        numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
            else if (0 && kth == num - 1) {
                     ^
                     /* DISABLES CODE */ ( )
        numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                npy_intp k;
                ^~~~~~~~~~~
        numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
            else if (0 && kth == num - 1) {
                     ^
                     /* DISABLES CODE */ ( )
        numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                npy_intp k;
                ^~~~~~~~~~~
        numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
            else if (0 && kth == num - 1) {
                     ^
                     /* DISABLES CODE */ ( )
        numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                npy_intp k;
                ^~~~~~~~~~~
        numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
            else if (0 && kth == num - 1) {
                     ^
                     /* DISABLES CODE */ ( )
        numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                npy_intp k;
                ^~~~~~~~~~~
        numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
            else if (0 && kth == num - 1) {
                     ^
                     /* DISABLES CODE */ ( )
        numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                npy_intp k;
                ^~~~~~~~~~~
        numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
            else if (0 && kth == num - 1) {
                     ^
                     /* DISABLES CODE */ ( )
        numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                npy_intp k;
                ^~~~~~~~~~~
        numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
            else if (0 && kth == num - 1) {
                     ^
                     /* DISABLES CODE */ ( )
        22 warnings generated.
        numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                npy_intp k;
                ^~~~~~~~~~~
        numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
            else if (0 && kth == num - 1) {
                     ^
                     /* DISABLES CODE */ ( )
        numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                npy_intp k;
                ^~~~~~~~~~~
        numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
            else if (0 && kth == num - 1) {
                     ^
                     /* DISABLES CODE */ ( )
        numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                npy_intp k;
                ^~~~~~~~~~~
        numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
            else if (0 && kth == num - 1) {
                     ^
                     /* DISABLES CODE */ ( )
        numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                npy_intp k;
                ^~~~~~~~~~~
        numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
            else if (0 && kth == num - 1) {
                     ^
                     /* DISABLES CODE */ ( )
        numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                npy_intp k;
                ^~~~~~~~~~~
        numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
            else if (0 && kth == num - 1) {
                     ^
                     /* DISABLES CODE */ ( )
        numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                npy_intp k;
                ^~~~~~~~~~~
        numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
            else if (0 && kth == num - 1) {
                     ^
                     /* DISABLES CODE */ ( )
        numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                npy_intp k;
                ^~~~~~~~~~~
        numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
            else if (0 && kth == num - 1) {
                     ^
                     /* DISABLES CODE */ ( )
        numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                npy_intp k;
                ^~~~~~~~~~~
        numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
            else if (0 && kth == num - 1) {
                     ^
                     /* DISABLES CODE */ ( )
        numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                npy_intp k;
                ^~~~~~~~~~~
        numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
            else if (0 && kth == num - 1) {
                     ^
                     /* DISABLES CODE */ ( )
        numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                npy_intp k;
                ^~~~~~~~~~~
        numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
            else if (0 && kth == num - 1) {
                     ^
                     /* DISABLES CODE */ ( )
        numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                npy_intp k;
                ^~~~~~~~~~~
        numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
            else if (0 && kth == num - 1) {
                     ^
                     /* DISABLES CODE */ ( )
        numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                npy_intp k;
                ^~~~~~~~~~~
        numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
            else if (0 && kth == num - 1) {
                     ^
                     /* DISABLES CODE */ ( )
        numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                npy_intp k;
                ^~~~~~~~~~~
        numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
            else if (0 && kth == num - 1) {
                     ^
                     /* DISABLES CODE */ ( )
        numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                npy_intp k;
                ^~~~~~~~~~~
        numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
            else if (0 && kth == num - 1) {
                     ^
                     /* DISABLES CODE */ ( )
        numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                npy_intp k;
                ^~~~~~~~~~~
        numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
            else if (0 && kth == num - 1) {
                     ^
                     /* DISABLES CODE */ ( )
        numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                npy_intp k;
                ^~~~~~~~~~~
        numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
            else if (0 && kth == num - 1) {
                     ^
                     /* DISABLES CODE */ ( )
        numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                npy_intp k;
                ^~~~~~~~~~~
        numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
            else if (0 && kth == num - 1) {
                     ^
                     /* DISABLES CODE */ ( )
        numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                npy_intp k;
                ^~~~~~~~~~~
        numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
            else if (0 && kth == num - 1) {
                     ^
                     /* DISABLES CODE */ ( )
        numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                npy_intp k;
                ^~~~~~~~~~~
        numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
            else if (0 && kth == num - 1) {
                     ^
                     /* DISABLES CODE */ ( )
        numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                npy_intp k;
                ^~~~~~~~~~~
        numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
            else if (0 && kth == num - 1) {
                     ^
                     /* DISABLES CODE */ ( )
        numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                npy_intp k;
                ^~~~~~~~~~~
        numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
            else if (0 && kth == num - 1) {
                     ^
                     /* DISABLES CODE */ ( )
        numpy/core/src/npysort/selection.c.src:328:9: warning: code will never be executed [-Wunreachable-code]
                npy_intp k;
                ^~~~~~~~~~~
        numpy/core/src/npysort/selection.c.src:326:14: note: silence by adding parentheses to mark code as explicitly dead
            else if (0 && kth == num - 1) {
                     ^
                     /* DISABLES CODE */ ( )
        22 warnings generated.
        xcrun: adding 7 object files to build/temp.macosx-10.9-universal2-cpython-310/libnpysort.a
        warning: /Library/Developer/CommandLineTools/usr/bin/ranlib: archive library: build/temp.macosx-10.9-universal2-cpython-310/libnpysort.a will be fat and ar(1) will not be able to operate on it
        ranlib:@ build/temp.macosx-10.9-universal2-cpython-310/libnpysort.a
        running build_ext
        customize UnixCCompiler
        customize UnixCCompiler using build_ext
        building 'numpy.core._dummy' extension
        compiling C sources
        C compiler: clang -Wno-unused-result -Wsign-compare -Wunreachable-code -fno-common -dynamic -DNDEBUG -g -fwrapv -O3 -Wall -arch arm64 -arch x86_64 -g

        compile options: '-DNPY_INTERNAL_BUILD=1 -DHAVE_NPY_CONFIG_H=1 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE=1 -D_LARGEFILE64_SOURCE=1 -Inumpy/core/include -Ibuild/src.macosx-10.9-universal2-3.1/numpy/core/include/numpy -Inumpy/core/src/common -Inumpy/core/src -Inumpy/core -Inumpy/core/src/npymath -Inumpy/core/src/multiarray -Inumpy/core/src/umath -Inumpy/core/src/npysort -I/Library/Frameworks/Python.framework/Versions/3.10/include/python3.10 -Ibuild/src.macosx-10.9-universal2-3.1/numpy/core/src/common -Ibuild/src.macosx-10.9-universal2-3.1/numpy/core/src/npymath -Ibuild/src.macosx-10.9-universal2-3.1/numpy/core/src/common -Ibuild/src.macosx-10.9-universal2-3.1/numpy/core/src/npymath -c'
        clang: numpy/core/src/dummymodule.c
        clang -bundle -undefined dynamic_lookup -arch arm64 -arch x86_64 -g build/temp.macosx-10.9-universal2-cpython-310/numpy/core/src/dummymodule.o -Lbuild/temp.macosx-10.9-universal2-cpython-310 -o build/lib.macosx-10.9-universal2-cpython-310/numpy/core/_dummy.cpython-310-darwin.so
        building 'numpy.core._multiarray_tests' extension
        compiling C sources
        C compiler: clang -Wno-unused-result -Wsign-compare -Wunreachable-code -fno-common -dynamic -DNDEBUG -g -fwrapv -O3 -Wall -arch arm64 -arch x86_64 -g

        creating build/temp.macosx-10.9-universal2-cpython-310/build/src.macosx-10.9-universal2-3.1/numpy/core/src/multiarray
        creating build/temp.macosx-10.9-universal2-cpython-310/numpy/core/src/common
        compile options: '-DNPY_INTERNAL_BUILD=1 -DHAVE_NPY_CONFIG_H=1 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE=1 -D_LARGEFILE64_SOURCE=1 -Inumpy/core/include -Ibuild/src.macosx-10.9-universal2-3.1/numpy/core/include/numpy -Inumpy/core/src/common -Inumpy/core/src -Inumpy/core -Inumpy/core/src/npymath -Inumpy/core/src/multiarray -Inumpy/core/src/umath -Inumpy/core/src/npysort -I/Library/Frameworks/Python.framework/Versions/3.10/include/python3.10 -Ibuild/src.macosx-10.9-universal2-3.1/numpy/core/src/common -Ibuild/src.macosx-10.9-universal2-3.1/numpy/core/src/npymath -Ibuild/src.macosx-10.9-universal2-3.1/numpy/core/src/common -Ibuild/src.macosx-10.9-universal2-3.1/numpy/core/src/npymath -c'
        clang: build/src.macosx-10.9-universal2-3.1/numpy/core/src/multiarray/_multiarray_tests.c
        clang: numpy/core/src/common/mem_overlap.c
        clang -bundle -undefined dynamic_lookup -arch arm64 -arch x86_64 -g build/temp.macosx-10.9-universal2-cpython-310/build/src.macosx-10.9-universal2-3.1/numpy/core/src/multiarray/_multiarray_tests.o build/temp.macosx-10.9-universal2-cpython-310/numpy/core/src/common/mem_overlap.o -Lbuild/temp.macosx-10.9-universal2-cpython-310 -lnpymath -o build/lib.macosx-10.9-universal2-cpython-310/numpy/core/_multiarray_tests.cpython-310-darwin.so
        building 'numpy.core._multiarray_umath' extension
        compiling C sources
        C compiler: clang -Wno-unused-result -Wsign-compare -Wunreachable-code -fno-common -dynamic -DNDEBUG -g -fwrapv -O3 -Wall -arch arm64 -arch x86_64 -g

        creating build/temp.macosx-10.9-universal2-cpython-310/numpy/core/src/multiarray
        creating build/temp.macosx-10.9-universal2-cpython-310/numpy/core/src/umath
        creating build/temp.macosx-10.9-universal2-cpython-310/build/src.macosx-10.9-universal2-3.1/numpy/core/src/umath
        creating build/temp.macosx-10.9-universal2-cpython-310/private
        creating build/temp.macosx-10.9-universal2-cpython-310/private/var
        creating build/temp.macosx-10.9-universal2-cpython-310/private/var/folders
        creating build/temp.macosx-10.9-universal2-cpython-310/private/var/folders/4p
        creating build/temp.macosx-10.9-universal2-cpython-310/private/var/folders/4p/m_8bgh6n2xx26wzgrc73tx0m0000gp
        creating build/temp.macosx-10.9-universal2-cpython-310/private/var/folders/4p/m_8bgh6n2xx26wzgrc73tx0m0000gp/T
        creating build/temp.macosx-10.9-universal2-cpython-310/private/var/folders/4p/m_8bgh6n2xx26wzgrc73tx0m0000gp/T/pip-install-2xw3lgi8
        creating build/temp.macosx-10.9-universal2-cpython-310/private/var/folders/4p/m_8bgh6n2xx26wzgrc73tx0m0000gp/T/pip-install-2xw3lgi8/numpy_b387d010387c4696b5c847035de0e8cf
        creating build/temp.macosx-10.9-universal2-cpython-310/private/var/folders/4p/m_8bgh6n2xx26wzgrc73tx0m0000gp/T/pip-install-2xw3lgi8/numpy_b387d010387c4696b5c847035de0e8cf/numpy
        creating build/temp.macosx-10.9-universal2-cpython-310/private/var/folders/4p/m_8bgh6n2xx26wzgrc73tx0m0000gp/T/pip-install-2xw3lgi8/numpy_b387d010387c4696b5c847035de0e8cf/numpy/_build_utils
        creating build/temp.macosx-10.9-universal2-cpython-310/private/var/folders/4p/m_8bgh6n2xx26wzgrc73tx0m0000gp/T/pip-install-2xw3lgi8/numpy_b387d010387c4696b5c847035de0e8cf/numpy/_build_utils/src
        compile options: '-DNPY_INTERNAL_BUILD=1 -DHAVE_NPY_CONFIG_H=1 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE=1 -D_LARGEFILE64_SOURCE=1 -DNO_ATLAS_INFO=3 -DHAVE_CBLAS -Ibuild/src.macosx-10.9-universal2-3.1/numpy/core/src/umath -Ibuild/src.macosx-10.9-universal2-3.1/numpy/core/src/npymath -Ibuild/src.macosx-10.9-universal2-3.1/numpy/core/src/common -Inumpy/core/include -Ibuild/src.macosx-10.9-universal2-3.1/numpy/core/include/numpy -Inumpy/core/src/common -Inumpy/core/src -Inumpy/core -Inumpy/core/src/npymath -Inumpy/core/src/multiarray -Inumpy/core/src/umath -Inumpy/core/src/npysort -I/Library/Frameworks/Python.framework/Versions/3.10/include/python3.10 -Ibuild/src.macosx-10.9-universal2-3.1/numpy/core/src/common -Ibuild/src.macosx-10.9-universal2-3.1/numpy/core/src/npymath -Ibuild/src.macosx-10.9-universal2-3.1/numpy/core/src/common -Ibuild/src.macosx-10.9-universal2-3.1/numpy/core/src/npymath -c'
        extra options: '-faltivec -I/System/Library/Frameworks/vecLib.framework/Headers'
        clang: numpy/core/src/multiarray/alloc.c
        clang: numpy/core/src/multiarray/array_assign_scalar.c
        clang: numpy/core/src/multiarray/buffer.c
        clang: numpy/core/src/multiarray/common.c
        clang: numpy/core/src/multiarray/datetime_strings.c
        clang: numpy/core/src/multiarray/descriptor.c
        clang: numpy/core/src/multiarray/conversion_utils.c
        clang: build/src.macosx-10.9-universal2-3.1/numpy/core/src/multiarray/einsum.c
        clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
        clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
        clang: numpy/core/src/multiarray/hashdescr.c
        clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
        clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
        clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
        clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
        clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
        clang: build/src.macosx-10.9-universal2-3.1/numpy/core/src/multiarray/lowlevel_strided_loops.c
        clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
        clang: numpy/core/src/multiarray/multiarraymodule.c
        clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
        clang: numpy/core/src/multiarray/nditer_constr.c
        clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
        clang: numpy/core/src/multiarray/refcount.c
        clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
        clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
        clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
        clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
        clang: numpy/core/src/multiarray/scalarapi.c
        clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
        clang: numpy/core/src/multiarray/temp_elide.c
        clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
        clang: numpy/core/src/multiarray/vdot.c
        clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
        clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
        clang: build/src.macosx-10.9-universal2-3.1/numpy/core/src/umath/loops.c
        clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
        clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
        clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
        clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
        clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
        clang: build/src.macosx-10.9-universal2-3.1/numpy/core/src/umath/scalarmath.c
        clang: numpy/core/src/umath/ufunc_object.c
        clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
        clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
        clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
        clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
        clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
        clang: numpy/core/src/npymath/halffloat.c
        clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
        clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
        clang: numpy/core/src/common/npy_longdouble.c
        clang: numpy/core/src/common/numpyos.c
        clang: numpy/core/src/npymath/npy_math.c
        clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
        clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
        clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
        clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
        clang: /private/var/folders/4p/m_8bgh6n2xx26wzgrc73tx0m0000gp/T/pip-install-2xw3lgi8/numpy_b387d010387c4696b5c847035de0e8cf/numpy/_build_utils/src/apple_sgemv_fix.c
        clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
        clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
        clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
        clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
        clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
        clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
        clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
        clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
        clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
        clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
        clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
        clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
        clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
        clang: error: the clang compiler does not support 'faltivec', please use -maltivec and include altivec.h explicitly
        error: Command "clang -Wno-unused-result -Wsign-compare -Wunreachable-code -fno-common -dynamic -DNDEBUG -g -fwrapv -O3 -Wall -arch arm64 -arch x86_64 -g -DNPY_INTERNAL_BUILD=1 -DHAVE_NPY_CONFIG_H=1 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE=1 -D_LARGEFILE64_SOURCE=1 -DNO_ATLAS_INFO=3 -DHAVE_CBLAS -Ibuild/src.macosx-10.9-universal2-3.1/numpy/core/src/umath -Ibuild/src.macosx-10.9-universal2-3.1/numpy/core/src/npymath -Ibuild/src.macosx-10.9-universal2-3.1/numpy/core/src/common -Inumpy/core/include -Ibuild/src.macosx-10.9-universal2-3.1/numpy/core/include/numpy -Inumpy/core/src/common -Inumpy/core/src -Inumpy/core -Inumpy/core/src/npymath -Inumpy/core/src/multiarray -Inumpy/core/src/umath -Inumpy/core/src/npysort -I/Library/Frameworks/Python.framework/Versions/3.10/include/python3.10 -Ibuild/src.macosx-10.9-universal2-3.1/numpy/core/src/common -Ibuild/src.macosx-10.9-universal2-3.1/numpy/core/src/npymath -Ibuild/src.macosx-10.9-universal2-3.1/numpy/core/src/common -Ibuild/src.macosx-10.9-universal2-3.1/numpy/core/src/npymath -c numpy/core/src/multiarray/array_assign_scalar.c -o build/temp.macosx-10.9-universal2-cpython-310/numpy/core/src/multiarray/array_assign_scalar.o -MMD -MF build/temp.macosx-10.9-universal2-cpython-310/numpy/core/src/multiarray/array_assign_scalar.o.d -faltivec -I/System/Library/Frameworks/vecLib.framework/Headers" failed with exit status 1
        [end of output]

    note: This error originates from a subprocess, and is likely not a problem with pip.
    ERROR: Failed building wheel for numpy
  Failed to build numpy
  ERROR: Could not build wheels for numpy, which is required to install pyproject.toml-based projects
  [end of output]

note: This error originates from a subprocess, and is likely not a problem with pip.
error: subprocess-exited-with-error

× pip subprocess to install build dependencies did not run successfully.
│ exit code: 1
╰─> See above for output.

pre-commit failed in python3.8

When using python3.8, pre-commit failed due to the run-time error when installing isort.
The change of poetry-core caused an incompatibility with isort.
This can be fixed by upgrading isort version to v5.12.0 in the pre-commit yaml file.

Download Annotated Data

Is there a way to download annotated data in Geti? Annotations can be a time-consuming process, and having the option to download them would be greatly beneficial.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.