尚未偵測到更新。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.