第三阶段改进

This commit is contained in:
Ukawka
2026-09-22 22:18:34 +08:00
parent 8080d52a99
commit 00f476022d
12 changed files with 873 additions and 74 deletions
+21 -2
View File
@@ -130,7 +130,24 @@ def load_assets(input_dir, completion_dir=None, fallback_policy='sam', draw_orde
raise ValueError(f'Invalid completion crop/size: {name}')
full = Image.new('RGBA', source.size)
full.paste(image, (box[0], box[1]))
if not np.array_equal(np.array(full)[mask], rgba[mask]):
preserve = mask
preservation = candidate.get('preservation')
if preservation:
areas = {}
for key in ['preserve_mask', 'editable_mask', 'removed_mask']:
area = np.array(Image.open(tracked(completion, preservation.get(key), 'completion')))
if area.shape != (h, w) or not np.isin(area, [0, 255]).all():
raise ValueError(f'Invalid completion preservation mask: {name}/{key}')
areas[key] = area > 0
preserve, editable, removed = (areas[k] for k in ['preserve_mask', 'editable_mask', 'removed_mask'])
if (np.any(editable & removed) or np.any(removed & ~mask) or
not np.array_equal(preserve, mask & ~editable & ~removed) or not preserve.any()):
raise ValueError(f'Inconsistent completion preservation partition: {name}')
alpha = np.array(full)[:, :, 3] > 0
if np.any(alpha & ~(preserve | editable)):
raise ValueError(f'Completion pixels outside preservation/edit contract: {name}')
warnings.append('VISIBLE_EDITS_DECLARED_NEEDS_REVIEW')
if not np.array_equal(np.array(full)[preserve], rgba[preserve]):
raise ValueError(f'Completion does not preserve original visible RGBA: {name}')
origin, reason = 'completion', 'GEOMETRY_PASSED_NEEDS_REVIEW'
if candidate.get('qa', {}).get('unfulfilled_regions'):
@@ -138,7 +155,8 @@ def load_assets(input_dir, completion_dir=None, fallback_policy='sam', draw_orde
else:
image, box = original, original_box
origin = 'sam'
if not part['needs_completion']:
inferred_need = bool(candidate) or skipped.get(name, {}).get('reason') == 'AMBIGUOUS_MASK_REQUIRES_REVIEW'
if not part['needs_completion'] and not inferred_need:
reason = 'NO_COMPLETION_NEEDED'
else:
reason = skipped.get(name, {}).get('reason') or (
@@ -151,6 +169,7 @@ def load_assets(input_dir, completion_dir=None, fallback_policy='sam', draw_orde
'crop_xyxy': box, 'original_crop_xyxy': original_box,
'semantic_verified': False, 'warnings': warnings,
'completion_status': candidate.get('status'),
'preservation': candidate.get('preservation'),
'completion_qa': candidate.get('qa')})
if not images: