2 #include "../core/GLFilter.h" 3 #include "../core/GLImage.h" 4 #include "../core/ImageAllocator.h" 6 #include "caffe2/core/operator.h" 7 #include "caffe2/core/timer.h" 25 std::vector<binding*>({BINDING(inputData),
38 static const char* fragment_shader;
43 const char* GLNormPlanarYUV::fragment_shader = R
"GLSL(#version 300 es 45 precision mediump float; 46 precision mediump int; 48 in highp vec2 v_texCoord; 50 uniform ivec2 outputSize; 51 uniform vec4 mean_data; 52 uniform vec4 std_data; 54 TEXTURE_INPUT(inputData); 55 TEXTURE_OUTPUT(0, outputData); 58 ivec2 texelCoord = ivec2(v_texCoord * vec2(outputSize)); 59 vec4 value = TEXTURE_LOAD(inputData, texelCoord); 60 outputData = TEXTURE_STORE((value - mean_data) / std_data); 68 int num_images = input_images.size();
69 for (
int i = 0; i < num_images; i++) {
72 int input_slices = input_image->slices;
73 int output_slices = output_image->slices;
75 for (
int is = 0; is < input_slices; is++) {
77 std::vector<texture_attachment> input_attachments({{input_image->textures[is], inputData}});
79 run(input_attachments,
80 {output_image->textures.begin() + is, output_image->textures.begin() + is + 1},
82 glUniform2i(outputSize->location, output_image->width, output_image->height);
83 glUniform4f(mean_data->location, mean[0], mean[1], mean[2], 0.0);
84 glUniform4f(std_data->location,
std[0],
std[1],
std[2], 1.0);
87 output_image->height);
98 order_(StringToStorageOrder(OperatorBase::GetSingleArgument<string>(
"order",
"NCHW"))) {
99 OPERATOR_NEEDS_FEATURE(this->order_ == StorageOrder::NCHW,
"OpenGL only supports NCHW order.");
102 bool RunOnDevice()
override {
103 const GLImageVector<T>& input = Inputs()[0]->template Get<GLImageVector<T>>();
104 const int num_images = input.size();
105 const int input_channels = input.channels();
106 const int input_width = input.width();
107 const int input_height = input.height();
109 const int output_channels = input_channels;
110 const int output_width = input_width;
111 const int output_height = input_height;
113 int is_last = OperatorBase::GetSingleArgument<int>(
"is_last", 0);
116 num_images, output_width, output_height, output_channels, is_last);
118 const auto& M = Input(1);
119 const auto& S = Input(2);
120 CAFFE_ENFORCE(input_channels == M.dim(1));
121 CAFFE_ENFORCE(input_channels == S.dim(1));
123 if (!_normPlanarYUV) {
124 _normPlanarYUV.reset(
new GLNormPlanarYUV(M.template data<float>(), S.template data<float>()));
127 _normPlanarYUV->normalize(input, *output);
129 Outputs()[0]->Reset(output);
136 std::unique_ptr<GLNormPlanarYUV> _normPlanarYUV;
140 OPERATOR_SCHEMA(OpenGLNormalizePlanarYUV).NumInputs(3).NumOutputs(1);
Workspace is a class that holds all the related objects created during runtime: (1) all blobs...
A global dictionary that holds information about what Caffe2 modules have been loaded in the current ...