fix: A lot of fixes relating to bounding-boxes
This commit is contained in:
@@ -62,9 +62,18 @@ pub struct FaceDetectionModelOutput {
|
||||
pub landmark: ndarray::Array3<f32>,
|
||||
}
|
||||
|
||||
/// Represents the 5 facial landmarks detected by RetinaFace
|
||||
pub struct FaceLandmarks {
|
||||
pub left_eye: Point2<f32>,
|
||||
pub right_eye: Point2<f32>,
|
||||
pub nose: Point2<f32>,
|
||||
pub left_mouth: Point2<f32>,
|
||||
pub right_mouth: Point2<f32>,
|
||||
}
|
||||
pub struct FaceDetectionProcessedOutput {
|
||||
pub bbox: Vec<Aabb2<f32>>,
|
||||
pub confidence: Vec<f32>,
|
||||
pub landmarks: Vec<FaceLandmarks>,
|
||||
}
|
||||
|
||||
impl FaceDetectionModelOutput {
|
||||
@@ -87,10 +96,12 @@ impl FaceDetectionModelOutput {
|
||||
}
|
||||
let mut boxes = Vec::new();
|
||||
let mut scores = Vec::new();
|
||||
let mut landmarks = Vec::new();
|
||||
let var0 = config.variance[0];
|
||||
let var1 = config.variance[1];
|
||||
let bbox_data = self.bbox;
|
||||
let conf_data = self.confidence;
|
||||
let landmark_data = self.landmark;
|
||||
let num_priors = bbox_data.shape()[1];
|
||||
for idx in 0..num_priors {
|
||||
let dx = bbox_data[[0, idx, 0]];
|
||||
@@ -110,11 +121,35 @@ impl FaceDetectionModelOutput {
|
||||
if score > config.threshold {
|
||||
boxes.push(Aabb2::from_x1y1x2y2(x_min, y_min, x_max, y_max));
|
||||
scores.push(score);
|
||||
|
||||
let left_eye_x = landmark_data[[0, idx, 0]] * anchor_w * var0 + anchor_cx;
|
||||
let left_eye_y = landmark_data[[0, idx, 1]] * anchor_h * var0 + anchor_cy;
|
||||
|
||||
let right_eye_x = landmark_data[[0, idx, 2]] * anchor_w * var0 + anchor_cx;
|
||||
let right_eye_y = landmark_data[[0, idx, 3]] * anchor_h * var0 + anchor_cy;
|
||||
|
||||
let nose_x = landmark_data[[0, idx, 4]] * anchor_w * var0 + anchor_cx;
|
||||
let nose_y = landmark_data[[0, idx, 5]] * anchor_h * var0 + anchor_cy;
|
||||
|
||||
let left_mouth_x = landmark_data[[0, idx, 6]] * anchor_w * var0 + anchor_cx;
|
||||
let left_mouth_y = landmark_data[[0, idx, 7]] * anchor_h * var0 + anchor_cy;
|
||||
|
||||
let right_mouth_x = landmark_data[[0, idx, 8]] * anchor_w * var0 + anchor_cx;
|
||||
let right_mouth_y = landmark_data[[0, idx, 9]] * anchor_h * var0 + anchor_cy;
|
||||
|
||||
landmarks.push(FaceLandmarks {
|
||||
left_eye: Point2::new(left_eye_x, left_eye_y),
|
||||
right_eye: Point2::new(right_eye_x, right_eye_y),
|
||||
nose: Point2::new(nose_x, nose_y),
|
||||
left_mouth: Point2::new(left_mouth_x, left_mouth_y),
|
||||
right_mouth: Point2::new(right_mouth_x, right_mouth_y),
|
||||
});
|
||||
}
|
||||
}
|
||||
Ok(FaceDetectionProcessedOutput {
|
||||
bbox: boxes,
|
||||
confidence: scores,
|
||||
landmarks,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,11 +29,11 @@ pub fn main() -> Result<()> {
|
||||
.change_context(errors::Error)
|
||||
.attach_printable("Failed to detect faces")?;
|
||||
// output.print(20);
|
||||
let aabbs = output
|
||||
let faces = output
|
||||
.postprocess(FaceDetectionConfig::default().with_threshold(detect.threshold))
|
||||
.change_context(errors::Error)
|
||||
.attach_printable("Failed to attach context")?;
|
||||
for bbox in aabbs {
|
||||
for bbox in faces.bbox {
|
||||
tracing::info!("Detected face: {:?}", bbox);
|
||||
use bounding_box::draw::*;
|
||||
let bbox = bbox
|
||||
@@ -41,7 +41,7 @@ pub fn main() -> Result<()> {
|
||||
array.shape()[1] as f32,
|
||||
array.shape()[0] as f32,
|
||||
))
|
||||
.cast()
|
||||
.try_cast()
|
||||
.ok_or(errors::Error)
|
||||
.attach_printable("Failed to cast f32 to usize")?;
|
||||
array.draw(bbox, color::palette::css::GREEN_YELLOW.to_rgba8(), 10);
|
||||
|
||||
Reference in New Issue
Block a user