From 14b4318e497467dd45a7ff4803358632cfea2ce2 Mon Sep 17 00:00:00 2001 From: Ethan Li Date: Tue, 29 Oct 2024 14:43:12 -0700 Subject: [PATCH 1/5] Implement Fabien's proposed size thresholding calculations --- .../segmenter/planktoscope/segmenter/__init__.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/processing/segmenter/planktoscope/segmenter/__init__.py b/processing/segmenter/planktoscope/segmenter/__init__.py index fb38a8cb..f30c3628 100644 --- a/processing/segmenter/planktoscope/segmenter/__init__.py +++ b/processing/segmenter/planktoscope/segmenter/__init__.py @@ -474,17 +474,16 @@ def __augment_slice(dim_slice, max_dims, size=10): dim_slice = tuple(dim_slice) return dim_slice - minMesh = self.__global_metadata.get("acq_minimum_mesh", 20) # microns - minESD = minMesh * 2 - minArea = math.pi * (minESD / 2) * (minESD / 2) - pixel_size = self.__global_metadata.get("process_pixel", 1.0) - # minsizepix = minArea / pixel_size / pixel_size - minsizepix = (minESD / pixel_size) ** 2 + min_mesh = self.__global_metadata.get("acq_minimum_mesh", 20) # microns + min_esd = min_mesh # or process_min_ESD in the future (microns) + pixel_size = self.__global_metadata["process_pixel"] + min_radius = min_esd / 2 / pixel_size # (pixels) + min_area = math.pi * min_radius * min_radius labels, nlabels = skimage.measure.label(mask, return_num=True) regionprops = skimage.measure.regionprops(labels) regionprops_filtered = [ - region for region in regionprops if region.bbox_area >= minsizepix + region for region in regionprops if prop.filled_area >= min_area ] object_number = len(regionprops_filtered) logger.debug(f"Found {nlabels} labels, or {object_number} after size filtering") From 56273cb6da524ac55e7cbf41c4dd98805dcfe68e Mon Sep 17 00:00:00 2001 From: Ethan Li Date: Tue, 29 Oct 2024 15:01:57 -0700 Subject: [PATCH 2/5] Try pinning cryptography package to last wheel available on armv7 --- processing/segmenter/Dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/processing/segmenter/Dockerfile b/processing/segmenter/Dockerfile index f0ee399c..7d389f17 100644 --- a/processing/segmenter/Dockerfile +++ b/processing/segmenter/Dockerfile @@ -25,7 +25,8 @@ WORKDIR /home/pi/device-backend/processing/segmenter COPY --chown=pi:pi pyproject.toml poetry.lock . RUN \ export PATH="/home/pi/.local/bin:$PATH" && \ - pip install --no-cache-dir poetry==1.7.1 --extra-index-url https://www.piwheels.org/simple && \ + pip install --no-cache-dir cryptography==42.0.8 poetry==1.7.1 \ + --extra-index-url https://www.piwheels.org/simple && \ poetry install --no-root --only main --compile && \ poetry --no-interaction cache list && \ poetry --no-interaction cache clear pypi --all && \ From c50ca27eed3a1b1669ba65e9493d64b090098599 Mon Sep 17 00:00:00 2001 From: Ethan Li Date: Tue, 29 Oct 2024 19:49:08 -0700 Subject: [PATCH 3/5] Fix incorrect variable name --- processing/segmenter/planktoscope/segmenter/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/processing/segmenter/planktoscope/segmenter/__init__.py b/processing/segmenter/planktoscope/segmenter/__init__.py index f30c3628..aca1dc5e 100644 --- a/processing/segmenter/planktoscope/segmenter/__init__.py +++ b/processing/segmenter/planktoscope/segmenter/__init__.py @@ -483,7 +483,7 @@ def __augment_slice(dim_slice, max_dims, size=10): labels, nlabels = skimage.measure.label(mask, return_num=True) regionprops = skimage.measure.regionprops(labels) regionprops_filtered = [ - region for region in regionprops if prop.filled_area >= min_area + region for region in regionprops if region.filled_area >= min_area ] object_number = len(regionprops_filtered) logger.debug(f"Found {nlabels} labels, or {object_number} after size filtering") From c93d0d0badd1f00d3b904d46a29e3e11391ab4bf Mon Sep 17 00:00:00 2001 From: Ethan Li Date: Thu, 28 Nov 2024 19:13:14 -0800 Subject: [PATCH 4/5] Bump cryptography package --- processing/segmenter/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/processing/segmenter/Dockerfile b/processing/segmenter/Dockerfile index 7d389f17..b4d33ccf 100644 --- a/processing/segmenter/Dockerfile +++ b/processing/segmenter/Dockerfile @@ -25,7 +25,7 @@ WORKDIR /home/pi/device-backend/processing/segmenter COPY --chown=pi:pi pyproject.toml poetry.lock . RUN \ export PATH="/home/pi/.local/bin:$PATH" && \ - pip install --no-cache-dir cryptography==42.0.8 poetry==1.7.1 \ + pip install --no-cache-dir cryptography==43.0.3 poetry==1.7.1 \ --extra-index-url https://www.piwheels.org/simple && \ poetry install --no-root --only main --compile && \ poetry --no-interaction cache list && \ From aff1ae174825c1e8e0634884cfd445dbedcfb148 Mon Sep 17 00:00:00 2001 From: Ethan Li Date: Fri, 29 Nov 2024 12:07:23 -0800 Subject: [PATCH 5/5] Update `CHANGELOG.md` --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 110ae498..880f5e68 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,10 @@ All dates in this file are given in the [UTC time zone](https://en.wikipedia.org - (Hardware controller) The bitrate of the camera preview stream has been reduced slightly from ~8 Mbps to ~7 Mbps. - (Hardware controller) The framerate of the camera preview stream is now explicitly limited to 25 fps. +### Fixed + +- (Breaking change; segmenter) The previously incorrect method for filtering segmented objects by size has now been corrected to filter object sizes by filled area rather than bounding box area, and directly using the mesh size as the threshold for equivalent spherical diameter (ESD) instead of calculating a fictional ESD. + ## v2024.0.0-beta.2 - 2024-08-19 ### Changed