code: def fetch_openimages(output_fn):
      bucket = boto3.resource(
          "s3",
          config=botocore.config.Config(
              signature_version=botocore.UNSIGNED
          ),
      ).Bucket(BUCKET_NAME)
  
      annotations_dir, data_dir = (
          BASEDIR / "annotations",
          BASEDIR / "validation/data",
      )
      annotations_dir.mkdir(parents=True, exist_ok=True)
      data_dir.mkdir(parents=True, exist_ok=True)
  
      annotations_fn = (
          annotations_dir / BBOX_ANNOTATIONS_URL.split("/")[-1]
      )
      fetch(BBOX_ANNOTATIONS_URL, annotations_fn)
      annotations = pd.read_csv(annotations_fn)
  
      classmap_fn = annotations_dir / MAP_CLASSES_URL.split("/")[-1]
      fetch(MAP_CLASSES_URL, classmap_fn)
      class_map = pd.read_csv(
          classmap_fn, names=["LabelName", "DisplayName"]
      )
  
      image_list = get_image_list(class_map, annotations)
  
      with concurrent.futures.ThreadPoolExecutor() as executor:
          futures = [
              executor.submit(
                  download_image, bucket, image_id, data_dir
              )
              for image_id in image_list
          ]
          for future in (
              t := tqdm(
                  concurrent.futures.as_completed(futures),
                  total=len(image_list),
              )
          ):
              t.set_description(f"Downloading images")
              future.result()
  
      print("Converting annotations to COCO format...")
      export_to_coco(
          class_map, annotations, image_list, data_dir, output_fn
      )
  
file_path: tinygrad/extra/datasets/openimages.py
imports: import os
  import math
  import json
  import numpy
  from PIL import Image
  import pathlib
  import boto3, botocore
  from tinygrad.helpers import fetch
  from tqdm import tqdm
  import pandas
  import concurrent.futures
label_desc: Use image node_id 6 for calling a global function with example usage: fetch_openimages(output_fn) without return types