Pre-release software. This version targets the
develop4branch and may contain bugs. For general lab use, v1.1.1 remains the recommended stable release. Feedback and bug reports via GitHub Issues are welcome.
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 is not the stable release. For general lab use, v1.1.1 remains the recommended version.train/ output folder) and do not apply to Beta 2.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.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 | Stable release — 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 |