void flip_2d_data_sampler_transformer::transform(
		const void * data,
		void * data_transformed,
		neuron_data_type::input_type type,
		const layer_configuration_specific& original_config,
		unsigned int sample_id)
	{
		if (type != neuron_data_type::type_byte)
			throw neural_network_exception("flip_2d_data_sampler_transformer is implemented for data stored as bytes only");

		if (original_config.dimension_sizes.size() != 2)
			throw neural_network_exception((boost::format("flip_2d_data_sampler_transformer is processing 2d data only, data is passed with number of dimensions %1%") % original_config.dimension_sizes.size()).str());

		unsigned int neuron_count_per_feature_map = original_config.get_neuron_count_per_feature_map();
		for(unsigned int feature_map_id = 0; feature_map_id < original_config.feature_map_count; ++feature_map_id)
		{
			cv::Mat1b src_image(static_cast<int>(original_config.dimension_sizes[1]), static_cast<int>(original_config.dimension_sizes[0]), const_cast<unsigned char *>(static_cast<const unsigned char *>(data)) + (neuron_count_per_feature_map * feature_map_id));
			cv::Mat1b image(static_cast<int>(original_config.dimension_sizes[1]), static_cast<int>(original_config.dimension_sizes[0]), static_cast<unsigned char *>(data_transformed) + (neuron_count_per_feature_map * feature_map_id));
			memcpy(
				((unsigned char *)data_transformed) + neuron_count_per_feature_map * feature_map_id,
				((unsigned char *)data) + neuron_count_per_feature_map * feature_map_id,
				neuron_count_per_feature_map * neuron_data_type::get_input_size(type));

			if (sample_id == 1)
			{
				data_transformer_util::flip(
					image,
					(flip_around_dimension_id == 0),
					(flip_around_dimension_id == 1));
			}
		}
	}
Exemplo n.º 2
0
static bool ExportAllVisibleLayersAsImage(const char* filename, sTileset& tileset, std::vector<sLayer> layers)
{
  if (!(layers.size() >= 1))
    return false;
  
  int tile_width  = tileset.GetTileWidth();
  int tile_height = tileset.GetTileHeight();
  int dest_image_width = 0;
  int dest_image_height = 0;
  unsigned int i;

  // find the size of the image we're going to create
  for (i = 0; i < layers.size(); i++) {
    if (layers[i].GetWidth() * tile_width > dest_image_width) {
      dest_image_width = layers[i].GetWidth() * tile_width;
    }
    if (layers[i].GetHeight() * tile_height > dest_image_height) {
      dest_image_height = layers[i].GetHeight() * tile_height;
    }
  }
  if (dest_image_width <= 0 || dest_image_height <= 0)
    return false;
  // create destination/output image
  CImage32 dest_image(dest_image_width, dest_image_height);
  if (layers.size() > 0) { // start from the bottom and work our way to the top ;)
    if (!LayerToImage(&dest_image, layers[0], tileset)) {
      return false;
    }
  }
  else // nothing to export
    return false;
  // we already have the first layer, now we do the rest
  for (i = 1; i < layers.size(); i++) {
    int image_width  = layers[i].GetWidth()  * tile_width;
    int image_height = layers[i].GetHeight() * tile_height;
    CImage32 src_image(image_width, image_height);
    
    if ( !LayerToImage(&src_image, layers[i], tileset) ) {
      return false;
    }
    else {
      // blend (dest_image, src_image)
      BlendImage(dest_image_width, dest_image_height, image_width, image_height, dest_image.GetPixels(), src_image.GetPixels());
    }
  }
 
  return dest_image.Save(filename);
}
Exemplo n.º 3
0
int resize_with_halide()
{
    Halide::ImageParam input {Halide::type_of<uint8_t>(), 3};
    
    //_/_/_/ load a source image and repeat its edges
    
    Halide::Func src_image {};
    src_image = Halide::BoundaryConditions::repeat_edge(input);
    
    //_/_/_/ describe algorithm
    Halide::Param<float> src_rows {};
    Halide::Param<float> src_cols {};
    Halide::Param<float> dst_rows {};
    Halide::Param<float> dst_cols {};
    
//    const float sc = 500.0f/4999;//static_cast<float>(src_cols.get()) / dst_cols.get();
//    const float sr = 350.0f/3499;//static_cast<float>(src_rows.get()) / dst_rows.get();
    const auto sc = src_cols / dst_cols;
    const auto sr = src_rows / dst_rows;

    Halide::Var i {};
    Halide::Var j {};
    Halide::Var c {};
    
    auto fj = j * sr;
    auto cj0 = Halide::cast<int>(fj);
    auto cj1 = cj0 + 1;
    auto dj = fj - cj0;
    
    auto fi = i * sc;
    auto ci0 = Halide::cast<int>(fi);
    auto ci1 = ci0 + 1;
    auto di = fi - ci0;
    
    const auto c0 = (1.0f - dj) * (1.0f - di);
    const auto c1 = (1.0f - dj) * di;
    const auto c2 = dj * (1.0f - di);
    const auto c3 = dj * di;

    const auto& src_pixel0 = src_image(ci0, cj0, c);
    const auto& src_pixel1 = src_image(ci1, cj0, c);
    const auto& src_pixel2 = src_image(ci0, cj1, c);
    const auto& src_pixel3 = src_image(ci1, cj1, c);

    Halide::Func resize {};
    resize(i, j, c) = Halide::saturating_cast<uint8_t>(c0 * src_pixel0 + c1 * src_pixel1 + c2 * src_pixel2 + c3 * src_pixel3);

    //_/_/_/ describe scheduling
    
    Halide::Var i_inner, j_inner;
    auto x_vector_size = 64;
    resize.compute_root();
    resize.tile(i, j, i_inner, j_inner, x_vector_size, 4).vectorize(i_inner, 16).parallel(j);

    //_/_/_/ save a static library
    const auto path = "/Users/kumada/Projects/cct_blog/halide/sample_4/sample_4/resize";
    resize.compile_to_static_library(
        path,
        {input, src_rows, src_cols, dst_rows, dst_cols},
        "resize");
    
    return 1;
}