Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Op deze pagina worden enkele mogelijke implementaties beschreven voor het transformeren van afbeeldingen voordat ze worden geƫvalueerd op een CNTK model dat is getraind met gegevens die zijn ingevoerd met ImageReader. Er wordt een werkvoorbeeld gegeven als onderdeel van het CSEvalClient-voorbeeldprogramma , met name naar de EvaluateImageClassificationModel methode verwijzen.
Overzicht
De CNTK ImageReader-invoegtoepassing maakt het invoeren van afbeeldingsgegevens mogelijk voor het CNTK model voor training, testen en evaluatie. ImageReader heeft enkele configureerbare mogelijkheden die, indien ingeschakeld, een aantal on-the-fly transformaties uitvoeren naar de afbeeldingsgegevens. Deze mogelijke transformaties zijn:
- Bijsnijden
- Formaat wijzigen
- Het gemiddelde toepassen
- Intensiteit
- Kleur
- Indeling (HWC versus CHW)
Evaluatie van afbeeldingen met CNTK.exe en de afbeeldingslezer
In dit geval kunnen afbeeldingstransformaties worden opgegeven in het configuratiebestand en voert Imagereader de gedefinieerde transformaties uit.
Programmatische evaluatie van afbeeldingen via EvalDll(EvalWrapper)
In dit geval moeten de vereiste afbeeldingstransformaties programmatisch worden uitgevoerd voordat de installatiekopie wordt doorgegeven aan de Evalwrapper.
Deze sectie bevat enkele mogelijke implementaties voor het uitvoeren van enkele van deze transformaties voorafgaand aan de evaluatie.
Een statische klasse met de naam CntkBitmapExtensions kan bijvoorbeeld de extensiemethoden bevatten die hieronder worden weergegeven.
Formaat wijzigen
/// <summary>
/// Resizes an image
/// </summary>
/// <param name="image">The image to resize</param>
/// <param name="width">New width in pixels</param>
/// <param name="height">New height in pixesl</param>
/// <param name="useHighQuality">Resize quality</param>
/// <returns>The resized image</returns>
public static Bitmap Resize(this Bitmap image, int width, int height, bool useHighQuality)
{
var rect = new Rectangle(0, 0, width, height);
var newImg = new Bitmap(width, height);
newImg.SetResolution(image.HorizontalResolution, image.VerticalResolution);
using (var g = Graphics.FromImage(newImg))
{
g.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy;
if (useHighQuality)
{
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
}
else
{
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.Default;
g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.Default;
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.Default;
g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.Default;
}
var attributes = new ImageAttributes();
attributes.SetWrapMode(System.Drawing.Drawing2D.WrapMode.TileFlipXY);
g.DrawImage(image, rect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, attributes);
}
return newImg;
}
In dit geval kan een mogelijke aanroep het volgende zijn:
var testBitmap = new Bitmap(Bitmap.FromFile(@"C:\rocket.bmp")).Resize(224, 224, true);
Met deze opdracht wordt het formaat van de C:\rocket.bmp afbeelding gewijzigd in een grootte van 224 x 224 pixels die een afbeelding van hoge kwaliteit behouden.
Indelingsconversie van HWC naar CHW
Er worden voornamelijk twee indelingstypen gebruikt in CNTK: HWC en CHW. De eerste is HWC de standaardindeling die wordt gebruikt in CNTK. De tweede, CHW, is de indeling die wordt gebruikt door cuDNN in de GPU.
Houd er rekening mee dat de werkelijke bestandsindelingmogelijk anders is. We kijken naar de geheugenweergave, niet naar de bestandsinhoud
Let op: de bovenstaande beschrijvingen verwijzen naar de veelgebruikte rij-primaire notatie waarbij de snelste bewegende dimensie het laatst komt. CNTK gebruikt meestal kolom-primaire notatie die de snelste bewegende dimensie als eerste gebruikt en waarbij het onderstaande respectievelijk wordt uitgedrukt als 'CWH' en 'WHC'.
Dit betekent dat uitgaande van een bitmap met HWC-indeling van grootte 10x10 met RGB-bytes, de geheugenruimte overeenkomt met:
Offset (byte) : 0 1 2 3 4 5 6 7 8 ...29 30 31 32 33 34 35 36 37 ...
Height Pos : 0 0 0 0 0 0 0 0 0 ... 0 0 0 1 1 1 1 1 1 ...
Width Pos : 0 0 0 1 1 1 2 2 2 ... 9 9 9 0 0 0 1 1 1 ...
Color Index : B G R B G R B G R ... B G R B G R B G R ...
In het geval van CHW is de indeling:
Offset (byte) : 0 1 2 3 ... 9 10 11 12 13 ...90 91 92 93 ... 99 100 ... 199 200 ... 299
Color Index : B B B B ... B B B B B ... B B B B ... B G ... G R ... R
Height Pos : 0 0 0 0 ... 0 0 0 0 0 ... 9 9 9 9 ... 9 0 ... 9 0 ... 9
Width Pos : 0 1 2 3 ... 9 0 1 2 3 ... 0 1 2 3 ... 9 0 ... 9 0 ... 9
Een mogelijke uitbreidingsmethode voor het extraheren van de Bitmapafbeeldingsgegevens naar chw-indeling kan zijn:
/// <summary>
/// Extracts image pixels in CHW
/// </summary>
/// <param name="image">The bitmap image to extract features from</param>
/// <returns>A list of pixels in HWC order</returns>
public static List<float> ExtractCHW(this Bitmap image)
{
var features = new List<float>(image.Width * image.Height * 3);
for (int c = 0; c < 3; c++)
{
for (int h = 0; h < image.Height; h++)
{
for (int w = 0; w < image.Width; w++)
{
var pixel = image.GetPixel(w, h);
float v = c == 0 ? pixel.B : c == 1 ? pixel.G : pixel.R;
features.Add(v);
}
}
}
return features;
}
De Bitmap.GetPixel methode zorgt voor een aantal nuances in de geheugenindeling, zodat we ons kunnen richten op de transformatie zelf.
Deze methode kan nu worden gebruikt in onze afbeeldingstransformatie voorafgaand aan de evaluatie. Uitgaande van dezelfde bitmap als in formaat, kunnen we de gegevens extraheren in chW-indeling met de volgende aanroep:
var features = testBitmap.ExtractCHW();
De features vector kan nu worden gebruikt als laaginvoer in het afbeeldingsclassificatiemodel. Er wordt een werkvoorbeeld gegeven als onderdeel van het CSEvalClient voorbeeldprogramma, met name naar de EvaluateImageClassificationModel methode verwijzen.