Created
January 11, 2019 23:01
-
-
Save Corneliuskruger/348ca17ebf8c186727d2ce2ef7f9196c to your computer and use it in GitHub Desktop.
Uploading Stanford Dogs Dataset to Azure CustomVision
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using Microsoft.Azure.CognitiveServices.Vision.CustomVision.Training; | |
using Microsoft.Azure.CognitiveServices.Vision.CustomVision.Training.Models; | |
using System; | |
using System.Collections.Generic; | |
using System.IO; | |
using System.Linq; | |
using System.Xml.Linq; | |
namespace DogBreedsTraining | |
{ | |
class Program | |
{ | |
private const string SouthCentralUsEndpoint = "https://southcentralus.api.cognitive.microsoft.com"; | |
private const string trainingKey = "<Your Training Key>"; | |
static void Main(string[] args) | |
{ | |
// Create the Api, passing in the training key | |
CustomVisionTrainingClient trainingApi = new CustomVisionTrainingClient() | |
{ | |
ApiKey = trainingKey, | |
Endpoint = SouthCentralUsEndpoint | |
}; | |
// Find the object detection domain | |
var domains = trainingApi.GetDomains(); | |
var objDetectionDomain = domains.FirstOrDefault(d => d.Type == "ObjectDetection"); | |
Console.WriteLine("Loading Project"); | |
var projects = trainingApi.GetProjects(); | |
foreach (var proj in projects) | |
{ | |
Console.WriteLine(proj.Name); | |
} | |
var project = projects.FirstOrDefault(p => p.Name.ToLower() == "breeds2"); | |
if (project == null) | |
return; | |
var tags = trainingApi.GetTags(project.Id); | |
Console.WriteLine("Enter the directory where the data files are extracted"); | |
var rootDir = Console.ReadLine(); | |
if (string.IsNullOrEmpty(rootDir) || !Directory.Exists(rootDir)) | |
{ | |
Console.WriteLine("Invalid Directory"); | |
Console.ReadLine(); | |
return; | |
} | |
var imageDirectory = Path.Combine(rootDir, "images"); | |
var annotationDirectory2 =Path.Combine(rootDir, "annotation"); | |
foreach (var dir in Directory.EnumerateDirectories(annotationDirectory2)) | |
{ | |
var annotationPath = Path.GetFullPath(dir); | |
var imageFileEntries = new List<ImageFileCreateEntry>(); | |
foreach (var filename in Directory.EnumerateFiles(annotationPath)) | |
{ | |
Console.WriteLine(filename); | |
var file = Path.Combine(dir, filename); | |
XElement root = XElement.Load(file); | |
var imageFileName = root.Elements("filename").FirstOrDefault().Value + ".jpg"; | |
var imageFolder = root.Elements("folder").FirstOrDefault().Value; | |
var size = root.Elements("size").FirstOrDefault(); | |
var imageWidth = Double.Parse(size?.Elements("width").FirstOrDefault().Value); | |
var imageHeight = Double.Parse(size?.Elements("height").FirstOrDefault().Value); | |
var x = from el in root.Elements("object") | |
select el; | |
foreach (var obj in x) | |
{ | |
var tagName = obj.Elements("name").FirstOrDefault()?.Value.ToString(); | |
var bElement = obj.Elements("bndbox").FirstOrDefault(); | |
var xmin = double.Parse(bElement?.Elements("xmin").FirstOrDefault()?.Value); | |
var ymin = double.Parse(bElement?.Elements("ymin").FirstOrDefault()?.Value); | |
var xmax = double.Parse(bElement?.Elements("xmax").FirstOrDefault()?.Value); | |
var ymax = double.Parse(bElement?.Elements("ymax").FirstOrDefault()?.Value); | |
var box = new double[] { xmin, ymin, xmax - xmin, ymax - ymin }; | |
var imagePath = Path.Combine(imageDirectory, $"n{imageFolder}-{tagName}", imageFileName); | |
var tag = tags.FirstOrDefault(t => t.Name.ToLower() == tagName.ToLower()); | |
if (tag == null) | |
{ | |
tag = trainingApi.CreateTag(project.Id, tagName.ToLower()); | |
tags.Add(tag); | |
} | |
var top = ymin / imageHeight; | |
var left = xmin / imageWidth; | |
var width = (xmax - xmin) / imageWidth; | |
var height = (ymax - ymin) / imageHeight; | |
Console.WriteLine($"{tagName} - {left}, {top}, {width}, {height}"); | |
var region = new Region(tag.Id, left, top, width, height); | |
List<Region> regions = new List<Region>(); | |
regions.Add(region); | |
var fileEntry = new ImageFileCreateEntry(imageFileName, File.ReadAllBytes(imagePath), null, regions); | |
imageFileEntries.Add(fileEntry); | |
} | |
if (imageFileEntries.Count > 60) | |
{ | |
trainingApi.CreateImagesFromFiles(project.Id, new ImageFileCreateBatch(imageFileEntries)); | |
imageFileEntries.Clear(); | |
} | |
} | |
if (imageFileEntries.Count > 0) | |
trainingApi.CreateImagesFromFiles(project.Id, new ImageFileCreateBatch(imageFileEntries)); | |
} | |
Console.WriteLine("EOF"); | |
Console.ReadLine(); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment