Back to Case Studies

Basic labeling pipeline: a label-and-review loop for your team

How a team labels and reviews images in the base OvalBee labeling loop. A universal starting point you can customize for any project.

Related templates

Basic labeling pipeline: a label-and-review loop for your team

Labeling with a team gets messy fast: images get lost between people, reviews pile up, and fixes slip through.

The Basic labeling pipeline template in OvalBee keeps it in order. Images go through a labeling and review loop until accepted, and the graph shows where each one is right now. Use it as the starting point for your next labeling project.

It takes a minute to set up and can be customized for your needs (add pre-labeling, quality checks or other stages). In this post we run it on a real task: two labelers and one reviewer label photos of power line insulators with three classes: insulator, pollution-flashover and broken.

Here is the live graph from this run. It’s read-only: open any node to see its settings and where each image is right now.

The live graph from this post. Open it in OvalBee ↗

How images move through the pipeline

Before the details, here is a high-level scheme of how the graph works. It’s simplified on purpose: it skips settings and some nodes and shows only the main idea. The scheme is a short animation in two parts:

  1. One image. The animation follows a single image. It goes from the labeling pool to a labeler, then to review. The reviewer rejects it, so it goes back to the pool. Another labeler fixes it, and this time the reviewer accepts it.
  2. The whole team. Then it shows everyone at work. Two labelers label at the same time, each from a personal queue, and the queues refill from the pool.
submittedacceptedrejectedLabeling pool42414039Labeling2 labelers1221Review1 reviewer12Accepted293031submittedacceptedrejectedLabeling pool41Labeling2 labelers12Review1 reviewer1Accepted30
  1. Labeling pool Images wait here until a labeler takes them.
  2. Labeling A labeler takes an image and annotates it.
  3. Review The reviewer accepts or rejects each image.
  4. Rework Rejected images go back to be fixed.
  5. Results Accepted images land in the final dataset.

All the work happens in two nodes, Labeling and Review: this is where people label and check images. The rest are datasets, one per stage, plus Return to labeling, which moves rejected images back for rework. Every image sits in exactly one dataset at a time, so you can open any stage and see which images are skipped, rejected or accepted right now. The full list of nodes is in the node reference at the end of the post. For the full picture of labeling in OvalBee, see Labeling in the docs.

Set up the template

✨ Ready in a minute: there is nothing to prepare in advance. The setup wizard is your assistant: it walks you through every step and builds the rest for you.

When you open the template, the wizard asks three questions: what you will label, who does the work and where the images are. You pick the classes, choose labelers and reviewers from your workspace, select a dataset or start with an empty one, and press Start.

The setup wizard: classes, people, images, Start.

Nothing is created before Start, so you can stop at any step and come back later. After Start, OvalBee creates the datasets and starts the pipeline. No further configuration is needed.

Add your images

Our images were not in OvalBee yet, so we added an Import drag & drop node in front of the labeling pool and dropped 50 photos onto it. They landed in the Labeling pool and reached the labelers’ queues right away, without running anything.

Add the Import drag & drop node, upload the images, and the Labeling pool fills up.

The photos come from the public Insulator-Defect Detection dataset on Dataset Ninja. The same way, you can import a public dataset from Dataset Ninja or copy images from Supervisely.

Dataset: Insulator-Defect Detection on Dataset Ninja, CC BY 4.0.

Paper: Zheng J., Wu H., Zhang H., Wang Z., Xu W. Insulator-Defect Detection Algorithm Based on Improved YOLOv7. Sensors, 22(22), 8801, 2022.

Start labeling

Each labeler clicks Open annotation tool on the Labeling card and gets a personal queue of images taken from the shared pool. When they finish an image, a new one takes its place, so nobody has to pick work by hand and two people never label the same image.

Two labelers work in parallel, each on a personal queue of images from the shared pool.

Two labelers work in parallel, each on a personal queue of images from the shared pool.

Two annotation tools open at the same time, each with its own queue of ten different images, next to the Labeling card listing both labelers

Any number of people can work in parallel, each with their own queue. In our run, two labelers took work from the same pool at the same time. An image left in a queue for too long goes back to the pool with its saved annotations, and so do the images of a labeler you remove from the node.

Buttons route images

Labeling and Review share one simple idea. Their settings have a Decision buttons field: a list of pairs, each a button name and a dataset.

💡 Key idea: every pair becomes a button in the annotation tool. Press it, and the image moves to that dataset with its annotations, at once.

Each pair in Decision buttons becomes a button in the annotation tool.

Each pair in Decision buttons becomes a button in the annotation tool.

The Decision buttons setting of the Labeling node with the Submit and Skip pairs, over the annotation tool with the matching Submit and Skip buttons

In this template, Labeling has Submit for the Review pool and Skip for Skipped. Review has Accept for Accepted and Reject for Rejected. Need another decision, such as sending hard cases to an expert? Add a pair, and the tool shows the new button. The statistics page counts it too: every button becomes its own outcome there, as shown in Detailed statistics.

Review and rework

The reviewer opens the tool from the Review card and gets a personal queue from the Review pool. They check each image and press Accept or Reject. Reviewers judge the work and labelers fix it, so the roles stay clear.

The reviewer accepts or rejects each image. Rejected images go back to the Labeling pool through Return to labeling, by hand or on a schedule.

The reviewer accepts or rejects each image. Rejected images go back to the Labeling pool through Return to labeling, by hand or on a schedule.

The reviewer's annotation tool with the Reject and Accept buttons, next to the part of the graph where Rejected images return through the Return to labeling node, which runs on a schedule

