PyOPIA 2.5.11__tar.gz → 2.5.13__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. {pyopia-2.5.11 → pyopia-2.5.13}/PKG-INFO +1 -1
  2. pyopia-2.5.13/pyopia/__init__.py +1 -0
  3. {pyopia-2.5.11 → pyopia-2.5.13}/pyopia/classify.py +7 -8
  4. {pyopia-2.5.11 → pyopia-2.5.13}/pyopia/io.py +9 -2
  5. {pyopia-2.5.11 → pyopia-2.5.13}/pyopia/process.py +6 -8
  6. pyopia-2.5.11/pyopia/__init__.py +0 -1
  7. {pyopia-2.5.11 → pyopia-2.5.13}/LICENSE +0 -0
  8. {pyopia-2.5.11 → pyopia-2.5.13}/README.md +0 -0
  9. {pyopia-2.5.11 → pyopia-2.5.13}/pyopia/background.py +0 -0
  10. {pyopia-2.5.11 → pyopia-2.5.13}/pyopia/cli.py +0 -0
  11. {pyopia-2.5.11 → pyopia-2.5.13}/pyopia/exampledata.py +0 -0
  12. {pyopia-2.5.11 → pyopia-2.5.13}/pyopia/instrument/__init__.py +0 -0
  13. {pyopia-2.5.11 → pyopia-2.5.13}/pyopia/instrument/common.py +0 -0
  14. {pyopia-2.5.11 → pyopia-2.5.13}/pyopia/instrument/holo.py +0 -0
  15. {pyopia-2.5.11 → pyopia-2.5.13}/pyopia/instrument/silcam.py +0 -0
  16. {pyopia-2.5.11 → pyopia-2.5.13}/pyopia/instrument/uvp.py +0 -0
  17. {pyopia-2.5.11 → pyopia-2.5.13}/pyopia/pipeline.py +0 -0
  18. {pyopia-2.5.11 → pyopia-2.5.13}/pyopia/plotting.py +0 -0
  19. {pyopia-2.5.11 → pyopia-2.5.13}/pyopia/simulator/__init__.py +0 -0
  20. {pyopia-2.5.11 → pyopia-2.5.13}/pyopia/simulator/silcam.py +0 -0
  21. {pyopia-2.5.11 → pyopia-2.5.13}/pyopia/statistics.py +0 -0
  22. {pyopia-2.5.11 → pyopia-2.5.13}/pyopia/tests/__init__.py +0 -0
  23. {pyopia-2.5.11 → pyopia-2.5.13}/pyopia/tests/test_classify.py +0 -0
  24. {pyopia-2.5.11 → pyopia-2.5.13}/pyopia/tests/test_notebooks.py +0 -0
  25. {pyopia-2.5.11 → pyopia-2.5.13}/pyopia/tests/test_pipeline.py +0 -0
  26. {pyopia-2.5.11 → pyopia-2.5.13}/pyproject.toml +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: PyOPIA
3
- Version: 2.5.11
3
+ Version: 2.5.13
4
4
  Summary: A Python Ocean Particle Image Analysis toolbox.
5
5
  Home-page: https://github.com/sintef/pyopia
6
6
  Keywords: Ocean,Particles,Imaging,Measurement,Size distribution
@@ -0,0 +1 @@
1
+ __version__ = '2.5.13'
@@ -5,7 +5,6 @@ Module containing tools for classifying particle ROIs
5
5
  import os
6
6
  import numpy as np
7
7
  import pandas as pd
8
-
9
8
  import logging
10
9
  logger = logging.getLogger()
11
10
 
@@ -77,6 +76,10 @@ class Classify():
77
76
  self.model_path = model_path
78
77
  self.load_model()
79
78
 
79
+ # Get config for image resizing from the model
80
+ _, self.img_height, self.img_width, _ = self.model.get_config()['layers'][0]['config']['batch_shape']
81
+ self.pad_to_aspect_ratio = getattr(self.model.layers[0], 'pad_to_aspect_ratio', False)
82
+
80
83
  # Enable this to perform whitebalance correction in the preprocessing step
81
84
  self.correct_whitebalance = False
82
85
 
@@ -134,7 +137,7 @@ class Classify():
134
137
  A particle ROI with range 0.-255., corrected and preprocessed, ready for prediction
