Skip to content

Commit

Permalink
[feature] Make FeatureExtractorViewJob public for further usage
Browse files Browse the repository at this point in the history
  • Loading branch information
mokibit authored and p12tic committed Oct 8, 2022
1 parent 92e5acd commit 82533b0
Show file tree
Hide file tree
Showing 2 changed files with 91 additions and 68 deletions.
98 changes: 34 additions & 64 deletions src/aliceVision/feature/FeatureExtractor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,64 +16,37 @@ namespace fs = boost::filesystem;
namespace aliceVision {
namespace feature {

struct FeatureExtractor::ViewJob
{
const sfmData::View& view;
std::size_t memoryConsuption = 0;
std::string outputBasename;
std::vector<std::size_t> cpuImageDescriberIndexes;
std::vector<std::size_t> gpuImageDescriberIndexes;

ViewJob(const sfmData::View& view,
const std::string& outputFolder) :
view(view),
outputBasename(fs::path(fs::path(outputFolder) / fs::path(std::to_string(view.getViewId()))).string())
{}

~ViewJob() = default;

bool useGPU() const
{
return !gpuImageDescriberIndexes.empty();
}

bool useCPU() const
{
return !cpuImageDescriberIndexes.empty();
}
FeatureExtractorViewJob::FeatureExtractorViewJob(const sfmData::View& view,
const std::string& outputFolder) :
_view(view),
_outputBasename(fs::path(fs::path(outputFolder) / fs::path(std::to_string(view.getViewId()))).string())
{}

std::string getFeaturesPath(feature::EImageDescriberType imageDescriberType) const
{
return outputBasename + "." + EImageDescriberType_enumToString(imageDescriberType) + ".feat";
}
FeatureExtractorViewJob::~FeatureExtractorViewJob() = default;

std::string getDescriptorPath(feature::EImageDescriberType imageDescriberType) const
void FeatureExtractorViewJob::setImageDescribers(
const std::vector<std::shared_ptr<feature::ImageDescriber>>& imageDescribers)
{
for (std::size_t i = 0; i < imageDescribers.size(); ++i)
{
return outputBasename + "." + EImageDescriberType_enumToString(imageDescriberType) + ".desc";
}
const std::shared_ptr<feature::ImageDescriber>& imageDescriber = imageDescribers.at(i);
feature::EImageDescriberType imageDescriberType = imageDescriber->getDescriberType();

void setImageDescribers(const std::vector<std::shared_ptr<feature::ImageDescriber>>& imageDescribers)
{
for (std::size_t i = 0; i < imageDescribers.size(); ++i)
if (fs::exists(getFeaturesPath(imageDescriberType)) &&
fs::exists(getDescriptorPath(imageDescriberType)))
{
const std::shared_ptr<feature::ImageDescriber>& imageDescriber = imageDescribers.at(i);
feature::EImageDescriberType imageDescriberType = imageDescriber->getDescriberType();

if (fs::exists(getFeaturesPath(imageDescriberType)) &&
fs::exists(getDescriptorPath(imageDescriberType)))
{
continue;
}
continue;
}

memoryConsuption += imageDescriber->getMemoryConsumption(view.getWidth(), view.getHeight());
_memoryConsuption += imageDescriber->getMemoryConsumption(_view.getWidth(),
_view.getHeight());

if(imageDescriber->useCuda())
gpuImageDescriberIndexes.push_back(i);
else
cpuImageDescriberIndexes.push_back(i);
}
if(imageDescriber->useCuda())
_gpuImageDescriberIndexes.push_back(i);
else
_cpuImageDescriberIndexes.push_back(i);
}
};
}


FeatureExtractor::FeatureExtractor(const sfmData::SfMData& sfmData) :
Expand All @@ -98,16 +71,16 @@ void FeatureExtractor::process()

std::size_t jobMaxMemoryConsuption = 0;

std::vector<ViewJob> cpuJobs;
std::vector<ViewJob> gpuJobs;
std::vector<FeatureExtractorViewJob> cpuJobs;
std::vector<FeatureExtractorViewJob> gpuJobs;

for (auto it = itViewBegin; it != itViewEnd; ++it)
{
const sfmData::View& view = *(it->second.get());
ViewJob viewJob(view, _outputFolder);
FeatureExtractorViewJob viewJob(view, _outputFolder);

viewJob.setImageDescribers(_imageDescribers);
jobMaxMemoryConsuption = std::max(jobMaxMemoryConsuption, viewJob.memoryConsuption);
jobMaxMemoryConsuption = std::max(jobMaxMemoryConsuption, viewJob.memoryConsuption());

if (viewJob.useCPU())
cpuJobs.push_back(viewJob);
Expand Down Expand Up @@ -193,21 +166,21 @@ void FeatureExtractor::process()
}
}

