diff --git a/official/cv/yolov3_resnet18/src/dataset.py b/official/cv/yolov3_resnet18/src/dataset.py index 26e288eca613971858d8b8439df9c1b2cf269d2e..c27d0d3d2120c1e25474321a10bb7db04f5b86b7 100644 --- a/official/cv/yolov3_resnet18/src/dataset.py +++ b/official/cv/yolov3_resnet18/src/dataset.py @@ -18,7 +18,6 @@ from __future__ import division import os import numpy as np -from matplotlib.colors import rgb_to_hsv, hsv_to_rgb from PIL import Image import mindspore.dataset as de from mindspore.mindrecord import FileWriter @@ -32,13 +31,9 @@ def preprocess_fn(image, box, is_training): """Preprocess function for dataset.""" config_anchors = [10, 13, 16, 30, 33, 23, 30, 61, 62, 45, 59, 119, 116, 90, 156, 198, 163, 326] anchors = np.array([float(x) for x in config_anchors]).reshape(-1, 2) - do_hsv = False max_boxes = 20 num_classes = ConfigYOLOV3ResNet18.num_classes - def _rand(a=0., b=1.): - return np.random.rand() * (b - a) + a - def _preprocess_true_boxes(true_boxes, anchors, in_shape=None): """Get true boxes.""" num_layers = anchors.shape[0] // 3 @@ -145,14 +140,14 @@ def preprocess_fn(image, box, is_training): if not is_training: return _infer_data(image, image_size, box) - flip = _rand() < .5 + flip = np.random.rand() < 0.5 # correct boxes box_data = np.zeros((max_boxes, 5)) while True: # Prevent the situation that all boxes are eliminated - new_ar = float(w) / float(h) * _rand(1 - jitter, 1 + jitter) / \ - _rand(1 - jitter, 1 + jitter) - scale = _rand(0.25, 2) + new_ar = float(w) / float(h) * np.random.uniform(1 - jitter, 1 + jitter) / \ + np.random.uniform(1 - jitter, 1 + jitter) + scale = np.random.uniform(0.25, 2) if new_ar < 1: nh = int(scale * h) @@ -161,8 +156,8 @@ def preprocess_fn(image, box, is_training): nw = int(scale * w) nh = int(nw / new_ar) - dx = int(_rand(0, w - nw)) - dy = int(_rand(0, h - nh)) + dx = int(np.random.uniform(0, w - nw)) + dy = int(np.random.uniform(0, h - nh)) if len(box) >= 1: t_box = box.copy() @@ -195,8 +190,7 @@ def preprocess_fn(image, box, is_training): image = image.transpose(Image.FLIP_LEFT_RIGHT) # convert image to gray or not - gray = _rand() < .25 - if gray: + if np.random.rand() < 0.25: image = image.convert('L').convert('RGB') # when the channels of image is 1 @@ -206,21 +200,7 @@ def preprocess_fn(image, box, is_training): image = np.concatenate([image, image, image], axis=-1) # distort image - hue = _rand(-hue, hue) - sat = _rand(1, sat) if _rand() < .5 else 1 / _rand(1, sat) - val = _rand(1, val) if _rand() < .5 else 1 / _rand(1, val) - image_data = image / 255. - if do_hsv: - x = rgb_to_hsv(image_data) - x[..., 0] += hue - x[..., 0][x[..., 0] > 1] -= 1 - x[..., 0][x[..., 0] < 0] += 1 - x[..., 1] *= sat - x[..., 2] *= val - x[x > 1] = 1 - x[x < 0] = 0 - image_data = hsv_to_rgb(x) # numpy array, 0 to 1 - image_data = image_data.astype(np.float32) + image_data = image.astype(np.float32) / 255. # preprocess bounding boxes bbox_true_1, bbox_true_2, bbox_true_3, gt_box1, gt_box2, gt_box3 = \ @@ -294,13 +274,14 @@ def data_to_mindrecord_byte_image(image_dir, anno_path, mindrecord_dir, prefix, writer.commit() -def create_yolo_dataset(mindrecord_dir, batch_size=32, repeat_num=1, device_num=1, rank=0, +def create_yolo_dataset(mindrecord_dir, batch_size=32, device_num=1, rank=0, is_training=True, num_parallel_workers=8): """Create YOLOv3 dataset with MindDataset.""" + de.config.set_prefetch_size(64) ds = de.MindDataset(mindrecord_dir, columns_list=["image", "annotation"], num_shards=device_num, shard_id=rank, - num_parallel_workers=num_parallel_workers, shuffle=is_training) + num_parallel_workers=2, shuffle=is_training) decode = C.Decode() - ds = ds.map(operations=decode, input_columns=["image"]) + ds = ds.map(operations=decode, input_columns=["image"], num_parallel_workers=1) compose_map_func = (lambda image, annotation: preprocess_fn(image, annotation, is_training)) if is_training: @@ -309,9 +290,8 @@ def create_yolo_dataset(mindrecord_dir, batch_size=32, repeat_num=1, device_num= output_columns=["image", "bbox_1", "bbox_2", "bbox_3", "gt_box1", "gt_box2", "gt_box3"], column_order=["image", "bbox_1", "bbox_2", "bbox_3", "gt_box1", "gt_box2", "gt_box3"], num_parallel_workers=num_parallel_workers) - ds = ds.map(operations=hwc_to_chw, input_columns=["image"], num_parallel_workers=num_parallel_workers) + ds = ds.map(operations=hwc_to_chw, input_columns=["image"], num_parallel_workers=1) ds = ds.batch(batch_size, drop_remainder=True) - ds = ds.repeat(repeat_num) else: ds = ds.map(operations=compose_map_func, input_columns=["image", "annotation"], output_columns=["image", "image_shape", "annotation"],