+def _make_prompt(
+ helper: QuickLabelHelper,
+ cursor: int,
+ filtered_images: List[Tuple[str, str]],
+ image: str,
+ features: str,
+ labeled_features: Dict[Tuple[str, str], str],
+) -> None:
+ label_label = helper.get_label_feature()
+ filtered_lines = []
+ label = labeled_features.get((image, features), None)
+ with open(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(image, features, filtered_lines)
+ print(f'{cursor}/{len(filtered_images)} ({cursor/len(filtered_images)*100.0:.1f}%) | ', end='')
+ print(f'{ansi.bold()}{image} / {features}{ansi.reset()}:')
+ print(f' ...{len(labeled_features)} currently unsaved labels ("W" to save).')
+ if label:
+ if (image, 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(image, 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.')
+
+