拓冰建站拓冰建站
首页 / 资讯中心 / 正文

智能体优化:构建闭环系统,提升图像生成视频的忠实度与稳定性

1. 项目概述告别“试错”走向智能优化在图像生成视频Image-to-Video这个领域摸爬滚打了好几年我最大的感受就是这活儿太像开盲盒了。你精心准备了一张构图、光影、细节都堪称完美的静态图片满怀期待地把它丢给模型希望它能生成一段连贯、稳定、忠于原图的动态视频。但结果呢常常是画面崩坏、主体变形、风格漂移或者干脆给你来一段和原图八竿子打不着的“魔幻现实主义”短片。传统的优化方法说白了就是“人工试错”调参数、改提示词、换模型、跑一遍、看结果、不满意、再调……循环往复耗时耗力效果还充满不确定性。这不仅是效率问题更是创作瓶颈。直到我开始系统性地研究和实践“智能体优化”Agentic Optimization才真正找到了一条让图像到视频的“忠实度”Adherence从玄学走向科学的路径。这个项目就是关于如何构建一个能自主思考、决策和迭代的智能体系统来替代我们进行枯燥的试错精准地提升生成视频与源图像的一致性。简单来说智能体优化的核心思想是创建一个具备感知、分析和执行能力的“AI代理”。这个代理不再是被动执行我们指令的工具而是一个能主动观察生成结果、评估其与目标的差距、并自主制定优化策略的“合作伙伴”。它针对的核心痛点正是传统方法中“图像-视频一致性”这个老大难问题。无论是人物肖像的动作保持、建筑场景的视角稳定还是艺术画风的纹理延续智能体都能通过一套量化的评估体系和策略网络进行定向、高效的优化。这不仅仅是自动化更是智能化。它适合所有被视频生成的不稳定性和低效工作流所困扰的创作者、开发者和研究者无论你是想提升商业项目的出品稳定性还是探索AIGC创作的边界这套思路都能为你打开一扇新的大门。2. 智能体优化的核心架构与设计哲学2.1 从“开环”到“闭环”优化范式的根本转变要理解智能体优化首先要看清传统方法的局限性。传统的图像到视频生成流程是一个典型的“开环系统”用户输入图像文本提示→ 黑盒模型如 Stable Video Diffusion, SVD→ 输出视频。整个过程一次性完成缺乏反馈机制。如果结果不理想用户只能凭借经验和直觉调整输入主要是提示词和负面提示然后重新运行整个流程。这个过程存在几个致命缺陷评估主观且模糊什么是“好”什么是“忠于原图”这些标准高度依赖人的主观判断难以量化。不同的人可能对同一段视频给出截然不同的评价。调整策略盲目面对不理想的视频应该调整哪个参数是修改提示词中的动作描述还是调整去噪步骤或是启用某个特定的LoRA模型没有数据支撑调整就像在黑暗中射击。试错成本高昂每次生成都消耗大量的计算资源GPU时间和等待时间。多次低效的试错使得创作成本急剧上升。智能体优化引入的是一个“感知-决策-执行”的闭环系统。在这个系统中智能体扮演了“质量工程师”和“策略分析师”的双重角色。其核心工作流可以概括为感知Perception智能体利用一系列评估模型Evaluator对生成的视频进行多维度、可量化的分析。这不仅仅是看整体质量更是精细地拆解“忠实度”这个抽象概念。决策Decision基于评估得分智能体通过其策略网络Policy Network或规则引擎Rule Engine进行分析判断当前结果与目标的差距在哪里并决定采取何种优化动作。执行Action智能体将决策转化为具体的操作指令例如“将提示词中的‘walking slowly’改为‘strolling gently’”或“将CFG分类器自由引导尺度从7.5调整到8.2”或“在下一轮生成中启用控制网ControlNet的姿态约束”。再评估执行新参数生成新视频后流程回到“感知”阶段形成闭环。智能体通过多次迭代驱动生成结果向目标不断逼近。这个闭环的核心优势在于数据驱动和目标导向。每一次迭代都产生了“参数-结果-评分”的数据对智能体可以从中学习使得后续的决策越来越精准。2.2 智能体系统的核心组件拆解一个完整的用于图像到视频忠实度优化的智能体通常由以下几个关键组件构成状态表示器State Representer功能将当前生成任务的所有相关信息编码成一个机器可理解的“状态向量”。输入源图像的特征嵌入Embedding、当前使用的文本提示词、已设置的生成参数如步数、CFG尺度、种子等、历史生成视频的评估得分序列。输出一个高维向量它浓缩了当前任务的全部上下文信息是决策模块的输入基础。多模态评估器Multi-modal Evaluator - 系统的“眼睛”和“标尺” 这是整个系统的基石。评估器的好坏直接决定了优化方向是否正确。我们不再依赖人的一句“感觉不对”而是构建一个可量化的评估体系。通常包括以下几个维度图像保真度Image Fidelity衡量生成视频的第一帧与源图像的相似度。可以使用CLIP图像编码器计算余弦相似度或使用专门训练的感知相似度模型如LPIPS的变体。时序一致性Temporal Consistency衡量视频帧与帧之间主体和场景的稳定性。例如计算连续帧之间光流Optical Flow的平滑度或使用专门评估视频抖动的模型。主体突然消失、闪烁、不合理跳跃都会在此项得分很低。语义对齐度Semantic Alignment衡量视频内容是否与文本提示词的语义描述一致。这通常通过计算视频帧特征用视频编码器或对帧采样后使用图像编码器与提示词文本特征用文本编码器的CLIP分数来实现。美学质量Aesthetic Quality一个综合性的“好看”评分可以使用预训练的美学评分模型。虽然与“忠实度”不直接相关但可以避免优化出一个忠实但丑陋的结果。动作合理性Motion Plausibility对于包含人物或物体运动的视频评估其动作是否自然、符合物理规律。这可能需要更复杂的动力学模型或基于大规模视频数据训练的判别器。实操心得评估器的构建是最大的挑战之一。完全依赖现成的CLIP或美学模型往往不够精准。一个有效的技巧是“组合评估”和“权重动态调整”。例如在优化初期给予“图像保真度”更高的权重确保主体不跑偏在后期则提高“时序一致性”的权重让动作更平滑。我们甚至可以训练一个轻量级的“元评估器”根据任务类型如人物、风景、抽象艺术自动调整各维度评估模型的权重。策略网络/优化器Policy Network/Optimizer - 系统的“大脑”基于规则的方法适用于问题相对明确的场景。我们可以建立一套“if-then”规则库。例如“如果图像保真度得分 0.7则增强控制网如Canny边缘或深度图的引导权重”“如果时序一致性得分低且提示词包含‘快速’则尝试降低运动模块Motion Module的强度”。这种方法直观、可控但灵活性和探索能力有限。基于学习的方法这是更高级的形态将优化过程建模为一个强化学习RL或进化策略问题。状态State即状态表示器的输出。动作Action对可调参数的修改如{“prompt_suffix”: “, cinematic lighting”, “cfg_scale”: 0.5, “controlnet_strength”: 0.8}。动作空间需要被谨慎设计不宜过大。奖励Reward评估器给出的综合得分各维度得分的加权和。智能体策略网络的目标是学习一个策略函数 π(a|s)使得在状态s下选择动作a能最大化长期累积奖励。通过大量“生成-评估-更新”的循环智能体学会在何种状态下应采取何种优化动作。深度确定性策略梯度DDPG或近端策略优化PPO是常用的算法。执行器Executor功能一个封装了图像到视频生成模型如SVD、ModelScope、zeroscope等的可靠接口。职责接收来自策略网络的具体动作指令将其转化为模型API的调用参数执行视频生成任务并返回生成的视频文件及元数据如使用的种子、耗时等。它需要处理模型加载、资源管理、错误重试等工程化问题。3. 构建实战从零搭建一个基础优化智能体理论讲得再多不如动手搭一个。这里我将分享一个基于规则引擎的轻量级智能体构建流程它不涉及复杂的强化学习但足以让你体会到智能体优化的威力并解决80%的常见忠实度问题。3.1 环境准备与工具选型我们选择Python作为开发语言因为它拥有最丰富的AI库生态。核心依赖库# 深度学习与图像处理 pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 # 根据你的CUDA版本调整 pip install diffusers transformers accelerate # Hugging Face核心库包含主流扩散模型 pip install opencv-python Pillow # 图像视频处理 pip install decord # 高效视频帧读取 # 评估相关 pip install clip # OpenAI CLIP用于图像-文本语义对齐评估 pip install lpips # 感知相似度用于图像保真度评估 pip install timm # 包含各种预训练视觉模型可用于美学评估 # 工作流与工具 pip install comet-ml # 或WandB用于实验跟踪和可视化强烈推荐 pip install hydra-core # 优雅的配置管理模型选择对于图像到视频生成我们以Stable Video Diffusion (SVD)或其社区改进版本如stable-video-diffusion-img2vid-xt作为基础执行器。它目前在质量、可控性和社区支持上比较均衡。同时我们需要准备一些辅助模型用于评估CLIP ViT-L/14用于图像保真度源图与第一帧和语义对齐度视频帧与提示词的评估。LPIPS (AlexNet backbone)作为图像保真度的补充更注重感知相似性。轻量级光流估计模型如RAFT用于计算时序一致性帧间运动平滑度。美学评估模型可以从timm库中加载一个在AVA数据集上预训练的模型。3.2 核心模块代码实现解析我们重点看评估器和规则引擎的实现。1. 多模态评估器实现import torch import clip from lpips import LPIPS import cv2 import numpy as np class MultiModalEvaluator: def __init__(self, devicecuda): self.device device # 加载CLIP模型 self.clip_model, self.clip_preprocess clip.load(ViT-L/14, devicedevice) # 加载LPIPS模型 self.lpips_model LPIPS(netalex).to(device) # 加载美学模型示例需根据实际模型调整 # self.aesthetic_model ... def extract_frame_features(self, video_path, num_frames8): 从视频中均匀采样帧并提取CLIP特征 cap cv2.VideoCapture(video_path) frames [] total_frames int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) indices np.linspace(0, total_frames-1, num_frames, dtypeint) for idx in range(total_frames): ret, frame cap.read() if not ret: break if idx in indices: # 转换BGR到RGB调整尺寸以适应CLIP frame_rgb cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) frame_processed self.clip_preprocess(Image.fromarray(frame_rgb)).unsqueeze(0).to(self.device) frames.append(frame_processed) cap.release() if frames: frames torch.cat(frames, dim0) with torch.no_grad(): frame_features self.clip_model.encode_image(frames) return frame_features.mean(dim0) # 返回视频的平均视觉特征 return None def evaluate_fidelity(self, source_image, first_frame): 评估图像保真度源图 vs 生成视频第一帧 # 预处理图像 img_source self.clip_preprocess(source_image).unsqueeze(0).to(self.device) img_frame self.clip_preprocess(first_frame).unsqueeze(0).to(self.device) # CLIP相似度 with torch.no_grad(): feat_source self.clip_model.encode_image(img_source) feat_frame self.clip_model.encode_image(img_frame) clip_sim torch.cosine_similarity(feat_source, feat_frame).item() # LPIPS距离值越小越相似 lpips_dist self.lpips_model(img_source, img_frame).item() # 综合得分将LPIPS距离映射到0-1与CLIP相似度加权 fidelity_score 0.7 * clip_sim 0.3 * (1 - lpips_dist) # 权重可调 return fidelity_score, {clip_sim: clip_sim, lpips_dist: lpips_dist} def evaluate_temporal_consistency(self, video_path): 简易时序一致性评估通过计算连续帧的PSNR/SSIM均值 cap cv2.VideoCapture(video_path) prev_frame None psnr_values [] while True: ret, frame cap.read() if not ret: break gray_frame cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) if prev_frame is not None: # 计算PSNR mse np.mean((gray_frame - prev_frame) ** 2) if mse 0: psnr 100 # 完全相同 else: psnr 20 * np.log10(255.0 / np.sqrt(mse)) psnr_values.append(psnr) prev_frame gray_frame cap.release() avg_psnr np.mean(psnr_values) if psnr_values else 0 # 将PSNR映射到一个0-1的分数例如PSNR30认为很好20认为差 consistency_score np.clip((avg_psnr - 20) / 30, 0, 1) return consistency_score, {avg_psnr: avg_psnr} def evaluate_semantic_alignment(self, video_feature, prompt): 评估语义对齐度视频特征 vs 提示词特征 with torch.no_grad(): text_tokens clip.tokenize([prompt]).to(self.device) text_feature self.clip_model.encode_text(text_tokens) alignment_score torch.cosine_similarity(video_feature, text_feature).item() return alignment_score def evaluate(self, source_image, video_path, prompt): 综合评估入口 # 提取视频特征和第一帧 video_feature self.extract_frame_features(video_path) cap cv2.VideoCapture(video_path) ret, first_frame_cv cap.read() cap.release() first_frame_pil Image.fromarray(cv2.cvtColor(first_frame_cv, cv2.COLOR_BGR2RGB)) # 执行各项评估 fidelity_score, fidelity_details self.evaluate_fidelity(source_image, first_frame_pil) consistency_score, consistency_details self.evaluate_temporal_consistency(video_path) alignment_score self.evaluate_semantic_alignment(video_feature, prompt) # 美学评分暂用placeholder实际需接入模型 aesthetic_score 0.7 # placeholder # 加权综合得分权重需根据任务调优 weights {fidelity: 0.4, consistency: 0.3, alignment: 0.2, aesthetic: 0.1} total_score (weights[fidelity] * fidelity_score weights[consistency] * consistency_score weights[alignment] * alignment_score weights[aesthetic] * aesthetic_score) return { total_score: total_score, details: { fidelity: {score: fidelity_score, **fidelity_details}, consistency: {score: consistency_score, **consistency_details}, alignment: {score: alignment_score}, aesthetic: {score: aesthetic_score} } }2. 基于规则的策略引擎实现class RuleBasedOptimizer: def __init__(self, initial_params): self.params initial_params # 包含prompt, negative_prompt, cfg_scale, steps, seed, controlnet_config等 self.rule_set self._define_rules() def _define_rules(self): 定义优化规则库。每条规则是一个函数输入评估详情输出是否触发及动作。 rules [] # 规则1如果图像保真度低尝试增强控制网或添加细节描述 def rule_low_fidelity(details): if details[fidelity][score] 0.6: action { type: modify_prompt, operation: suffix, value: , highly detailed, sharp focus } # 同时可以微调CFG增强文本引导 if self.params.get(cfg_scale, 7.5) 10: action[cfg_scale_delta] 0.5 return True, action return False, None rules.append((boost_fidelity, rule_low_fidelity)) # 规则2如果时序一致性差尝试降低运动强度或添加稳定化提示 def rule_low_consistency(details): if details[consistency][score] 0.5: action { type: modify_prompt, operation: suffix, value: , steady shot, smooth motion } # 如果使用了动态参数如SVD的motion_bucket_id可以尝试调低 if motion_bucket_id in self.params: action[motion_bucket_id_delta] -20 return True, None return False, None rules.append((smooth_motion, rule_low_consistency)) # 规则3如果语义对齐度低尝试重写或细化提示词核心动作 def rule_low_alignment(details): if details[alignment][score] 0.7: # 这里可以集成一个简单的提示词优化LLM如调用GPT-3.5/4的API # 此处简化为添加更明确的动作描述 action { type: rewrite_prompt_action, hint: Make the action in the prompt more specific and direct. } return True, action return False, None rules.append((clarify_action, rule_low_alignment)) return rules def analyze_and_act(self, evaluation_details): 分析评估结果并返回优化动作列表 actions [] for rule_name, rule_func in self.rule_set: triggered, action rule_func(evaluation_details) if triggered: print(f[Optimizer] Rule triggered: {rule_name}) if action: actions.append(action) return actions def apply_actions(self, actions): 应用优化动作到当前参数集 for action in actions: if action[type] modify_prompt: if action[operation] suffix: self.params[prompt] self.params[prompt] action[value] elif action[type] adjust_parameter: param_name action[parameter] if param_name in self.params: self.params[param_name] action.get(delta, 0) # ... 处理其他类型的action return self.params3.3 主循环工作流集成将上述模块串联起来就形成了智能体优化的主循环。def agentic_optimization_loop(source_image, initial_prompt, max_iterations5): 智能体优化主循环 # 1. 初始化 evaluator MultiModalEvaluator(devicecuda) initial_params { prompt: initial_prompt, negative_prompt: blurry, distorted, ugly, deformed, num_inference_steps: 25, guidance_scale: 7.5, seed: 42, } optimizer RuleBasedOptimizer(initial_params) executor VideoGenerationExecutor() # 假设已封装好的生成器 best_score -1 best_video_path None history [] # 2. 迭代优化 for iter in range(max_iterations): print(f\n Iteration {iter1}/{max_iterations} ) current_params optimizer.params.copy() # a. 执行生成 print(fGenerating video with params: {current_params[prompt][:50]}...) video_path executor.generate(source_image, current_params) # b. 评估结果 print(Evaluating generated video...) eval_result evaluator.evaluate(source_image, video_path, current_params[prompt]) total_score eval_result[total_score] print(fTotal Score: {total_score:.4f}) print(f Fidelity: {eval_result[details][fidelity][score]:.4f}) print(f Consistency: {eval_result[details][consistency][score]:.4f}) print(f Alignment: {eval_result[details][alignment][score]:.4f}) # 记录历史 history.append({ iteration: iter, params: current_params.copy(), video_path: video_path, score: total_score, details: eval_result[details] }) # 更新最佳结果 if total_score best_score: best_score total_score best_video_path video_path print(fNew best score achieved!) # c. 决策与优化如果不是最后一次迭代 if iter max_iterations - 1: actions optimizer.analyze_and_act(eval_result[details]) if actions: print(fOptimizer suggests actions: {actions}) new_params optimizer.apply_actions(actions) print(fUpdated params for next iteration.) else: print(No optimization action suggested. Convergence may be reached.) # 可以加入随机探索避免陷入局部最优 # optimizer.params[seed] random.randint(0, 10000) else: print(Max iterations reached.) # 3. 返回最佳结果和优化历史 return { best_video_path: best_video_path, best_score: best_score, optimization_history: history }4. 高级策略与实战避坑指南4.1 从规则引擎到学习型智能体当规则引擎无法满足复杂需求时就需要引入学习型智能体。这里以强化学习RL为例勾勒出升级路径定义更精细的状态和动作空间状态State除了基础参数可以加入历史评估得分的变化趋势一阶/二阶差分、源图像的深层特征如通过AutoEncoder提取的潜在向量。动作Action设计成连续或离散的调整量。例如{“cfg_delta”: [-0.5, 0.5], “prompt_strength_delta”: [-0.1, 0.1]}。也可以设计离散动作如“增加细节描述”、“减弱运动”、“增强色彩饱和度”。设计合理的奖励函数Reward Function 奖励函数是RL的灵魂。我们的评估器给出的total_score可以直接作为奖励。但为了引导智能体更快学习可以设计稀疏奖励为稠密奖励。例如不仅给最终总分还为每个评估维度的改善给予额外的小奖励。惩罚项也很重要比如对参数超出合理范围如CFG尺度20给予大惩罚。选择与训练算法近端策略优化PPO因其稳定性和易于调参而广受欢迎适合处理连续动作空间。软演员-评论家SAC在探索和利用之间平衡得更好适合需要大量探索的任务。实践要点视频生成非常耗时直接用真实环境训练RL智能体成本极高。一个可行的方案是构建一个视频质量预测器Video Quality Predictor作为模拟环境。这个预测器是一个神经网络输入状态和动作直接预测生成视频的评估得分。先用历史数据训练这个预测器然后让RL智能体在这个快速的模拟环境中进行大量试错学习最后再将学到的策略部署到真实生成环境中进行微调Fine-tuning。这被称为世界模型World Model或模拟器学习Simulator Learning。4.2 常见问题与排查技巧实录在实际操作中你会遇到各种各样的问题。下面是我踩过的一些坑和总结的排查思路问题现象可能原因排查与解决思路优化陷入停滞分数不再提升1. 规则库已穷尽。2. 动作空间太小或不对。3. 评估器权重不合理导致优化方向矛盾。1.引入随机探索在规则引擎中当连续多次无动作触发时主动随机调整一个次要参数如种子、微小噪声跳出局部最优。2.扩展动作空间检查是否有关键参数未被纳入优化范围例如视频帧数、采样器Sampler类型、VAE版本等。3.分析评估细节查看各分项得分。如果“保真度”和“一致性”此消彼长可能需要动态调整它们的权重或引入帕累托优化Pareto Optimization思想。生成视频质量突然崩溃1. 参数调整幅度过大如CFG尺度突变。2. 提示词修改后引入冲突或不良概念。3. 模型本身的不稳定性。1.设置参数安全边界为所有可调参数设置最小/最大值如CFG尺度限制在1.5-15之间。2.使用负面提示词锚定保持一个强大的、通用的负面提示词如“deformed, ugly, blurry, bad anatomy”不变防止质量滑坡。3.实施回滚机制如果本次迭代得分远低于历史平均则自动回退到上一次的参数并采取更保守的优化策略。评估器打分与人类主观感受不符1. 评估模型本身有偏差。2. 评估维度权重不符合当前任务。1.人工校准收集一个小型数据集10-20个视频人工打分然后线性回归拟合评估器总分与人工分的关系进行分数校准。2.任务特定权重调优对于“人物特写”任务提高保真度和美学权重对于“风景延时”任务提高一致性权重。可以预设几套权重模板。优化过程耗时过长1. 每次迭代都从零开始生成视频。2. 评估器计算开销大。1.利用潜在空间插值如果两次迭代的参数变化很小可以尝试在潜在空间Latent Space对前后两次的生成结果进行插值快速得到中间状态的视频进行预评估减少完整生成次数。2.评估器轻量化与缓存使用更小的评估模型如ViT-B/32代替ViT-L/14并对固定源图像和提示词的CLIP特征进行缓存避免重复计算。智能体总是给出相似的动作1. 策略过拟合到少数成功模式。2. 状态表示缺乏区分度。1.增加策略熵Entropy鼓励探索在RL训练中增加熵奖励项在规则引擎中设计多条等效但不同的规则路径。2.丰富状态信息在状态向量中加入更多历史信息如过去3次的动作和得分变化帮助智能体感知到“当前策略是否已经重复”。核心避坑技巧从小处着手快速验证。不要一开始就追求全自动的强化学习智能体。先从构建一个评估几个关键维度保真度、一致性的评估器和一个包含3-5条核心规则的优化器开始。用一个具体的、定义明确的图像到视频任务例如“让这张人脸图片缓慢转头”进行测试。观察闭环是否工作评估分数是否朝着预期方向变化。这个最小可行产品MVP能帮你快速验证整个架构的可行性并暴露出最致命的问题。5. 效果评估与迭代方向经过智能体优化后的视频其提升通常是多维且明显的。最直接的感受是工作流的效率提升。以前需要手动调试数十次的任务现在可能只需要设置好初始条件让智能体跑5-10个迭代就能达到满意效果。更重要的是它带来了一种可重复的、标准化的质量保障。你可以为不同类型的项目电商产品展示、动漫角色动画、建筑漫游定制不同的评估权重和规则模板从而确保产出符合特定领域的质量标准。从量化指标看优化后的视频在图像保真度CLIP-I和时序一致性帧间PSNR/SSIM上通常有15%-30%的显著提升。语义对齐度则取决于提示词优化的能力如果集成了LLM进行提示词改写提升可能更为巨大。未来的迭代方向非常广阔评估器专业化训练针对特定瑕疵如面部畸变、手部崩坏、纹理闪烁的“专项评估模型”实现更精细的优化。多智能体协作可以设计多个智能体分工合作一个负责构图和主体一个负责运动和光影一个负责整体风格通过竞争或协作共同优化视频。与人类反馈对齐引入人类偏好数据通过基于人类反馈的强化学习RLHF来训练评估器和策略网络让智能体的优化目标更贴近人类的真实审美。跨模型优化智能体不应绑定单一的视频生成模型。它可以学习不同模型SVD, Pika, Runway等的“脾气”针对不同模型选择最优的优化策略成为一个真正的“通用视频优化顾问”。这个项目让我深刻体会到AIGC创作的未来绝不是人与模型的简单对抗或单向指令而是人与智能体协同进化的伙伴关系。我们将从繁琐的试错中解放出来更多地扮演导演、策划和评审的角色而将那些需要大量计算和迭代的优化工作交给不知疲倦、不断学习的智能体伙伴。这不仅仅是效率的提升更是创作可能性的极大拓展。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门