Răsfoiți Sursa

delete some codes

FlyingQianMM 5 ani în urmă
părinte
comite
b794b3454e

+ 0 - 22
docs/apis/datasets.md

@@ -141,28 +141,6 @@ paddlex.datasets.EasyDataSeg(data_dir, file_list, label_list, transforms=None, n
 > > * **parallel_method** (str): 数据集中样本在预处理过程中并行处理的方式,支持'thread'线程和'process'进程两种方式。默认为'process'(Windows和Mac下会强制使用thread,该参数无效)。  
 > > * **shuffle** (bool): 是否需要对数据集中样本打乱顺序。默认为False。
 
-
-## paddlex.datasets.SegDataset
-> **用于语义分割模型**  
-```
-paddlex.datasets.SegDataset(data_dir, file_list, label_list, transforms=None, num_workers='auto', buffer_size=100, parallel_method='process', shuffle=False)
-```
-
-> 读取语义分割任务数据集,并对样本进行相应的处理。语义分割任务数据集格式的介绍可查看文档:[数据集格式说明](../data/format/segmentation.md)  
-
-> 示例:[代码文件](https://github.com/PaddlePaddle/PaddleX/blob/develop/tutorials/train/semantic_segmentation/unet.py)
-
-> **参数**
-
-> > * **data_dir** (str): 数据集所在的目录路径。  
-> > * **file_list** (str): 描述数据集图片文件和对应标注文件的文件路径(文本内每行路径为相对`data_dir`的相对路径)。
-> > * **label_list** (str): 描述数据集包含的类别信息文件路径。  
-> > * **transforms** (paddlex.seg.transforms): 数据集中每个样本的预处理/增强算子,详见[paddlex.seg.transforms](./transforms/seg_transforms.md)。  
-> > * **num_workers** (int|str):数据集中样本在预处理过程中的线程或进程数。默认为'auto'。当设为'auto'时,根据系统的实际CPU核数设置`num_workers`: 如果CPU核数的一半大于8,则`num_workers`为8,否则为CPU核数的一半。
-> > * **buffer_size** (int): 数据集中样本在预处理过程中队列的缓存长度,以样本数为单位。默认为100。  
-> > * **parallel_method** (str): 数据集中样本在预处理过程中并行处理的方式,支持'thread'线程和'process'进程两种方式。默认为'process'(Windows和Mac下会强制使用thread,该参数无效)。  
-> > * **shuffle** (bool): 是否需要对数据集中样本打乱顺序。默认为False。
-
 ## paddlex.datasets.ChangeDetDataset
 > **用于完成变化检测的语义分割模型**  
 ```

+ 9 - 9
docs/apis/transforms/seg_transforms.md

@@ -87,10 +87,10 @@ paddlex.seg.transforms.Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5], min_
 3.对图像进行减均值除以标准差操作。
 
 ### 参数
-* **mean** (list): 图像数据集的均值。默认值[0.5, 0.5, 0.5]。
-* **std** (list): 图像数据集的标准差。默认值[0.5, 0.5, 0.5]。
-* **min_val** (list): 图像数据集的最小值。默认值[0, 0, 0]。
-* **max_val** (list): 图像数据集的最大值。默认值[255.0, 255.0, 255.0]。
+* **mean** (list): 图像数据集的均值。默认值[0.5, 0.5, 0.5]。长度应与图像通道数量相同。
+* **std** (list): 图像数据集的标准差。默认值[0.5, 0.5, 0.5]。长度应与图像通道数量相同。
+* **min_val** (list): 图像数据集的最小值。默认值[0, 0, 0]。长度应与图像通道数量相同。
+* **max_val** (list): 图像数据集的最大值。默认值[255.0, 255.0, 255.0]。长度应与图像通道数量相同。
 
 ## Padding
 ```python
@@ -99,7 +99,7 @@ paddlex.seg.transforms.Padding(target_size, im_padding_value=[127.5, 127.5, 127.
 对图像或标注图像进行padding,padding方向为右和下。根据提供的值对图像或标注图像进行padding操作。
 ### 参数
 * **target_size** (int|list|tuple): padding后图像的大小。
-* **im_padding_value** (list): 图像padding的值。默认为[127.5, 127.5, 127.5]。
+* **im_padding_value** (list): 图像padding的值。默认为[127.5, 127.5, 127.5]。长度应与图像通道数量相同。
 * **label_padding_value** (int): 标注图像padding的值。默认值为255(仅在训练时需要设定该参数)。
 
 
@@ -110,7 +110,7 @@ paddlex.seg.transforms.RandomPaddingCrop(crop_size=512, im_padding_value=[127.5,
 对图像和标注图进行随机裁剪,当所需要的裁剪尺寸大于原图时,则进行padding操作,模型训练时的数据增强操作。
 ### 参数
 * **crop_size**(int|list|tuple): 裁剪图像大小。默认为512。
-* **im_padding_value** (list): 图像padding的值。默认为[127.5, 127.5, 127.5]。
+* **im_padding_value** (list): 图像padding的值。默认为[127.5, 127.5, 127.5]。长度应与图像通道数量相同。
 * **label_padding_value** (int): 标注图像padding的值。默认值为255。
 
 
@@ -127,13 +127,13 @@ paddlex.seg.transforms.RandomBlur(prob=0.1)
 ```python
 paddlex.seg.transforms.RandomRotate(rotate_range=15, im_padding_value=[127.5, 127.5, 127.5], label_padding_value=255)
 ```
-对图像进行随机旋转,模型训练时的数据增强操作。
+对图像进行随机旋转,模型训练时的数据增强操作。目前支持多通道的RGB图像,例如支持多张RGB图像沿通道轴做concatenate后的图像数据,不支持通道数量不是3的倍数的图像数据。
 
 在旋转区间[-rotate_range, rotate_range]内,对图像进行随机旋转,当存在标注图像时,同步进行,
 并对旋转后的图像和标注图像进行相应的padding。
 ### 参数
 * **rotate_range** (float): 最大旋转角度。默认为15度。
-* **im_padding_value** (list): 图像padding的值。默认为[127.5, 127.5, 127.5]。
+* **im_padding_value** (list): 图像padding的值。默认为[127.5, 127.5, 127.5]。长度应与图像通道数量相同。
 * **label_padding_value** (int): 标注图像padding的值。默认为255。
 
 
@@ -153,7 +153,7 @@ paddlex.seg.transforms.RandomScaleAspect(min_scale=0.5, aspect_ratio=0.33)
 ```python
 paddlex.seg.transforms.RandomDistort(brightness_range=0.5, brightness_prob=0.5, contrast_range=0.5, contrast_prob=0.5, saturation_range=0.5, saturation_prob=0.5, hue_range=18, hue_prob=0.5)
 ```
-以一定的概率对图像进行随机像素内容变换,模型训练时的数据增强操作。
+以一定的概率对图像进行随机像素内容变换,模型训练时的数据增强操作。目前支持多通道的RGB图像,例如支持多张RGB图像沿通道轴做concatenate后的图像数据,不支持通道数量不是3的倍数的图像数据。
 
 1.对变换的操作顺序进行随机化操作。
 2.按照1中的顺序以一定的概率对图像在范围[-range, range]内进行随机像素内容变换。  

+ 0 - 65
examples/change_detection/hrnet_1.py

@@ -1,65 +0,0 @@
-# 环境变量配置,用于控制是否使用GPU
-# 说明文档:https://paddlex.readthedocs.io/zh_CN/develop/appendix/parameters.html#gpu
-import os
-os.environ['CUDA_VISIBLE_DEVICES'] = '0,1,6,7'
-
-import paddlex as pdx
-from paddlex.seg import transforms
-
-# 定义训练和验证时的transforms
-# API说明 https://paddlex.readthedocs.io/zh_CN/develop/apis/transforms/seg_transforms.html
-train_transforms = transforms.Compose([
-    transforms.ResizeStepScaling(
-        min_scale_factor=0.5, max_scale_factor=2.,
-        scale_step_size=0.25), transforms.RandomRotate(
-            rotate_range=180,
-            im_padding_value=[127.5] * 6), transforms.RandomPaddingCrop(
-                crop_size=769, im_padding_value=[127.5] * 6),
-    transforms.RandomDistort(), transforms.RandomHorizontalFlip(),
-    transforms.RandomVerticalFlip(), transforms.Normalize(
-        mean=[0.5] * 6, std=[0.5] * 6, min_val=[0] * 6, max_val=[255] * 6)
-])
-
-eval_transforms = transforms.Compose([
-    transforms.Padding(
-        target_size=769, im_padding_value=[127.5] * 6), transforms.Normalize(
-            mean=[0.5] * 6, std=[0.5] * 6, min_val=[0] * 6, max_val=[255] * 6)
-])
-
-# 定义训练和验证所用的数据集
-# API说明:https://paddlex.readthedocs.io/zh_CN/develop/apis/datasets.html#paddlex-datasets-segdataset
-train_dataset = pdx.datasets.ChangeDetDataset(
-    data_dir='tiled_dataset',
-    file_list='tiled_dataset/train_list.txt',
-    label_list='tiled_dataset/labels.txt',
-    transforms=train_transforms,
-    num_workers=4,
-    parallel_method='thread',
-    shuffle=True)
-eval_dataset = pdx.datasets.ChangeDetDataset(
-    data_dir='tiled_dataset',
-    file_list='tiled_dataset/val_list.txt',
-    label_list='tiled_dataset/labels.txt',
-    num_workers=4,
-    parallel_method='thread',
-    transforms=eval_transforms)
-
-# 初始化模型,并进行训练
-# 可使用VisualDL查看训练指标,参考https://paddlex.readthedocs.io/zh_CN/develop/train/visualdl.html
-num_classes = len(train_dataset.labels)
-
-# API说明:https://paddlex.readthedocs.io/zh_CN/develop/apis/models/semantic_segmentation.html#paddlex-seg-deeplabv3p
-model = pdx.seg.HRNet(num_classes=num_classes, input_channel=6)
-
-# API说明:https://paddlex.readthedocs.io/zh_CN/develop/apis/models/semantic_segmentation.html#train
-# 各参数介绍与调整说明:https://paddlex.readthedocs.io/zh_CN/develop/appendix/parameters.html
-model.train(
-    num_epochs=400,
-    train_dataset=train_dataset,
-    train_batch_size=16,
-    eval_dataset=eval_dataset,
-    learning_rate=0.1,
-    save_interval_epochs=10,
-    pretrain_weights='CITYSCAPES',
-    save_dir='output/hrnet_1',
-    use_vdl=True)

+ 0 - 108
examples/change_detection/prepara_data_cd.py

@@ -1,108 +0,0 @@
-import os
-import os.path as osp
-import numpy as np
-import cv2
-import shutil
-import random
-random.seed(0)
-from PIL import Image
-import paddlex as pdx
-
-# 定义训练集切分时的滑动窗口大小和步长,格式为(W, H)
-train_tile_size = (1024, 1024)
-train_stride = (512, 512)
-# 定义验证集切分时的滑动窗口大小和步长,格式(W, H)
-val_tile_size = (769, 769)
-val_stride = (769, 769)
-# 训练集和验证集比例
-train_ratio = 0.8
-val_ratio = 0.2
-
-change_det_dataset = './change_det_data'
-tiled_dataset = './tiled_dataset'
-origin_dataset = './origin_dataset'
-tiled_image_dir = osp.join(tiled_dataset, 'JPEGImages')
-tiled_anno_dir = osp.join(tiled_dataset, 'Annotations')
-
-if not osp.exists(tiled_image_dir):
-    os.makedirs(tiled_image_dir)
-if not osp.exists(tiled_anno_dir):
-    os.makedirs(tiled_anno_dir)
-
-# 划分数据集
-im1_file_list = os.listdir(osp.join(change_det_dataset, 'T1'))
-im2_file_list = os.listdir(osp.join(change_det_dataset, 'T2'))
-label_file_list = os.listdir(osp.join(change_det_dataset, 'labels_change'))
-im1_file_list = sorted(
-    im1_file_list, key=lambda k: int(k.split('test')[-1].split('_')[0]))
-im2_file_list = sorted(
-    im2_file_list, key=lambda k: int(k.split('test')[-1].split('_')[0]))
-label_file_list = sorted(
-    label_file_list, key=lambda k: int(k.split('test')[-1].split('_')[0]))
-file_list = list()
-for im1_file, im2_file, label_file in zip(im1_file_list, im2_file_list,
-                                          label_file_list):
-    im1_file = osp.join(osp.join(change_det_dataset, 'T1'), im1_file)
-    im2_file = osp.join(osp.join(change_det_dataset, 'T2'), im2_file)
-    label_file = osp.join(
-        osp.join(change_det_dataset, 'labels_change'), label_file)
-    file_list.append((im1_file, im2_file, label_file))
-random.shuffle(file_list)
-train_num = int(len(file_list) * train_ratio)
-
-for i, item in enumerate(file_list):
-    im1_file, im2_file, label_file = item[:]
-    if i < train_num:
-        stride = train_stride
-        tile_size = train_tile_size
-    else:
-        stride = val_stride
-        tile_size = val_tile_size
-    i += 1
-    set_name = 'train' if i < train_num else 'val'
-    im1 = cv2.imread(im1_file)
-    im2 = cv2.imread(im2_file)
-    label = cv2.imread(label_file, cv2.IMREAD_GRAYSCALE)
-    label = label != 0
-    label = label.astype(np.uint8)
-    H, W, C = im1.shape
-    tile_id = 1
-    im1_name = osp.split(im1_file)[-1].split('.')[0]
-    im2_name = osp.split(im2_file)[-1].split('.')[0]
-    label_name = osp.split(label_file)[-1].split('.')[0]
-    for h in range(0, H, stride[1]):
-        for w in range(0, W, stride[0]):
-            left = w
-            upper = h
-            right = min(w + tile_size[0], W)
-            lower = min(h + tile_size[1], H)
-            tile_im1 = im1[upper:lower, left:right, :]
-            tile_im2 = im2[upper:lower, left:right, :]
-            cv2.imwrite(
-                osp.join(tiled_image_dir,
-                         "{}_{}.bmp".format(im1_name, tile_id)), tile_im1)
-            cv2.imwrite(
-                osp.join(tiled_image_dir,
-                         "{}_{}.bmp".format(im2_name, tile_id)), tile_im2)
-            cut_label = label[upper:lower, left:right]
-            cv2.imwrite(
-                osp.join(tiled_anno_dir,
-                         "{}_{}.png".format(label_name, tile_id)), cut_label)
-            mode = 'w' if i in [0, train_num] and tile_id == 1 else 'a'
-            with open(
-                    osp.join(tiled_dataset, '{}_list.txt'.format(set_name)),
-                    mode) as f:
-                f.write(
-                    "JPEGImages/{}_{}.bmp JPEGImages/{}_{}.bmp Annotations/{}_{}.png\n".
-                    format(im1_name, tile_id, im2_name, tile_id, label_name,
-                           tile_id))
-            tile_id += 1
-
-# 生成labels.txt
-label_list = ['unchanged', 'changed']
-for i, label in enumerate(label_list):
-    mode = 'w' if i == 0 else 'a'
-    with open(osp.join(tiled_dataset, 'labels.txt'), 'a') as f:
-        name = "{}\n".format(label) if i < len(
-            label_list) - 1 else "{}".format(label)
-        f.write(name)

+ 0 - 40
examples/change_detection/test.py

@@ -1,40 +0,0 @@
-import os
-import cv2
-import numpy as np
-from PIL import Image
-
-import paddlex as pdx
-
-model_dir = "output/unet_1/best_model/"
-save_dir = 'output/gt_pred'
-if not os.path.exists(save_dir):
-    os.makedirs(save_dir)
-color = [0, 0, 0, 255, 255, 255]
-
-model = pdx.load_model(model_dir)
-
-with open('tiled_dataset/val_list.txt', 'r') as f:
-    for line in f:
-        items = line.strip().split()
-        img_file_1 = os.path.join('tiled_dataset', items[0])
-        img_file_2 = os.path.join('tiled_dataset', items[1])
-        label_file = os.path.join('tiled_dataset', items[2])
-
-        # 预测并可视化预测结果
-        im1 = cv2.imread(img_file_1)
-        im2 = cv2.imread(img_file_2)
-        image = np.concatenate((im1, im2), axis=-1)
-        pred = model.predict(image)
-        vis_pred = pdx.seg.visualize(
-            img_file_1, pred, weight=0., save_dir=None, color=color)
-
-        # 可视化标注文件
-        label = np.asarray(Image.open(label_file))
-        pred = {'label_map': label}
-        vis_gt = pdx.seg.visualize(
-            img_file_1, pred, weight=0., save_dir=None, color=color)
-
-        ims = cv2.hconcat([im1, im2])
-        labels = cv2.hconcat([vis_gt, vis_pred])
-        data = cv2.vconcat([ims, labels])
-        cv2.imwrite("{}/{}".format(save_dir, items[0].split('/')[-1]), data)

+ 0 - 71
examples/change_detection/unet.py

@@ -1,71 +0,0 @@
-# 环境变量配置,用于控制是否使用GPU
-# 说明文档:https://paddlex.readthedocs.io/zh_CN/develop/appendix/parameters.html#gpu
-import os
-os.environ['CUDA_VISIBLE_DEVICES'] = '2'
-
-import paddlex as pdx
-from paddlex.seg import transforms
-
-# 定义训练和验证时的transforms
-# API说明 https://paddlex.readthedocs.io/zh_CN/develop/apis/transforms/seg_transforms.html
-train_transforms = transforms.Compose([
-    #transforms.ResizeStepScaling(
-    #    min_scale_factor=0.5,
-    #    max_scale_factor=2.,
-    #    scale_step_size=0.25),
-    transforms.RandomPaddingCrop(
-        crop_size=769, im_padding_value=[127.5] * 6),
-    #transforms.ResizeByLong(long_size=512),
-    #transforms.Padding(
-    #    target_size=512, im_padding_value=[127.5] * 6),
-    transforms.RandomHorizontalFlip(),
-    transforms.RandomVerticalFlip(),
-    transforms.Normalize(
-        mean=[0.5] * 6, std=[0.5] * 6, min_val=[0] * 6, max_val=[255] * 6)
-])
-
-eval_transforms = transforms.Compose([
-    transforms.Padding(
-        target_size=1000, im_padding_value=[127.5] * 6), transforms.Normalize(
-            mean=[0.5] * 6, std=[0.5] * 6, min_val=[0] * 6, max_val=[255] * 6)
-])
-
-# 定义训练和验证所用的数据集
-# API说明:https://paddlex.readthedocs.io/zh_CN/develop/apis/datasets.html#paddlex-datasets-segdataset
-train_dataset = pdx.datasets.ChangeDetDataset(
-    data_dir='dataset',
-    file_list='dataset/train_list.txt',
-    label_list='dataset/labels.txt',
-    transforms=train_transforms,
-    num_workers=4,
-    shuffle=True)
-eval_dataset = pdx.datasets.ChangeDetDataset(
-    data_dir='dataset',
-    file_list='dataset/val_list.txt',
-    label_list='dataset/labels.txt',
-    num_workers=4,
-    transforms=eval_transforms)
-
-# 初始化模型,并进行训练
-# 可使用VisualDL查看训练指标,参考https://paddlex.readthedocs.io/zh_CN/develop/train/visualdl.html
-num_classes = len(train_dataset.labels)
-
-# API说明:https://paddlex.readthedocs.io/zh_CN/develop/apis/models/semantic_segmentation.html#paddlex-seg-deeplabv3p
-model = pdx.seg.UNet(
-    num_classes=num_classes,
-    input_channel=6,
-    use_bce_loss=True,
-    use_dice_loss=True)
-
-# API说明:https://paddlex.readthedocs.io/zh_CN/develop/apis/models/semantic_segmentation.html#train
-# 各参数介绍与调整说明:https://paddlex.readthedocs.io/zh_CN/develop/appendix/parameters.html
-model.train(
-    num_epochs=400,
-    train_dataset=train_dataset,
-    train_batch_size=4,
-    eval_dataset=eval_dataset,
-    learning_rate=0.01,
-    save_interval_epochs=10,
-    pretrain_weights='CITYSCAPES',
-    save_dir='output/unet_3',
-    use_vdl=True)

+ 0 - 63
examples/change_detection/unet_3.py

@@ -1,63 +0,0 @@
-# 环境变量配置,用于控制是否使用GPU
-# 说明文档:https://paddlex.readthedocs.io/zh_CN/develop/appendix/parameters.html#gpu
-import os
-os.environ['CUDA_VISIBLE_DEVICES'] = '2,3,4,5'
-
-import paddlex as pdx
-from paddlex.seg import transforms
-
-# 定义训练和验证时的transforms
-# API说明 https://paddlex.readthedocs.io/zh_CN/develop/apis/transforms/seg_transforms.html
-train_transforms = transforms.Compose([
-    transforms.ResizeStepScaling(
-        min_scale_factor=0.5, max_scale_factor=2.,
-        scale_step_size=0.25), transforms.RandomRotate(
-            rotate_range=180,
-            im_padding_value=[127.5] * 6), transforms.RandomPaddingCrop(
-                crop_size=769, im_padding_value=[127.5] * 6),
-    transforms.RandomDistort(), transforms.RandomHorizontalFlip(),
-    transforms.RandomVerticalFlip(), transforms.Normalize(
-        mean=[0.5] * 6, std=[0.5] * 6, min_val=[0] * 6, max_val=[255] * 6)
-])
-
-eval_transforms = transforms.Compose([
-    transforms.Padding(
-        target_size=769, im_padding_value=[127.5] * 6), transforms.Normalize(
-            mean=[0.5] * 6, std=[0.5] * 6, min_val=[0] * 6, max_val=[255] * 6)
-])
-
-# 定义训练和验证所用的数据集
-# API说明:https://paddlex.readthedocs.io/zh_CN/develop/apis/datasets.html#paddlex-datasets-segdataset
-train_dataset = pdx.datasets.ChangeDetDataset(
-    data_dir='tiled_dataset',
-    file_list='tiled_dataset/train_list.txt',
-    label_list='tiled_dataset/labels.txt',
-    transforms=train_transforms,
-    num_workers=4,
-    shuffle=True)
-eval_dataset = pdx.datasets.ChangeDetDataset(
-    data_dir='tiled_dataset',
-    file_list='tiled_dataset/val_list.txt',
-    label_list='tiled_dataset/labels.txt',
-    num_workers=4,
-    transforms=eval_transforms)
-
-# 初始化模型,并进行训练
-# 可使用VisualDL查看训练指标,参考https://paddlex.readthedocs.io/zh_CN/develop/train/visualdl.html
-num_classes = len(train_dataset.labels)
-
-# API说明:https://paddlex.readthedocs.io/zh_CN/develop/apis/models/semantic_segmentation.html#paddlex-seg-deeplabv3p
-model = pdx.seg.UNet(num_classes=num_classes, input_channel=6)
-
-# API说明:https://paddlex.readthedocs.io/zh_CN/develop/apis/models/semantic_segmentation.html#train
-# 各参数介绍与调整说明:https://paddlex.readthedocs.io/zh_CN/develop/appendix/parameters.html
-model.train(
-    num_epochs=400,
-    train_dataset=train_dataset,
-    train_batch_size=16,
-    eval_dataset=eval_dataset,
-    learning_rate=0.1,
-    save_interval_epochs=10,
-    pretrain_weights='CITYSCAPES',
-    save_dir='output/unet_3',
-    use_vdl=True)

+ 8 - 13
paddlex/cv/transforms/seg_transforms.py

@@ -840,19 +840,14 @@ class RandomPaddingCrop(SegTransform):
                 img_width = im.shape[1]
 
             if crop_height > 0 and crop_width > 0:
-                while 1:
-                    h_off = np.random.randint(img_height - crop_height + 1)
-                    w_off = np.random.randint(img_width - crop_width + 1)
-
-                    im = im[h_off:(crop_height + h_off), w_off:(w_off +
-                                                                crop_width), :]
-                    if label is not None:
-                        label = label[h_off:(crop_height + h_off), w_off:(
-                            w_off + crop_width)]
-                    if np.max(im) != np.min(im):
-                        break
-                    else:
-                        print('There is only one class\n')
+                h_off = np.random.randint(img_height - crop_height + 1)
+                w_off = np.random.randint(img_width - crop_width + 1)
+
+                im = im[h_off:(crop_height + h_off), w_off:(w_off + crop_width
+                                                            ), :]
+                if label is not None:
+                    label = label[h_off:(crop_height + h_off), w_off:(
+                        w_off + crop_width)]
         if label is None:
             return (im, im_info)
         else:

+ 1 - 1
paddlex/cv/transforms/visualize.py

@@ -239,7 +239,7 @@ def seg_compose(im,
             im = cv2.imread(im)
         except:
             raise ValueError('Can\'t read The image file {}!'.format(im))
-    #im = cv2.cvtColor(im, cv2.COLOR_BGR2RGB)
+    im = cv2.cvtColor(im, cv2.COLOR_BGR2RGB)
     im = im.astype('float32')
     h, w, c = im.shape
     if label is not None: