Grouped Electronic Real-time Imaging Environment
An 8-camera distributed Raspberry Pi system for high-throughput specimen digitisation, developed at the Natural History Museum London.
GERTIE captures synchronised 12.3 MP images from 8 networked cameras simultaneously, providing real-time video preview and centralised control through a Qt GUI. Built as a 3,000 GBP open-source alternative to 30,000 GBP commercial imaging systems.
New to GERTIE? Start here:
- INSTALL.md β Complete deployment guide (USB setup, control1 configuration, node deployment)
- Project Structure β How the codebase is organised
- Keyboard shortcuts β Control the GUI
For development:
- See Project Structure below
- Check CHANGELOG.md for recent changes
- Review GitHub Issues for known issues
License: MIT (see LICENSE)
- Quick Start
- System Architecture
- Features
- Tech Stack
- Performance
- Deployment
- Network Requirements
- Project Status
- Keyboard Shortcuts
- Project Structure
- Background
- Contributing
- License
+------------------+
| control1 |
| (Qt GUI host) |
| + rep8 (local) |
+--------+---------+
|
Gigabit PoE Switch
|
+------+------+------+------+------+------+
| | | | | | |
rep1 rep2 rep3 rep4 rep5 rep6 rep7
IMX477 IMX477 IMX477 IMX477 IMX477 IMX477 IMX477
Each remote node (rep1-rep7) runs a Python camera service communicating with control1 over TCP. Rep8 is a local camera on the control node. The entire cluster operates air-gapped with no internet connectivity.
- Real-time 8-stream video at 16+ FPS in grid view, 30 FPS in exclusive single-camera view
- Synchronised capture across all cameras with sub-second latency
- Per-camera controls: exposure, white balance, saturation, crop, with AE/WB lock indicators
- Guard-Then-Act safety: 2-click confirmation for destructive operations (AE/WB clear)
- Gallery with automatic refresh after batch capture
- Context-sensitive shortcuts bar adapting to grid vs exclusive mode
- Per-tile overflow menus for camera restart/reboot
- DNG raw capture support
- Automated file naming: device ID + timestamp + structured folder hierarchy
- Museum workflow compatible: BardecodeFiler and EMu ingestion support
| Component | Technology |
|---|---|
| GUI | Python, Qt/PySide6 |
| Networking | Custom TCP controller/node protocol |
| Camera API | libcamera / PiCamera2 |
| Sensors | IMX477 (HQ Camera), IMX296 (Global Shutter) |
| Services | systemd units with auto-restart |
| Hardware | Raspberry Pi 4/5, Gigabit PoE |
| Deployment | rsync + Bash verification scripts |
| CAD | Autodesk Fusion 360, FDM 3D printing |
- System overhead reduced from 40% to under 10% through async streaming optimisation
- 8 concurrent camera streams at 16+ FPS (grid), 30 FPS (exclusive)
- 12.3 MP capture (4056x3040) per camera, full sensor utilisation
- Camera footprint reduced to 15 cm through custom 3D-printed mounts
- User testing: 5 testers, 255 specimens, 3,418 files, 22.51 GB
GERTIE operates air-gapped. Deployment follows a USB transfer pipeline:
MacBook (development) --> USB drive --> control1 (production)
--> sync_to_nodes.sh --> rep1-rep7
Pre-deployment verification: bash verify.sh (5 automated checks).
IMPORTANT: GERTIE uses UDP-based messaging for video streaming and commands. This design is suitable for local network (LAN) deployment only.
- β Museum/lab networks (controlled environment)
- β Single subnet, <100m distance
- β Dedicated Ethernet (not shared with heavy traffic)
- β Packet loss <1%
- β Wide Area Network (WAN) or internet-facing
- β Wireless networks (unless <50m line-of-sight)
- β Congested shared networks
- β Cloud-hosted controllers
Minimum: 100 Mbps Ethernet switch, latency <50ms, CAT5e+ cabling
Recommended: 1 Gbps switch, latency <10ms, CAT6+ cabling
For complete messaging protocol details, see MESSAGING_PROTOCOL.md.
- Phase A: 10/10 complete (v2 feature ports)
- Phase B: 5/7 complete (interaction refinements)
- Under consideration for national deployment across partner institutions
| Key | Action |
|---|---|
| Space / C | Capture All |
| 1-8 | Toggle exclusive view |
| Esc | Grid view (all cameras) |
| R | Restart camera |
| S | Settings |
| G | Gallery |
| D | DNG toggle |
| F | Focus mode |
| Q | Quit |
GERTIE_Qt/
βββ src/ # Qt GUI application (PySide6)
βββ node/ # Remote camera node code (synced to rep1-rep7)
βββ shared/ # Shared configuration and utilities
βββ local_camera_node.py # Local rep8 camera handler (systemd service)
βββ tools/ # Utilities (deployment, testing, etc.)
βββ docs/ # Architecture and reference documentation
βββ INSTALL.md # Complete deployment guide
GERTIE was built from scratch by a single developer with no prior programming background, progressing from zero Python experience to a deployed distributed system in 18 months. The project encompasses hardware design (Fusion 360 + 3D printing), software development (Python/Qt), network protocol design (TCP), service management (systemd), and deployment automation (Bash/rsync).
Contributions welcome. Please:
- Review the Project Structure to understand the codebase
- Check GitHub Issues for known issues
- Read CONTRIBUTING.md for development guidelines
- Submit a pull request with clear commit messages
For questions about deployment or architecture, start with INSTALL.md or open an issue.
MIT License β See LICENSE for full text.
Copyright (c) 2024-2026 Natural History Museum London
GERTIE is provided as-is for research, educational, and commercial use. Please cite this work if you use it:
Crane, A. (2026). GERTIE: Multi-camera specimen digitisation system.
Natural History Museum London. Available at:
https://github.com/andrc2/GERTIE-Qt