处理尺寸不一致

This commit is contained in:
Ukawka
2026-09-20 22:36:20 +08:00
parent 99d65377ab
commit a00a5621cf
7 changed files with 114 additions and 18 deletions
+27 -5
View File
@@ -140,16 +140,32 @@ def prepare(directory, selected_ids, size=1024, radius=32):
return result
def merge_candidate(folder, candidate_file, output_file):
def merge_candidate(folder, candidate_file, output_file, size_policy='strict'):
if size_policy not in ['strict', 'uniform']:
raise ValueError('Unknown candidate size policy')
folder = Path(folder)
task = read_json(folder/'task.json')
original = np.array(Image.open(folder/'visible.png').convert('RGBA'))
allowed = np.array(Image.open(folder/'allowed-mask.png').convert('L')) > 0
candidate = Image.open(candidate_file).convert('RGBA')
qa = {'accepted': False, 'semantic_verified': False, 'reasons': []}
qa = {'accepted': False, 'semantic_verified': False, 'reasons': [],
'expected_size': task['canvas_size'], 'returned_size': list(candidate.size),
'size_policy': size_policy, 'canvas_resampled': False}
if list(candidate.size) != task['canvas_size']:
qa['reasons'].append('CANVAS_SIZE_MISMATCH')
return qa
if size_policy == 'strict':
qa['reasons'].append('CANVAS_SIZE_MISMATCH')
return qa
tw, th = task['canvas_size']
cw, ch = candidate.size
if cw * th != ch * tw:
qa['reasons'].append('CANVAS_ASPECT_RATIO_MISMATCH')
return qa
# Only reverse uniform whole-canvas scaling. Do not translate, stretch,
# crop, or register the object to make a changed pose appear correct.
candidate = candidate.resize((tw, th), Image.Resampling.LANCZOS)
qa.update(canvas_resampled=True, canvas_scale=tw/cw,
resampling='LANCZOS', warnings=['CANDIDATE_CANVAS_RESAMPLED'])
candidate.save(Path(output_file).with_name(Path(output_file).stem + '-normalized.png'))
try:
candidate, preprocessing = prepare_rgba(candidate)
except ValueError as error:
@@ -213,6 +229,11 @@ def finalize(directory):
ox, oy = meta['origin_xy']
task.update(image=f'parts/{name}.png', crop_xyxy=[bbox[0]+ox, bbox[1]+oy, bbox[2]+ox, bbox[3]+oy])
view = f'<img src="{task["image"]}">' if task.get('image') else ''
for index, item in enumerate(task.get('candidates', []), 1):
view += f'<p><a href="{html.escape(item["file"], quote=True)}">原候选 {index}</a> · <a href="tasks/{name}/qa-{index}.json">QA</a>'
if item['qa'].get('canvas_resampled'):
view += f' · <a href="tasks/{name}/merged-{index}-normalized.png">缩放后候选</a>'
view += '</p>'
warnings = html.escape(', '.join(task.get('upstream_warnings', [])))
rows.append(f'<tr><td>{html.escape(name)}<p>{warnings}</p><a href="tasks/{name}/task.json">任务参数</a> · <a href="tasks/{name}/prompt.txt">提示词</a></td><td>{html.escape(task["status"])}</td><td><a href="tasks/{name}/visible.png"><img src="tasks/{name}/visible.png"></a></td><td><a href="tasks/{name}/allowed-mask.png"><img src="tasks/{name}/allowed-mask.png"></a><p><a href="tasks/{name}/context.png">原图局部参考</a></p></td><td>{view}</td><td><pre>{html.escape(json.dumps(qa, ensure_ascii=False, indent=2))}</pre></td></tr>')
write_json(out/'completion-result.json', result)
@@ -232,13 +253,14 @@ def main():
parser.add_argument('--candidate')
parser.add_argument('--merged')
parser.add_argument('--qa')
parser.add_argument('--candidate-size-policy', choices=['strict', 'uniform'], default='strict')
args = parser.parse_args()
if args.action == 'prepare':
if not 128 <= args.size <= 4096 or not 1 <= args.radius <= 256:
parser.error('size must be 128..4096 and radius 1..256')
prepare(args.out, args.part, args.size, args.radius)
elif args.action == 'merge':
write_json(args.qa, merge_candidate(args.out, args.candidate, args.merged))
write_json(args.qa, merge_candidate(args.out, args.candidate, args.merged, args.candidate_size_policy))
else:
finalize(args.out)