Rejected images wait in Rejected until Return to labeling sends them back to the pool with their annotations in place. The first labeler with room in their queue picks them up, fixes them and submits them for review again. Run the node by hand when you want rework to start.

⏱️ Tip: put Return to labeling on a schedule, for example every hour, and rejected images go back to the labelers on their own.

Roles and access

Labeling is often one part of a bigger pipeline, next to active learning, training and other stages. Workspace roles give each person only the part they need. Someone becomes a labeler or reviewer when you add them to the Labeling or Review node, and their role decides what else they can see.

RoleWhat they can do
CollaboratorSees only their own labeling or review tasks and opens them in the annotation tool. The rest of the pipeline stays hidden. A good fit for labelers and reviewers.
ViewerSees flows and their results, but changes nothing. A good fit for managers and clients who follow progress.
OperatorSees and runs flows, but does not edit them.
AdminFull control over flows, data and members.

🪄 Pro plan: roles and per-flow access come with the Pro plan. Invite outside labelers or a client, and each person works only on their own part. Pro also brings an audit log, more credits and storage, and other upgrades. Larger teams can also choose Enterprise, with single sign-on, a dedicated cluster and onboarding from our experts. Read how roles work in Members and roles.

Track progress

Status on the graph

The Labeling and Review cards show live status while people work: how many images are in progress and how many are done, in total and per person. Review also splits the finished work into accepted and rejected.

Live status on the Labeling and Review cards in the middle of the run.

Live status on the Labeling and Review cards in the middle of the run.

The Labeling card with 18 images labeled and 20 in progress, and the Review card with 7 of 17 images reviewed: 5 accepted and 2 rejected

At the moment of this snapshot, the two labelers had submitted 18 images, with 20 more in their queues. The reviewer had checked 7 of the 17 images that reached review: 5 accepted and 2 sent back for rework.

Detailed statistics

For the full picture, open the statistics page. There are two ways in:

  • the Statistics button (the chart icon) next to Open annotation tool on the Labeling or Review card;
  • the Labeling page in the sidebar.

The Labeling page lists every labeling and review task in your workspace: the node and its flow, who is assigned, how many images sit in queues and when the last work happened. From any row, people assigned to the task continue in the annotation tool, and anyone opens its statistics. Labelers with the Collaborator role see only their own tasks here, so this page is where their work starts.

The statistics page puts every number about the work in one place:

  • Totals per stage: images submitted, the backlog in queues and in the pool with an estimate of when it clears, time in the tool with the median per image, and objects created, updated and deleted.
  • Outcomes: how many images went through each button, plus a chart of submissions per day.
  • Members: the same numbers for every person, from submitted images to the last submission.
  • Review results per labeler: how each labeler’s work did in review and the median time to a verdict.
  • Classes: objects per class, with what was created, updated and deleted.
  • Image history: every image with its last step and outcome. Expand a row to see each step: who worked on it, which button they pressed and how long it took.

Filter everything by node, person, class and period: the last 24 hours, 7 or 30 days, all time or your own range. Members, classes and images export to CSV for your own reports. Collaborators see only their own numbers. Every part of the page is explained in Labeling statistics.

💡 Your buttons, your outcomes: the statistics page counts every pair in Decision buttons as its own outcome, under the name of its dataset. Add a Needs expert button that sends images to a Needs expert dataset, and Needs expert appears next to the other outcomes, with no extra setup.

Statistics of the Labeling node: totals, per-person numbers and the history of every image.

Statistics of the Labeling node: totals, per-person numbers and the history of every image.

The Labeling statistics page with totals for submitted images, backlog, time in tool and objects, a Members table with per-labeler numbers, and the history of one image that was labeled and then rejected in review

The result

Accepted images collect in the Accepted dataset with their annotations, ready for training or the next step of your pipeline. Images a labeler skipped stay apart in Skipped, so you can look through them later and decide what to do with each.

Accepted images land in the Accepted dataset with their annotations.

Accepted images land in the Accepted dataset with their annotations.

The Accepted dataset open in a preview window with labeled insulator images, next to the Accepted dataset card with 5 images

From here, a natural next step is a Move node on a schedule, for example every day. It sends newly accepted images to a Training dataset, so Accepted holds only the latest batch. A Create version ↗ node then saves the training dataset as a new version. Each version holds everything from the previous one plus the new images, so the dataset grows step by step and every earlier state stays in its history. The nodes after it read that saved version, so you always know exactly which data a model was trained on.

Beyond that, the pipeline grows with your project. Split the data, train a detector, compare it with the previous model, or close the loop with active learning, where the model picks the next images worth labeling. Every step is one more node on the same graph, so your labeling, data and models live in one place, and you always see how they connect.

Every day, accepted images move to the training dataset, and Create version saves it as a new version. What comes next is up to you.

Every day, accepted images move to the training dataset, and Create version saves it as a new version. What comes next is up to you.

The graph continued after the Review node: the Accepted images dataset, a Move node that runs every day, a Training dataset with 545 images, and a Create version node marked New version, followed by Train/validation split and Train DEIM

Node reference

Every node of the template, with a link to its documentation.

NodeWhat happens
Labeling ↗Labelers annotate images and press Submit or Skip.
Review ↗The reviewer checks each image and presses Accept or Reject.
Labeling pool (dataset ↗)Images wait here for labelers.
Review pool (dataset ↗)Submitted images wait here for a reviewer.
Accepted (dataset ↗)Images that passed review, with their annotations. This is the result.
Skipped (dataset ↗)Images a labeler set aside, kept out of the loop.
Rejected (dataset ↗)Rejected images waiting for rework.
Return to labeling (Move ↗)Sends rejected images back to the labeling pool with their annotations.