Skip to main content

Readme

The AnomalyTDA Client Library is a Python API toolkit that facilitates seamless integration between your Python code and the DataRefiner AnomalyTDA platform, allowing users to perform inference on their data using models exported from the AnomalyTDA platform.

Website: https://datarefiner.com

What functions this library support?

  • Perform anomaly detection using exported models
  • Perform detection using supervised models exported from AnomalyTDA platform
  • Generate anomaly heatmaps and bounding boxes images

Usage example for Anomaly Detection use case:

import os
from typing import List, Tuple

import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
from scipy.ndimage import zoom

from tqdm.notebook import tqdm

from anomalytda_client import AnomalyModel
from anomalytda_client.files import get_filenames
from anomalytda_client.tools import get_images_amaps_score, find_bounding_boxes

anomaly_model_filepath: str = "models/exported_model.anomaly"
image_folder: str = "data/myimages"

# Get filenames
filenames = get_filenames(image_folder)

# Reading all images and converting grayscale images to RGB while keeping filenames
test_images_set: List[Tuple[str, Image.Image]] = [
    Image.open(filename).convert("RGB") for filename in tqdm(filenames, desc="Read images")
]

# Applying anomaly detection model to the images, and getting anomaly map in return
anomaly_model: AnomalyModel = AnomalyModel(
    anomaly_model_filepath=anomaly_model_filepath, 
    crop_rows=2, # Grid crop "rows" parameter used during the model training
    crop_cols=2, # Grid crop "columns" parameter used during the model training
    batch_size=8
)
amap_list: List[np.ndarray] = anomaly_model.inference(test_images_set)

# Using anomaly maps for each image to generate the image heatmaps and to get anomaly scores
img_list, score_list = get_images_amaps_score(images_set=test_images_set, amap_list=amap_list)

# Calculate anomaly threshold for bounding boxes
threshold = np.percentile(np.array(amap_list), 99)

# Visualise images and generate bounding boxes around the anomalies
import matplotlib.patches as patches

for i in np.array(score_list).argsort()[::-1][:200]:
    print('score:', score_list[i], 'filename:', filenames[i])
    img, ano_map = img_list[i]
    data = amap_list[i]
    fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(6, 3))
    ax1.imshow(img)
    ax1.axis('off')
    ax2.imshow(ano_map)
    ax2.axis('off')

    for x_min, y_min, x_max, y_max in find_bounding_boxes(
        amap=data, image_size=np.shape(img), threshold=threshold
    ):
        ax2.add_patch(patches.Rectangle(
            xy=(x_min, y_min), width=x_max - x_min, height=y_max - y_min,
            linewidth=2, edgecolor="red", facecolor="none",
        ))
    
    plt.tight_layout()
    plt.show()

Usage example for Detection use case:

import os
import math
from typing import List

import cv2
import numpy as np
import onnxruntime as ort
import matplotlib.pyplot as plt
from PIL import Image
from tqdm.auto import trange

from anomalytda_client import DetectionModel
from anomalytda_client.files import get_filenames

detection_model_filepath: str = "models/exported_model.detection"
image_folder: str = "data/myimages"

# Reading all images from the folder in RAM
test_images_set: List[Image.Image] = [Image.open(filename) for filename in get_filenames(image_folder)]
len(test_images_set)

# Initialise detection model
detection_model: DetectionModel = DetectionModel(
    anomaly_model_filepath=detection_model_filepath, batch_size=16
)

# Run detection model to predict the bounding boxes
outputs: List[np.ndarray] = detection_model.inference(
    images_set=test_images_set, 
    conf=0.1, 
    iou=0.45,
    image_size=(640, 640)
)

# Show the results
for i, result in enumerate(outputs):
    image: np.ndarray = np.array(test_images_set[i].convert("RGB"))
    image = image[:, :, ::-1].copy()
    print(f"Filename: {os.path.basename(test_images_set[i].filename)}")
    for box, score, class_ in result:
        print(f"Score: {score:.2f}, class: {class_} = {result.names[class_]}")
        x1, y1, x2, y2 = box[0], box[1], box[0] + box[2], box[1] + box[3]
        cv2.rectangle(image, (x1, y1), (x2, y2), (0, 0, 255), 2)
        cv2.putText(image, f"{result.names[class_]}: {score:.2f}", (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)

    # Display the images
    _, (ax1, ax2) = plt.subplots(1, 2, figsize=(6, 3))
    ax1.imshow(test_images_set[i])
    ax1.axis('off')
    ax2.imshow(cv2.cvtColor(image, cv2.COLOR_RGB2BGR))
    ax2.axis('off')
    plt.tight_layout()
    plt.show()

Metadata

Release files for anomalytda-client 0.2.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for anomalytda-client 0.2.1
File Size Uploaded
anomalytda_client-0.2.1.tar.gz 14.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for anomalytda-client 0.2.1
File Interpreter ABI Platform
anomalytda_client-0.2.1-py3-none-any.whl Python 3 none any Details

Total release size: 31.5 kB

Release files / anomalytda_client-0.2.1.tar.gz

Download URL anomalytda_client-0.2.1.tar.gz
Size 14.4 kB
Tags Source
SHA-256 checksum
How to use checksums
9e063c309979e305e551d5eac9e5bb66e267d21f904522f12da283124aa87e88
BLAKE2b-256 checksum
How to use checksums
a5a686843790fb02ec4bf902125233274013cec25c710ee6f0cf8268e1f27747
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.5.1 CPython/3.10.5 Linux/5.15.0-139-generic

Release files / anomalytda_client-0.2.1-py3-none-any.whl

Download URL anomalytda_client-0.2.1-py3-none-any.whl
Size 17.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
5b3da0e953dbdd8d415ab08c54a2c01c6775410f703785fe2294362245fb83d8
BLAKE2b-256 checksum
How to use checksums
180bb75169d5cace8a01cb283246461cd91924a560ae7d8943ab87aa78349c78
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.5.1 CPython/3.10.5 Linux/5.15.0-139-generic

Release history Release notifications | RSS feed

This release

0.2.1 This release

2 release files

0.2.0

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page