Deux implémentations équivalentes : Python (live.py) et Rust (yolo_live_rs/).
Les deux font la même chose : capture vidéo (webcam ou fichier), inférence ONNX,
NMS, et affichage en temps réel avec un rendu futuriste des boites.
pip install numpy onnxruntime opencv-python# Webcam (index 0)
python live.py --model weights/best.onnx --nc 80 --source 0
# Fichier vidéo
python live.py --model weights/best.onnx --nc 80 --source path/to/video.mp4
# Avec sauvegarde du flux annoté
python live.py --model weights/best.onnx --nc 80 --source 0 --output out.mp4
# Mode headless (pas d'affichage, juste sauvegarde)
python live.py --model weights/best.onnx --nc 80 --source video.mp4 \
--output out.mp4 --no-showTouches : Q ou ESC pour quitter.
- Rust toolchain (rustup)
- Sur Linux :
libv4l-dev(pourrustcvcôté caméra) et un compilateur C - ONNX Runtime sera téléchargé automatiquement à la première compilation
grâce à la feature
download-binariesdu crateort
cd yolo_live_rs
cargo build --release# Webcam
cargo run --release -- --model ../weights/best.onnx --nc 80 --source 0
# Fichier vidéo
cargo run --release -- --model ../weights/best.onnx --nc 80 --source video.mp4
# Mode headless
cargo run --release -- --model ../weights/best.onnx --nc 80 \
--source video.mp4 --no-showTouches : Q (113) ou ESC (27) pour quitter.
| Étape | Python (live.py) |
Rust (main.rs) |
|---|---|---|
| Source vidéo | cv2.VideoCapture(src) |
rustcv::VideoCapture::{new,from_file} |
| Lecture frame | cap.read() |
cap.read(&mut frame) |
| Letterbox | cv2.resize + numpy padding |
nearest-neighbor manuel sur Vec<u8> |
| Tenseur d'entrée | np.ascontiguousarray(...) |
ndarray::Array4::<f32> |
| Session ONNX | ort.InferenceSession |
ort::Session::builder() |
| Inference | session.run(...) |
session.run(ort::inputs![...]) |
| NMS | cv2.dnn.NMSBoxes (par classe) |
implé. gloutonne en Rust pur |
| Rendu | cv2.line/rectangle/putText |
manipulation directe des bytes du Mat |
| Affichage | cv2.imshow + waitKey |
rustcv::highgui::imshow + wait_key |
-
Resize : OpenCV utilise INTER_LINEAR par défaut, la version Rust fait du nearest-neighbor pour rester sans dépendance lourde. La qualité est acceptable mais peut légèrement dégrader les détections sur petits objets. Pour matcher exactement Python, ajouter
fast_image_resize = "5"auCargo.tomlet l'utiliser dansletterbox(). -
Texte :
rustcvn'expose pas (encore)cv::putText. La version Rust omet donc le label texte sur la boite et le HUD FPS. Pour les ajouter, utiliser le crateimageproc::drawing::draw_text_mutavec une police TTF chargée viarusttypeouab_glyph. -
NMS : la version Python utilise
cv2.dnn.NMSBoxes(très rapide, C++). La version Rust implémente le NMS gloutonne manuellement pour rester indépendante d'OpenCV. Sur ~100 candidats c'est négligeable. -
Sauvegarde vidéo : la version Rust ne le fait pas car
rustcvn'expose pas encoreVideoWriter. Pour ajouter, utiliser le crateopencv(binding complet) à la place derustcv, ou écrire frame par frame en PNG/JPEG et utiliserffmpegen post-process.