每个任务有三种类型:XxxBuilder
、Xxx
、XxxSession
。(Xxx
是任务名称)
XxxBuilder
用于创建任务实例Xxx
,有多个选项可设置。
示例:使用ImageClassifierBuilder
构建ImageClassifier
任务。
let classifier = ImageClassifierBuilder::new()
.max_results(3) // 设置最大结果数
.category_deny_list(vec!["denied label".into()]) // 设置拒绝列表
.gpu() // 设置运行设备
.build_from_file(model_path)?; // 创建图像分类器
Xxx
是任务实例,包含任务信息和模型信息。
示例:使用ImageClassifier
创建新的ImageClassifierSession
let classifier_session = classifier.new_session()?;
XxxSession
是执行预处理、推理和后处理的运行会话,有缓冲区存储中间结果。
示例:使用ImageClassifierSession
运行图像分类任务并返回分类结果:
let classification_result = classifier_session.classify(&image::open(img_path)?)?;
注意:可重复使用会话以提高速度,如果代码只使用会话一次,可以使用任务的包装函数来简化。
// let classifier_session = classifier.new_session()?;
// let classification_result = classifier_session.classify(&image::open(img_path)?)?;
// 上面两行代码等同于:
let classification_result = classifier.classify(&image::open(img_path)?)?;
GestureRecognizerBuilder
-> GestureRecognizer
-> GestureRecognizerSession
HandDetectorBuilder
-> HandDetector
-> HandDetectorSession
ImageClassifierBuilder
-> ImageClassifier
-> ImageClassifierSession
ImageEmbedderBuilder
-> ImageEmbedder
-> ImageEmbedderSession
ImageSegmenterBuilder
-> ImageSegmenter
-> ImageSegmenterSession
ObjectDetectorBuilder
-> ObjectDetector
-> ObjectDetectorSession
AudioClassifierBuilder
-> AudioClassifier
-> AudioClassifierSession
TextClassifierBuilder
-> TextClassifier
-> TextClassifierSession
use mediapipe_rs::tasks::vision::ImageClassifierBuilder; fn main() -> Result<(), Box<dyn std::error::Error>> { let (model_path, img_path) = parse_args()?; let classification_result = ImageClassifierBuilder::new() .max_results(3) // 设置最大结果数 .build_from_file(model_path)? // 创建图像分类器 .classify(&image::open(img_path)?)?; // 执行推理并生成结果 // 显示格式化的结果信息 println!("{}", classification_result); Ok(()) }
示例输入:(图像下载自 https://yellow-cdn.veclightyear.com/835a84d5/eda7dfa2-8039-406e-84ff-c1b833fff26b.jpg)
<img height="30%" src="https://yellow-cdn.veclightyear.com/835a84d5/eda7dfa2-8039-406e-84ff-c1b833fff26b.jpg" width="30%" alt="burger.jpg" />控制台示例输出:
$ cargo run --release --example image_classification -- ./assets/models/image_classification/efficientnet_lite0_fp32.tflite ./assets/testdata/img/burger.jpg 已完成 release [优化] 目标在 0.01 秒内 运行 `/mediapipe-rs/./scripts/wasmedge-runner.sh target/wasm32-wasi/release/examples/image_classification.wasm ./assets/models/image_classification/efficientnet_lite0_fp32.tflite ./assets/testdata/img/burger.jpg` 分类结果: 分类 #0: 类别 #0: 类别名称: "芝士汉堡" 显示名称: 无 得分: 0.70625573 索引: 933
use mediapipe_rs::postprocess::utils::draw_detection; use mediapipe_rs::tasks::vision::ObjectDetectorBuilder; fn main() -> Result<(), Box<dyn std::error::Error>> { let (model_path, img_path, output_path) = parse_args()?; let mut input_img = image::open(img_path)?; let detection_result = ObjectDetectorBuilder::new() .max_results(2) // 设置最大结果数 .build_from_file(model_path)? // 创建物体检测器 .detect(&input_img)?; // 进行推理并生成结果 // 显示格式化的结果信息 println!("{}", detection_result); if let Some(output_path) = output_path { // 在图像上绘制检测结果 draw_detection(&mut input_img, &detection_result); // 保存输出图像 input_img.save(output_path)?; } Ok(()) }
示例输入:(图片下载自 https://yellow-cdn.veclightyear.com/835a84d5/3c8fc365-b65d-4b4e-a71e-2c840b48416b.jpg)
<img alt="cat_and_dog.jpg" height="30%" src="https://yellow-cdn.veclightyear.com/835a84d5/3c8fc365-b65d-4b4e-a71e-2c840b48416b.jpg" width="30%"/>控制台输出示例:
$ cargo run --release --example object_detection -- ./assets/models/object_detection/efficientdet_lite0_fp32.tflite ./assets/testdata/img/cat_and_dog.jpg 已完成 release [优化] 目标在 0.00 秒内 运行 `/mediapipe-rs/./scripts/wasmedge-runner.sh target/wasm32-wasi/release/examples/object_detection.wasm ./assets/models/object_detection/efficientdet_lite0_fp32.tflite ./assets/testdata/img/cat_and_dog.jpg` 检测结果: 检测 #0: 边界框: (左: 0.12283102, 上: 0.38476586, 右: 0.51069236, 下: 0.851197) 类别 #0: 类别名称: "猫" 显示名称: 无 得分: 0.8460574 索引: 16 检测 #1: 边界框: (左: 0.47926134, 上: 0.06873521, 右: 0.8711677, 下: 0.87927735) 类别 #0: 类别名称: "狗" 显示名称: 无 得分: 0.8375256 索引: 17
输出示例: <img height="30%" src="https://yellow-cdn.veclightyear.com/835a84d5/12f24475-02f5-4b61-9441-49e726ab4b4f.jpg" width="30%"/>
fn main() -> Result<(), Box<dyn std::error::Error>> { let model_path = parse_args()?; let text_classifier = TextClassifierBuilder::new() .max_results(1) // 设置最大结果数 .build_from_file(model_path)?; // 创建文本分类器 let positive_str = "我非常喜欢编程!"; let negative_str = "我不喜欢下雨。"; // 分类并显示格式化的结果信息 let result = text_classifier.classify(&positive_str)?; println!("`{}` -- {}", positive_str, result); let result = text_classifier.classify(&negative_str)?; println!("`{}` -- {}", negative_str, result); Ok(()) }
控制台输出示例(使用 bert 模型):
$ cargo run --release --example text_classification -- ./assets/models/text_classification/bert_text_classifier.tflite 已完成 release [优化] 目标在 0.01 秒内 运行 `/mediapipe-rs/./scripts/wasmedge-runner.sh target/wasm32-wasi/release/examples/text_classification.wasm ./assets/models/text_classification/bert_text_classifier.tflite` `我非常喜欢编程!` -- 分类结果: 分类 #0: 类别 #0: 类别名称: "积极" 显示名称: 无 得分: 0.99990463 索引: 1 `我不喜欢下雨。` -- 分类结果: 分类 #0: 类别 #0: 类别名称: "消极" 显示名称: 无 得分: 0.99541473 索引: 0
use mediapipe_rs::tasks::vision::GestureRecognizerBuilder; fn main() -> Result<(), Box<dyn std::error::Error>> { let (model_path, img_path) = parse_args()?; let gesture_recognition_results = GestureRecognizerBuilder::new() .num_hands(1) // 设置只识别一只手 .max_results(1) // 设置最大结果数 .build_from_file(model_path)? // 创建任务实例 .recognize(&image::open(img_path)?)?; // 进行推理并生成结果 for g in gesture_recognition_results { println!("{}", g.gestures.classifications[0].categories[0]); } Ok(()) }
示例输入:(图片下载自 https://yellow-cdn.veclightyear.com/835a84d5/f3e27d24-b3d5-452a-83a3-3474a4e6b18a.jpg)
<img alt="victory.jpg" height="30%" src="https://yellow-cdn.veclightyear.com/835a84d5/f3e27d24-b3d5-452a-83a3-3474a4e6b18a.jpg" width="30%"/>控制台输出示例:
$ cargo run --release --example gesture_recognition -- ./assets/models/gesture_recognition/gesture_recognizer.task ./assets/testdata/img/gesture_recognition_google_samples/victory.jpg Finished release [optimized] target(s) in 0.02s Running `/mediapipe-rs/./scripts/wasmedge-runner.sh target/wasm32-wasi/release/examples/gesture_recognition.wasm ./assets/models/gesture_recognition/gesture_recognizer.task ./assets/testdata/img/gesture_recognition_google_samples/victory.jpg` 类别名称: "Victory" 显示名称: None 得分: 0.9322255 索引: 6
任何实现了AudioData
特征的音频媒体都可以作为音频任务的输入。
目前,该库内置了支持symphonia
、ffmpeg
和原始音频数据作为输入的实现。
音频分类示例:
use mediapipe_rs::tasks::audio::AudioClassifierBuilder; #[cfg(feature = "ffmpeg")] use mediapipe_rs::preprocess::audio::FFMpegAudioData; #[cfg(not(feature = "ffmpeg"))] use mediapipe_rs::preprocess::audio::SymphoniaAudioData; #[cfg(not(feature = "ffmpeg"))] fn read_audio_using_symphonia(audio_path: String) -> SymphoniaAudioData { let file = std::fs::File::open(audio_path).unwrap(); let probed = symphonia::default::get_probe() .format( &Default::default(), symphonia::core::io::MediaSourceStream::new(Box::new(file), Default::default()), &Default::default(), &Default::default(), ) .unwrap(); let codec_params = &probed.format.default_track().unwrap().codec_params; let decoder = symphonia::default::get_codecs() .make(codec_params, &Default::default()) .unwrap(); SymphoniaAudioData::new(probed.format, decoder) } #[cfg(feature = "ffmpeg")] fn read_video_using_ffmpeg(audio_path: String) -> FFMpegAudioData { ffmpeg_next::init().unwrap(); FFMpegAudioData::new(ffmpeg_next::format::input(&audio_path.as_str()).unwrap()).unwrap() } fn main() -> Result<(), Box<dyn std::error::Error>> { let (model_path, audio_path) = parse_args()?; #[cfg(not(feature = "ffmpeg"))] let audio = read_audio_using_symphonia(audio_path); #[cfg(feature = "ffmpeg")] let audio = read_video_using_ffmpeg(audio_path); let classification_results = AudioClassifierBuilder::new() .max_results(3) // 设置最大结果数 .build_from_file(model_path)? // 创建任务实例 .classify(audio)?; // 进行推理并生成结果 // 显示格式化的结果消息 for c in classification_results { println!("{}", c); } Ok(()) }
会话包括推理会话(如TfLite解释器)、输入和输出缓冲区等。 显式使用会话可以重用这些资源以加快速度。
原始方法:
use mediapipe_rs::tasks::text::TextClassifier; use mediapipe_rs::postprocess::ClassificationResult; use mediapipe_rs::Error; fn inference( text_classifier: &TextClassifier, inputs: &Vec<String> ) -> Result<Vec<ClassificationResult>, Error> { let mut res = Vec::with_capacity(inputs.len()); for input in inputs { // text_classifier 每次都会创建新的会话 res.push(text_classifier.classify(input.as_str())?); } Ok(res) }
使用会话加速:
use mediapipe_rs::tasks::text::TextClassifier; use mediapipe_rs::postprocess::ClassificationResult; use mediapipe_rs::Error; fn inference( text_classifier: &TextClassifier, inputs: &Vec<String> ) -> Result<Vec<ClassificationResult>, Error> { let mut res = Vec::with_capacity(inputs.len()); // 只创建一个会话并重用会话中的资源 let mut session = text_classifier.new_session()?; for input in inputs { res.push(session.classify(input.as_str())?); } Ok(res) }
使用cargo构建带有ffmpeg
功能的库时,用户必须设置以下环境变量:
FFMPEG_DIR
:预构建的FFmpeg库路径。您可以从以下地址下载:
https://github.com/yanghaku/ffmpeg-wasm32-wasi/releasesWASI_SDK
或(WASI_SYSROOT
和CLANG_RT
),您可以从以下地址下载:
https://github.com/WebAssembly/wasi-sdk/releasesBINDGEN_EXTRA_CLANG_ARGS
:为libclang设置sysroot、target和函数可见性。
(sysroot必须是绝对路径)。示例:
export FFMPEG_DIR=/path/to/ffmpeg/library export WASI_SDK=/opt/wasi-sdk export BINDGEN_EXTRA_CLANG_ARGS="--sysroot=/opt/wasi-sdk/share/wasi-sysroot --target=wasm32-wasi -fvisibility=default" # 然后运行cargo
默认设备是CPU,用户可以使用API选择要使用的设备:
use mediapipe_rs::tasks::vision::ObjectDetectorBuilder; fn create_gpu(model_blob: Vec<u8>) { let detector_gpu = ObjectDetectorBuilder::new() .gpu() .build_from_buffer(model_blob) .unwrap(); } fn create_tpu(model_blob: Vec<u8>) { let detector_tpu = ObjectDetectorBuilder::new() .tpu() .build_from_buffer(model_blob) .unwrap(); }
本项目由Google在Mediapipe上的工作使之成为可能。
本项目采用Apache 2.0许可证。更多详情请参阅LICENSE。
一键生成PPT和Word,让学习生活更轻松
讯飞智文是一个利用 AI 技 术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。
深度推理能力全新升级,全面对标OpenAI o1
科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。
一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型
Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。
字节跳动发布的AI编程神器IDE
Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。
AI助力,做PPT更简单!
咔片是一款轻量化在线演示设计工具,借助 AI 技术,实现从内容生成到智能设计的一站式 PPT 制作服务。支持多种文档格式导入生成 PPT,提供海量模板、智能美化、素材替换等功能,适用于销售、教师、学生等各类人群,能高效制作出高品质 PPT,满足不同场景演示需求。
选题、配图、成文,一站式创作,让内容运营更高效
讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。
专业的AI公文写作平台,公文写作神器
AI 材料星,专业的 AI 公文写作辅助平台,为体制内工作人员提供高效的公文写作解决方案。拥有海量公文文库、9 大核心 AI 功能,支持 30 + 文稿类型生成,助力快速完成领导讲话、工作总结、述职报告等材料,提升办公效率,是体制打工人的得力写作神器。
OpenAI Agents SDK,助力开发者便捷使用 OpenAI 相关功能。
openai-agents-python 是 OpenAI 推出的一款强大 Python SDK,它为开发者提供了与 OpenAI 模型交互的高效工具,支持工具调用、结果处理、追踪等功能,涵盖多种应用场景,如研究助手、财务研究等,能显著提升开发效率,让开发者更轻松地利用 OpenAI 的技术优势。
高分辨率纹理 3D 资产生成
Hunyuan3D-2 是腾讯开发的用于 3D 资产生成的强大工具,支持从文本描述、单张图片或多视角图片生成 3D 模型,具备快速形状生成能力,可生成带纹理的高质量 3D 模型,适用于多个领域,为 3D 创作提供了高效解决方案。
一个具备存储、管理和客户端操作等多种功能的分布式文件系统相关项目。
3FS 是一个功能强大的分布式文件系统项目,涵盖了存储引擎、元数据管理、客户端工具等多个模块。它支持多种文件操作,如创建文件和目录、设置布局等,同时具备高效的事件循环、节点选择和协程池管理等特性。适用于需要大规模数据存储和管理的场景,能够提高系统的性能和可靠性,是分布式存储领域的优质解决方案。
最新AI工具、AI资讯
独家AI资源、AI项目落地
微信扫一扫关注公众号