SeetaFace detection library for the Rust programming language
Example of demo program output
* **[SEETAFACE C++](https://github.com/seetaface/SeetaFaceEngine/tree/master/FaceDetection)** – Github repository for the original library * **[PYTHON BINDINGS](https://github.com/torchbox/rustface-py)** – call Rustface from Python code * **[LICENSE](https://github.com/atomashpolskiy/rustface/blob/master/LICENSE)** – licensed under permissive BSD 2-Clause ## About SeetaFace Detection is an implementation of Funnel-Structured cascade, which is designed for **real-time** multi-view face detection. FuSt aims at a good trade-off between accuracy and speed by using a coarse-to-fine structure. It consists of multiple view-specific fast LAB cascade classifiers at early stages, followed by coarse Multilayer Perceptron (MLP) cascades at later stages. The final stage is one unified fine MLP cascade, processing all proposed windows in a centralized style. [Read more...](https://github.com/seetaface/SeetaFaceEngine/tree/master/FaceDetection#seetaface-detection) ## Performance You can run the criterion benchmarks using `cargo bench`. ### Using nightly Rust The `nightly` branch contains a slightly (~20%) faster version of rustface. This speedup is made possible by using explicit SIMD intrinsics. If you want to use this branch, you need an older nightly toolchain. ``` rustup toolchain install nightly-2018-01-15 rustup default nightly-2018-01-15 ``` Regarding the performance of the `nightly` branch: crude manual benchmarking showed that this nightly Rust version of SeetaFace is _slightly faster_ than the original C++ version. In this particular test the Rust version has been **4% faster on average** than its C++ counterpart. When using multiple threads and enabling LTO (link-time optimization), Rust performance is a tad better (I observe a **8% boost**): ``` 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 ``` ## Usage example ```rust 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); } } ``` ## How to build The project is a library crate and also contains a runnable example for demonstration purposes. Then just use the standard Cargo `build` command: ``` cargo build --release ``` ## Run demo Code for the demo is located in `examples/image_demo.rs` file. It performs face detection for a given image and saves the result into a file in the working directory. The simplest way to run the demo is to use the `bin/test.sh` script: ``` ./bin/test.sh