Pre-release software. This version targets the
develop4branch and may contain bugs. For general lab use, v1.1.2 remains the recommended stable release. Feedback and bug reports via GitHub Issues are welcome.
Released 2026-10-08 — release page
To use this beta version, check out the corresponding tag:
git checkout v2.0.0-beta.4
Task-by-task instructions are in the Beta Guides.
yolov5 model type to ultralytics, which refuses YOLOv5 checkpoints, so no v1 model could be used. YOLOv5 is now bundled in yoru/libs/yolov5/ and runs as it did in v1. On three v1 models, every box matches v1 exactly. YOLOv5 is back in the Training GUI too, as the default for new projects.docs/external_api.md in the repository lists the YORU names that sister applications such as YORU Tracker may use, and tests pin each of them. YORU Tracker needs this beta.Python stays at 3.10 and YORU.yml has not changed, so there is no need to recreate the conda environment.
git fetch --tags
git checkout v2.0.0-beta.4
uv sync # uv
# or, with conda:
conda activate yoru
pip install torch==2.8.0 torchvision==0.23.0 --index-url https://download.pytorch.org/whl/cu128
Recreate the conda environment, as Beta 3 moved from Python 3.9 to 3.10. See the Beta Install guide.
git clone https://github.com/Kamikouchi-lab/YORU.git
cd YORU
git checkout v2.0.0-beta.4
conda env create -f YORU.yml
conda activate yoru
# then install PyTorch (see the Beta Install guide)
python -m yoru
No conda and no manual PyTorch step.
git clone https://github.com/Kamikouchi-lab/YORU.git
cd YORU
git checkout v2.0.0-beta.4
uv sync
uv run yoru
tracking_id or evaluation figures with results from earlier versions (breaking changes 3 and 4).close().pyproject.toml now takes torch ≥ 2.7 and torchvision ≥ 0.22 from the cu128 index, where Beta 3 used cu124. The CUDA 12.8 build needs driver 570 or newer (572.xx on Windows); check yours with nvidia-smi.
uv sync installs the new build.If the driver cannot be updated, the Beta Install guide describes a CUDA 12.6 fallback. That build has no kernels for the RTX 50-series.
A new project now defaults to YOLOv5 (yolov5s.pt), as in YORU v1, instead of YOLO11. Choose another version in the Training GUI as before. Ticking Oriented Bounding Box still switches the project to YOLO11, because YOLOv5 has no rotated-box head.
tracking_idVideo Analysis tracking was biased (see Bug Fixes), and every track that ended used up an ID. Now only real distances decide the matching, and IDs are numbered without gaps. Re-analysing a movie can therefore pair detections differently in frames where the number of animals changes, and gives lower IDs after a track has ended. Compare tracking_id only between results made with the same version.
The AP the Evaluation sub-module reported was wrong in several ways (see Bug Fixes). Do not compare figures from Beta 4 with those from earlier versions. For an OBB model, run Prediction again: _yolo.txt files written by earlier versions hold only the upright box around each rotated box, while Beta 4 writes all four corners.
Closing the window used to skip its cleanup. Now it asks the run to stop at the end of the epoch, waits 3 s, and then ends the training process along with its data-loader workers. Checkpoints that are already saved remain, but the unfinished epoch may be lost. To keep it, use Stop after this epoch and wait for the run to finish.
best.pt reaches the right backend.YORU_YOLOV5_RGB=1 (or pass get_detector(..., rgb_input=True)) to give them RGB frames instead. The channel order is printed and written to yoru.log each time a model loads.yolov5su.pt and the like) are a different network, and they stay on the ultralytics backend.null and is left out of the mAP. The results file adds the overall mAP@[.50:.05:.95] and names its IoU and AP methods.trigger.result_max_age seconds old. This is a new optional key in the condition YAML (default 1.0). The trigger, the recorded _detect.csv and the preview all use the same check, so old boxes disappear from the preview.close() is called if it has one. The bundled serial, display and NI-DAQ plugins now implement close().hardware.camera_fps instead of busy-waiting at 16 fps. The area selector accepts a drag in any direction, cancels on Escape, ignores a click that selects no area, and no longer forces 640×480.docs/external_api.md is the supported surface for applications built on YORU: renaming anything it lists is a breaking change. tests/test_public_api.py pins every name, and also checks that YORU never imports yoru_tracker.yoru.libs.camera.open_camera, which opens a camera the way real-time capture does, and yoru.libs.plugins.list_detector_backends, which lists the backend names get_detector accepts on this machine..jpeg and upper-case extensions, skips blank label lines, reports an unreadable image clearly, and draws its figures from a worker thread.OBB dataset incorrectly formatted.yoru.log. Run it directly from a terminal to see the error, e.g. python -m yoru.train_GUI. Always launch YORU from the repository root.cpu. Choose Train anyway.<frame name>_<frame number>.png. A second run over the same range rewrites the frames that overlap, and the saved-frame counter counts them twice. Give each video its own frame name when several videos share one output folder.develop4 branch and is not the stable release. For general lab use, v1.1.2 remains the recommended version.Superseded by Beta 4 above. This version targets the
develop4branch.
Released 2026-09-28 — release page
To use this beta version, check out the corresponding tag:
git checkout v2.0.0-beta.3
Task-by-task instructions are in the Beta Guides.
yolo11s-obb.pt), and real-time and offline detection draw rotated rectangles.C) fits a box to an animal from a single click. The Frame Capture GUI adds Automatic Extraction, which picks a whole set of frames for labelling (uniform or kmeans, as in DeepLabCut).~/.yoru/logs/yoru.log, and GUI errors shown on screen instead of being swallowed.Python moved from 3.9 to 3.10 (breaking change 1), so recreate the environment:
git fetch --tags
git checkout v2.0.0-beta.3
conda deactivate
conda env remove -n yoru
conda env create -f YORU.yml
conda activate yoru
# then install PyTorch for your CUDA version (see the Beta Install guide)
python -m yoru
git clone https://github.com/Kamikouchi-lab/YORU.git
cd YORU
git checkout v2.0.0-beta.3
conda env create -f YORU.yml
conda activate yoru
# then install PyTorch for your CUDA version (see the Beta Install guide)
python -m yoru
No conda and no manual PyTorch step. uv users upgrading from Beta 2 only need to run uv sync.
git clone https://github.com/Kamikouchi-lab/YORU.git
cd YORU
git checkout v2.0.0-beta.3
uv sync
uv run yoru
Beta 2 used Python 3.9. YORU.yml and pyproject.toml now target Python 3.10, and NumPy is capped below 2.0 because opencv-python 4.10 is built against NumPy 1.x. Updating a Beta 2 environment in place is not reliable across a Python version change, so recreate it (see above), then reinstall PyTorch. uv users only need to run uv sync.
For every project, not only OBB ones, the Video Analysis tables now have w, h, angle between y_center and confidence. confidence, class, class_name and tracking_id therefore move three columns to the right.
angle is always 0.The real-time *_detect.csv gains cx, cy, w, h, angle at the end. The first eight columns keep their names and positions, and none of the bundled trigger plugins is affected.
If you wrote your own trigger plugin: the rows in m_dict["yolo_results"] now have 13 entries. Indexing (row[4], row[6]) still works. Unpacking exactly eight values (x1, y1, x2, y2, conf, cls, name, t = row) now raises ValueError, and when that happens the trigger stops firing. Unpack with *rest or index instead. Rows passed to yoru.libs.drawing.draw_detections changed the same way. See Custom Trigger Plugins.
The panels on the Video Analysis screen now have stable internal names. If you have a logs/custom_layout_analysis.ini saved by Beta 2, the two panels can open on top of each other the first time. Choose Window → Reset layout to default once to fix it, or delete that file.
task: obb in the project’s config.yaml, and every later step follows it.Z / X turn the selected box 1°, and Shift+Z / Shift+X turn it 15°. Corners resize the box along its own axes, and the status bar shows its own width, height and angle.class x1 y1 x2 y2 x3 y3 x4 y4, normalised), the format ultralytics reads for task="obb". LabelImg tells it apart from ordinary YOLO labels by the number of fields on each line.-obb suffix automatically. Only YOLOv8 and YOLO11 have a rotated-box head, so RT-DETR and the torchvision models cannot be trained on OBB.yolo_model_type: "auto". Rotated rectangles are drawn on screen and in rendered videos, and the angle is written to the CSVs (see breaking changes 2 and 3).python -m yoru.labelimg.labelimg) instead of the one on PATH. It opens already pointed at the right image folder and classes.txt, and in the right format: YOLO for an ordinary project, YOLO-OBB for an OBB one. You no longer set the format by hand.C (or the Click to Box button) and click once on the animal. A box is fitted to its body, leaving out legs, wings and antennae. In an OBB project the box is rotated along the body. It works for dark animals on a light background and the reverse, needs no model, and runs on OpenCV alone.python -m yoru.labelimg.labelimg [image_dir] [classes_file] [save_dir] [--obb | --no-obb].0.25–0.75) skips handling at the start of a recording, or keeps part of the video back as unseen test material.logs/.YORU_DEVICE environment variable, the --device flag of the training scripts, or the new device selector in the Training GUI. The selected device reaches the training subprocess and the detectors.uv.lock now covers Windows, Linux and macOS.~/.yoru/logs/yoru.log (relocatable with YORU_HOME). They hold the full traceback of every error the GUIs catch. The last-used condition file is now remembered in ~/.yoru/condition_file_log.json and is migrated from logs/ automatically.cv2.imwrite returns success there but writes no file. Frames are now written with imencode + tofile.~/.labelImgSettings.pkl) written by another labelImg build no longer breaks YORU’s bundled copy.import cv2 works on Python 3.10, and several error-handling gaps were closed.OBB dataset incorrectly formatted. Check the format button in LabelImg’s toolbar if in doubt.yoru.log (the same as Beta 2). Run it directly from a terminal to see the error, e.g. python -m yoru.train_GUI. Always launch YORU from the repository root.uv.lock pins torch 2.6.0+cu124, which has no kernels for these cards, so CUDA calls fail with no kernel image is available. Set YORU_DEVICE=cpu, or use the conda route with a CUDA 12.8 build (see working-example.md, torch 2.8.0+cu128).cpu. Choose Train anyway.<frame name>_<frame number>.png. A second run over the same range rewrites the frames that overlap, and the saved-frame counter counts them twice. Give each video its own frame name when several videos share one output folder.develop4 branch and is not the stable release. For general lab use, v1.1.2 remains the recommended version.Superseded by Beta 3 above. This version targets the
develop4branch.
Released 2026-08-19 — release page
To use this beta version, check out the corresponding tag:
git checkout v2.0.0-beta.2
localhost:8889. Because of this, you must update your environment before YORU will start.ultralytics package, torchvision, and a new ONNX backend. YOLOv5 is no longer trainable, and old YOLOv5 .pt files can no longer be loaded.This step is required — the launcher will not start otherwise.
conda activate yoru
conda env update -f YORU.yml --prune
python -m yoru
Google Chrome is no longer a prerequisite.
git clone https://github.com/Kamikouchi-lab/YORU.git
cd YORU
git checkout v2.0.0-beta.2
conda env create -f YORU.yml
conda activate yoru
python -m yoru
uv resolves everything from pyproject.toml / uv.lock, so the conda environment creation and the manual PyTorch step are not needed.
cd Path/to/YORU
uv sync
uv run python -m yoru
The PyTorch install line in the README covers CUDA 11.8 and 12.1. RTX 50-series (Blackwell) cards need a newer build — see working-example.md in the repository, which records a working RTX 5070 Ti setup on torch 2.8.0+cu128.
trigger_pin value in every condition file (breaking change 3).trigger_threshold_configuration values (breaking change 4).<project>/train/weights/best.pt (breaking change 5).The launcher moved from Eel to pywebview, and onnxruntime was added. An environment created for Beta 1 has neither, so python -m yoru stops with:
[yoru] failed to import yoru.app.main: No module named 'webview'
Run conda env update -f YORU.yml --prune to fix it. The launch command itself is unchanged: python -m yoru (or the yoru command). Google Chrome is no longer required, and nothing opens a network port any more.
The vendored yoru/libs/yolov5/ tree was removed. What to do with an existing YOLOv5 model:
yolo_model_path in your condition file at the .onnx file. The new ONNX backend understands the YOLOv5 output layout and is selected automatically from the file extension.yolov5s.pt for yolo11s.pt (same size letter) and prints a notice — but the run starts from scratch and the results are not comparable to a YOLOv5 baseline.yolo_model_type: yolov5 keep loading (the name is aliased to ultralytics); it is the old weight file that cannot be read.trigger_pin in your condition filesBeta 1 hard-coded the TTL output to digital pin 13 and silently ignored the trigger_pin value in your file. Beta 2 actually uses it. If any of your condition files sets trigger_pin to something other than 13, that pin is what will now fire — edit the YAML or rewire before your next experiment. Files with no trigger_pin key still default to 13.
trigger_threshold_configuration was loaded but never read in Beta 1, so the trigger fired on any detection of the trigger class regardless of confidence. It is now applied. With the shipped values (0.3–0.5), expect fewer firings from an unchanged config. If you had raised the threshold to compensate for it being ignored, lower it back to the value you actually want.
exp_<model>/, not train/Look for the weights in <project>/exp_yolo11s/weights/best.pt (YOLO / RT-DETR) or <project>/exp_fasterrcnn/fasterrcnn_best.pt (torchvision). Repeat runs go to exp_yolo11s2, exp_yolo11s3, … so retraining no longer overwrites earlier weights or writes checkpoints into the training-image folder. Existing train/ folders are untouched; update any scripts or notes that point at them.
The plugin contract changed — check all of the following:
m_dict: def __init__(self, m_dict=None):, not def __init__(self):.trigger() is a pyfirmata board, not a serial port: use arduino.writeDO_all(1) / arduino.writeDO_all(0), not ser.write(b"1").if arduino is None: return (for configs with Arduino_COM: "None").import libs.arduino as ard → import yoru.libs.arduino as ard.yoru.libs.yolo_wrapper was deleted. Replace from yoru.libs.yolo_wrapper import load_yolo_model with:
from yoru.libs.plugins import get_detector
det = get_detector("auto", model_path) # or "ultralytics", "rtdetr", "torchvision", "onnx"
The detector exposes .names and .detect(image), which takes a BGR image and returns a list of dicts with the keys x1, y1, x2, y2, conf, class_id, class_name. yoru.libs.file_operation_evaluation was also removed (it was a duplicate of yoru.libs.file_operation_create_label).
.jpg / .jpeg / .bmp / .tif / .tiff as well as .png. Do not re-split a project mid-experiment — the split will differ from the one Beta 1 produced.custom_layout_*.ini files moved from config/ to logs/. The stale config/custom_layout_*.ini files can be deleted.yolo_model_path at a .onnx file (or set yolo_model_type: onnx) and it is used automatically. It handles models exported from YOLOv5 and YOLOv8 / YOLO11, reads class names from the model metadata, and uses whatever ONNX Runtime execution providers are installed.yoru/libs/plugins/) with ultralytics (YOLOv8 / YOLO11), rtdetr (RT-DETR), torchvision (Faster R-CNN / Mask R-CNN / SSD) and onnx backends; auto picks one from the weights file.~9.4 GB needed / 7.6 GB free (NVIDIA RTX 4070) with a breakdown, colour-coded green / orange / red, recalculated as the model, Image Size and Batch change. It counts free VRAM, so another training run or a live detection session on the same card is taken into account. Pressing Train Model while it is red offers “Use Batch n” (the largest batch expected to fit), “Train anyway” or “Cancel”. Accurate to roughly ±30%.best.pt and last.pt stay usable. A red Force stop appears while a stop is pending, with a confirmation that spells out what is lost — and it kills the dataloader workers too, so nothing is left holding the GPU. A run started from a terminal can be stopped the same way by creating an empty .yoru_stop_request file in the project directory.python is not the environment’s interpreter.yoru gui remembers the last-used config instead of resetting to config/template.yaml, and yoru gui --config <file> now actually works (it was silently discarded in Beta 1).The real-time process can be started directly from the command line:
python -m yoru.realtime_yoru_GUI path/to/condition.yaml
hardware.camera_settings_dialog (default False) — the camera driver’s property dialog is now opt-in.config/ were rewritten: developer-machine paths and the dead root: key removed, export defaults to ./results/, a model path pointing at a non-existent file fixed, Arduino_COM: 13 (a pin number in the COM field) fixed, curly quotes around “COM3” fixed, a trigger_style naming a plugin that does not exist fixed, and every key given an inline comment.docs/install.md in the repository gains an install with uv path.docs/training.md documents the GPU-memory estimate and the stop buttons; docs/evaluation.md points at the new exp_<model>/ folders.THIRD_PARTY_LICENSES.md lists every dependency and its licence, and the README adds an Ultralytics dual-licensing notice: Ultralytics YOLO is AGPL-3.0 by default and that extends to models trained with it, so commercial use needs an Ultralytics Enterprise licence.working-example.md records one verified working machine (Windows 11, RTX 5070 Ti, torch 2.8.0+cu128) as a reference when an install misbehaves.trigger_threshold_configuration was never read, so any detection of the trigger class fired the TTL. Closed-loop experiments run on Beta 1 were effectively running with threshold 0.trigger_pin said in the condition file.standard_nidaq, state_convert and state_convert_for_copulation_attempts could not even be constructed, so the trigger never engaged; the two state_convert plugins also still wrote to a serial port that had become a pyfirmata board. The Arduino plugins no longer crash the trigger process when no board is connected.stream_MSS: True) fed 4-channel BGRA frames to the detector, the recorder and the display — recording and detection should now work where they previously produced broken output.hardware.camera_id instead of failing cryptically.create_video() flipped unconditionally, ignoring the flip checkboxes — and it crashed on the last frame.ser_recount unconstructible; nidaq.dio.stop() not actually stopping the DAQ task; a divide-by-zero in the evaluation IoU; a SciPy function removed in modern versions; Quit raising in the Evaluation and Create-Labels windows; and yoru gui opening a second launcher window when an error escaped the GUI.yoru --version now reports the real version instead of a placeholder, and the packaged source distribution now actually contains config/, trigger_plugins/ and web/.develop4 branch and was not a stable release. At the time, v1.1.1 was the recommended version.Superseded by Beta 2 above. This version targets the
develop2branch.
To use this version, check out the corresponding tag:
git checkout v2.0.0-beta.1
yoru/ package structure for cleaner imports and maintainability.| Version | Date | Notes |
|---|---|---|
| v2.0.0-beta.4 | 2026-10-08 | Pre-release — YOLOv5 back (v1 models load), CUDA 12.8 PyTorch, corrected evaluation, safer closed loop, external API for sister applications |
| v2.0.0-beta.3 | 2026-09-28 | Pre-release — oriented bounding boxes, Click to Box, Automatic Extraction, screen-fitted windows, Python 3.10 |
| v1.1.2 | 2026-09-04 | Stable release — macOS / Linux via uv, automatic compute device, ~/.yoru logs, CI on three platforms |
| v2.0.0-beta.2 | 2026-08-19 | Pre-release — native launcher, plugin / ONNX backends, YOLOv5 removed |
| v2.0.0-beta.1 | 2026-03-14 | Pre-release — see above |
| v1.1.1 | 2026-03-14 | PyTorch 2.6 fix, uv install support, path corrections |
| v1.1.0 | 2025-12-05 | Docs updates, GUI enhancements |
| v1.0.3 | 2025-05-29 | Published DOI release |
| v1.0.2 | 2025-02-28 | Confidence threshold for video analysis |
| v1.0.1 | 2025-01-16 | Updated instructions, YOLOv5 fix |
| v1.0.0 | 2024-11-14 | Initial public release |