void FeatureExtractor::computeViewJob(const ViewJob& job, bool useGPU)
void FeatureExtractor::computeViewJob(const FeatureExtractorViewJob& job, bool useGPU)
{
image::Image<float> imageGrayFloat;
image::Image<unsigned char> imageGrayUChar;
image::Image<unsigned char> mask;

image::readImage(job.view.getImagePath(), imageGrayFloat, image::EImageColorSpace::SRGB);
image::readImage(job.view().getImagePath(), imageGrayFloat, image::EImageColorSpace::SRGB);

if (!_masksFolder.empty() && fs::exists(_masksFolder))
{
const auto masksFolder = fs::path(_masksFolder);
const auto idMaskPath = masksFolder /
fs::path(std::to_string(job.view.getViewId())).replace_extension("png");
fs::path(std::to_string(job.view().getViewId())).replace_extension("png");
const auto nameMaskPath = masksFolder /
fs::path(job.view.getImagePath()).filename().replace_extension("png");
fs::path(job.view().getImagePath()).filename().replace_extension("png");

if (fs::exists(idMaskPath))
{
Expand All @@ -219,10 +192,7 @@ void FeatureExtractor::computeViewJob(const ViewJob& job, bool useGPU)
}
}

const auto imageDescriberIndexes = useGPU ? job.gpuImageDescriberIndexes
: job.cpuImageDescriberIndexes;

for (const auto & imageDescriberIndex : imageDescriberIndexes)
for (const auto & imageDescriberIndex : job.imageDescriberIndexes(useGPU))
{
const auto& imageDescriber = _imageDescribers.at(imageDescriberIndex);
const feature::EImageDescriberType imageDescriberType = imageDescriber->getDescriberType();
Expand All @@ -231,7 +201,7 @@ void FeatureExtractor::computeViewJob(const ViewJob& job, bool useGPU)

// Compute features and descriptors and export them to files
ALICEVISION_LOG_INFO("Extracting " << imageDescriberTypeName << " features from view '"
<< job.view.getImagePath() << "' " << (useGPU ? "[gpu]" : "[cpu]"));
<< job.view().getImagePath() << "' " << (useGPU ? "[gpu]" : "[cpu]"));

std::unique_ptr<feature::Regions> regions;
if (imageDescriber->useFloatImage())
Expand Down Expand Up @@ -281,7 +251,7 @@ void FeatureExtractor::computeViewJob(const ViewJob& job, bool useGPU)
job.getDescriptorPath(imageDescriberType));
ALICEVISION_LOG_INFO(std::left << std::setw(6) << " " << regions->RegionCount() << " "
<< imageDescriberTypeName << " features extracted from view '"
<< job.view.getImagePath() << "'");
<< job.view().getImagePath() << "'");
}
}

Expand Down
61 changes: 57 additions & 4 deletions src/aliceVision/feature/FeatureExtractor.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,64 @@
namespace aliceVision {
namespace feature {

class FeatureExtractor
class FeatureExtractorViewJob
{
struct ViewJob;
public:
FeatureExtractorViewJob(const sfmData::View& view,
const std::string& outputFolder);

~FeatureExtractorViewJob();

bool useGPU() const
{
return !_gpuImageDescriberIndexes.empty();
}

bool useCPU() const
{
return !_cpuImageDescriberIndexes.empty();
}

std::string getFeaturesPath(feature::EImageDescriberType imageDescriberType) const
{
return _outputBasename + "." + EImageDescriberType_enumToString(imageDescriberType) + ".feat";
}

std::string getDescriptorPath(feature::EImageDescriberType imageDescriberType) const
{
return _outputBasename + "." + EImageDescriberType_enumToString(imageDescriberType) + ".desc";
}

void setImageDescribers(
const std::vector<std::shared_ptr<feature::ImageDescriber>>& imageDescribers);

public:
const sfmData::View& view() const
{
return _view;
}

std::size_t memoryConsuption() const
{
return _memoryConsuption;
}

const std::vector<std::size_t>& imageDescriberIndexes(bool useGPU) const
{
return useGPU ? _gpuImageDescriberIndexes
: _cpuImageDescriberIndexes;
}

private:
const sfmData::View& _view;
std::size_t _memoryConsuption = 0;
std::string _outputBasename;
std::vector<std::size_t> _cpuImageDescriberIndexes;
std::vector<std::size_t> _gpuImageDescriberIndexes;
};

class FeatureExtractor
{
public:

explicit FeatureExtractor(const sfmData::SfMData& sfmData);
~FeatureExtractor();
Expand Down Expand Up @@ -50,7 +103,7 @@ class FeatureExtractor

private:

void computeViewJob(const ViewJob& job, bool useGPU);
void computeViewJob(const FeatureExtractorViewJob& job, bool useGPU);

const sfmData::SfMData& _sfmData;
std::vector<std::shared_ptr<feature::ImageDescriber>> _imageDescribers;
Expand Down

0 comments on commit 82533b0

Please sign in to comment.