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.
| Table | One row is | Use it for | Available in |
|---|---|---|---|
| Summary | one species | a quick overview of what was found and how much | Both |
| Counts | one species in one event | ecological analysis. Start here | Projects |
| Detections | one box on one photo | model checking, bounding boxes | Both |
| Files | one photo or video | one label per file, file lists, finding blanks | Both |
| Deployments | one camera period | effort, trap nights, locations | Projects |
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.
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.
Detections
One row per box. Use it when you care about individual boxes. Blank files do not appear here.
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.
| Column | Meaning |
|---|---|
file_id | Identifier of the file |
deployment_id | Which camera period |
event_id | Which event, empty if not grouped |
file_type | image or video |
relative_path | Path inside the deployment folder |
absolute_path | Full path on the machine that ran the analysis |
datetime | Capture time, camera local time. Empty if the file had no readable date |
camera_make | Camera manufacturer, from the image's own EXIF (Make), read once during analysis |
camera_model | Camera model, from EXIF Model, read once during analysis |
ambient_temperature | Temperature 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_serial | The camera's serial number, from EXIF BodySerialNumber, read once during analysis. Useful to confirm which physical camera took the file |
observation_type | What 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_confidence | How 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_label | The 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_confidence | Score for that species. Always 1.0 when a human set the label. Empty when there is no species |
taxon_class to taxon_variant | Taxonomy 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_name | Scientific name of that same box |
common_name | Common 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_verified | TRUE 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_favorited | TRUE if you marked the file as a favourite on the Labels page |
is_flagged | TRUE if you flagged the file for review on the Labels page |
notes | Your 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.
| Column | Meaning |
|---|---|
deployment_id | Identifier of the camera period |
site_name | Name of the location |
latitude, longitude | Location in decimal degrees |
site_elevation_m | Elevation in metres, if you entered it |
site_habitat | Habitat type, if you entered it |
site_notes | Your notes on the site |
site_tags | Your tags on the site |
deployment_start | First day of the period |
deployment_end | Last day, empty if the camera is still out |
trap_nights | How 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_notes | Your notes on this deployment |
deployment_tags | Your 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:
- The
infoblock carries an extraaddaxaisection 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. - Each detection keeps only the top classification, not the full list the format allows.
- Nothing is filtered by a threshold. Every detection AddaxAI stored is in the file.
- File paths are relative to the folder the JSON sits in.
- The
exif_metadatablock 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 thedatetimecolumn 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.