尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证ffrwd/yolo26: YOLO26 detection and segmentation hosted in wasm; detect makes rows, segment_mask makes a matte, and ffmpeg does the rest. AGPL-3.0.
翻译准备中
取自仓库 README
正在加载完整 README。 以下为已保存的摘录。
YOLO26 detection and segmentation, hosted in wasm. One model family,
one row shape, then composition: detect produces rows,
segment_mask produces a matte, the utilities turn rows into mattes
or drawn overlays, and everything downstream is native ffmpeg.
Requires ffrwd 0.29, whose ffrwd/wasm is 0.19.1.
This package is AGPL-3.0. The model weights are Ultralytics'
YOLO26, released under AGPL-3.0, and the package follows them. Using
the models over a network in a commercial product needs Ultralytics'
commercial license; nothing here
changes that.查看完整 README ↗YOLO26 detection and segmentation, hosted in wasm. One model family,
one row shape, then composition: detect produces rows,
segment_mask produces a matte, the utilities turn rows into mattes
or drawn overlays, and everything downstream is native ffmpeg.
Requires ffrwd 0.29, whose ffrwd/wasm is 0.19.1.
This package is AGPL-3.0. The model weights are Ultralytics' YOLO26, released under AGPL-3.0, and the package follows them. Using the models over a network in a commercial product needs Ultralytics' commercial license; nothing here changes that.
If that license is in your way, use
ffrwd/rfdetr
instead: the same exports, utilities and recipes over Roboflow's
RF-DETR, whose weights are Apache-2.0, so a query swaps the package
name and nothing else moves. On the footage the two were compared on,
its mattes agree with this package's at 0.95 IoU and it runs at about
half the frame rate.
The weights are not in the archive: the manifest pins them - exact
repo, revision, file and sha256 - and ffrwd install fetches and
verifies them. Both are the medium end-to-end (NMS-free) ONNX exports
at 640x640, about 176 MB together, run through wasi:nn on the
machine's own ONNX Runtime.
detect(v, conf DEFAULT 0.25) returns
STRUCT(class text, conf number, x number, y number, w number, h number)[]:
one row per object per frame, the class as COCO label text, the box
in the frame's own pixels, whole numbers each. The rows are all that
leaves; the picture stays where it was.segment_mask(v, class DEFAULT NULL, conf DEFAULT 0.25) returns the
found instances as one grayscale matte the size of v, optionally
narrowed to one class name.A reader takes the picture from the source and the rows from the
detector, so both arguments name the same v:
ffrwd.yolo26.draw_boxes(v, ffrwd.yolo26.detect(v)). Narrow
detect's rows at run time with the gather spelling:
ARRAY(SELECT r FROM unnest(ffrwd.yolo26.detect(v)) r
WHERE r.class = 'person' AND r.conf >= 0.5)
Both models take the picture as yuv420p, three eighths of the bytes of rgba, and convert it to RGB with ffrwd-frame in the range and matrix the stream declares; an untagged stream is read as tv-range BT.601, as ffmpeg reads it. They letterbox it into the 640 square with OpenCV's bilinear resize, which is what the models were trained on (Ultralytics' own preprocessing), rather than the Pillow resize ffrwd-frame carries for the models trained on that.
boxes_mask(v, boxes, grow DEFAULT 0, feather DEFAULT 0): the rows
rasterized into a grayscale matte the size of v; grow pads each
box in pixels, feather softens the edge. It reads x, y, w and
h and nothing else, so any rows carrying a box will do. The picture
is read for its times and size alone: it arrives in whatever format
the query already has it in, and no pixels are carried for it.draw_boxes(v, boxes, thickness DEFAULT 2): the boxes drawn on the
picture as green outlines. It reads whole pixels: a query handing it
boxes in fractions is refused when it compiles. A frame with no box
on it leaves as it arrived.The composition layer lives in ffrwd/mask_tools - blur_where,
mosaic_where, spotlight, cutout and the masked spelling they
share - because it is model-agnostic: any grayscale matte beside any
stream, all native ffmpeg. This package's recipes call it as
ffrwd.mask_tools.blur_where(...) and so on, feeding it the mattes
segment_mask and boxes_mask produce.
blur-people, mosaic-people, spotlight, replace-background,
draw, detections - run ffrwd list for each one's variables, or
read the header of the recipe file.
ffrwd run ffrwd/yolo26:blur-people -v source=street.mp4 -v dest=blurred.mp4
1.0's detect handed the picture back with its rows beside it, and
draw_boxes took that record: draw_boxes(detect(v)). 1.1's writes
the rows alone, and a reader names the picture itself:
draw_boxes(v, detect(v)). A query selecting detect(v).boxes selects
detect(v). The mattes of segment_mask and boxes_mask are one byte
a pixel in gray rather than the picture's own format.
1.0 read every yuv420p picture as full-range BT.601, whatever the stream said. A tv-range picture, which is nearly every video, reached the model at 219/255 of its contrast with its blacks lifted, and a BT.709 one through the wrong matrix as well. 1.1 reads the stream's own range and matrix, so the boxes move where that mattered:
The recipes that draw or composite move with the boxes and the masks.
cargo build --target wasm32-wasip2 --release
cargo test --release
Every module is a node written with
ffrwd-node, which carries
the world they are built against, so there is no build.rs, no wit of
ours beyond wasi:nn's, and nothing to install first. common holds
what the model nodes share: the colour conversion, the letterbox, and
the graph run through wasi:nn. ffrwd-frame's yuv is not on a tag
yet, so common finds the crate by path, in a checkout of ffrwd-frame
on its yuv branch beside this one; the pin moves to a tag once that
branch is merged.
The weights are fetched at ffrwd install time by whoever installs
the published package, and ffrwd install in a checkout puts them
beside the built modules.