8个版本

0.1.7 2021年6月25日
0.1.6 2020年11月2日
0.1.5 2020年10月28日
0.1.3 2020年9月8日
0.1.0 2018年1月16日

#163 in 图像

Download history • Rust 包仓库 102/week @ 2024-03-17 • Rust 包仓库 108/week @ 2024-03-24 • Rust 包仓库 125/week @ 2024-03-31 • Rust 包仓库 78/week @ 2024-04-07 • Rust 包仓库 103/week @ 2024-04-14 • Rust 包仓库 263/week @ 2024-04-21 • Rust 包仓库 129/week @ 2024-04-28 • Rust 包仓库 171/week @ 2024-05-05 • Rust 包仓库 171/week @ 2024-05-12 • Rust 包仓库 76/week @ 2024-05-19 • Rust 包仓库 90/week @ 2024-05-26 • Rust 包仓库 152/week @ 2024-06-02 • Rust 包仓库 114/week @ 2024-06-09 • Rust 包仓库 92/week @ 2024-06-16 • Rust 包仓库 128/week @ 2024-06-23 • Rust 包仓库 3/week @ 2024-06-30 • Rust 包仓库

每月349次下载
用于 bevy_webcam_facial

BSD-2-Clause

3MB
2K SLoC

rustface


SeetaFace检测库的Rust语言实现

示例输出 示例演示程序输出

crates.io docs.rs Linux build License

关于

SeetaFace检测是基于Funnel-Structured cascade的实现,适用于实时多视角人脸检测。FuSt通过使用由粗到细的结构,在精度和速度之间取得良好的平衡。它包括早期阶段多个针对特定视角的快速LAB级联分类器,随后是粗略的多层感知机(MLP)级联,最后阶段是一个统一的精细MLP级联,集中处理所有提出的窗口。

阅读更多...

性能

您可以使用cargo bench运行criterion基准测试。

使用nightly Rust

nightly分支包含一个略快(约20%)的rustface版本。这种加速是通过使用显式SIMD内建函数实现的。如果您想使用此分支,需要较旧的nightly工具链。

rustup toolchain install nightly-2018-01-15
rustup default nightly-2018-01-15

关于nightly分支的性能:粗略的手动基准测试表明,这个nightly Rust版本的SeetaFace比原始的C++版本略快。在这个特定的测试中,Rust版本的平均速度比其C++版本快了4%。当使用多线程并启用LTO(链接时优化)时,Rust的性能略好(我观察到增加了8%)

Multi-threaded (Rayon threads set to 2)
LTO enabled

* Rustface *
samples (ms): 787,789,795,795,787,785,791,799,795,788
mean (ms): 791.1
stddev (ms): 4.39

使用示例

extern crate rustface;

use rustface::{Detector, FaceInfo, ImageData};

fn main() {
    let mut detector = rustface::create_detector("/path/to/model").unwrap();
    detector.set_min_face_size(20);
    detector.set_score_thresh(2.0);
    detector.set_pyramid_scale_factor(0.8);
    detector.set_slide_window_step(4, 4);
    
    let mut image = ImageData::new(bytes, width, height);
    for face in detector.detect(&mut image).into_iter() {
        // print confidence score and coordinates
        println!("found face: {:?}", face);
    }
}

如何构建

该项目是一个库crate,同时包含一个可运行的示例以供演示。

然后只需使用标准的Cargo build 命令

cargo build --release

运行演示

演示代码位于 examples/image_demo.rs 文件中。它对指定图像进行人脸检测,并将结果保存到工作目录中的文件。

运行演示的最简单方法是使用 bin/test.sh 脚本

./bin/test.sh <path-to-image>

请注意,此库使用 Rayon 框架来并行化某些计算。默认情况下,Rayon 会启动与可用的CPU(逻辑核心)数量相同的线程数。过多的线程切换可能会严重损害性能,因此强烈建议通过手动设置环境变量 RAYON_NUM_THREADS 来保持线程数较小。

# empirically found to be the sweet spot for the number of threads
export RAYON_NUM_THREADS=2
cargo run --release --example image_demo model/seeta_fd_frontal_v1.0.bin <path-to-image>

请注意,可以通过提供 --no-default-features 标志在编译时完全禁用Rayon。

待办事项

  • 当可用时,使用稳定的SIMD内建函数
  • 评估并行化的好处。编译器的改进可能已经减少了并行处理的相对好处,尤其是在运行较小图像时。尽可能简化。
  • 并行化剩余的CPU密集型循环
  • 测试(根据从原始库获取的结果,从 Detector::detect 的集成测试开始)

作者

  • Andrei Tomashpolskiy @atomashpolskiy

    原始开发者和维护者

  • Jurriaan BW @jjhbw

    贡献者和主要维护者

  • Ashley @expenses

    贡献者。添加了从OpenCV到 Image 的切换。

此库基于以下作品

  • 论文中描述的人脸检测方法:"Funnel-structured cascade for multi-view face detection with alignment awareness, Shuzhe Wu, Meina Kan, Zhenliang He, Shiguang Shan, Xilin Chen. In Neurocomputing (under review)"

  • 原始C++实现

许可证

原始SeetaFace Detection是在 BSD 2-Clause许可证 下发布的。此项目是一个派生作品,并使用与原始作品相同的许可证。

依赖项