Skip to main content

CamTrapML is a Python library for Detecting, Classifying, and Analysing Wildlife Camera Trap Imagery.

Project description

CamTrapML

CamTrapML is a Python library for Detecting, Classifying, and Analysing Wildlife Camera Trap Imagery.

Installation

$ pip install camtrapml

Features

Loading Data

Search for images in a directory, load an image and create a thumbnail.

%load_ext autoreload
%autoreload
from camtrapml.dataset import ImageDataset
from camtrapml.image.utils import load_image, thumbnail

ena24 = ImageDataset(
    name="ena24",
    path="/pool0/datasets/ena24/ena24",
)

ena24_image_paths = list(ena24.enumerate_images())

thumbnail(load_image(ena24_image_paths[0]))

EXIF Extraction

EXIF extraction is a common task in gathering the metadata such as each image's timestamp, camera model, focal length, etc. Some researchers write labelling into the EXIF data. CamTrapML doesn't assist with writing to EXIF. However, there is functionality for extracting it for analysis and building datasets for training new models from previously labelled images.

ExifTool is required for this package to work. Installation instructions can be found here.

Three methods are available for extracting EXIF data from images. Each with different performance characteristics.

Method 1: Individual Images

from camtrapml.image.exif import extract_exif

exif = extract_exif(ena24_image_paths[0])
exif

Method 2: Multiple Images

extract_multiple_exif passes a list of image paths to ExifTool and returns a list of dictionaries containing the EXIF data. This is faster than extract_exif when multiple images are being processed as it only passes the list of image paths to ExifTool once, rather than spawning a new process for each image.

from camtrapml.image.exif import extract_multiple_exif

exif = extract_multiple_exif(ena24_image_paths)
exif[0]

Method 3: Multiple Images, Multiple Processes

When processing large datasets, it's apparent that the bottleneck in extracting the EXIF information tends to be the CPU. This method spawns multiple versions of ExifTool in parallel, each with a batch of image paths. This is faster than extract_multiple_exif when processing large datasets as it allows for multiple processes to be spawned and the data extracted in parallel.

from camtrapml.image.exif import extract_multiple_exif_fast

exif = extract_multiple_exif_fast(ena24_image_paths)
exif[0]

Detection

Various Detection models are available in the camtrapml.detection subpackage. These currently include MegaDetector (v4.1, v3 and v2) and support for loading in custom Tensorflow v1.x Object Detection Frozen models.

Detection with MegaDetector v4.1

from camtrapml.detection.models.megadetector import MegaDetectorV4_1
from camtrapml.detection.utils import render_detections

with MegaDetectorV4_1() as detector:
    detections = detector.detect(ena24_image_paths[0])

thumbnail(
    render_detections(ena24_image_paths[0], detections, class_map=detector.class_map)
)

Detection with a custom Tensorflow v1.x Object Detection Frozen model

from camtrapml.detection.models.tensorflow import TF1ODAPIFrozenModel
from camtrapml.detection.utils import render_detections
from pathlib import Path

with TF1ODAPIFrozenModel(
    model_path=Path("~/Downloads/my-custom-model.pb").expanduser(),
    model_image_tensor_name="image_tensor:0",
    model_boxes_tensor_name="detection_boxes:0",
    model_scores_tensor_name="detection_scores:0",
    model_classes_tensor_name="detection_classes:0",
    class_map={
        1: "animal",
    },
) as detector:
    detections = detector.detect(ena24_image_paths[1])

thumbnail(
    render_detections(ena24_image_paths[1], detections, class_map=detector.class_map)
)

Extract Detections

from camtrapml.detection.models.megadetector import MegaDetectorV4_1
from camtrapml.detection.utils import extract_detections_from_image

with MegaDetectorV4_1() as detector:
    detections = detector.detect(ena24_image_paths[0])

list(extract_detections_from_image(load_image(ena24_image_paths[0]), detections))[0]

Remove Humans from Images

In order to reduce the risks of identification of humans in line with GDPR, CamTrapML provides the ability to remove humans from images. This is achieved by using the MegaDetector v3+ models to detect humans in the image, and then replacing all pixels in each human detection.

from camtrapml.detection.models.megadetector import MegaDetectorV4_1
from camtrapml.detection.utils import remove_detections_from_image
from camtrapml.image.utils import load_image, thumbnail
from pathlib import Path

ct_image_with_humans = Path("/pool0/datasets/bens-day-at-zsl/IMG_0576.JPG").expanduser()

with MegaDetectorV4_1() as detector:
    detections = detector.detect(ct_image_with_humans)

human_class_id = 2

thumbnail(
    remove_detections_from_image(
        load_image(ct_image_with_humans),
        [
            detection
            for detection in detections
            if detection["category"] == human_class_id and detection["conf"] > 0.5
        ],
    )
)

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

camtrapml-0.2.1.tar.gz (11.5 kB view details)

Uploaded Source

Built Distribution

camtrapml-0.2.1-py3-none-any.whl (12.3 kB view details)

Uploaded Python 3

File details

Details for the file camtrapml-0.2.1.tar.gz.

File metadata

  • Download URL: camtrapml-0.2.1.tar.gz
  • Upload date:
  • Size: 11.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.1.13 CPython/3.9.7 Linux/5.13.0-39-generic

File hashes

Hashes for camtrapml-0.2.1.tar.gz
Algorithm Hash digest
SHA256 e9d3bf7dfc5dad84cba825f5d0a62bbfdfe3da108995f38996d8bbc72da81534
MD5 e49f55a5bf070f31a3a1d9860d4d3b5c
BLAKE2b-256 cfc4f8735e8222a38b1d5e0177564e2bb21434ab6929441f637a6a0f34cb3c50

See more details on using hashes here.

File details

Details for the file camtrapml-0.2.1-py3-none-any.whl.

File metadata

  • Download URL: camtrapml-0.2.1-py3-none-any.whl
  • Upload date:
  • Size: 12.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.1.13 CPython/3.9.7 Linux/5.13.0-39-generic

File hashes

Hashes for camtrapml-0.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 31bb8e0ca62c8d556726224771874f2a8990e4795028f577b77f53883e798b70
MD5 9e11c2ddd0846f76800f52de6c6d4af4
BLAKE2b-256 9b885955441903b5651451cd54a6a250ccf61980a7b2eb13e99c87d9c45ad069

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page