From 88a08388ecaa8a606af37c92e9d1e809afe46816 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=92=D0=BB=D0=B0=D0=B4=D0=B8=D1=81=D0=BB=D0=B0=D0=B2?= Date: Wed, 12 Oct 2022 16:35:04 +0200 Subject: [PATCH 1/4] update mask2segments and saving results --- segment/predict.py | 15 ++++++++++----- utils/segment/general.py | 13 ++++++++----- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/segment/predict.py b/segment/predict.py index 94117cd78633..0b0bd16057ae 100644 --- a/segment/predict.py +++ b/segment/predict.py @@ -156,7 +156,7 @@ def run( # Segments if save_txt: segments = reversed(masks2segments(masks)) - segments = [scale_segments(im.shape[2:], x, im0.shape).round() for x in segments] + segments = [scale_segments(im.shape[2:], x, im0.shape).round() if not isinstance(x, int) else 0 for x in segments] # Print results for c in det[:, 5].unique(): @@ -171,10 +171,15 @@ def run( # Write results for j, (*xyxy, conf, cls) in enumerate(reversed(det[:, :6])): if save_txt: # Write to file - segj = segments[j].reshape(-1) # (n,2) to (n*2) - line = (cls, *segj, conf) if save_conf else (cls, *segj) # label format - with open(f'{txt_path}.txt', 'a') as f: - f.write(('%g ' * len(line)).rstrip() % line + '\n') + if not isinstance(segments[j], int): + segj = segments[j].reshape(-1) # (n,2) to (n*2) + line = (cls, *segj, conf) if save_conf else (cls, *segj) # label format + with open(f'{txt_path}.txt', 'a') as f: + f.write(('%g ' * len(line)).rstrip() % line + '\n') + else: + line = (cls, segments[j], conf) if save_conf else (cls, segments[j]) # label format + with open(f'{txt_path}.txt', 'a') as f: + f.write(('%g ' * len(line)).rstrip() % line + '\n') if save_img or save_crop or view_img: # Add bbox to image c = int(cls) # integer class diff --git a/utils/segment/general.py b/utils/segment/general.py index 43bdc460f928..db7e53e5e549 100644 --- a/utils/segment/general.py +++ b/utils/segment/general.py @@ -126,9 +126,12 @@ def masks2segments(masks, strategy='largest'): segments = [] for x in masks.int().cpu().numpy().astype('uint8'): c = cv2.findContours(x, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0] - if strategy == 'concat': # concatenate all segments - c = np.concatenate([x.reshape(-1, 2) for x in c]) - elif strategy == 'largest': # select largest segment - c = np.array(c[np.array([len(x) for x in c]).argmax()]).reshape(-1, 2) - segments.append(c.astype('float32')) + if c: + if strategy == 'concat': # concatenate all segments + c = np.concatenate([x.reshape(-1, 2) for x in c]) + elif strategy == 'largest': # select largest segment + c = np.array(c[np.array([len(x) for x in c]).argmax()]).reshape(-1, 2) + segments.append(c.astype('float32')) + else: + segments.append(0) return segments From c691ccfd67137bf0e6998eb7145507d5b899e1da Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 12 Oct 2022 14:37:09 +0000 Subject: [PATCH 2/4] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- segment/predict.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/segment/predict.py b/segment/predict.py index 0b0bd16057ae..9234502bc60a 100644 --- a/segment/predict.py +++ b/segment/predict.py @@ -156,7 +156,9 @@ def run( # Segments if save_txt: segments = reversed(masks2segments(masks)) - segments = [scale_segments(im.shape[2:], x, im0.shape).round() if not isinstance(x, int) else 0 for x in segments] + segments = [ + scale_segments(im.shape[2:], x, im0.shape).round() if not isinstance(x, int) else 0 + for x in segments] # Print results for c in det[:, 5].unique(): From 6455604322ff9b3266739e10de5f21a10e7eb458 Mon Sep 17 00:00:00 2001 From: Glenn Jocher Date: Thu, 13 Oct 2022 00:26:43 +0200 Subject: [PATCH 3/4] Update general.py Signed-off-by: Glenn Jocher --- utils/segment/general.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/utils/segment/general.py b/utils/segment/general.py index db7e53e5e549..b526333dc5a1 100644 --- a/utils/segment/general.py +++ b/utils/segment/general.py @@ -131,7 +131,7 @@ def masks2segments(masks, strategy='largest'): c = np.concatenate([x.reshape(-1, 2) for x in c]) elif strategy == 'largest': # select largest segment c = np.array(c[np.array([len(x) for x in c]).argmax()]).reshape(-1, 2) - segments.append(c.astype('float32')) else: - segments.append(0) + c = np.zeros((0, 2)) # no segments found + segments.append(c.astype('float32')) return segments From 86af9cd5c964b8bfe31485d09b96219db7236126 Mon Sep 17 00:00:00 2001 From: Glenn Jocher Date: Thu, 13 Oct 2022 00:27:21 +0200 Subject: [PATCH 4/4] Update predict.py Signed-off-by: Glenn Jocher --- segment/predict.py | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/segment/predict.py b/segment/predict.py index 9234502bc60a..94117cd78633 100644 --- a/segment/predict.py +++ b/segment/predict.py @@ -156,9 +156,7 @@ def run( # Segments if save_txt: segments = reversed(masks2segments(masks)) - segments = [ - scale_segments(im.shape[2:], x, im0.shape).round() if not isinstance(x, int) else 0 - for x in segments] + segments = [scale_segments(im.shape[2:], x, im0.shape).round() for x in segments] # Print results for c in det[:, 5].unique(): @@ -173,15 +171,10 @@ def run( # Write results for j, (*xyxy, conf, cls) in enumerate(reversed(det[:, :6])): if save_txt: # Write to file - if not isinstance(segments[j], int): - segj = segments[j].reshape(-1) # (n,2) to (n*2) - line = (cls, *segj, conf) if save_conf else (cls, *segj) # label format - with open(f'{txt_path}.txt', 'a') as f: - f.write(('%g ' * len(line)).rstrip() % line + '\n') - else: - line = (cls, segments[j], conf) if save_conf else (cls, segments[j]) # label format - with open(f'{txt_path}.txt', 'a') as f: - f.write(('%g ' * len(line)).rstrip() % line + '\n') + segj = segments[j].reshape(-1) # (n,2) to (n*2) + line = (cls, *segj, conf) if save_conf else (cls, *segj) # label format + with open(f'{txt_path}.txt', 'a') as f: + f.write(('%g ' * len(line)).rstrip() % line + '\n') if save_img or save_crop or view_img: # Add bbox to image c = int(cls) # integer class