+def _make_prompt(
+ helper: QuickLabelHelper,
+ cursor: int,
+ num_filtered_images: int,
+ current_image: str,
+ current_features: str,
+ labeled_features: Dict[Tuple[str, str], str], # Examples already labeled
+) -> None:
+ '''Tell an interactive user where they are in the set of examples that
+ may be labeled and the details of the current example.'''
+
+ label_label = helper.get_label_feature() # the key: of a label in features
+ filtered_lines = []
+ label = labeled_features.get((current_image, current_features), None)
+ with open(current_features, 'r') as rf:
+ lines = rf.readlines()
+ for line in lines:
+ line = line[:-1]
+ if len(line) == 0:
+ continue
+ if not line.startswith(label_label):
+ filtered_lines.append(line)
+ else:
+ assert not label
+ label = line
+
+ # Prompt...
+ helper.render_example(current_image, current_features, filtered_lines)
+ print(f'{cursor}/{num_filtered_images} ({cursor/num_filtered_images*100.0:.1f}%) | ', end='')
+ print(f'{ansi.bold()}{current_image} / {current_features}{ansi.reset()}:')
+ print(f' ...{len(labeled_features)} currently unwritten label(s) ("W" to write).')
+ if label:
+ if (current_image, current_features) in labeled_features:
+ print(f' ...This example is labeled but not yet saved: {label}')
+ else:
+ print(f' ...This example is already labeled on disk: {label}')
+ else:
+ print(' ...This example is currently unlabeled')
+ guess = helper.ask_current_model_about_example(current_image, current_features, filtered_lines)
+ if guess:
+ print(f' ...The ML Model says {guess}')
+ print()
+
+
+def _write_labeled_features(
+ helper: QuickLabelHelper,
+ labeled_features: Dict[Tuple[str, str], str],
+ skip_list: Set[str],
+) -> None:
+ label_label = helper.get_label_feature()
+ for image_features, label in labeled_features.items():
+ image = image_features[0]
+ features = image_features[1]
+ filtered_lines = []
+ with open(features, 'r') as rf:
+ lines = rf.readlines()
+ for line in lines:
+ line = line[:-1]
+ line = line.strip()
+ if line == '':
+ continue
+ if not line.startswith(label_label):
+ filtered_lines.append(line)
+
+ filtered_lines.append(f'{label_label}: {label}')
+ with open(features, 'w') as f:
+ f.writelines(line + '\n' for line in filtered_lines)
+ if config.config['ml_quick_label_use_skip_lists']:
+ skip_list.add(image)
+ print(f'Wrote {len(labeled_features)} labels.')
+
+