Added some fixes to DEXTR model handler (#3325)

* Added some fixes to DEXTR model handler

* Updated Changelog
main
Boris Sekachev 5 years ago committed by GitHub
parent 7699bd362f
commit 3d496ef904
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -13,7 +13,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Filter `is_active` for user list (<https://github.com/openvinotoolkit/cvat/pull/3235>) - Filter `is_active` for user list (<https://github.com/openvinotoolkit/cvat/pull/3235>)
- Ability to export/import tasks (<https://github.com/openvinotoolkit/cvat/pull/3056>) - Ability to export/import tasks (<https://github.com/openvinotoolkit/cvat/pull/3056>)
### Changed ### Changed
- Updated manifest format, added meta with related images (<https://github.com/openvinotoolkit/cvat/pull/3122>) - Updated manifest format, added meta with related images (<https://github.com/openvinotoolkit/cvat/pull/3122>)
@ -36,6 +35,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Fix CLI create an infinite loop if git repository responds with failure (<https://github.com/openvinotoolkit/cvat/pull/3267>) - Fix CLI create an infinite loop if git repository responds with failure (<https://github.com/openvinotoolkit/cvat/pull/3267>)
- Bug with sidebar & fullscreen (<https://github.com/openvinotoolkit/cvat/pull/3289>) - Bug with sidebar & fullscreen (<https://github.com/openvinotoolkit/cvat/pull/3289>)
- 504 Gateway Time-out on `data/meta` requests (<https://github.com/openvinotoolkit/cvat/pull/3269>) - 504 Gateway Time-out on `data/meta` requests (<https://github.com/openvinotoolkit/cvat/pull/3269>)
- Some code issues in Deep Extreme Cut handler code (<https://github.com/openvinotoolkit/cvat/pull/3325>)
### Security ### Security

@ -1,4 +1,4 @@
# Copyright (C) 2018-2020 Intel Corporation # Copyright (C) 2018-2021 Intel Corporation
# #
# SPDX-License-Identifier: MIT # SPDX-License-Identifier: MIT
@ -21,7 +21,7 @@ class ModelHandler:
# polygon: [[x1,y1], [x2,y2], [x3,y3], [x4,y4], ...] # polygon: [[x1,y1], [x2,y2], [x3,y3], [x4,y4], ...]
def handle(self, image, points): def handle(self, image, points):
DEXTR_PADDING = 50 DEXTR_PADDING = 50
DEXTR_TRESHOLD = 0.9 DEXTR_TRESHOLD = 0.8
DEXTR_SIZE = 512 DEXTR_SIZE = 512
numpy_image = np.array(image) numpy_image = np.array(image)
@ -43,7 +43,7 @@ class ModelHandler:
resized = resized[:, :, :3] resized = resized[:, :, :3]
# Make a heatmap # Make a heatmap
points = points - [min(points[:, 0]), min(points[:, 1])] + [DEXTR_PADDING, DEXTR_PADDING] points = points - [bounding_box[0], bounding_box[1]]
points = (points * [DEXTR_SIZE / numpy_cropped.shape[1], DEXTR_SIZE / numpy_cropped.shape[0]]).astype(int) points = (points * [DEXTR_SIZE / numpy_cropped.shape[1], DEXTR_SIZE / numpy_cropped.shape[0]]).astype(int)
heatmap = np.zeros(shape=resized.shape[:2], dtype=np.float64) heatmap = np.zeros(shape=resized.shape[:2], dtype=np.float64)
for point in points: for point in points:
@ -51,25 +51,24 @@ class ModelHandler:
gaussian_y_axis = np.arange(0, DEXTR_SIZE, 1, float)[:, np.newaxis] - point[1] gaussian_y_axis = np.arange(0, DEXTR_SIZE, 1, float)[:, np.newaxis] - point[1]
gaussian = np.exp(-4 * np.log(2) * ((gaussian_x_axis ** 2 + gaussian_y_axis ** 2) / 100)).astype(np.float64) gaussian = np.exp(-4 * np.log(2) * ((gaussian_x_axis ** 2 + gaussian_y_axis ** 2) / 100)).astype(np.float64)
heatmap = np.maximum(heatmap, gaussian) heatmap = np.maximum(heatmap, gaussian)
cv2.normalize(heatmap, heatmap, 0, 255, cv2.NORM_MINMAX) cv2.normalize(heatmap, heatmap, 0, 255, cv2.NORM_MINMAX)
# Concat an image and a heatmap # Concat an image and a heatmap
input_dextr = np.concatenate((resized, heatmap[:, :, np.newaxis].astype(resized.dtype)), axis=2) input_dextr = np.concatenate((resized, heatmap[:, :, np.newaxis].astype(resized.dtype)), axis=2)
input_dextr = input_dextr.transpose((2,0,1)) input_dextr = input_dextr.transpose((2,0,1))
pred = self.model.infer(input_dextr[np.newaxis, ...], False)[0, 0, :, :] pred = self.model.infer(input_dextr[np.newaxis, ...], False)[0, 0, :, :]
pred = cv2.resize(pred, tuple(reversed(numpy_cropped.shape[:2])), interpolation = cv2.INTER_CUBIC) pred = (pred > DEXTR_TRESHOLD).astype(np.uint8)
result = np.zeros(numpy_image.shape[:2]) pred = cv2.resize(pred, tuple(reversed(numpy_cropped.shape[:2])), interpolation = cv2.INTER_NEAREST)
result[bounding_box[1]:bounding_box[1] + pred.shape[0], bounding_box[0]:bounding_box[0] + pred.shape[1]] = pred > DEXTR_TRESHOLD result = np.zeros(numpy_image.shape[:2]).astype(np.uint8)
result[bounding_box[1]:bounding_box[1] + pred.shape[0], bounding_box[0]:bounding_box[0] + pred.shape[1]] = pred
# Convert a mask to a polygon # Convert a mask to a polygon
result = np.array(result, dtype=np.uint8)
cv2.normalize(result,result,0,255,cv2.NORM_MINMAX)
contours = None contours = None
if int(cv2.__version__.split('.')[0]) > 3: if int(cv2.__version__.split('.')[0]) > 3:
contours = cv2.findContours(result, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_TC89_KCOS)[0] contours = cv2.findContours(result, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0]
else: else:
contours = cv2.findContours(result, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_TC89_KCOS)[1] contours = cv2.findContours(result, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[1]
contours = max(contours, key=lambda arr: arr.size) contours = max(contours, key=lambda arr: arr.size)
if contours.shape.count(1): if contours.shape.count(1):

Loading…
Cancel
Save