/// <summary> /// Get an image reader to sequentially read images from disk for training. /// </summary> /// <param name="mapFilePath">The path to the map file</param> /// <param name="imageWidth">The width to scale all images to</param> /// <param name="imageHeight">The height to scale all images to</param> /// <param name="numChannels">The number of channels to transform all images to</param> /// <param name="numClasses">The number of label classes in this training set</param> /// <param name="randomizeData">Set to true to randomize the data for training</param> /// <param name="augmentData">Set to true to use data augmentation to expand the training set</param> /// <returns>An image source ready for use in training or testing.</returns> public static CNTK.MinibatchSource GetImageReader(string mapFilePath, int imageWidth, int imageHeight, int numChannels, int numClasses, bool randomizeData, bool augmentData) { var transforms = new List <CNTK.CNTKDictionary>(); if (augmentData) { var randomSideTransform = CNTK.CNTKLib.ReaderCrop("RandomSide", new Tuple <int, int>(0, 0), new Tuple <float, float>(0.8f, 1.0f), new Tuple <float, float>(0.0f, 0.0f), new Tuple <float, float>(1.0f, 1.0f), "uniRatio"); transforms.Add(randomSideTransform); } var scaleTransform = CNTK.CNTKLib.ReaderScale(imageWidth, imageHeight, numChannels); transforms.Add(scaleTransform); var imageDeserializer = CNTK.CNTKLib.ImageDeserializer(mapFilePath, "labels", (uint)numClasses, "features", transforms); var minibatchSourceConfig = new CNTK.MinibatchSourceConfig(new CNTK.DictionaryVector() { imageDeserializer }); if (!randomizeData) { minibatchSourceConfig.randomizationWindowInChunks = 0; minibatchSourceConfig.randomizationWindowInSamples = 0; } return(CNTK.CNTKLib.CreateCompositeMinibatchSource(minibatchSourceConfig)); }
CNTK.MinibatchSource create_minibatch_source(CNTK.NDShape shape, int start_index, int sample_count, string prefix, bool is_training = false, bool use_augmentations = false) { var map_filename = create_map_txt_file_if_needed(start_index, sample_count, prefix); var transforms = new List <CNTK.CNTKDictionary>(); if (use_augmentations) { var randomSideTransform = CNTK.CNTKLib.ReaderCrop("RandomSide", new Tuple <int, int>(0, 0), new Tuple <float, float>(0.8f, 1.0f), new Tuple <float, float>(0.0f, 0.0f), new Tuple <float, float>(1.0f, 1.0f), "uniRatio"); transforms.Add(randomSideTransform); } var scaleTransform = CNTK.CNTKLib.ReaderScale(width: shape[1], height: shape[0], channels: shape[2]); transforms.Add(scaleTransform); var imageDeserializer = CNTK.CNTKLib.ImageDeserializer(map_filename, "labels", 2, "features", transforms); var minibatchSourceConfig = new CNTK.MinibatchSourceConfig(new CNTK.DictionaryVector() { imageDeserializer }); if (!is_training) { minibatchSourceConfig.randomizationWindowInChunks = 0; minibatchSourceConfig.randomizationWindowInSamples = 0; } return(CNTK.CNTKLib.CreateCompositeMinibatchSource(minibatchSourceConfig)); }
CNTK.MinibatchSource create_minibatchSource(string map_file, int num_classes, bool train) { var transforms = new List <CNTK.CNTKDictionary>(); if (true) { var randomSideTransform = CNTK.CNTKLib.ReaderCrop("RandomSide", new Tuple <int, int>(0, 0), new Tuple <float, float>(0.8f, 1.0f), new Tuple <float, float>(0.0f, 0.0f), new Tuple <float, float>(1.0f, 1.0f), "uniRatio"); transforms.Add(randomSideTransform); } var scaleTransform = CNTK.CNTKLib.ReaderScale(image_width, image_height, num_channels); transforms.Add(scaleTransform); var imageDeserializer = CNTK.CNTKLib.ImageDeserializer(map_file, "labels", (uint)num_classes, "features", transforms); var minibatchSourceConfig = new CNTK.MinibatchSourceConfig(new CNTK.DictionaryVector() { imageDeserializer }); return(CNTK.CNTKLib.CreateCompositeMinibatchSource(minibatchSourceConfig)); }