This repository has been archived on 2019-09-17. You can view files and clone it, but cannot push or open issues or pull requests.
Files
research-project/src/fmri/PoolingLayerAnimation.cpp
2018-04-06 13:10:07 +02:00

46 lines
1.9 KiB
C++

#include <glog/logging.h>
#include <cmath>
#include <caffe/util/math_functions.hpp>
#include "PoolingLayerAnimation.hpp"
#include "glutils.hpp"
#include "MultiImageVisualisation.hpp"
using namespace std;
using namespace fmri;
PoolingLayerAnimation::PoolingLayerAnimation(const LayerData &prevData, const LayerData &curData,
const std::vector<float> &prevPositions,
const std::vector<float> &curPositions) :
original(loadTextureForData(prevData)),
downSampled(loadTextureForData(curData)),
startingPositions(MultiImageVisualisation::getVertices(prevPositions)),
deltas(startingPositions.size()),
textureCoordinates(MultiImageVisualisation::getTexCoords(prevPositions.size() / 3))
{
CHECK_EQ(prevPositions.size(), curPositions.size()) << "Layers should be same size. Caffe error?";
const auto downScaling = sqrt(
static_cast<float>(curData.shape()[2] * curData.shape()[3]) / (prevData.shape()[2] * prevData.shape()[3]));
const auto targetPositions = MultiImageVisualisation::getVertices(curPositions, downScaling);
caffe::caffe_sub(targetPositions.size(), targetPositions.data(), startingPositions.data(), deltas.data());
for (auto i = 0u; i < deltas.size(); i+=3) {
deltas[i] = LAYER_X_OFFSET;
}
}
void PoolingLayerAnimation::draw(float timeStep)
{
auto& vertexBuffer = animate(startingPositions, deltas, timeStep);
drawImageTiles(vertexBuffer.size() / 3, vertexBuffer.data(), textureCoordinates.data(), original, getAlpha());
}
Texture PoolingLayerAnimation::loadTextureForData(const LayerData &data)
{
CHECK_EQ(data.shape().size(), 4) << "Layer should be image-like";
CHECK_EQ(data.shape()[0], 1) << "Only single images supported";
auto channels = data.shape()[1], width = data.shape()[2], height = data.shape()[3];
return loadTexture(data.data(), width, height * channels, channels);
}