135
138
  '''
136
139
 
137
- whitebalanced = np.copy(img_input).astype(np.float64)
140
+ whitebalanced = img_input.astype(np.float64)
138
141
 
139
142
  # Do white-balance correction as a per-channel histogram shift
140
143
  if self.correct_whitebalance:
@@ -150,14 +153,10 @@ class Classify():
150
153
  # which loads images in 0-255 range
151
154
  img = keras.utils.img_to_array(whitebalanced * 255)
152
155
 
153
- # Get config for image resizing from the model
154
- _, img_height, img_width, _ = self.model.get_config()['layers'][0]['config']['batch_shape']
155
- pad_to_aspect_ratio = getattr(self.model.layers[0], 'pad_to_aspect_ratio', False)
156
-
157
156
  # resize to match the dimentions expected by the network
158
- img = tf.image.resize(img, [img_height, img_width],
157
+ img = tf.image.resize(img, [self.img_height, self.img_width],
159
158
  method=tf.image.ResizeMethod.BILINEAR,
160
- preserve_aspect_ratio=pad_to_aspect_ratio)
159
+ preserve_aspect_ratio=self.pad_to_aspect_ratio)
161
160
 
162
161
  img_array = tf.keras.utils.img_to_array(img)
163
162
  img_preprocessed = tf.expand_dims(img_array, 0) # Create a batch
@@ -84,14 +84,21 @@ def write_stats(stats,
84
84
  existing_stats = load_stats(datafilename + '-STATS.nc')
85
85
  xstats = xarray.concat([existing_stats, xstats], 'index')
86
86
  elif not append:
87
+ # When appending, only store the last row in the image_stats DataFrame
87
88
  datafilename += ('-Image-D' +
88
89
  str(xstats['timestamp'][0].values).replace('-', '').replace(':', '').replace('.', '-'))
90
+
89
91
  encoding = setup_xstats_encoding(xstats)
90
92
  xstats.to_netcdf(datafilename + '-STATS.nc', encoding=encoding, engine=NETCDF_ENGINE, format='NETCDF4')
91
93
 
92
94
  # If we have image statistics (summary data for each raw image), add the image_stats a group
93
95
  if image_stats is not None:
94
- image_stats.to_xarray().to_netcdf(datafilename + '-STATS.nc', group='image_stats', mode='a', engine=NETCDF_ENGINE)
96
+ if append:
97
+ ximage_stats = image_stats.to_xarray()
98
+ else:
99
+ ximage_stats = image_stats.loc[[image_stats.index[-1]], :].to_xarray()
100
+
101
+ ximage_stats.to_netcdf(datafilename + '-STATS.nc', group='image_stats', mode='a', engine=NETCDF_ENGINE)
95
102
 
96
103
 
97
104
  def setup_xstats_encoding(xstats, string_vars=['export name', 'holo_filename']):
@@ -330,7 +337,7 @@ def merge_and_save_mfdataset(path_to_data, prefix='*', overwrite_existing_partia
330
337
  num_chunks = int(np.ceil(num_files / chunk_size_used))
331
338
  filelist_chunks = [sorted_filelist[i*chunk_size_used:min(num_files, (i+1)*chunk_size_used)] for i in range(num_chunks)]
332
339
  infostr = f'Processing {num_chunks} partial file lists of {chunk_size_used} files each'
333
- infostr += ', based on a total of {num_files} files.'
340
+ infostr += f', based on a total of {num_files} files.'
334
341
  logging.info(infostr)
335
342
 
336
343
  # Get config from first file in list
@@ -259,14 +259,12 @@ def extract_particles(imc, timestamp, Classification, region_properties,
259
259
  stats : DataFrame
260
260
  List of particle statistics for every particle, according to Partstats class
261
261
  '''
262
- filenames = ['not_exported'] * len(region_properties)
262
+ num_rows = max(len(region_properties), 1)
263
+ filenames = ['not_exported'] * num_rows
263
264
 
264
265
  if Classification is not None:
265
266
  # pre-allocation
266
- predictions = np.zeros((len(region_properties),
267
- len(Classification.class_labels)),
268
- dtype='float64')
269
- predictions *= np.nan
267
+ predictions = np.nan * np.zeros((num_rows, len(Classification.class_labels)), dtype='float64')
270
268
 
271
269
  # obtain the original image filename from the timestamp
272
270
  filename = timestamp.strftime('D%Y%m%dT%H%M%S.%f')
@@ -292,8 +290,8 @@ def extract_particles(imc, timestamp, Classification, region_properties,
292
290
  HDF5File = None
293
291
 
294
292
  # pre-allocate some things
295
- data = np.zeros((len(region_properties), len(propnames)), dtype=np.float64)
296
- bboxes = np.zeros((len(region_properties), 4), dtype=np.float64)
293
+ data = np.nan * np.zeros((num_rows, len(propnames)), dtype=np.float64)
294
+ bboxes = np.nan * np.zeros((num_rows, 4), dtype=np.float64)
297
295
  nb_extractable_part = 0
298
296
 
299
297
  for i, el in enumerate(region_properties):
@@ -630,7 +628,7 @@ class CalculateImageStats():
630
628
  data['image_stats'].loc[data['timestamp'], 'saturation'] = image_saturation
631
629
 
632
630
  # Skip remaining calculations if no particles where found
633
- if data['stats'].size == 0:
631
+ if data['stats'].dropna().size == 0:
634
632
  return data
635
633
 
636
634
  # Calculate D50, nc and vc stats
@@ -1 +0,0 @@
1
- __version__ = '2.5.11'
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes