Merge pull request #26278 from Quantizs:feature-create-face-recognizer-from-buffer

Added buffer-based model loading to FaceRecognizerSF
pull/21407/merge
Alexander Smorkalov 2 months ago committed by GitHub
commit 0f234209da
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 16
      modules/objdetect/include/opencv2/objdetect/face.hpp
  2. 26
      modules/objdetect/src/face_recognize.cpp

@ -155,6 +155,22 @@ public:
* @param target_id the id of target device * @param target_id the id of target device
*/ */
CV_WRAP static Ptr<FaceRecognizerSF> create(CV_WRAP_FILE_PATH const String& model, CV_WRAP_FILE_PATH const String& config, int backend_id = 0, int target_id = 0); CV_WRAP static Ptr<FaceRecognizerSF> create(CV_WRAP_FILE_PATH const String& model, CV_WRAP_FILE_PATH const String& config, int backend_id = 0, int target_id = 0);
/**
* @brief Creates an instance of this class from a buffer containing the model weights and configuration.
* @param framework Name of the framework (ONNX, etc.)
* @param bufferModel A buffer containing the binary model weights.
* @param bufferConfig A buffer containing the network configuration.
* @param backend_id The id of the backend.
* @param target_id The id of the target device.
*
* @return A pointer to the created instance of FaceRecognizerSF.
*/
CV_WRAP static Ptr<FaceRecognizerSF> create(const String& framework,
const std::vector<uchar>& bufferModel,
const std::vector<uchar>& bufferConfig,
int backend_id = 0,
int target_id = 0);
}; };
//! @} //! @}

@ -26,6 +26,19 @@ public:
net.setPreferableBackend(backend_id); net.setPreferableBackend(backend_id);
net.setPreferableTarget(target_id); net.setPreferableTarget(target_id);
} }
FaceRecognizerSFImpl(const String& framework,
const std::vector<uchar>& bufferModel,
const std::vector<uchar>& bufferConfig,
int backend_id, int target_id)
{
net = dnn::readNet(framework, bufferModel, bufferConfig);
CV_Assert(!net.empty());
net.setPreferableBackend(backend_id);
net.setPreferableTarget(target_id);
}
void alignCrop(InputArray _src_img, InputArray _face_mat, OutputArray _aligned_img) const override void alignCrop(InputArray _src_img, InputArray _face_mat, OutputArray _aligned_img) const override
{ {
Mat face_mat = _face_mat.getMat(); Mat face_mat = _face_mat.getMat();
@ -189,4 +202,17 @@ Ptr<FaceRecognizerSF> FaceRecognizerSF::create(const String& model, const String
#endif #endif
} }
Ptr<FaceRecognizerSF> FaceRecognizerSF::create(const String& framework,
const std::vector<uchar>& bufferModel,
const std::vector<uchar>& bufferConfig,
int backend_id, int target_id)
{
#ifdef HAVE_OPENCV_DNN
return makePtr<FaceRecognizerSFImpl>(framework, bufferModel, bufferConfig, backend_id, target_id);
#else
CV_UNUSED(bufferModel); CV_UNUSED(bufferConfig); CV_UNUSED(backend_id); CV_UNUSED(target_id);
CV_Error(cv::Error::StsNotImplemented, "cv::FaceRecognizerSF requires enabled 'dnn' module");
#endif
}
} // namespace cv } // namespace cv

Loading…
Cancel
Save