in featurizers/coarse_conv_featurizer.cpp [149:209]
vector<Feature> CoarseConvFeaturizer::featurize_reduced(
vector<char> const& data,
size_t skip_frames,
size_t combine_frames,
std::pair<size_t, size_t> const &map_size,
int32_t perspective,
bool full) const {
assert(perspective == 0 || perspective == 1);
// Map size is (ydim, xdim)
auto nBinX = (double)(map_size.second - resX) / strideX + 1;
auto nBinY = (double)(map_size.first - resY) / strideY + 1;
if (nBinX != (int)nBinX)
std::cerr << "WARNING: X dimension of " << map_size.second <<
" is not evenly tiled by kW " << resX <<
" and stride " << strideX << " because you get " << nBinX << "bins\n";
if (nBinY != (int)nBinY)
std::cerr << "WARNING: Y dimension of " << map_size.first <<
" is not evenly tiled by kW " << resY <<
" and stride " << strideY << " because you get " << nBinY << "bins\n";
vector<Feature> features;
membuf mbuf(data);
zstd::istreambuf zbuf(&mbuf);
std::istream is(&zbuf);
size_t nframes;
readPOD(nframes, is);
// Read all frames
std::vector<Reduced*> rframes;
for (auto i = 0U; i < nframes; i++) {
auto rf = read_reduced_frame(is);
if (this->until == 0 || i >= this->from) {
rframes.push_back(rf);
} else if (i >= this->until) {
break;
}
}
auto it = rframes.begin();
while (it != rframes.end()) {
auto begin = it;
auto end = std::min(it + combine_frames, rframes.end());
auto rframe = combine_reduced_frames(begin, end, perspective, full);
it = std::min(it + skip_frames, rframes.end());
// Featurize
features.emplace_back(ceil(nBinY), vector<vector<double>>(ceil(nBinX),
vector<double>(2 * feature_size, 0.0)));
featurize_reduced_frame(features.back(), rframe, perspective, full);
delete rframe;
}
// Clean up
for (size_t j = 0; j < rframes.size(); j++) {
delete rframes[j];
}
return features;
}