Skip to content

Instantly share code, notes, and snippets.

@Corneliuskruger
Created January 11, 2019 23:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Corneliuskruger/348ca17ebf8c186727d2ce2ef7f9196c to your computer and use it in GitHub Desktop.
Save Corneliuskruger/348ca17ebf8c186727d2ce2ef7f9196c to your computer and use it in GitHub Desktop.
Uploading Stanford Dogs Dataset to Azure CustomVision
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