mirror of
https://github.com/opencv/opencv.git
synced 2024-11-25 11:40:44 +08:00
Add preprocessing warps for separate parameters
This commit is contained in:
parent
174b4ce29d
commit
a9839af903
@ -999,9 +999,14 @@ CV__DNN_INLINE_NS_BEGIN
|
||||
* Model creates net from file with trained weights and config,
|
||||
* sets preprocessing input and runs forward pass.
|
||||
*/
|
||||
class CV_EXPORTS_W Model : public Net
|
||||
class CV_EXPORTS_W_SIMPLE Model : public Net
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* @brief Default constructor.
|
||||
*/
|
||||
Model();
|
||||
|
||||
/**
|
||||
* @brief Create model from deep learning network represented in one of the supported formats.
|
||||
* An order of @p model and @p config arguments does not matter.
|
||||
@ -1020,7 +1025,7 @@ CV__DNN_INLINE_NS_BEGIN
|
||||
* @param[in] size New input size.
|
||||
* @note If shape of the new blob less than 0, then frame size not change.
|
||||
*/
|
||||
Model& setInputSize(const Size& size);
|
||||
CV_WRAP Model& setInputSize(const Size& size);
|
||||
|
||||
/** @brief Set input size for frame.
|
||||
* @param[in] width New input width.
|
||||
@ -1028,27 +1033,27 @@ CV__DNN_INLINE_NS_BEGIN
|
||||
* @note If shape of the new blob less than 0,
|
||||
* then frame size not change.
|
||||
*/
|
||||
Model& setInputSize(int width, int height);
|
||||
CV_WRAP Model& setInputSize(int width, int height);
|
||||
|
||||
/** @brief Set mean value for frame.
|
||||
* @param[in] mean Scalar with mean values which are subtracted from channels.
|
||||
*/
|
||||
Model& setInputMean(const Scalar& mean);
|
||||
CV_WRAP Model& setInputMean(const Scalar& mean);
|
||||
|
||||
/** @brief Set scalefactor value for frame.
|
||||
* @param[in] scale Multiplier for frame values.
|
||||
*/
|
||||
Model& setInputScale(double scale);
|
||||
CV_WRAP Model& setInputScale(double scale);
|
||||
|
||||
/** @brief Set flag crop for frame.
|
||||
* @param[in] crop Flag which indicates whether image will be cropped after resize or not.
|
||||
*/
|
||||
Model& setInputCrop(bool crop);
|
||||
CV_WRAP Model& setInputCrop(bool crop);
|
||||
|
||||
/** @brief Set flag swapRB for frame.
|
||||
* @param[in] swapRB Flag which indicates that swap first and last channels.
|
||||
*/
|
||||
Model& setInputSwapRB(bool swapRB);
|
||||
CV_WRAP Model& setInputSwapRB(bool swapRB);
|
||||
|
||||
/** @brief Set preprocessing parameters for frame.
|
||||
* @param[in] size New input size.
|
||||
@ -1078,7 +1083,7 @@ CV__DNN_INLINE_NS_BEGIN
|
||||
* ClassificationModel creates net from file with trained weights and config,
|
||||
* sets preprocessing input, runs forward pass and return top-1 prediction.
|
||||
*/
|
||||
class CV_EXPORTS_W ClassificationModel : public Model
|
||||
class CV_EXPORTS_W_SIMPLE ClassificationModel : public Model
|
||||
{
|
||||
public:
|
||||
/**
|
||||
@ -1111,7 +1116,7 @@ CV__DNN_INLINE_NS_BEGIN
|
||||
* sets preprocessing input, runs forward pass and return result detections.
|
||||
* For DetectionModel SSD, Faster R-CNN, YOLO topologies are supported.
|
||||
*/
|
||||
class CV_EXPORTS_W DetectionModel : public Model
|
||||
class CV_EXPORTS_W_SIMPLE DetectionModel : public Model
|
||||
{
|
||||
public:
|
||||
/**
|
||||
|
@ -138,10 +138,7 @@ class dnn_test(NewOpenCVTests):
|
||||
config = self.find_dnn_file("dnn/MobileNetSSD_deploy.prototxt")
|
||||
frame = cv.imread(img_path)
|
||||
model = cv.dnn_DetectionModel(weights, config)
|
||||
size = (300, 300)
|
||||
mean = (127.5, 127.5, 127.5)
|
||||
scale = 1.0 / 127.5
|
||||
model.setInputParams(size=size, mean=mean, scale=scale)
|
||||
model.setInputParams(size=(300, 300), mean=(127.5, 127.5, 127.5), scale=1.0/127.5)
|
||||
|
||||
iouDiff = 0.05
|
||||
confThreshold = 0.0001
|
||||
@ -164,6 +161,21 @@ class dnn_test(NewOpenCVTests):
|
||||
cv.rectangle(frame, list(box), (0, 255, 0))
|
||||
|
||||
|
||||
def test_classification_model(self):
|
||||
img_path = self.find_dnn_file("dnn/googlenet_0.png")
|
||||
weights = self.find_dnn_file("dnn/squeezenet_v1.1.caffemodel")
|
||||
config = self.find_dnn_file("dnn/squeezenet_v1.1.prototxt")
|
||||
ref = np.load(self.find_dnn_file("dnn/squeezenet_v1.1_prob.npy"))
|
||||
|
||||
frame = cv.imread(img_path)
|
||||
model = cv.dnn_ClassificationModel(config, weights)
|
||||
model.setInputSize(227, 227)
|
||||
model.setInputCrop(True)
|
||||
|
||||
out = model.predict(frame)
|
||||
normAssert(self, out, ref)
|
||||
|
||||
|
||||
def test_face_detection(self):
|
||||
testdata_required = bool(os.environ.get('OPENCV_DNN_TEST_REQUIRE_TESTDATA', False))
|
||||
proto = self.find_dnn_file('dnn/opencv_face_detector.prototxt', required=testdata_required)
|
||||
|
@ -23,7 +23,7 @@ struct Model::Impl
|
||||
Mat blob;
|
||||
std::vector<String> outNames;
|
||||
|
||||
void predict(Net& net, const Mat& frame, std::vector<Mat>& outs)
|
||||
void predict(Net& net, const Mat& frame, OutputArrayOfArrays outs)
|
||||
{
|
||||
if (size.empty())
|
||||
CV_Error(Error::StsBadSize, "Input size not specified");
|
||||
@ -41,16 +41,18 @@ struct Model::Impl
|
||||
}
|
||||
};
|
||||
|
||||
Model::Model() : impl(new Impl) {}
|
||||
|
||||
Model::Model(const String& model, const String& config)
|
||||
: Net(readNet(model, config)), impl(new Impl)
|
||||
{
|
||||
impl->outNames = getUnconnectedOutLayersNames();
|
||||
};
|
||||
}
|
||||
|
||||
Model::Model(const Net& network) : Net(network), impl(new Impl)
|
||||
{
|
||||
impl->outNames = getUnconnectedOutLayersNames();
|
||||
};
|
||||
}
|
||||
|
||||
Model& Model::setInputSize(const Size& size)
|
||||
{
|
||||
@ -100,9 +102,7 @@ void Model::setInputParams(double scale, const Size& size, const Scalar& mean,
|
||||
|
||||
void Model::predict(InputArray frame, OutputArrayOfArrays outs)
|
||||
{
|
||||
std::vector<Mat> outputs;
|
||||
outs.getMatVector(outputs);
|
||||
impl->predict(*this, frame.getMat(), outputs);
|
||||
impl->predict(*this, frame.getMat(), outs);
|
||||
}
|
||||
|
||||
ClassificationModel::ClassificationModel(const String& model, const String& config)
|
||||
|
Loading…
Reference in New Issue
Block a user