Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

16 bit gray scale Image read error #5401

Open
1 task done
JunHyunjae opened this issue Mar 28, 2024 · 1 comment
Open
1 task done

16 bit gray scale Image read error #5401

JunHyunjae opened this issue Mar 28, 2024 · 1 comment
Assignees
Labels
question Further information is requested

Comments

@JunHyunjae
Copy link

JunHyunjae commented Mar 28, 2024

Describe the question.

My loader is configured as follows.

However, KeyError: <DALIDataType.UINT16: 1> is occurring.

torch 1.12.1+cu113
nvidia-dali-cuda110 1.36.0
I'm using the above version

class ExternalInputIterator(object):
    ....
  def __next__(self):
      source_batch = []
      target_batch = []
      name_batch = []

      if self.i >= self.n:
          self.__iter__()
          raise StopIteration

      for _ in range(self.batch_size):
          filename = self.source_files[self.i % self.n]
          # print("self.i : ", self.i, ", filename : ", filename)

          source_batch.append(np.fromfile(os.path.join(self.source_root, filename), dtype=np.uint8))  # we can use numpy
          target_batch.append(np.fromfile(os.path.join(self.target_root, filename), dtype=np.uint8))  # we can use numpy
          # name_batch.append(filename)
          name_batch.append(np.fromstring(filename, dtype=np.uint8))
          self.i += 1

      return (source_batch, target_batch, name_batch)

  def __len__(self):
      return self.data_set_len

  next = __next__


def ExternalSourcePipeline(batch_size, num_threads, device_id, external_data, mode):
  pipe = Pipeline(batch_size, num_threads, device_id)
  with pipe:
      source_img, target_img, filename = fn.external_source(source=external_data, num_outputs=3)

      source_images = fn.experimental.decoders.image(
          source_img, device='mixed', output_type=types.GRAY, dtype=types.UINT16)
      target_images = fn.experimental.decoders.image(
          source_img, device='mixed', output_type=types.GRAY, dtype=types.UINT16)

      ...
      ...

      pipe.set_outputs(source_images, target_images, filename)
  return pipe

Check for duplicates

  • I have searched the open bugs/issues and have found no duplicates for this bug report
@JunHyunjae JunHyunjae added the question Further information is requested label Mar 28, 2024
@jantonguirao
Copy link
Contributor

Hi @JunHyunjae

I've check your code above and it produces valid results. I had to modify it a little bit to make it run:

from nvidia.dali import Pipeline, fn, types
import numpy as np

class ExternalInputIterator(object):
    def __init__(self, batch_size):
        self.batch_size = batch_size
        self.source_files = [
            'DALI_extra/db/single/jpeg/450/bobsled-683993_1280.jpg',
            'DALI_extra/db/single/jpeg/450/bobsled-643397_1280.jpg',
            'DALI_extra/db/single/jpeg/450/bobsled-683995_1280.jpg',
            'DALI_extra/db/single/jpeg/312/grasshopper-4357907_1280.jpg',
            'DALI_extra/db/single/jpeg/312/grasshopper-4357903_1280.jpg',
            'DALI_extra/db/single/jpeg/312/cricket-1345065_1280.jpg',
            'DALI_extra/db/single/jpeg/372/baboon-3089012_1280.jpg',
            'DALI_extra/db/single/jpeg/372/monkey-653705_1920.jpg',
            'DALI_extra/db/single/jpeg/372/baboon-174073_1280.jpg',
        ]
    def __iter__(self):
        self.i = 0
        self.n = self.batch_size
        return self

    def __next__(self):
        source_batch = []
        target_batch = []
        name_batch = []

        if self.i >= self.n:
            self.__iter__()
            raise StopIteration

        for _ in range(self.batch_size):
            filename = self.source_files[self.i % self.n]
            # print("self.i : ", self.i, ", filename : ", filename)

            source_batch.append(np.fromfile(filename, dtype=np.uint8))  # we can use numpy
            target_batch.append(np.fromfile(filename, dtype=np.uint8))  # we can use numpy
            # name_batch.append(filename)
            name_batch.append(np.fromstring(filename, dtype=np.uint8))
            self.i += 1

        return (source_batch, target_batch, name_batch)

    def __len__(self):
        return self.data_set_len

    next = __next__

class ExternalSourcePipeline(Pipeline):
    def __init__(self, batch_size, num_threads, device_id):
        super(ExternalSourcePipeline, self).__init__(batch_size, num_threads, device_id)
        self.eii = ExternalInputIterator(batch_size)
        self.iterator = iter(self.eii)

    def define_graph(self):
        source = fn.external_source(device="cpu", name="source_images")
        target = fn.external_source(device="cpu", name="target_images")
        filename = fn.external_source(device="cpu", name="filename")
        source_images = fn.experimental.decoders.image(
            source, device='mixed', output_type=types.GRAY, dtype=types.UINT16)
        target_images = fn.experimental.decoders.image(
            target, device='mixed', output_type=types.GRAY, dtype=types.UINT16)
        return (source_images, target_images, filename)

    def iter_setup(self):
        source_images, target_images, filename = next(self.iterator)
        self.feed_input("source_images", source_images)
        self.feed_input("target_images", target_images)
        self.feed_input("filename", filename)

p = ExternalSourcePipeline(1, 1, 0)
p.build()
print(p.run())

Producing:

(TensorListGPU(
    [[[[16705]
       [16191]
       ...
       [ 6425]
       [ 5911]]

      [[15420]
       [15934]
       ...
       [ 3341]
       [ 3855]]

      ...

      [[54998]
       [55769]
       ...
       [61937]
       [61680]]

      [[54998]
       [56026]
       ...
       [61937]
       [61937]]]],
    dtype=DALIDataType.UINT16,
    layout="HWC",
    num_samples=1,
    shape=[(988, 1280, 1)]), TensorListGPU(
    [[[[16705]
       [16191]
       ...
       [ 6425]
       [ 5911]]

      [[15420]
       [15934]
       ...
       [ 3341]
       [ 3855]]

      ...

      [[54998]
       [55769]
       ...
       [61937]
       [61680]]

      [[54998]
       [56026]
       ...
       [61937]
       [61937]]]],
    dtype=DALIDataType.UINT16,
    layout="HWC",
    num_samples=1,
    shape=[(988, 1280, 1)]), TensorListCPU(
    [[ 47 104 111 109 101  47 106  97 110 116 111 110  47 103 105 116  47
       68  65  76  73  95 101 120 116 114  97  47 100  98  47 115 105 110
      103 108 101  47 106 112 101 103  47  52  53  48  47  98 111  98 115
      108 101 100  45  54  56  51  57  57  51  95  49  50  56  48  46 106
      112 103]],
    dtype=DALIDataType.UINT8,
    num_samples=1,
    shape=[(70,)]))

If you still find issues with your code, please attach a full script that we can run on our end.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
question Further information is requested
Projects
None yet
Development

No branches or pull requests

2 participants