你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

BrainScript 图像读取器

警告:我们仍然支持此读取器格式,但它已被弃用。 请使用新的读取器格式: 了解和扩展读取器

图像读取器可用于读取图像,并应用一些特定于图像的转换,例如随机裁剪、缩放、水平翻转等。 它采用简单的文本文件,其中每行都包含图像文件之间的制表符分隔映射 (,例如 JPEG、PNG 等) 和基于 0 的标签。 例如:

/home/user/data/train/n01440764/n01440764_10026.JPEG<tab>0
/home/user/data/train/n01440764/n01440764_10027.JPEG<tab>0

ImageReader 支持“...”映射文件中的语法。 如果存储在映射文件中的文件路径以“...”开头,则为“...”替换为映射文件本身的目录。

例如,如果文件 C:\work\CNTK\data\train.map 包含

...\images\img1.png 1
...\images\img2.png 2
...\images\img3.png 3

然后,读取器将读取文件,就像指定了以下绝对路径一样:

C:\work\CNTK\data\images\img1.png 1
C:\work\CNTK\data\images\img2.png 2
C:\work\CNTK\data\images\img3.png 3

由于一些图像数据集可能非常大, (例如数百万个图像) ,因此将这些映像放入容器中有时很有用。 映像读取器当前支持一种容器类型:ZIP 文件。 在这种情况下,建议使用 STORE 压缩模式,因为它提供对.zip文件内容的最快访问,此外,图像通常不需要压缩。 例如, (记下.zip文件名末尾的 @ 符号) :

/home/user/data/train.zip@/n01440764/n01440764_10026.JPEG<tab>0
/home/user/data/train.zip@/n01440764/n01440764_10027.JPEG<tab>0
/home/user/data/train_01.zip@/n01534433/n01534433_7285.JPEG<tab>0
/home/user/data/train/n01534433/n01534433_7285.JPEG<tab>0

请注意,可以混合和匹配容器和文件,但建议限制容器数量以提高性能,例如将所有映像放入单个 (或少量) .zip文件。

另请注意,在Windows环境中,不支持文件名中的 Unicode 字符 (所有字符都应是标准 ASCII) 。 此限制来自图像读取器所依赖的 OpenCV 库。

以下示例演示了以下 ImageReader用法:

    reader=[
        readerType=ImageReader
        file=$ConfigDir$/train_map.txt
        randomize=Auto
        features=[
            # Below are the required parameters.
            width=224
            height=224
            channels=3
            # Below are the optional parameters.
            # Possible values: Center, RandomSide, RandomArea, MultiView10. Default: Center
            cropType=RandomSide
            # Horizontal random flip, will be enabled by default if cropType=Random
            #hflip=0
            # Crop scale side ratio. Examples: sideRatio=0.9, sideRatio=0.7:0.9.
            sideRatio=0.875
            # Crop scale ratio jitter type.
            # Possible values: None, UniRatio. Default: None
            jitterType=UniRatio
            # Interpolation to use when scaling image to width x height size.
            # Possible values: nearest, linear, cubic, lanczos. Default: linear.
            interpolations=Linear
            # Aspect ratio jitter radius. Default is 1.0 (crop square).
            aspectRatio=0.75:1.0
            # Brightness, contrast and color jittering. Default is 0.0 (no effect).
            brightnessRadius=0.2
            contrastRadius=0.2
            saturationRadius=0.4
            # Intensity jittering: enabled if file is specified and intensityStdDev > 0. 
            # The file stores 1x3 vector (eigenvalues) and 3x3 matrix (eigenvectors) in OpenCV XML format.
            intensityFile="$ConfigDir$/ImageNet1K_intensity.xml"
            # StdDev for intensity jittering. Default is 0.0. 
            intensityStdDev=0.1
            # Mean subtraction: enabled if file is specified.
            # The file stores mean values for each pixel in OpenCV matrix XML format.
            meanFile=$ConfigDir$/ImageNet1K_mean.xml
        ]
        labels=[
            labelDim=1000
        ]
    ]    

有极少数必需的参数,例如widthheight,以及channels配置图像转换的多个可选参数。

裁剪转换

cropType指定裁剪图像的哪个部分,当前可以是CenterRandomSideRandomArea也可以Multiview10RandomSide 通常在 RandomArea 训练 Center 期间使用,而通常在测试期间使用。 随机裁剪是一种常用的数据扩充技术,用于改进 DNN 的通用化。 MultiView10 通常用于测试/评估阶段并启用 10 视图图像评估: (4 个 (角) + 1 (center) ) * 2 (原始 + 水平翻转) = 10。

水平翻转转换

hflip 参数指定图像是否在水平方向随机翻转。 水平翻转是另一种流行的数据扩充技术,如果图像显示垂直对称性,例如,与许多现实世界对象一样,则应使用。

缩放转换

sideRatio 指定最终图像维度的比率,例如 width ,或 height,与从图像拍摄的随机裁剪的大小。 例如,比率 224 / 256 = 0.875 表示大小为 224 的裁剪将从图像重新缩放到 256 (实现详细信息: ImageReader 采用裁剪,然后重新缩放,而不是以其他方式) 。 若要启用缩放抖动 (另一种流行的数据扩充技术) ,请使用冒号分隔的值,这意味着 sideRatio=0.875:0.466 224 裁剪将从随机缩放的图像中随机缩放为 [256, 480] 范围的大小。

areaRatio 指定最终图像区域与原始图像的比率。 例如,0.5 的比率意味着裁剪窗口区域大约是原始图像的一半。 然后,裁剪的窗口将缩放为 224x224。 sideRatio (与 cropType=RandomSide) 一起指定, (areaRatiocropType=RandomArea) 一起指定,互斥。

aspectRatio 允许一个应用纵横比随机抖动。 例如,值为 0.2 表示图像的纵横比可以随机更改, (统一分布) 为原始图像的 80% 到 120%。

颜色抖动转换

brightnessRadius 并允许 contrastRadius 应用亮度和对比度抖动。 这些转换将以下公式应用于图像的每个像素: Yij = alpha * Xij + beta 其中 alpha 是对比度调整和 beta - 亮度。 例如,如果为 contrastRadius0.2 alpha,则将随机选择 (统一分布) 。0.81.2 brightnessRadius随机选择值作为图像平均值的比例,例如,brightnessRadius等于0.2随机选择值。-0.2 * mean0.2 * mean

saturationRadius 允许应用饱和随机抖动。 例如,图像的 0.3 饱和度值可以从原始图像的 70% 更改为 130%。

intensityFile 并允许 intensityStdDev 应用基于 PCA 的强度抖动,如 本文所述。 intensityFile 是包含 OpenCV XML 格式特征值和特征函数的文件的路径。 intensityStdDev 指定特征值随机系数的标准偏差。

平均减法转换

meanFile 参数是 OpenCV XML 矩阵格式的文件的路径,其中包含整个数据集的每像素平均值。 例如,对于文件大小 224x224x3 的输入层,文件将包含将在训练 (或从输入图像测试) 期间减去的150528条目。 可以使用其他几种方法(例如 Mean 节点甚至仅从输入中减去一些固定值(如 128)来实现相同的或类似效果。