nsfw
is a library for determining the not-safe-for-work-ness of images.
It is based off of GantMan's model.
Because Cargo has a size limit of 10mb, the pre-trained model cannot be included in the crate. You will need to download it from the release page or download the model yourself and convert it into ONNX
Downloading from the release page (easy)
$ gh release download -R Fyko/nsfw --pattern "model.onnx"
# or naviate to the release page and download it manually
Convering from GantMan's model
See our GitHub Workflow
[dependencies]
image = { version = "0.24.7", default-features = false, features = ["jpeg"] }
nsfw = { version = "0.1.0", default-features = false, features = ["jpeg"] }
use nsfw::{create_model, examine};
fn main() -> Result<(), Box<dyn std::error::Error>> {
let model = create_model(
include_bytes!(concat!(env!("CARGO_MANIFEST_DIR"), "/model.onnx"))
);
let image = image::open(concat!(env!("CARGO_MANIFEST_DIR"), "/might_be_porn.jpg"))?;
let result = examine(&model, &image)?;
println!("{:#?}", result);
Ok(())
}
[dependencies]
image = { version = "0.24.7", default-features = false, features = ["gif"] }
nsfw = { version = "0.1.0", default-features = false, features = ["gif"] }
use nsfw::{examine, MODEL, GifParser};
fn main() -> Result<(), Box<dyn std::error::Error>> {
let model = create_model(
include_bytes!(concat!(env!("CARGO_MANIFEST_DIR"), "/model.onnx"))
);
let path = concat!(env!("CARGO_MANIFEST_DIR"), "/might_be_porn.gif");
let file = BufReader::new(File::open(gif_path)?);
let frames = GifParser::new(GifDecoder::new(file)?, &model);
for frame in frames {
println!("{frame:#?}")
}
Ok(())
}
default
-jpeg
andpng
serde
- Enables serialization and deserialization of the model usingserde
.gif
- Enables GIF support forimage
.jpeg
- Enables JPEG support forimage
.png
- Enables PNG support forimage
.webp
- Enables WEBP support forimage
.
Name | Size | Language | Time |
---|---|---|---|
test_porn.gif | 50495726 bytes (50.49 MB) |
Rust | 22.719 seconds |
test_porn.gif | 50495726 bytes (50.49 MB) |
JavaScript | 219.96 seconds |