Skip to main content

Exports

What is in the files AddaxAI writes. Most of this page covers the columns in the CSV and XLSX tables, which hold the same columns either way; XLSX just puts each table on its own sheet. The recognition file is described at the end.

One limit to know if your project is large: an Excel sheet holds at most 1,048,576 rows, so a table bigger than that cannot be saved as XLSX. AddaxAI tells you when this happens instead of writing a file Excel cannot open. Pick CSV for those projects, it has no row limit.

AddaxAI exports five tables. Which one you want depends on the question you are asking. A folder run has no sites, no deployments and no confirmed counts, so two of them are projects only.

TableOne row isUse it forAvailable in
Summaryone speciesa quick overview of what was found and how muchBoth
Countsone species in one eventecological analysis. Start hereProjects
Detectionsone box on one photomodel checking, bounding boxesBoth
Filesone photo or videoone label per file, file lists, finding blanksBoth
Deploymentsone camera periodeffort, trap nights, locationsProjects

What the tables contain

All five tables hold the same set of detections, and it is the same set the app shows you. Two rules decide it, and they work the same way in a project and in a folder run.

Anything below your counting threshold is left out, unless you verified it yourself. A detection you verified always stays in, whatever it scored, because your decision outranks the score.

For videos, only the frame AddaxAI saved is included. A video is analysed frame by frame, but only one frame is kept as a picture, so a box on any other frame has no image you could ever look at. Those boxes are left out of the tables rather than listed as animals you cannot find.

If you do want every box on every frame, use the recognition file described at the end of this page. That one is complete on purpose.

Summary

One row per species, plus one row each for people, vehicles and animals without a species. The first sheet of the workbook, so you see what was found before anything else. Each count column counts one of the other tables, so the numbers can always be traced back.

ColumnMeaning
detection_categoryanimal, person or vehicle
classification_labelThe species label as used by the model. Empty for people, vehicles and animals without a species. A box whose label is just animal counts as an animal without a species
taxon_class to taxon_variantTaxonomy, broad to specific
scientific_nameScientific name. Reads Person, Vehicle or Animal when there is no species
common_nameCommon name, with the same fallback
n_imagesPhotos with at least one box of this species
n_videosVideos with at least one box of this species
n_detectionsBoxes of this species, the rows in the Detections table
n_eventsEvents with at least one such photo or video
n_individualsTotal of the count column in the Counts table for this species: your confirmed numbers where you set them, otherwise the AI's highest number seen in a single photo per event

A row exists when the species has at least one box in the Detections table. A species you added by hand on the Counts page, without a box, has no row here. Boxes you marked as false are not counted either, although they stay in the Detections table as a record.

Counts

One row per species per event, with the count. Each row is one observation, so an animal is counted once per event instead of once per photo. If you split a species into groups on the Counts page (adult and juvenile, male and female), each group is its own row. This is the analysis-ready table.

ColumnMeaning
event_idIdentifier of the event
deployment_idWhich camera period it came from
event_startTime of the first photo in the event, camera local time
event_endTime of the last photo in the event
categoryanimal, person or vehicle
classification_labelThe species label as used by the model
taxon_classClass, for example mammalia
taxon_orderOrder, for example carnivora
taxon_familyFamily, for example canidae
taxon_genusGenus, for example vulpes
taxon_speciesSpecies
taxon_variantOne level below species, when the model predicts it, for example adult or juvenile. Empty for most models
scientific_nameScientific name for display
common_nameCommon name for display
countNumber of individuals. Your confirmed number if you set one, otherwise the AI's highest number seen in a single photo
sexfemale or male, if you set it. Empty means unknown
life_stageadult, subadult or juvenile, if you set it
behaviorWhat the animals were doing, if you set it, for example foraging
event_notesYour note on the event, repeated on each of its rows
is_confirmedTRUE if you signed off the count for this event

Detections

One row per box. Use it when you care about individual boxes. Blank files do not appear here.

ColumnMeaning
detection_idIdentifier of the box
file_idWhich file it is on
relative_pathPath inside the deployment folder, so you can find the photo without joining to the Files table
deployment_idWhich camera period
event_idWhich event, empty if not grouped
detection_categoryanimal, person or vehicle
detection_confidenceHow sure the detector was there is something there
classification_labelThe current species label. May be your correction
classification_confidenceScore for the current label. Always 1.0 when a human set it
ai_classification_labelThe label the app showed before you touched it, kept even after you relabel
ai_classification_confidenceScore for that label
classification_methodmachine or human, who set the current label
is_verifiedTRUE if you verified this detection
taxon_class to taxon_variantTaxonomy, broad to specific. taxon_variant sits below species (adult, juvenile) and is empty for most models
scientific_nameScientific name
common_nameCommon name
frame_numberFrame index for videos, empty for photos
bbox_x, bbox_yTop left corner of the box, 0 to 1
bbox_width, bbox_heightSize of the box, 0 to 1

Box positions are fractions of the image, not pixels. Multiply by the image width and height to get pixels.

To see where the AI was wrong, compare ai_classification_label with classification_label on rows where is_verified is TRUE.

