123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160 |
- #![allow(clippy::type_complexity)]
- use std::io::{Read, Write};
- pub mod cli;
- pub mod model;
- pub mod ort_backend;
- pub mod yolo_result;
- pub use crate::cli::Args;
- pub use crate::model::YOLOv8;
- pub use crate::ort_backend::{Batch, OrtBackend, OrtConfig, OrtEP, YOLOTask};
- pub use crate::yolo_result::{Bbox, Embedding, Point2, YOLOResult};
- pub fn non_max_suppression(
- xs: &mut Vec<(Bbox, Option<Vec<Point2>>, Option<Vec<f32>>)>,
- iou_threshold: f32,
- ) {
- xs.sort_by(|b1, b2| b2.0.confidence().partial_cmp(&b1.0.confidence()).unwrap());
- let mut current_index = 0;
- for index in 0..xs.len() {
- let mut drop = false;
- for prev_index in 0..current_index {
- let iou = xs[prev_index].0.iou(&xs[index].0);
- if iou > iou_threshold {
- drop = true;
- break;
- }
- }
- if !drop {
- xs.swap(current_index, index);
- current_index += 1;
- }
- }
- xs.truncate(current_index);
- }
- pub fn gen_time_string(delimiter: &str) -> String {
- let offset = chrono::FixedOffset::east_opt(8 * 60 * 60).unwrap(); // Beijing
- let t_now = chrono::Utc::now().with_timezone(&offset);
- let fmt = format!(
- "%Y{}%m{}%d{}%H{}%M{}%S{}%f",
- delimiter, delimiter, delimiter, delimiter, delimiter, delimiter
- );
- t_now.format(&fmt).to_string()
- }
- pub const SKELETON: [(usize, usize); 16] = [
- (0, 1),
- (0, 2),
- (1, 3),
- (2, 4),
- (5, 6),
- (5, 11),
- (6, 12),
- (11, 12),
- (5, 7),
- (6, 8),
- (7, 9),
- (8, 10),
- (11, 13),
- (12, 14),
- (13, 15),
- (14, 16),
- ];
- pub fn check_font(font: &str) -> rusttype::Font<'static> {
- // check then load font
- // ultralytics font path
- let font_path_config = match dirs::config_dir() {
- Some(mut d) => {
- d.push("Ultralytics");
- d.push(font);
- d
- }
- None => panic!("Unsupported operating system. Now support Linux, MacOS, Windows."),
- };
- // current font path
- let font_path_current = std::path::PathBuf::from(font);
- // check font
- let font_path = if font_path_config.exists() {
- font_path_config
- } else if font_path_current.exists() {
- font_path_current
- } else {
- println!("Downloading font...");
- let source_url = "https://ultralytics.com/assets/Arial.ttf";
- let resp = ureq::get(source_url)
- .timeout(std::time::Duration::from_secs(500))
- .call()
- .unwrap_or_else(|err| panic!("> Failed to download font: {source_url}: {err:?}"));
- // read to buffer
- let mut buffer = vec![];
- let total_size = resp
- .header("Content-Length")
- .and_then(|s| s.parse::<u64>().ok())
- .unwrap();
- let _reader = resp
- .into_reader()
- .take(total_size)
- .read_to_end(&mut buffer)
- .unwrap();
- // save
- let _path = std::fs::File::create(font).unwrap();
- let mut writer = std::io::BufWriter::new(_path);
- writer.write_all(&buffer).unwrap();
- println!("Font saved at: {:?}", font_path_current.display());
- font_path_current
- };
- // load font
- let buffer = std::fs::read(font_path).unwrap();
- rusttype::Font::try_from_vec(buffer).unwrap()
- }
- use ab_glyph::FontArc;
- pub fn load_font() -> FontArc {
- use std::path::Path;
- let font_path = Path::new("./font/Arial.ttf");
- match font_path.try_exists() {
- Ok(true) => {
- let buffer = std::fs::read(font_path).unwrap();
- FontArc::try_from_vec(buffer).unwrap()
- }
- Ok(false) => {
- std::fs::create_dir_all("./font").unwrap();
- println!("Downloading font...");
- let source_url = "https://ultralytics.com/assets/Arial.ttf";
- let resp = ureq::get(source_url)
- .timeout(std::time::Duration::from_secs(500))
- .call()
- .unwrap_or_else(|err| panic!("> Failed to download font: {source_url}: {err:?}"));
- // read to buffer
- let mut buffer = vec![];
- let total_size = resp
- .header("Content-Length")
- .and_then(|s| s.parse::<u64>().ok())
- .unwrap();
- let _reader = resp
- .into_reader()
- .take(total_size)
- .read_to_end(&mut buffer)
- .unwrap();
- // save
- let mut fd = std::fs::File::create(font_path).unwrap();
- fd.write_all(&buffer).unwrap();
- println!("Font saved at: {:?}", font_path.display());
- FontArc::try_from_vec(buffer).unwrap()
- }
- Err(e) => {
- panic!("Failed to load font {}", e);
- }
- }
- }
|