static async Task MainAsync(string[] args) { /* you need at least 2 tags and 5 images for each tag to start*/ //generate random name for the project var projectName = Guid.NewGuid().ToString(); Console.WriteLine($"\tCreating a project in customvision.ai - project name: {projectName}"); var project = CreateProject(projectName); var basepath = Directory.GetCurrentDirectory(); //read tags var tsgfilepath = $"{basepath}\\tags.csv"; Console.WriteLine($"\tReading Tags from {tsgfilepath}"); var tags = ReadTags(tsgfilepath); //download images - var trainingSetPath = $"{basepath}\\{projectName}\\data\\TrainingSet"; var testSetPath = $"{basepath}\\{projectName}\\data\\TestSet"; Console.WriteLine($"\tBing search & downloading images - split them in TrainingSet & TestSet for each tag"); Console.WriteLine($"\tTrainingSetPath: {trainingSetPath}"); Console.WriteLine($"\tTestSetPath: {testSetPath}"); System.IO.Directory.CreateDirectory(trainingSetPath); System.IO.Directory.CreateDirectory(testSetPath); int minTrainingPhotosCount = 5; int minTestPhotosCount = 3; foreach (var tag in tags) { { using (var bingImageSearchService = new BingImageSearchService()) { Console.WriteLine($"\tStarting the Process for : {tag}"); var bingresult = await bingImageSearchService.ImageSearch(tag, 20); if (bingresult.value == null) { return; } //training Console.WriteLine($"\tDownloading the training set"); var trainingphotos = DownloadImages($"{trainingSetPath}\\{tag}", bingresult.value.ToList(), minTrainingPhotosCount); //test Console.WriteLine($"\tDownloading the test set"); var testphotos = DownloadImages($"{testSetPath}\\{tag}", bingresult.value.Skip(trainingphotos).ToList(), minTestPhotosCount); if (trainingphotos < minTrainingPhotosCount || testphotos < minTestPhotosCount) { throw new Exception($"Bing couldn't find required images.you need at least 2 tags and 5 images for each tag to start"); } } } } CreateTheModel(trainingSetPath, project); // Now there are images with tags start training the project TrainTheModel(project); Console.WriteLine($"\tTesting the Model"); TestingTheModel(testSetPath, project); }
static async Task MainAsync(string[] args) { /* you need at least 2 tags and 5 images for each tag to start*/ var basepath = Directory.GetCurrentDirectory(); //read tags var tsgfilepath = $"{basepath}\\tags.csv"; Console.WriteLine($"\tReading Tags from {tsgfilepath}"); var tags = ReadTags(tsgfilepath); //generate random name for the project var projectName = tags.Count == 2 ? $"{tags[0]} {tags[1]} classifier {DateTime.Now:yyyyMMddHHmm}" : DateTime.Now.ToString("yyyyMMddHHmm"); Console.WriteLine($"\tCreating a project in customvision.ai - project name: {projectName}"); var project = CreateProject(projectName); //download images - var imagesresouce = $"{basepath}\\{projectName}\\data\\"; var trainingSetPath = $"{imagesresouce}TrainingSet"; var testSetPath = $"{imagesresouce}TestSet"; Console.WriteLine($"\tBing search & downloading images - split them in TrainingSet & TestSet for each tag"); Console.WriteLine($"\tTrainingSetPath: {trainingSetPath}"); Console.WriteLine($"\tTestSetPath: {testSetPath}"); System.IO.Directory.CreateDirectory(trainingSetPath); System.IO.Directory.CreateDirectory(testSetPath); var minTrainingPhotosCount = int.Parse(ConfigurationManager.AppSettings["TrainingImagesCount"]); var minTestPhotosCount = int.Parse(ConfigurationManager.AppSettings["TestImagesCount"]); var sizeOfImageSet = (minTrainingPhotosCount + minTestPhotosCount) * 3; var augmentTrainingImages = bool.Parse(ConfigurationManager.AppSettings["AugmentTrainingImages"]); foreach (var tag in tags) { { using (var bingImageSearchService = new BingImageSearchService()) { Console.WriteLine($"\tStarting the Process for : {tag}"); var bingresult = await bingImageSearchService.ImageSearch(tag, sizeOfImageSet); if (bingresult.value == null) { return; } // using (var writer = new StreamWriter($"{imagesresouce}\\{tag}_resource.csv")) { using (var csvWriter = new CsvWriter(writer)) { csvWriter.WriteRecords(bingresult.value); } } var randomize = bool.Parse(ConfigurationManager.AppSettings["Randomize"]); var imageList = bingresult.value.ToList(); if (randomize) { imageList.Shuffle(); } //training Console.WriteLine($"\tDownloading the training set"); var trainingphotos = await DownloadImagesAsync($"{trainingSetPath}\\{tag}", imageList, minTrainingPhotosCount, augmentTrainingImages); //test Console.WriteLine($"\tDownloading the test set"); var testphotos = await DownloadImagesAsync($"{testSetPath}\\{tag}", imageList.Skip(trainingphotos).ToList(), minTestPhotosCount); if (trainingphotos < minTrainingPhotosCount || testphotos < minTestPhotosCount) { throw new Exception($"Bing couldn't find required images.you need at least 2 tags and 5 images for each tag to start"); } } } } CreateTheModel(trainingSetPath, project); // Now there are images with tags start training the project TrainTheModel(project); Console.WriteLine($"\tTesting the Model"); TestingTheModel(testSetPath, project); }
static async Task MainAsync(string[] args) { /* you need at least 2 tags and 5 images for each tag to start*/ var basepath = Directory.GetCurrentDirectory(); //read tags var tsgfilepath = $"{basepath}\\tags.csv"; Console.WriteLine($"\tReading Tags from {tsgfilepath}"); var tags = ReadTags(tsgfilepath); //generate random name for the project if projectname isn't passed in string projectName = string.Empty; try { projectName = ConfigurationManager.AppSettings["ProjectName"]; } catch { } if (projectName == string.Empty) { projectName = tags.Count == 2 ? $"{tags[0]} {tags[1]} classifier {DateTime.Now:yyyyMMddHHmm}" : DateTime.Now.ToString("yyyyMMddHHmm"); } Console.WriteLine($"\tCreating or returning project in customvision.ai - project name: {projectName}"); var project = CreateProject(projectName); //download images - var imagesresouce = $"{basepath}\\{projectName}\\data\\"; var trainingSetPath = $"{imagesresouce}TrainingSet"; var testSetPath = $"{imagesresouce}TestSet"; Console.WriteLine($"\tBing search & downloading images - split them in TrainingSet & TestSet for each tag"); Console.WriteLine($"\tTrainingSetPath: {trainingSetPath}"); Console.WriteLine($"\tTestSetPath: {testSetPath}"); try { // create the directory if it doesn't already exist System.IO.Directory.CreateDirectory(trainingSetPath); } catch { } try { // create the directory if it doesn't already exist System.IO.Directory.CreateDirectory(testSetPath); } catch { } int sizeOfImageSet = 10; try { sizeOfImageSet = Convert.ToInt16(ConfigurationManager.AppSettings["SizeOfImageSet"]); //recommend 100 } catch { } bool PerformImageDownload = true; try { PerformImageDownload = Convert.ToBoolean(ConfigurationManager.AppSettings["PerformImageDownload"]); } catch { } if (PerformImageDownload) { foreach (var tag in tags) { { using (var bingImageSearchService = new BingImageSearchService()) { Console.WriteLine($"\tStarting the Process for : {tag}"); string tagResource = $"{imagesresouce}\\{tag}_resource.csv"; try { // if it exists from a previous run delete it System.IO.File.Delete(tagResource); } catch { } var bingresult = await bingImageSearchService.ImageSearch(tag, sizeOfImageSet); if (bingresult.value == null) { return; } // using (var writer = new StreamWriter(tagResource)) { using (var csvWriter = new CsvWriter(writer)) { csvWriter.WriteRecords(bingresult.value); } } Console.WriteLine($"\tDownloading the training and test set"); var trainingphotos = DownloadImages(projectName, tag, bingresult.value.ToList(), sizeOfImageSet); } } } } bool TrainModel = true; try { TrainModel = Convert.ToBoolean(ConfigurationManager.AppSettings["TrainModel"]); } catch { } if (TrainModel) { Console.WriteLine($"\tCreating the Model"); CreateTheModel(trainingSetPath, project); // Now there are images with tags start training the project TrainTheModel(project); } bool TestModel = true; try { TestModel = Convert.ToBoolean(ConfigurationManager.AppSettings["TestModel"]); } catch { } if (TestModel) { Console.WriteLine($"\tTesting the Model"); TestingTheModel(testSetPath, project); } }