第三阶段改进
This commit is contained in:
+21
-2
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user