Download Google Open Images¶
M. Fawcett - 10/17/2021
Download Google Open Images for a specific class of objects (example, just images of houses).
See: https://pypi.org/project/openimages/ See: https://www.freecodecamp.org/news/how-to-classify-photos-in-600-classes-using-nine-million-open-images-65847da1a319/
Explanation of four different bounding box annotation types, including YOLO/Darknet .txt files: https://albumentations.ai/docs/getting_started/bounding_boxes_augmentation/
Google does not charge for this service.
YOLO darknet .txt bounding box annotation format¶
In yolo, a bounding box is represented by four values [x_center, y_center, width, height]. x_center and y_center are the normalized coordinates of the center of the bounding box. To make coordinates normalized, we take pixel values of x and y, which marks the center of the bounding box on the x- and y-axis. Then we divide the value of x by the width of the image and value of y by the height of the image. width and height represent the width and the height of the bounding box. They are normalized as well.
Coordinates of the example bounding box in this format are [((420 + 98) / 2) / 640, ((462 + 345) / 2) / 480, 322 / 640, 117 / 480] which are [0.4046875, 0.840625, 0.503125, 0.24375].
!pip install openimages
Collecting openimages
Downloading openimages-0.0.1-py2.py3-none-any.whl (10 kB)
Requirement already satisfied: requests in /Users/mitchellfawcett/anaconda3/lib/python3.7/site-packages (from openimages) (2.21.0)
Requirement already satisfied: tqdm in /Users/mitchellfawcett/anaconda3/lib/python3.7/site-packages (from openimages) (4.31.1)
Requirement already satisfied: pandas in /Users/mitchellfawcett/anaconda3/lib/python3.7/site-packages (from openimages) (0.24.2)
Collecting cvdata
Downloading cvdata-0.0.7-py2.py3-none-any.whl (49 kB)
|████████████████████████████████| 49 kB 3.9 MB/s
Collecting boto3
Downloading boto3-1.18.63-py3-none-any.whl (131 kB)
|████████████████████████████████| 131 kB 8.6 MB/s
Requirement already satisfied: lxml in /Users/mitchellfawcett/anaconda3/lib/python3.7/site-packages (from openimages) (4.6.2)
Collecting jmespath<1.0.0,>=0.7.1
Downloading jmespath-0.10.0-py2.py3-none-any.whl (24 kB)
Collecting s3transfer<0.6.0,>=0.5.0
Downloading s3transfer-0.5.0-py3-none-any.whl (79 kB)
|████████████████████████████████| 79 kB 16.6 MB/s
Collecting botocore<1.22.0,>=1.21.63
Downloading botocore-1.21.63-py3-none-any.whl (8.0 MB)
|████████████████████████████████| 8.0 MB 19.4 MB/s
Requirement already satisfied: pillow in /Users/mitchellfawcett/anaconda3/lib/python3.7/site-packages (from cvdata->openimages) (5.4.1)
Collecting ImageHash
Downloading ImageHash-4.2.1.tar.gz (812 kB)
|████████████████████████████████| 812 kB 15.1 MB/s
Preparing metadata (setup.py) ... done
Collecting tensorflow-cpu>=2.1
Downloading tensorflow_cpu-2.6.0-cp37-cp37m-macosx_10_11_x86_64.whl (198.9 MB)
|████████████████████████████████| 198.9 MB 13.6 MB/s
Requirement already satisfied: contextlib2 in /Users/mitchellfawcett/anaconda3/lib/python3.7/site-packages (from cvdata->openimages) (0.5.5)
Requirement already satisfied: opencv-python in /Users/mitchellfawcett/anaconda3/lib/python3.7/site-packages (from cvdata->openimages) (4.5.3.56)
Requirement already satisfied: numpy>=1.12.0 in /Users/mitchellfawcett/anaconda3/lib/python3.7/site-packages (from pandas->openimages) (1.19.5)
Requirement already satisfied: python-dateutil>=2.5.0 in /Users/mitchellfawcett/anaconda3/lib/python3.7/site-packages (from pandas->openimages) (2.8.0)
Requirement already satisfied: pytz>=2011k in /Users/mitchellfawcett/anaconda3/lib/python3.7/site-packages (from pandas->openimages) (2018.9)
Requirement already satisfied: idna<2.9,>=2.5 in /Users/mitchellfawcett/anaconda3/lib/python3.7/site-packages (from requests->openimages) (2.8)
Requirement already satisfied: chardet<3.1.0,>=3.0.2 in /Users/mitchellfawcett/anaconda3/lib/python3.7/site-packages (from requests->openimages) (3.0.4)
Requirement already satisfied: certifi>=2017.4.17 in /Users/mitchellfawcett/anaconda3/lib/python3.7/site-packages (from requests->openimages) (2020.12.5)
Requirement already satisfied: urllib3<1.25,>=1.21.1 in /Users/mitchellfawcett/anaconda3/lib/python3.7/site-packages (from requests->openimages) (1.24.1)
INFO: pip is looking at multiple versions of tqdm to determine which version is compatible with other requirements. This could take a while.
Collecting tqdm
Downloading tqdm-4.62.3-py2.py3-none-any.whl (76 kB)
|████████████████████████████████| 76 kB 8.2 MB/s
INFO: pip is looking at multiple versions of requests to determine which version is compatible with other requirements. This could take a while.
Collecting requests
Downloading requests-2.26.0-py2.py3-none-any.whl (62 kB)
|████████████████████████████████| 62 kB 3.2 MB/s
Collecting charset-normalizer~=2.0.0
Downloading charset_normalizer-2.0.7-py3-none-any.whl (38 kB)
Collecting urllib3<1.27,>=1.21.1
Downloading urllib3-1.26.7-py2.py3-none-any.whl (138 kB)
|████████████████████████████████| 138 kB 23.9 MB/s
Requirement already satisfied: six>=1.5 in /Users/mitchellfawcett/anaconda3/lib/python3.7/site-packages (from python-dateutil>=2.5.0->pandas->openimages) (1.15.0)
Requirement already satisfied: tensorflow-estimator~=2.6 in /Users/mitchellfawcett/anaconda3/lib/python3.7/site-packages (from tensorflow-cpu>=2.1->cvdata->openimages) (2.6.0)
Requirement already satisfied: wheel~=0.35 in /Users/mitchellfawcett/anaconda3/lib/python3.7/site-packages (from tensorflow-cpu>=2.1->cvdata->openimages) (0.37.0)
Requirement already satisfied: flatbuffers~=1.12.0 in /Users/mitchellfawcett/anaconda3/lib/python3.7/site-packages (from tensorflow-cpu>=2.1->cvdata->openimages) (1.12)
Requirement already satisfied: opt-einsum~=3.3.0 in /Users/mitchellfawcett/anaconda3/lib/python3.7/site-packages (from tensorflow-cpu>=2.1->cvdata->openimages) (3.3.0)
Requirement already satisfied: tensorboard~=2.6 in /Users/mitchellfawcett/anaconda3/lib/python3.7/site-packages (from tensorflow-cpu>=2.1->cvdata->openimages) (2.6.0)
Requirement already satisfied: clang~=5.0 in /Users/mitchellfawcett/anaconda3/lib/python3.7/site-packages (from tensorflow-cpu>=2.1->cvdata->openimages) (5.0)
Requirement already satisfied: astunparse~=1.6.3 in /Users/mitchellfawcett/anaconda3/lib/python3.7/site-packages (from tensorflow-cpu>=2.1->cvdata->openimages) (1.6.3)
Requirement already satisfied: google-pasta~=0.2 in /Users/mitchellfawcett/anaconda3/lib/python3.7/site-packages (from tensorflow-cpu>=2.1->cvdata->openimages) (0.2.0)
Requirement already satisfied: absl-py~=0.10 in /Users/mitchellfawcett/anaconda3/lib/python3.7/site-packages (from tensorflow-cpu>=2.1->cvdata->openimages) (0.14.1)
Requirement already satisfied: protobuf>=3.9.2 in /Users/mitchellfawcett/anaconda3/lib/python3.7/site-packages (from tensorflow-cpu>=2.1->cvdata->openimages) (3.18.0)
Requirement already satisfied: termcolor~=1.1.0 in /Users/mitchellfawcett/anaconda3/lib/python3.7/site-packages (from tensorflow-cpu>=2.1->cvdata->openimages) (1.1.0)
Requirement already satisfied: keras~=2.6 in /Users/mitchellfawcett/anaconda3/lib/python3.7/site-packages (from tensorflow-cpu>=2.1->cvdata->openimages) (2.6.0)
Requirement already satisfied: grpcio<2.0,>=1.37.0 in /Users/mitchellfawcett/anaconda3/lib/python3.7/site-packages (from tensorflow-cpu>=2.1->cvdata->openimages) (1.41.0)
Requirement already satisfied: h5py~=3.1.0 in /Users/mitchellfawcett/anaconda3/lib/python3.7/site-packages (from tensorflow-cpu>=2.1->cvdata->openimages) (3.1.0)
Requirement already satisfied: wrapt~=1.12.1 in /Users/mitchellfawcett/anaconda3/lib/python3.7/site-packages (from tensorflow-cpu>=2.1->cvdata->openimages) (1.12.1)
Requirement already satisfied: gast==0.4.0 in /Users/mitchellfawcett/anaconda3/lib/python3.7/site-packages (from tensorflow-cpu>=2.1->cvdata->openimages) (0.4.0)
Requirement already satisfied: typing-extensions~=3.7.4 in /Users/mitchellfawcett/anaconda3/lib/python3.7/site-packages (from tensorflow-cpu>=2.1->cvdata->openimages) (3.7.4.3)
Requirement already satisfied: keras-preprocessing~=1.1.2 in /Users/mitchellfawcett/anaconda3/lib/python3.7/site-packages (from tensorflow-cpu>=2.1->cvdata->openimages) (1.1.2)
Requirement already satisfied: scipy in /Users/mitchellfawcett/anaconda3/lib/python3.7/site-packages (from ImageHash->cvdata->openimages) (1.2.1)
Requirement already satisfied: PyWavelets in /Users/mitchellfawcett/anaconda3/lib/python3.7/site-packages (from ImageHash->cvdata->openimages) (1.0.2)
Requirement already satisfied: cached-property in /Users/mitchellfawcett/anaconda3/lib/python3.7/site-packages (from h5py~=3.1.0->tensorflow-cpu>=2.1->cvdata->openimages) (1.5.2)
Requirement already satisfied: setuptools>=41.0.0 in /Users/mitchellfawcett/anaconda3/lib/python3.7/site-packages (from tensorboard~=2.6->tensorflow-cpu>=2.1->cvdata->openimages) (58.2.0)
Requirement already satisfied: google-auth-oauthlib<0.5,>=0.4.1 in /Users/mitchellfawcett/anaconda3/lib/python3.7/site-packages (from tensorboard~=2.6->tensorflow-cpu>=2.1->cvdata->openimages) (0.4.6)
Requirement already satisfied: werkzeug>=0.11.15 in /Users/mitchellfawcett/anaconda3/lib/python3.7/site-packages (from tensorboard~=2.6->tensorflow-cpu>=2.1->cvdata->openimages) (0.14.1)
Requirement already satisfied: tensorboard-plugin-wit>=1.6.0 in /Users/mitchellfawcett/anaconda3/lib/python3.7/site-packages (from tensorboard~=2.6->tensorflow-cpu>=2.1->cvdata->openimages) (1.8.0)
Requirement already satisfied: google-auth<2,>=1.6.3 in /Users/mitchellfawcett/anaconda3/lib/python3.7/site-packages (from tensorboard~=2.6->tensorflow-cpu>=2.1->cvdata->openimages) (1.35.0)
Requirement already satisfied: tensorboard-data-server<0.7.0,>=0.6.0 in /Users/mitchellfawcett/anaconda3/lib/python3.7/site-packages (from tensorboard~=2.6->tensorflow-cpu>=2.1->cvdata->openimages) (0.6.1)
Requirement already satisfied: markdown>=2.6.8 in /Users/mitchellfawcett/anaconda3/lib/python3.7/site-packages (from tensorboard~=2.6->tensorflow-cpu>=2.1->cvdata->openimages) (3.3.4)
Requirement already satisfied: pyasn1-modules>=0.2.1 in /Users/mitchellfawcett/anaconda3/lib/python3.7/site-packages (from google-auth<2,>=1.6.3->tensorboard~=2.6->tensorflow-cpu>=2.1->cvdata->openimages) (0.2.8)
Requirement already satisfied: rsa<5,>=3.1.4 in /Users/mitchellfawcett/anaconda3/lib/python3.7/site-packages (from google-auth<2,>=1.6.3->tensorboard~=2.6->tensorflow-cpu>=2.1->cvdata->openimages) (4.7.2)
Requirement already satisfied: cachetools<5.0,>=2.0.0 in /Users/mitchellfawcett/anaconda3/lib/python3.7/site-packages (from google-auth<2,>=1.6.3->tensorboard~=2.6->tensorflow-cpu>=2.1->cvdata->openimages) (4.2.4)
Requirement already satisfied: requests-oauthlib>=0.7.0 in /Users/mitchellfawcett/anaconda3/lib/python3.7/site-packages (from google-auth-oauthlib<0.5,>=0.4.1->tensorboard~=2.6->tensorflow-cpu>=2.1->cvdata->openimages) (1.3.0)
Requirement already satisfied: importlib-metadata in /Users/mitchellfawcett/anaconda3/lib/python3.7/site-packages (from markdown>=2.6.8->tensorboard~=2.6->tensorflow-cpu>=2.1->cvdata->openimages) (0.0.0)
Requirement already satisfied: pyasn1<0.5.0,>=0.4.6 in /Users/mitchellfawcett/anaconda3/lib/python3.7/site-packages (from pyasn1-modules>=0.2.1->google-auth<2,>=1.6.3->tensorboard~=2.6->tensorflow-cpu>=2.1->cvdata->openimages) (0.4.8)
Requirement already satisfied: oauthlib>=3.0.0 in /Users/mitchellfawcett/anaconda3/lib/python3.7/site-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard~=2.6->tensorflow-cpu>=2.1->cvdata->openimages) (3.1.1)
Requirement already satisfied: zipp>=0.3.2 in /Users/mitchellfawcett/anaconda3/lib/python3.7/site-packages (from importlib-metadata->markdown>=2.6.8->tensorboard~=2.6->tensorflow-cpu>=2.1->cvdata->openimages) (3.6.0)
Building wheels for collected packages: ImageHash
Building wheel for ImageHash (setup.py) ... done
Created wheel for ImageHash: filename=ImageHash-4.2.1-py2.py3-none-any.whl size=295207 sha256=6eb7abe56d323f9651be72a573a5b3e8420404866e01d65647cce2f2eaa2e413
Stored in directory: /Users/mitchellfawcett/Library/Caches/pip/wheels/4c/d5/59/5e3e297533ddb09407769762985d134135064c6831e29a914e
Successfully built ImageHash
Installing collected packages: urllib3, charset-normalizer, requests, jmespath, botocore, tensorflow-cpu, s3transfer, ImageHash, cvdata, boto3, openimages
Attempting uninstall: urllib3
Found existing installation: urllib3 1.24.1
Uninstalling urllib3-1.24.1:
Successfully uninstalled urllib3-1.24.1
Attempting uninstall: requests
Found existing installation: requests 2.21.0
Uninstalling requests-2.21.0:
Successfully uninstalled requests-2.21.0
ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
conda 4.10.1 requires ruamel_yaml_conda>=0.11.14, which is not installed.
Successfully installed ImageHash-4.2.1 boto3-1.18.63 botocore-1.21.63 charset-normalizer-2.0.7 cvdata-0.0.7 jmespath-0.10.0 openimages-0.0.1 requests-2.26.0 s3transfer-0.5.0 tensorflow-cpu-2.6.0 urllib3-1.26.7
from openimages.download import download_dataset
download_dataset("/Users/mitchellfawcett/Documents/Data Science/Blog - Download Google Open Images/mydestination/mydirectory", ["Hammer", "Scissors",], annotation_format="pascal")
2021-10-17 10:06:35 INFO Downloading 53 train images for class 'hammer' 100%|██████████| 53/53 [00:01<00:00, 38.59it/s] 2021-10-17 10:06:37 INFO Creating 53 train annotations (pascal) for class 'hammer' 100%|██████████| 53/53 [00:00<00:00, 1464.42it/s] 2021-10-17 10:06:37 INFO Downloading 166 train images for class 'scissors' 100%|██████████| 166/166 [00:03<00:00, 46.26it/s] 2021-10-17 10:06:41 INFO Creating 166 train annotations (pascal) for class 'scissors' 100%|██████████| 166/166 [00:00<00:00, 3279.01it/s] 2021-10-17 10:06:43 INFO Downloading 0 validation images for class 'hammer' 0it [00:00, ?it/s] 2021-10-17 10:06:43 INFO Creating 0 validation annotations (pascal) for class 'hammer' 0it [00:00, ?it/s] 2021-10-17 10:06:43 INFO Downloading 1 validation images for class 'scissors' 100%|██████████| 1/1 [00:00<00:00, 4.65it/s] 2021-10-17 10:06:43 INFO Creating 1 validation annotations (pascal) for class 'scissors' 100%|██████████| 1/1 [00:00<00:00, 48.64it/s] 2021-10-17 10:06:49 INFO Downloading 0 test images for class 'hammer' 0it [00:00, ?it/s] 2021-10-17 10:06:49 INFO Creating 0 test annotations (pascal) for class 'hammer' 0it [00:00, ?it/s] 2021-10-17 10:06:49 INFO Downloading 5 test images for class 'scissors' 100%|██████████| 5/5 [00:00<00:00, 18.03it/s] 2021-10-17 10:06:49 INFO Creating 5 test annotations (pascal) for class 'scissors' 100%|██████████| 5/5 [00:00<00:00, 189.05it/s]
{'hammer': {'images_dir': '/Users/mitchellfawcett/Documents/Data Science/Blog - Download Google Open Images/mydestination/mydirectory/hammer/images', 'annotations_dir': '/Users/mitchellfawcett/Documents/Data Science/Blog - Download Google Open Images/mydestination/mydirectory/hammer/pascal'}, 'scissors': {'images_dir': '/Users/mitchellfawcett/Documents/Data Science/Blog - Download Google Open Images/mydestination/mydirectory/scissors/images', 'annotations_dir': '/Users/mitchellfawcett/Documents/Data Science/Blog - Download Google Open Images/mydestination/mydirectory/scissors/pascal'}}
download_dataset("/Users/mitchellfawcett/Documents/Data Science/Blog - Download Google Open Images/mydestination/mydirectory", ["House"], annotation_format="darknet")
2021-10-17 10:58:26 INFO Downloading 34060 train images for class 'house' 100%|█████████▉| 34040/34060 [16:45<00:01, 15.05it/s] 2021-10-17 11:15:15 WARNING Connection pool is full, discarding connection: open-images-dataset.s3.amazonaws.com 100%|██████████| 34060/34060 [16:47<00:00, 33.81it/s] 2021-10-17 11:15:15 INFO Creating 34060 train annotations (darknet) for class 'house' 100%|██████████| 34060/34060 [00:11<00:00, 2897.41it/s] 2021-10-17 11:16:08 INFO Downloading 92 validation images for class 'house' 100%|██████████| 92/92 [00:03<00:00, 25.33it/s] 2021-10-17 11:16:12 INFO Creating 92 validation annotations (darknet) for class 'house' 100%|██████████| 92/92 [00:00<00:00, 2417.36it/s] 2021-10-17 11:16:18 INFO Downloading 317 test images for class 'house' 100%|██████████| 317/317 [00:08<00:00, 39.14it/s] 2021-10-17 11:16:26 INFO Creating 317 test annotations (darknet) for class 'house' 100%|██████████| 317/317 [00:00<00:00, 2493.12it/s]
{'house': {'images_dir': '/Users/mitchellfawcett/Documents/Data Science/Blog - Download Google Open Images/mydestination/mydirectory/house/images', 'annotations_dir': '/Users/mitchellfawcett/Documents/Data Science/Blog - Download Google Open Images/mydestination/mydirectory/house/darknet'}}
# Display an image with bounding box
from matplotlib import pyplot
from matplotlib.patches import Rectangle
from PIL import Image
# load the image
# [x_center, y_center, width, height] normalized falues
data = pyplot.imread("./mydestination/mydirectory/house/images/000a0b93c3852d73.jpg")
# plot the image
pyplot.imshow(data, cmap="gray")
image = Image.open("./mydestination/mydirectory/house/images/000a0b93c3852d73.jpg")
# image to open
image_width_pxl, image_height_pxl = image.size
print(image_width_pxl, image_height_pxl)
# get the context for drawing boxes
ax = pyplot.gca()
# y1, x1, y2, x2 = box.ymin, box.xmin, box.ymax, box.xmax
# get coordinates
y1, x1, y2, x2 = 300, 300, 500, 600
# calculate width and height of the box
w, h = x2 - x1, y2 - y1
# create the shape
rect = Rectangle((x1, y1), w, h, fill=False, color='white')
# draw the box
# ax.add_patch(rect)
# Store normalized YOLO values into variables containing a box's center point, height and width.
box_center_x_nrml = 0.21968749999999998
box_center_y_nrml = 0.39844549999999995
box_width_nrml = 0.406875
box_height_nrml = 0.5108809999999999
# Convert box's normalized center point to a pixel location
box_center_x_pxl = image_width_pxl * box_center_x_nrml
box_center_y_pxl = image_height_pxl * box_center_y_nrml
# Convert box's normalized height and width to pixel size
box_width_pxl = box_width_nrml * image_width_pxl
box_height_pxl = box_height_nrml * image_height_pxl
# create the shape
# circle1 = pyplot.Circle(xy = (300, 200), radius = 10, fill = False, color = 'r') # ((x, y), radius)
# draw the shape
# ax.add_patch(circle1)
# create center marker
center_mark = pyplot.Circle(xy = (box_center_x_pxl, box_center_y_pxl), radius = 10, fill = False, color = 'r')
# draw the shape to show the box center
ax.add_patch(center_mark)
# create upper left marker
upper_left_xy = (box_center_x_pxl - box_width_pxl/2, box_center_y_pxl - box_height_pxl/2)
up_left_mark = pyplot.Circle(xy = (upper_left_xy), radius = 10, fill = False, color = 'r')
# draw the shape
# ax.add_patch(up_left_mark)
# create the bounding box shape
rect = Rectangle((upper_left_xy), box_width_pxl, box_height_pxl, fill=False, color='white')
# draw the box
ax.add_patch(rect)
1024 618
<matplotlib.patches.Rectangle at 0x7ffd7ce1d390>
# Read a yolo annotation file and display bounding boxes on the corresponding image.
# Explanation of four different bounding box annotation types, including YOLO/Darknet .txt files:
# https://albumentations.ai/docs/getting_started/bounding_boxes_augmentation/
# Names of an annotation file and corresponding image file.
yolo_txt_file = "./mydestination/mydirectory/house/darknet/2b9787973530ec79.txt"
image_file = "./mydestination/mydirectory/house/images/2b9787973530ec79.jpg"
# Get image width in pixels
image = Image.open(image_file)
image_width_pxl, image_height_pxl = image.size
# Load image
data = pyplot.imread(image_file)
# plot the image
pyplot.imshow(data, cmap="gray")
# get the context for drawing boxes
ax = pyplot.gca()
# Using readlines()
file1 = open(yolo_txt_file, 'r')
Lines = file1.readlines()
count = 0
for line in Lines:
count += 1
x = line.strip() # Strips the newline character
classification, box_center_x_nrml, box_center_y_nrml, box_width_nrml, box_height_nrml = [float(item) for item in x.split()]
print(classification, box_center_x_nrml, box_center_y_nrml, box_width_nrml, box_height_nrml)
# Convert box's normalized center point to a pixel location
box_center_x_pxl = image_width_pxl * box_center_x_nrml
box_center_y_pxl = image_height_pxl * box_center_y_nrml
# Convert box's normalized height and width to pixel size
box_width_pxl = box_width_nrml * image_width_pxl
box_height_pxl = box_height_nrml * image_height_pxl
# Create upper left marker
upper_left_xy = (box_center_x_pxl - (box_width_pxl/2.0), box_center_y_pxl - (box_height_pxl/2.0))
# create the bounding box shape
rect = Rectangle((upper_left_xy), box_width_pxl, box_height_pxl, fill=False, color='red')
# draw the box
ax.add_patch(rect)
0.0 0.3325 0.844538 0.135 0.10177400000000004 0.0 0.4559375 0.7670399999999999 0.130625 0.11297800000000002 0.0 0.45718749999999997 0.4351075 0.07437500000000002 0.08403300000000002 0.0 0.5196875 0.32212899999999994 0.11812499999999998 0.21848799999999996