Migration guide#
Overview#
Here you can find information about important changes in the next releases of LUNA SDK.
FishEyeEstimator#
Since v.5.13.0 method estimate
of IFishEyeEstimator
by crop and detection has been deprecated (See IFishEyeEstimator.h
).
Use estimate
by warped image instead.
Example of code (before version 5.13.0):
fsdk::FishEyeEstimation estimation;
fsdk::Result<fsdk::FSDKError> res = fishEyeEstimator->estimate(image, detection, estimation);
Example of code (from version 5.13.0):
fsdk::FishEyeEstimation estimation;
fsdk::Result<fsdk::FSDKError> res = fishEyeEstimator->estimate(warp, estimation);
v.5.6.0#
Vector2#
Since v.5.6.0, the member array
in fsdk::Vector2
has been removed. You should use the x
andy
members instead of the removed array
one.
Example of code (before version 5.6.0):
fsdk::Vector2<int> vector2;
vector2.x = 10;
vector2.y = 20;
// or
vector2.array[0] = 10;
vector2.array[1] = 20;
Example of code (from version 5.6.0):
fsdk::Vector2<int> vector2;
vector2.x = 10;
vector2.y = 20;
BlackWhiteEstimator#
Since v.5.6.0 method estimate
of IBlackWhiteEstimator
by full image has been deprecated (See IBlackWhiteEstimator.h
).
Use estimate
by warped image instead.
Example of code (before version 5.6.0):
bool isGray = false;
Result<FSDKError> res = BlackWhiteEstimator->estimate(fullImage, isGray);
Example of code (from version 5.6.0):
fsdk::ImageColorEstimation estimation;
Result<FSDKError> res = BlackWhiteEstimator->estimate(warp, estimation);
v.5.5.0#
From v.5.5.0 the default value of numThreads
(runtime.conf) was replaced by -1
. Which means that will be taken the maximum number of available threads. This number of threads is equal to according number of available processor cores.
Example of setting (before version 5.5.0):
<param name="numThreads" type="Value::Int1" x="4" />
Example of setting (from version 5.5.0):
<param name="numThreads" type="Value::Int1" x="-1" />
From v.5.5.0 the method loadFromFile(const char* path)
(See ILicense.h
) is deprecated.
The use is allowed, but can be useless.
Please use the method loadFromFile(const char* path, const fsdk::ISettingsProvider* settings)
instead.
Examples of code#
Example of code (before version 5.5.0):
const bool isLicenseFileLoadedSuccessfully = license->loadFromFile(path).isOk());
Example of code (from version 5.5.0):
auto resSettings = fsdk::createSettingsProvider("License Config Path");
if (!resSettings.isOk()) {
return -1;
}
fsdk::ISettingsProviderPtr settings = resSettings.getValue();
// Create new license from file
const bool isLicenseFileLoadedSuccessfully = license->loadFromFile(path, settings).isOk());
v.5.2.0#
From v.5.2.0 the 101 version of human descriptor is not supported, it was changed by 104. Currently, three versions are available: 102 (tracker), 103 (precise), 104 (regular). It means that all instances (such as IDescriptorExtractor
, IDescriptorMatcher
and etc.) cannot be created with the version 101.
v.5.1.0#
From version v.5.1.0 IHeadPoseEstimatorPtr
and IAGSEstimatorPtr
are deprecated.
Use IBestShotQualityEstimatorPtr
instead.
Note. AGS score thresholds are different for IAGSEstimatorPtr
and IBestShotQualityEstimatorPtr
.
Read more on the BestShotQuality estimation page.
v.5.0.0#
Objects creation#
The fsdk::acquire(...)
method for the pointer acquiring for IFaceEngine
objects is not allowed for usage starting from version 5.0.0. In addition, the types of values returned from the create
methods of IFaceEngine
were changed.
Most of the create
methods now return the following structure - fsdk::ResultValue<fsdk::FSDKError, ObjectClassPtr>
Thus it is easy to check the correctness of the result (using one of the following methods result.isOk()
or result.isError()
) and get an error (using the result.getError()
method). The result.what()
method can be used to get the text description of the error.
Examples of code#
Example of code (before version 5.0.0):
fsdk::IAttributeEstimatorPtr estimator = fsdk::acquire(faceEngine->createAttributeEstimator());
if (estimator.isNull()) {
std::cout << "Object pointer is nullptr" << std::endl;
... // process error
}
Example of code (from version 5.0.0):
fsdk::ResultValue<fsdk::FSDKError, fsdk::IAttributeEstimatorPtr> resEstimator = faceEngine->createAttributeEstimator();
if (resEstimator.isError()) {
std::cout << "Error: " << resEstimator.what() << std::endl;
... // process error
}
fsdk::IAttributeEstimatorPtr estimator = resEstimator.getValue();
Interface of ILicense#
From version v.5.0.0 we changed the interface of ILicense
.
Now all methods of this class return fsdk::Result<fsdk::FSDKError>
, fsdk::ResultValue<fsdk::FSDKError, bool>
or fsdk::ResultValue<fsdk::FSDKError, uint32_t>
instead of bool
.
Examples of code#
Example of code (before version 5.0.0):
const bool res = license->isActivated();
if (!res) {
/* error case code */
}
Example of code (from version 5.0.0):
const fsdk::ResultValue<fsdk::FSDKError, bool> result = license->isActivated();
if (result.isError()) {
/* error case code */
}
const bool value = result.getValue();
if (!value) {
/* false case code */
}
From version v.5.0.0 we changed the arguments of methods getExpirationDate
and checkFeatureId
in class ILicense
.
Now the input arguments of getExpirationDate
and checkFeatureId
is fsdk::LicenseFeature
instead of uint32_t
. And the second argument of getExpirationDate
was removed. The return value of getExpirationDate
is fsdk::ResultValue<fsdk::FSDKError, uint32_t>
.
Example of code (before version 5.0.0):
long long expDate = 0;
const bool result =
license->getExpirationDate(static_cast<uint32_t>(fsdk::LicenseFeature::Detection), expDate);
if (result == false) {
/* error case code */
}
Example of code (from version 5.0.0):
const fsdk::ResultValue<fsdk::FSDKError, uint32_t> result =
license->getExpirationDate(fsdk::LicenseFeature::Detection);
if (result.isError()) {
/* error case code */
}
const uint32_t expDate = result.getValue();
Example of code (before version 5.0.0):
const bool res = license->checkFeatureId(static_cast<uint32_t>(fsdk::LicenseFeature::Detection));
if (!res) {
/* error case code */
}
Example of code (from version 5.0.0):
const fsdk::ResultValue<fsdk::FSDKError, bool> result = license->checkFeatureId(fsdk::LicenseFeature::Detection);
if (result.isError()) {
/* error case code */
}
const bool value = result.getValue();
if (!value) {
/* false case code */
}
Interface of HumanLandmark#
From version v.5.0.0 we changed the interface of HumanLandmark
.
Now member point
doesn't store zero coordinates in the case when it is not visible.
For this purposes we added member visible
which stores true
if point is visible.
Example of code (before version 5.0.0):
if (humanLandmark.point.x == 0 && humanLandmark.point.y == 0) {
// point is not visible case code
}
else {
// point is visible case code
}
Example of code (from version 5.0.0):
if (humanLandmark.visible == false) {
// point is not visible case code
}
else {
// point is visible case code
}
Interface of IDescriptorBatch#
From version v.5.0.0 we renamed method IDescriptorBatch::getDescriptorSize()
to IDescriptorBatch::getDescriptorLength()
.
Example of code (before version 5.0.0):
uint32_t descriptorLength = descriptorBatch->getDescriptorSize();
Example of code (from version 5.0.0):
uint32_t descriptorLength = descriptorBatch->getDescriptorLength();
Interface of Detection#
From version v.5.0.0 we changed the interface of the Detection
structure.
Now all members of this structure are private and could be available through the public methods.
Example of code (before version 5.0.0):
fsdk::Detection detection = ...; // Somehow initialized detection object
fsdk::Rect rect = detection.rect; // Get the detection rect
float score = detection.score; // Get the detection score
Example of code (from version 5.0.0):
fsdk::Detection detection = ...; // Somehow initialized detection object
fsdk::Rect rect = detection.getRect(); // Get the detection rect
float score = detection.getScore(); // Get the detection score
Interface of IDetector#
From version v.5.0.0 we changed the interface of IDetector
structure.
Now method detect
returns ResultValue<FSDKError, Ref<IFaceDetectionBatch>>
instead of
ResultValue<FSDKError, Ref<IResultBatch<Face>>>
.
Example of code (before version 5.0.0):
fsdk::ResultValue<fsdk::FSDKError, fsdk::Ref<fsdk::IResultBatch<fsdk::Face>>> detectorResult = faceDetector->detect(
fsdk::Span<const fsdk::Image>(&image, 1),
fsdk::Span<const fsdk::Rect>(&imageRect, 1),
detectionsCount,
fsdk::DT_ALL);
Example of code (from version 5.0.0):
fsdk::ResultValue<fsdk::FSDKError, fsdk::Ref<fsdk::IFaceDetectionBatch>> detectorResult = faceDetector->detect(
fsdk::Span<const fsdk::Image>(&image, 1),
fsdk::Span<const fsdk::Rect>(&imageRect, 1),
detectionsCount,
fsdk::DT_ALL);
Also we changed input and output parameters of the method redetectOne
.
Now it takes Image
and Detection
instead of Face
.
And returns ResultValue<FSDKError, Face>
instead of ResultValue<FSDKError, bool>
.
Example of code (before version 5.0.0):
fsdk::ResultValue<fsdk::FSDKError, bool> redetectResult = faceDetector->redetectOne(face);
Example of code (from version 5.0.0):
fsdk::ResultValue<fsdk::FSDKError, fsdk::Face> redetectResult = faceDetector->redetectOne(image, detection);
IFaceDetectionBatch#
We added IFaceDetectionBatch
structure to replace IResultBatch<Face>
.
Example of code (before version 5.0.0):
fsdk::Ref<IResultBatch<Face>> resultBatch = ...; // Somehow get the IResultBatch<Face>
for (std::size_t i = 0; i < resultBatch->getSize(); ++i) {
fsdk::Span<fsdk::Face> faces = resultBatch->getResults(i);
for (auto& face : faces) {
const fsdk::Rect& rect = face.detection.rect;
const float score = face.detection.score;
const fsdk::Landmarks5& lm5 = face.landmarks5.value();
const fsdk::Landmarks68& lm68 = face.landmarks68.value();
// Some code which uses received objects
}
}
Example of code (from version 5.0.0):
fsdk::Ref<fsdk::IFaceDetectionBatch> faceDetectionBatch = ...; // Somehow get the IFaceDetectionBatch
for (std::size_t i = 0; i < faceDetectionBatch->getSize(); ++i) {
fsdk::Span<const fsdk::Detection> detections = faceDetectionBatch->getDetections(i);
fsdk::Span<const fsdk::Landmarks5> landmarks5 = faceDetectionBatch->getLandmarks5(i);
fsdk::Span<const fsdk::Landmarks68> landmarks68 = faceDetectionBatch->getLandmarks68(i);
for (std::size_t j = 0; j < detections.size(); ++j) {
const fsdk::Rect& rect = detections[j].getRect();
const float score = detections[j].getScore();
const fsdk::Landmarks5& lm5 = landmarks5[j];
const fsdk::Landmarks68& lm68 = landmarks68[j];
// Some code which uses received objects
}
}
Interface of IHumanDetector#
From version v.5.0.0 we changed the interface of IHumanDetector
structure.
Now method detect
returns ResultValue<FSDKError, Ref<IHumanDetectionBatch>>
instead of
ResultValue<FSDKError, Ref<IResultBatch<Human>>>
.
Example of code (before version 5.0.0):
fsdk::ResultValue<fsdk::FSDKError, fsdk::Ref<fsdk::IResultBatch<fsdk::Human>>> detectResult = humanDetector->detect(
fsdk::Span<const fsdk::Image>(&image, 1),
fsdk::Span<const fsdk::Rect>(&imageRect, 1),
detectionsCount,
fsdk::DCT_ALL);
Example of code (from version 5.0.0):
fsdk::ResultValue<fsdk::FSDKError, fsdk::Ref<fsdk::IHumanDetectionBatch>> detectResult = humanDetector->detect(
fsdk::Span<const fsdk::Image>(&image, 1),
fsdk::Span<const fsdk::Rect>(&imageRect, 1),
detectionsCount,
fsdk::HDT_ALL);
Also we changed input and output parameters of the method redetectOne
.
Now it takes Image
and Detection
instead of Human
.
And returns ResultValue<FSDKError, Human>
instead of ResultValue<FSDKError, bool>
.
Example of code (before version 5.0.0):
fsdk::ResultValue<fsdk::FSDKError, bool> redetectResult = humanDetector->redetectOne(human);
Example of code (from version 5.0.0):
fsdk::ResultValue<fsdk::FSDKError, fsdk::Human> redetectResult = humanDetector->redetectOne(image, detection);
IHumanDetectionBatch#
We added IHumanDetectionBatch
structure to replace IResultBatch<Human>
.
Example of code (before version 5.0.0):
fsdk::Ref<IResultBatch<Human>> resultBatch = ...; // Somehow get the IResultBatch<Human>
for (std::size_t i = 0; i < resultBatch->getSize(); ++i) {
fsdk::Span<fsdk::Human> humans = resultBatch->getResults(i);
for (auto& human : humans) {
const fsdk::Rect& rect = human.detection.rect;
const float score = human.detection.score;
const fsdk::Landmarks17& lm17 = face.landmarks5.value();
// Some code which uses received objects
}
}
Example of code (from version 5.0.0):
const fsdk::Ref<fsdk::IHumanDetectionBatch> humanDetectionBatch = ...; // Somehow get the IHumanDetectionBatch
for (std::size_t i = 0; i < humanDetectionBatch->getSize(); ++i) {
fsdk::Span<const fsdk::Detection> detections = humanDetectionBatch->getDetections(i);
fsdk::Span<const fsdk::HumanLandmarks17> landmarks = humanDetectionBatch->getLandmarks17(i);
for (std::size_t j = 0; j < detections.size(); ++j) {
const fsdk::Rect rect = detections[j].getRect();
const float score = detections[j].getScore();
const fsdk::HumanLandmarks17 lm17 = landmarks[j];
// Some code which uses received objects
}
}
Interface of ILivenessFlyingFaces#
From version v.5.0.0 we changed the interface of ILivenessFlyingFaces
structure.
Now both methods estimate
take Image
and Detection
instead of Face
.
Example of code (before version 5.0.0):
fsdk::LivenessFlyingFacesEstimation flyingFacesEstimation;
Result<fsdk::FSDKError> flyingFacesResult = livenessFlyingFacesEstimator->estimate(face, flyingFacesEstimation);
Example of code (from version 5.0.0):
fsdk::LivenessFlyingFacesEstimation flyingFacesEstimation;
Result<fsdk::FSDKError> flyingFacesResult = livenessFlyingFacesEstimator->estimate(
image,
detection,
flyingFacesEstimation);
Example of code (before version 5.0.0):
Result<fsdk::FSDKError> flyingFacesResult = livenessFlyingFacesEstimator->estimate(
fsdk::Span<const fsdk::Face>(&face, 1),
fsdk::Span<fsdk::LivenessFlyingFacesEstimation>(&estimation, 1));
Example of code (from version 5.0.0):
fsdk::LivenessFlyingFacesEstimation flyingFacesEstimation;
Result<fsdk::FSDKError> flyingFacesResult = livenessFlyingFacesEstimator->estimate(
fsdk::Span<const fsdk::Image>(&image, 1),
fsdk::Span<const fsdk::Detection>(&detection, 1),
fsdk::Span<fsdk::LivenessFlyingFacesEstimation>(&flyingFacesEstimation, 1));
v.3.10.1#
Detector FaceDetV3 changes#
From version 3.10.1 we changed the logic for image resizing in FaceDetV3 detector.
Now you can change the minimum and maximum sizes of the faces that will be searched in the photo from the faceengine.conf
configuration.
To get new parameter which will be identical to old setting you need to set minFaceSize
:
The old recommended
imageSize
=640 will be identical to new meaning of setting minFaceSize
=20
config->setValue("FaceDetV3::Settings", "minFaceSize", 20);
and
imageSize
=320 will be identical to new meaning of setting minFaceSize
=40
config->setValue("FaceDetV3::Settings", "minFaceSize", 40);
Detector FaceDetV1, FaceDetV2 changes#
From version 3.10.1 we changed the name of parameter minSize
to minFaceSize
in faceengine.conf
for FaceDetV1, FaceDetV2 detector types. The logic and default value for image resizing left unchanged.