public object Process() { var settings = JsonConvert.DeserializeObject <Settings>(File.ReadAllText(Program.SETTINGS_FILE)); var trainingApi = CvService.AuthenticateTraining(settings.CvTrainingEndpoint, settings.CvTrainingKey, settings.CvPredictionKey); var project = trainingApi.GetProject(Options.ProjectId); if (Options.IsInteractive) { Console.WriteLine($"Irreversibly delete all images and tags from Custom Vision project '{project.Name}'? (yes/no)"); var res = Console.ReadLine(); if (res.ToLowerInvariant() != "yes") { return(new object()); } } Console.WriteLine(); try { Console.WriteLine("Deleting images..."); trainingApi.DeleteImages(Options.ProjectId); Console.WriteLine("Deleting tags..."); var tags = trainingApi.GetTags(Options.ProjectId); foreach (var tag in tags) { Console.WriteLine($" - {tag.Name}"); trainingApi.DeleteTag(Options.ProjectId, tag.Id); } Console.WriteLine("Done!"); } catch (CustomVisionErrorException ex) { Console.WriteLine($"Error: {ex.DetailedMessage()}"); } return(new object()); }
public object Process() { var settings = JsonConvert.DeserializeObject <Settings>(File.ReadAllText(Program.SETTINGS_FILE)); var trainingApi = CvService.AuthenticateTraining(settings.CvTrainingEndpoint, settings.CvTrainingKey, settings.CvPredictionKey); var project = trainingApi.GetProject(Options.ProjectId); try { trainingApi.TrainProject(Options.ProjectId, reservedBudgetInHours: Options.BudgetHours, notificationEmailAddress: Options.Email); Console.WriteLine(); Console.WriteLine($"Training of project '{project.Name}' started!"); } catch (CustomVisionErrorException ex) { Console.WriteLine($"Error: {ex.DetailedMessage()}"); } return(new object()); }
public object Process() { if (!Directory.Exists(Options.Folder)) { Console.WriteLine($"Folder not found: {Options.Folder}"); return(null); } var tagDirectories = Directory.GetDirectories(Options.Folder); if (tagDirectories.Length == 0) { Console.WriteLine($"Not subfolders found in {Options.Folder}. Subfolders are required to define tags and associated images."); return(null); } var cropRect = new Rectangle(); if (!string.IsNullOrEmpty(Options.CropArea)) { var dims = Options.CropArea.Split(","); try { var x = int.Parse(dims[0]); var y = int.Parse(dims[1]); var w = int.Parse(dims[2]); var h = int.Parse(dims[3]); cropRect = new Rectangle(x, y, w, h); } catch { Console.WriteLine($"Unable to parse {Options.CropArea} into a rectangle. Required format is: x,y,width, height"); return(new object()); } Console.WriteLine($"Crop area is [{cropRect.Left},{cropRect.Top}], {cropRect.Width}x{cropRect.Height}"); } else { Console.WriteLine("No cropping will be performed."); } Console.WriteLine(); var settings = JsonConvert.DeserializeObject <Settings>(File.ReadAllText(Program.SETTINGS_FILE)); var trainingApi = CvService.AuthenticateTraining(settings.CvTrainingEndpoint, settings.CvTrainingKey, settings.CvPredictionKey); // Explore subdirectories var totalFileCount = 0; Console.WriteLine($"Base folder: {Options.Folder}"); foreach (var directory in tagDirectories) { var files = Directory.GetFiles(directory); totalFileCount += files.Length; Console.WriteLine($" /{directory.Split(Path.DirectorySeparatorChar).Last()}, {files.Length} image(s)"); } Console.WriteLine(" --------"); Console.WriteLine($" {totalFileCount} image(s) in total"); if (totalFileCount == 0) { Console.WriteLine("Nothing to do..."); } else if (Options.IsInteractive) { Console.WriteLine(); Console.WriteLine(Program.CONFIRM_PHRASE); Console.ReadLine(); } else { Console.WriteLine(); } var project = trainingApi.GetProject(Options.ProjectId); Console.WriteLine($"Target project is '{project.Name}'"); Console.WriteLine(); if (totalFileCount == 0) { return(new object()); } // Go through each subdirectory var fileCountFormat = string.Empty; for (int i = 0; i < totalFileCount.ToString().Length; i++) { fileCountFormat += "0"; } var fileCount = 1; foreach (var directory in tagDirectories) { var targetTagName = directory.Split(Path.DirectorySeparatorChar).Last(); Microsoft.Azure.CognitiveServices.Vision.CustomVision.Training.Models.Tag targetTag = null; try { targetTag = trainingApi.GetTags(Options.ProjectId).SingleOrDefault(t => t.Name == targetTagName); // If a tag with this name does not already exist, create it if (targetTag == null) { if (targetTagName.ToLowerInvariant() == "negative") { targetTag = trainingApi.CreateTag(Options.ProjectId, targetTagName, type: "Negative"); } else { targetTag = trainingApi.CreateTag(Options.ProjectId, targetTagName); } Console.WriteLine($"Created tag '{targetTagName}' (id={targetTag.Id})"); } else { Console.WriteLine($"Reusing existing tag '{targetTag.Name}' (id={targetTag.Id})"); } } catch (CustomVisionErrorException ex) { Console.WriteLine($"Error: {ex.DetailedMessage()}"); return(new object()); } Console.WriteLine(); if (cropRect == Rectangle.Empty) { fileCount = UploadFolder(trainingApi, fileCount, directory, targetTag); } else { // Crops into temporary files //foreach (var file in Directory.GetFiles(directory)) //{ // Console.Write($"[{fileCount++.ToString(fileCountFormat)}/{totalFileCount}] Processing {Path.Combine(directory, file)}..."); // using (var image = SixLabors.ImageSharp.Image.Load(file)) // { // image.Mutate(x => x.Crop(cropRect)); // using (var stream = new MemoryStream()) // { // //image.Save(stream, new JpegEncoder() { Quality = 100 }); // var tmpFile = Path.GetTempFileName(); // try // { // var res = trainingApi.CreateImagesFromData(Options.ProjectId, stream, new List<Guid>() { targetTag.Id }); // var errorCount = PrintBatchErrors(res); // } // catch (CustomVisionErrorException ex) { Console.WriteLine($"Error: {ex.DetailedMessage()}"); } // } // } //} var tempDir = Path.Combine(Path.GetTempPath(), targetTagName); if (Directory.Exists(tempDir) && Options.IsInteractive) { Console.WriteLine($"Temporary folder {tempDir} already exists."); Console.WriteLine(Program.CONFIRM_PHRASE); Console.ReadLine(); } else { Directory.CreateDirectory(tempDir); Console.Write($"Created temporary folder {tempDir}"); } foreach (var file in Directory.GetFiles(directory)) { Console.Write($"Cropping {Path.Combine(directory.Split(Path.DirectorySeparatorChar).Last(), file)}..."); using (var image = SixLabors.ImageSharp.Image.Load(file)) { image.Mutate(x => x.Crop(cropRect)); image.Save(Path.Combine(tempDir, Path.GetFileName(file)), new JpegEncoder() { Quality = 100 }); } Console.WriteLine("ok"); } fileCount = UploadFolder(trainingApi, fileCount, tempDir, targetTag); Directory.Delete(tempDir, true); Console.WriteLine($"Deleted {tempDir}"); } } return(new object()); }