Lab 11 · GUI Workflows for Labeling & Review (Shiny PNW-Cnet + Njobvu-AI)
Why this lab
Up to this point you've done everything in Python or R on the command
line. That is great for reproducibility, but in real teams — field
crews, undergraduates, partners across agencies — not everyone is
going to install pycnet-audio in a conda env. The two GUI
tools in this lab are the workhorse graphical interfaces in the PNW
wildlife community for exactly the same tasks you've been doing on the
CLI:
- Shiny PNW-Cnet (Zack Ruff, Oregon State University / Pacific NW Research Station) — a desktop-style R Shiny app that wraps PNW-Cnet. Field crews can drop a folder of WAVs onto it, set detection thresholds with sliders, and review/verify hits without ever opening a terminal.
- Njobvu-AI (Sulli Chrosu, Cara Appel, and others; Appel et al. 2025) — a browser-based, multi-user platform for collaborative image labeling, custom YOLO/TensorFlow model training, and batch classification. Built for camera-trap and other wildlife-imagery teams who need many people annotating in parallel.
The point of this lab is not to learn a third or fourth tool from scratch. It's to learn when a GUI is the right answer — and how to evaluate one quickly against the CLI workflow you already know.
Reading
Required: Appel, C. L., Subramanian, A., Koning, J. S., et al. (2025). Developing custom computer vision models with Njobvu-AI: A collaborative, user-friendly platform for ecological research. Ecological Applications. doi:10.1002/eap.70096. Read end-to-end; this is short and gives you the context for Part 2 of the lab.
Part 1 — Shiny PNW-Cnet (10 pts)
Install
Shiny PNW-Cnet is an R Shiny app, so you need R + Shiny installed (you already have these from Labs 9 and 10). Clone Zack Ruff's repo and follow the README:
git clone https://github.com/zjruff/Shiny_PNW-Cnet.git
cd Shiny_PNW-Cnet
From R or RStudio:
# install dependencies once (this can take 5-10 min the first time)
source("install_dependencies.R")
# Then launch the app
shiny::runApp(".")
A browser window opens at http://127.0.0.1:<some port>/
with the Shiny UI. If the launch fails on a missing system tool (most
commonly SoX or Python), the README has per-OS notes. The app also bundles
a one-click Windows installer if you're on a lab/teaching computer.
Tasks (Part 1)
- Process a small recording set (4 pts). Point the app
at
data_sample/audio/. Use the PNW-Cnet v5 model. Run processing. Take a screenshot of the per-class detection-count summary it produces. - Tune review thresholds (3 pts). Pick three classes of your choice (one common, one rare, one ambiguous). For each, move the score-threshold slider from 0.10 to 0.90 and write down how many detections survive at each step. Same exercise as Lab 6's calibration, but with sliders instead of a Python loop.
- Review and verify a handful (3 pts). Pick the top 10 detections for one species (your choice). Use the app's review interface to listen to each clip and mark it as confirmed / rejected. Note how many were real; report your verified precision @ the threshold you chose.
Deliverable (Part 1)
A 1–2 minute screen recording walking through the three tasks above. Software-wise the easiest options are macOS's built-in Cmd+Shift+5 or Windows's Game Bar (Win+G). No voice-over required; on-screen captions are fine.
Part 2 — Njobvu-AI for camera-trap labeling and training (10 pts)
Install
Njobvu-AI is a Node.js web app you run locally. You should have Node.js already if you followed the Node.js install section of the RStudio tutorial; if not, install it now.
git clone https://github.com/sullichrosu/Njobvu-AI.git
cd Njobvu-AI
npm install
npm install --save sqlite3 # storage backend
# Start the server
npm start
# Open http://localhost:8080 in your browser
On Windows, the repo also includes InstallMe.exe which
installs Node.js for you and creates a desktop shortcut — use that
if you're on a teaching computer where you can't run npm.
On the login page, click Signup, create a local account, log in.
Tasks (Part 2)
- Create a project and import data (2 pts). Create a
new project. Import 20–30 images from
data_sample/cameratraps/. Define 4 classes:deer,elk,bear,bobcat(matching Lab 4). - Label a few (4 pts). Draw bounding boxes on at least 15 images. Use the keyboard shortcuts the README documents (much faster than the mouse). For an empty image, mark it as "reviewed, no animal" rather than drawing no box — an important distinction.
- Train a tiny model (2 pts). Upload one of the YOLO training scripts Njobvu-AI ships with (or adapt our Lab 4 script). Run training for 1–2 epochs as a smoke test. You don't need a usable model — you need to see the training-status log update in the GUI.
- Validate (2 pts). Switch to validation mode. Step
through 5 of your labels and either confirm or correct them. Note how
the UX compares to running
yolo predicton the command line.
Deliverable (Part 2)
A 1–2 minute screen recording showing the labeling, training-run start, and validation step.
Reflection (1-page PDF, both parts)
In ~300 words, answer:
- For your own future projects, where would the GUI be a better choice
than the CLI? Where is the CLI clearly better? Be specific (e.g., "for
undergrad labeling sprints across 3 sites, Njobvu-AI's multi-user mode
wins; for nightly batch processing of 100k images on a remote server,
yolo predicton the CLI wins"). - What did the GUI surface that the CLI hid? (Often: how slow review really is. Sometimes: that your label classes are ambiguous.)
- What did the CLI surface that the GUI hid? (Often: reproducibility. Sometimes: which exact model version was used.)
Rubric
| Component | Points |
|---|---|
| Part 1 — Shiny PNW-Cnet (install & 3 tasks) | 10 |
| Part 2 — Njobvu-AI (install & 4 tasks) | 8 |
| Reflection | 2 |
| Total | 20 |
If something doesn't work
- Shiny PNW-Cnet failing on Python detection: see Zack's install README. Pure-R installs work too if Python is uncooperative; you'll lose some inference features but the review UI works.
- Njobvu-AI on macOS asking for Xcode tools when running
npm install --save sqlite3: just say yes and re-run. - Either app failing because of a port conflict: pick another port
(Shiny:
shiny::runApp(".", port = 4321); Njobvu-AI: setPORT=8888 npm start). - For both: paste the error into a Claude Code session running in the cloned repo's folder and let Claude help triage. You will be a much faster debugger of a GUI tool with Claude reading the install scripts alongside you.
This lab also doubles as a sanity check for your final project: if your project will involve labeling new images or reviewing acoustic detections, one of these tools is almost certainly the right answer for that step.