One thing to know before you read too much into that. ai_classification_label is the label after cleanup, the one the app put in front of you, not the model's raw output. That raw call stays in the results.json on disk. So the comparison scores the whole pipeline, model plus rollup plus smoothing. See how labels get cleaned up.

Files

One row per photo or video, whether or not anything was found.

ColumnMeaning
file_idIdentifier of the file
deployment_idWhich camera period
event_idWhich event, empty if not grouped
file_typeimage or video
relative_pathPath inside the deployment folder
absolute_pathFull path on the machine that ran the analysis
datetimeCapture time, camera local time. Empty if the file had no readable date
camera_makeCamera manufacturer, from the image's own EXIF (Make), read once during analysis
camera_modelCamera model, from EXIF Model, read once during analysis
ambient_temperatureTemperature at capture, from EXIF AmbientTemperature, read once during analysis. The standard says degrees Celsius, but camera trap thermometers are rough, so treat it as indicative
camera_serialThe camera's serial number, from EXIF BodySerialNumber, read once during analysis. Useful to confirm which physical camera took the file
observation_typeWhat the file holds, taken from its strongest box: the one you verified yourself, or else the one the detector scored highest. For a video, only boxes on the one frame AddaxAI saved count. The value is whatever the detector called it, so animal, person or vehicle for MegaDetector, or blank when no box passed
detection_confidenceHow sure the detector was there is something there, for that same box. A verified box counts whatever its score, so this can sit below your counting threshold
classification_labelThe species of that same strongest box, not the most confident species on the file. Empty for a person, a vehicle, or an animal that was never classified
classification_confidenceScore for that species. Always 1.0 when a human set the label. Empty when there is no species
taxon_class to taxon_variantTaxonomy of that species, broad to specific. taxon_variant sits below species and is empty for most models. Only a species label fills the five ranks above it, so check these before you group by classification_label
scientific_nameScientific name of that same box
common_nameCommon name of that same box. Never empty on a file that holds something: it reads Person, Vehicle or Animal when there is no species
is_verifiedTRUE if you verified this file: every box on it was verified, or, for a file with nothing on it, you verified that it is empty
is_favoritedTRUE if you marked the file as a favourite on the Labels page
is_flaggedTRUE if you flagged the file for review on the Labels page
notesYour own notes

observation_type is the only place "blank" appears. Use it to count empty files.

Deployments

One row per camera period. This is your effort table.

ColumnMeaning
deployment_idIdentifier of the camera period
site_nameName of the location
latitude, longitudeLocation in decimal degrees
site_elevation_mElevation in metres, if you entered it
site_habitatHabitat type, if you entered it
site_notesYour notes on the site
site_tagsYour tags on the site
deployment_startFirst day of the period
deployment_endLast day, empty if the camera is still out
trap_nightsHow long the camera was out: the days from its first file to its last, counting both ends. Not the number of days that produced photos. See how trap nights are counted
deployment_notesYour notes on this deployment
deployment_tagsYour tags on this deployment

Folder runs

In the three tables a folder run writes, deployment_id is dropped because there is no deployment, and notes because nothing ever fills it. The Summary keeps n_images, n_videos and n_detections and drops n_events and n_individuals: those are ecological interpretation, and a folder run has no Counts table to back them.

event_id stays. Files and detections from the same burst share one, so you can still group by visit. What you cannot do is look the event up, because the counts table is projects only. In a project that column points at a row in counts; in a folder run it is only a grouping key.

Recognition file (JSON)

A folder run also writes addaxai-recognitions.json. This is the file Timelapse reads.

It follows the MegaDetector output format, version 1.6, which is documented here. Four things are worth knowing on top of that spec:

  1. The info block carries an extra addaxai section with the app version and the settings the run used, such as smoothing, rollup and the independence interval. So the file records how it was produced.
  2. Each detection keeps only the top classification, not the full list the format allows.
  3. Nothing is filtered by a threshold. Every detection AddaxAI stored is in the file.
  4. File paths are relative to the folder the JSON sits in.
  5. The exif_metadata block per image is the file's raw EXIF, copied verbatim. A date correction made with Adjust dates does not change it: the corrected timestamps are in the datetime column of the files table, while this block stays in sync with what the image files themselves say, which is also what Timelapse reads from them.

Spatial

Projects can also export point layers for GIS tools such as QGIS and ArcGIS, as GeoJSON, Shapefile or GeoPackage. You get two layers: one point per camera, and one point per camera per species. Deployments with no site coordinates are left out.

Camtrap DP

Projects can also export Camtrap DP, a standard format for camera trap data. It uses its own column names and a fixed structure, so other tools and archives can read your data without knowing anything about AddaxAI. Use it when you share data or deposit it in a repository.

For models that predict below species level (adult or juvenile fox, for example), scientificName always carries the real species name. The variant goes into lifeStage (adult, subadult, juvenile) or sex (female, male) when it fits those fields, and into observationComments otherwise.

What you set on the Counts page goes into the same fields: sex, lifeStage and behavior per row, and your note on the event into observationComments of each of its rows. Unknown stays empty. A favourite file gets favorite set to true in the media table.