Vision Lab
Teach PneX your own objects — annotate pictures and videos, freeze a dataset, train a detector on the server and use it in flows
Media › Vision Lab builds a custom object detector. You name the classes ("red_valve", "safety_helmet"…), gather pictures, draw a box around every object, freeze a dataset version, then train a model on the PneX server. The trained model joins Automation › Models, ready for the Object detection node of flows.
Projects and classes
New project: a Name, a Description and the Classes (one per line). Classes can be renamed or added later; a class that still has boxes cannot be removed.
Add pictures
Every import is one source: all its pictures go either to training or to validation, never split between both, so near-identical pictures never inflate the scores.
- Add images: pick photos already in Media › Library.
- From a recording: one picture every N seconds of what a camera recorded (pick the Camera, the Day, From and To, and One picture every (s)). At most one hour and 200 pictures per import. Only device cameras with a Video recording flow have recordings.
- From a video: a video of the media library (MP4 or MOV in H.264, H.265 or MJPEG, 512 MB at most), a Start (s), an End (s) and one picture every N seconds, with the same limits. Phone videos work as recorded; other formats must be converted to MP4 (H.264) first. Every import of the same video belongs to one source.
Annotate
Select a picture, pick the Class of the next box (keys 1 to 9) and drag a box around each object. Click a box to select it; Delete removes it. No object in this image marks a negative example, which teaches the model what is not the object. Every change is saved at once. A box should hug the visible part of the object, including when it touches the image border.
Three helpers speed this up:
- Pre-annotate with a model: pick a detection model of Models and Suggest boxes. Proposals appear dashed. A proposal whose label is a class of the project takes that class; the Keep the matching proposals button keeps them all, a click keeps one (a grey proposal takes the current class), Dismiss drops the rest. Nothing is saved until you keep a box. Once a first custom model exists, use it here.
- Interpolate (pictures from a video or a recording): annotate a picture, skip a few, annotate a later one, then on a picture in between click Interpolate. PneX proposes the boxes moved in a straight line between the two annotated pictures, labelled "interpolated". Boxes are paired by class, nearest first. Keep them like model proposals and correct the ones that drifted.
- Propagate (pictures from a video or a recording, a model chosen): the model proposes the boxes of the picture, and each takes the class of the nearest box on the previous annotated picture of the same video. Useful when the model does not know your class names.
Two people editing the same picture at the same time: the second save is refused; reload the picture and redo the change.
Dataset statistics and versions
The Dataset panel counts boxes and images per class and the training / validation split, and warns when a class has fewer than 20 annotated images, when there are fewer than 5 validation images, when there is no negative example, when a class comes from fewer than 3 sources, always has the same size or the same place in the picture, or when all pictures have the same brightness. These are advice, never a blocker: twenty varied pictures beat a hundred identical ones.
Freeze a version copies the annotated pictures and their boxes into a numbered, read-only dataset version; later edits never change it. Download (COCO) exports a version as a zip (images plus COCO annotations for training and validation), ready to train elsewhere with any YOLOX tool.
Training
In the Training panel, pick a frozen Dataset version, a Starting model (a YOLOX model of Models, for example the YOLOX COCO model) and the number of Epochs (30 by default), then Train.
PneX keeps the starting network and relearns only its detection head for your classes. Training runs on the server, in Rust, without Python and without a GPU: a few minutes for a few hundred pictures. The run shows its progress (reading the pictures, each epoch with its loss, evaluation) and, once done, the Validation [email protected]: how well the model finds the objects of the validation pictures, 100 % meaning all found with no false alarm.
- The new model joins Models with your class names, already checked: Open in Models, then pick it in an Object detection node.
- One training per project at a time; Cancel stops it. A run stopped by a server restart has to be started again.
- No validation picture in the version means no mAP: give each class pictures from several imports.
- Objects very different from everyday ones are learned less well by relearning the head only: add varied pictures, more epochs, and compare the mAP of successive versions.
The improvement loop: "To review"
In an Object detection node, Doubtful frames to the Vision Lab picks a project. When the model hesitates (a score between Min score and Max score, 0.25 to 0.6 by default), the frame joins that project with the model's proposals, at most one per camera every 60 s by default (At most every (s)). In the Lab these pictures carry a purple dot, To review (the model hesitated); Only the pictures to review filters them. A picture leaves the queue once it has boxes or is marked without object. At most 500 pictures wait per project.
Annotate them, freeze a new version, train again, and switch the detection node to the new model.
From the Lab to flows
A trained model is used like any other detection model: Camera source → Object detection in a flow. Behind detection, the vision nodes Object tracking, Image zones, Image description, Video description and Text decision turn boxes into tracks, zone entries and exits, and descriptions: see Cameras & vision.
Roles
Owners, Admins and Members change projects, annotate and train. Viewers browse and export.

