%%{init: {'themeVariables': {'lineColor': '#00a68a', 'primaryBorderColor': '#00a68a'}}}%%
flowchart LR
A([Deploy camera\nEpicollect5]) --> B([Retrieve camera\nEpicollect5])
B --> C([Copy images\nto laptop])
C --> D([Run AddaxAI\nDeepFaune v1.4])
D --> E([Delete human\nimages])
E --> F([Upload to\nOneDrive])
F --> G([Verify in\nShiny app])
G --> H([Create detection\histories])
H --> I([Upload outputs\nto OneDrive])
Camera Trap Pipeline
This page is intended as a sort of checklist/step-by-step guide to the camera trapping workflow: from deploying cameras in the field through to detection histories ready for occupancy modelling.
This page covers the full pipeline for the camera trap monitoring project. It is written for students who will be deploying cameras, processing images, or analysing the resulting data. The 45 sites (Site_001 to Site_045) sit across north-east Scotland and are revisited each season during the summer, with each camera deployed for 14-day in each site.
The pipeline runs in three phases: field data collection, image processing, and data processing. Each is described below.
Pipeline Overview
Pre-fieldwork Checklist
Download and complete the checklist before every deployment trip. Fieldwork cannot proceed without my (Deon) signature on the risk assessment and my acceptance of the calendar invite.
pre_fieldwork_checklist.docxPhase 1: Field Data Collection
Epicollect5
All deployment and retrieval data is recorded in the Epicollect5 project North East Scotland Camera Trapping. Install the Epicollect5 app on your phone and confirm you have access to the project before heading out.
There are two forms:
- Camera Trap Deployment: filled in when you put a camera up
- Retrieval: a child form filled in when you collect the camera, linked back to its deployment record
Deployment form
| Field | What to record |
|---|---|
| GPS location | Recorded automatically: let it get a good fix before saving |
| Site ID | Select from the dropdown (Site_001 to Site_045, or Deon_House) |
| Name | Your name |
| Date of deployment | Today’s date |
| Camera set up | Confirm the camera settings match the standard protocol: Trigger (passive infrared), 8MP, 30s delay, 4 images per trigger, Normal speed, date/time set |
| Camera type | Select from the dropdown (Browning BTC-8A or other model as labelled on the camera) |
| Camera ID | The ID label on the camera body |
| SD card size | Select 8 GB, 16 GB, or 128 GB to match the card installed |
| Dominant habitat | Best match from the 10 habitat categories |
| Field of view | 1-5 scale: 1 = heavily obstructed, 5 = clear and unobstructed |
| Deployment issues | Any problems, e.g. difficult placement, camera wouldn’t trigger |
| Photo of camera location | Take a photo showing the camera position in context |
Set Site ID, Date, and Name correctly. Epicollect5 builds the entry title from these three fields. If they are missing or wrong the record is nearly impossible to identify later without opening the full entry.
Field of view scoring: Stand at approximately the point where an animal would cross through the camera’s frame. Score 5 means a clear, unobstructed view to at least 5 m. Score 1 means branches, tall grass, or other material obscures more than half the frame.
Retrieval form
The retrieval form is opened from within the existing deployment entry. Find the deployment in Epicollect5, open it, and add a child entry. This links the retrieval record to the correct deployment automatically.
| Field | What to record |
|---|---|
| Date | Today’s date |
| Camera status | Functioning / Faulty / Missing |
| Deployment issues | None / Minor (data useable) / Major (data compromised): your assessment of data quality for the deployment |
| Retrieval issues | Any problems, e.g. battery failure, vandalism, camera moved |
| SD card removed? | Confirm Yes before leaving the site |
Site locations
All 45 sites are shown on the map below. Click a marker to see the site ID and coordinates. A shared Google My Maps is also available for use in the field.
Phase 2: Image Processing
Folder structure
Before copying any images, create the correct folder structure on your local machine. All images for a season go into:
Year/
└── Site_ID/
└── [images]
For example:
2025/
├── Site_001/
├── Site_002/
└── Site_003/
Make sure the site folder exists transferring from the SD card.
Copying images from the SD card
- Insert the SD card from the retrieved camera.
- Copy all images into the correct
Year/Site_ID/folder on your laptop. - Spot-check that files transferred correctly, open a few at random and confirm they are not corrupted.
- Leave the images on the SD card. Delete them only once the full pipeline is complete and the images have been confirmed on OneDrive.
Running AddaxAI with DeepFaune v1.4
AddaxAI is a local desktop application that runs species detection and classification on camera trap images. The project uses the DeepFaune v1.4 model, which is trained on European mammals and birds. Download AddaxAI
Open AddaxAI.
Set the input folder to
Year/Site_ID/.Select the DeepFaune v1.4 model.
In the species filter, enable only the following 18 categories and deselect everything else:
badgerbeaverbirdcatcowdogfallow deerfoxhedgehoglagomorphmicromammalmustelidotterred deerroe deersheepsquirrelwild boarRun the classifier.
When it finishes, AddaxAI writes an Excel file into the folder. This file lists each image, its predicted species label, and the associated confidence score. Keep this file: it is uploaded to OneDrive alongside the images and is read by the Shiny app.
AddaxAI runs entirely on your local machine. No images are sent to a server or any external service.
Handling human images
AddaxAI flags images containing people as Human. Before uploading anything:
- Open the AddaxAI Excel output and filter to rows where the prediction is
Human. - Delete those image files from your local machine.
- Do not upload human images to OneDrive or any shared storage.
The Shiny app in Phase 3 also has a built-in confirmation modal for deleting any human images that were missed at this stage.
Phase 3: Verification and Analysis
Uploading to OneDrive
Once human images have been removed, upload the remaining images and the AddaxAI Excel file to OneDrive. The OneDrive folder structure mirrors your local structure:
Year/
└── Site_ID/
├── [species images]
└── addaxai_output.xlsx
Do not run any analysis scripts until the images are on OneDrive and you have verified them in the Shiny app.
Species verification: the Shiny app
The Shiny app (classify_app.R) provides an interface for reviewing AddaxAI’s predictions, correcting misclassifications, and exporting a clean classifications CSV for use in camtrapR.
How to use it
- Open RStudio and run
classify_app.R. - Click Browse to select the image folder (
Year/Site_ID/), then Browse again to select the AddaxAIresults.xlsx. Click Load. - The app works label by label. Each AddaxAI label (e.g. “roe deer”, “bird”) is processed in sequence, with person detections handled first.
- For each image, the species dropdown is pre-set to AddaxAI’s suggestion. Confirm it, or select a different species, then click Confirm.
- Select Nothing present if the detection was a false positive. This skips the image without writing anything to the output.
- If the image contains a person, the delete button turns red. Click it to permanently remove the image from disk (GDPR compliance).
- Once all images for a label are reviewed, click Next label to continue.
- Repeat from step 2 for each site folder by clicking Change folder.
Progress is saved to classifications.csv in the image folder after every confirmation. Reloading the same folder resumes where you left off.
Species list
The app uses a fixed species list. You can only assign one of these labels to each image.
Several labels mirror DeepFaune’s resolution rather than species-level identification: Mustelid covers stoat, weasel, pine marten, and mink; Lagomorph covers rabbit and brown hare; Bird covers all bird species. These can be refined in a later pass by cross-referencing the classifications CSV with the original images on OneDrive.
| Deer | Wild mammals | Domestic / other |
|---|---|---|
| Fallow deer | Badger | Bird |
| Red deer | Beaver | Cat |
| Roe deer | Fox | Cow |
| Hedgehog | Dog | |
| Lagomorph | Other mammal | |
| Micromammal | Sheep | |
| Mustelid | Vehicle | |
| Otter | Unknown | |
| Squirrel | ||
| Wild boar |
Human images are never written to the classifications CSV. They are removed from disk via the deletion modal. This is intentional as the project does not retain any record of human presence in its data files.
Download
classify_app.RFrom classifications to detection histories
The classifier app produces classifications.csv; one row per image, with station, filename, datetime, species, count, and burst ID. The next task is to turn this into a detection history: the site-by-occasion matrix that occupancy models require.
What you are aiming for
A detection history for a single focal species looks something like this, with each row a station and each column a sampling occasion (typically one day):
| Station | Day 1 | Day 2 | Day 3 | ··· | Day 14 |
|---|---|---|---|---|---|
| Site_001 | 0 | 1 | 0 | ··· | 0 |
| Site_002 | NA | 0 | 0 | ··· | 1 |
| Site_003 | 0 | 0 | 0 | ··· | 0 |
1 means the species was detected on that day. 0 means the camera was operating but the species was not detected. NA means the camera was not operating, so that occasion contributes no information to the model.
What you need
To build the detection history you need three things:
classifications.csvfrom the classifier app- The deployment CSV exported from Epicollect5
- The retrieval CSV exported from Epicollect5
Export both CSVs from the Epicollect5 website. The columns you will use to link deployment dates to detection records are:
| CSV | Column | Contents |
|---|---|---|
| Deployment | ec5_uuid |
Unique ID for the deployment |
| Deployment | 2_Site_ID |
Site label (e.g. Site_001) |
| Deployment | 4_Date_of_deployment |
Start date |
| Deployment | lat_1_Location |
Latitude |
| Deployment | long_1_Location |
Longitude |
| Retrieval | ec5_parent_uuid |
Links back to the deployment |
| Retrieval | 13_Date |
Retrieval date |
| Retrieval | 14_Camera_status |
Camera condition at collection |
| Retrieval | 16_Retrieval_issues |
Free-text retrieval notes |
Building it in R
The camtrapR package is designed for this. The two key functions are cameraOperation(), which builds an effort matrix from deployment and retrieval dates, and detectionHistory(), which maps detection records onto that matrix to produce the site-by-occasion output. Package documentation and worked vignettes are at cran.r-project.org/package=camtrapR.
Uploading final outputs to OneDrive
Once detection histories are generated, save outputs to a Detection_histories/ subfolder under the year:
Year/
├── Site_001/
│ └── ...
├── Site_002/
│ └── ...
└── Detection_histories/
├── classifications.csv
├── record_table.csv
├── <Species>_detection_history.csv
└── <Species>_effort.csv
Quick-reference checklist
Full pipeline checklist
Field
- Complete risk assessment (HS014) and send calendar invite (HS022) before departure
- Record deployment in Epicollect5 (Camera Trap Deployment form)
- Record retrieval in Epicollect5 (Retrieval child form, linked to the deployment)
Processing
- Copy images to
Year/Site_ID/on laptop - Run AddaxAI with DeepFaune v1.4
- Delete human images from local machine
- Upload images and AddaxAI Excel to OneDrive
- Delete images from SD card only after pipeline is complete and images are confirmed on OneDrive
Analysis
- Run Shiny app: verify predictions, export classifications CSV
- Export Epicollect5 deployment and retrieval CSVs
- Build detection histories using camtrapR
- Upload classifications CSV and detection histories to OneDrive