做cf网站网架加工工厂图片

当前位置: 首页 > news >正文

做cf网站,网架加工工厂图片,下面什么不属于网络推广方法,浅谈博物馆网站建设意义PhotoMaker: 高效个性化定制人像照片文生图 - 知乎今天分享我们团队最新的工作PhotoMaker的技术细节。该工作开源5天Githubstar数已过6千次#xff0c;已列入Github官方Trending榜第一位#xff0c;PaperswithCode热度榜第一位#xff0c;HuggingFace Spaces趋势榜第一位。项…PhotoMaker: 高效个性化定制人像照片文生图 - 知乎今天分享我们团队最新的工作PhotoMaker的技术细节。该工作开源5天Githubstar数已过6千次已列入Github官方Trending榜第一位PaperswithCode热度榜第一位HuggingFace Spaces趋势榜第一位。项目主页在 PhotoMa…https://zhuanlan.zhihu.com/p/680468694https://huggingface.co/spaces/TencentARC/PhotoMakerhttps://huggingface.co/spaces/TencentARC/PhotoMaker相当于把以前串联型保ID项目比如facechain和easyphoto的数据处理提前了给了sd更好的特征维度。 定制化生成dreambooth允许用户输入少量的待定制目标的图像配合文本控制就可以生成该目标不同动作或者不同场景的图像。 DreamBooth的算法流程非常简单主要分为了两个阶段。第一阶段准备数张待定制目标的图像配合对应的触发词一同送入预训练的扩散模型中进行微调Finetuning。第二阶段用户可以在文本中加入相应的触发词进行定制化目标的生成。由于DreamBooth一般需要对扩散模型中去噪器的所有参数进行上千次迭代步数的微调整个流程非常消耗时间往往需要花费约数十分钟时间。消耗的计算资源和存储资源都很大。因此一些工作尝试减少DreamBooth需要微调的参数。 这些工作包括了1CVPR23的Custom Diffusion其只需要微调去噪器的cross-attention中所有的k和v就可以实现定制化生成。以及2社区中出现的基于LoRA的方式该方式只需要微调低秩分解后的注意力模块的残差。不仅微调的参数量变少了、消耗的资源更少了、速度变快了他们还可以达到比DreamBooth更好的效果。 但是以上的这些基于DreamBoothLoRA的人像定制应用都有三个资源采集和消耗上的痛点 1. 定制时间慢由于需要在“测试”定制阶段对模型进行微调理论上消耗的时间往往需要大约15分钟在一些商业化的APP上由于资源分配和排队的问题这一定制时间甚至要更久数小时到数天。 2. 消耗显存高如果不进行额外的优化在SDXL底模上执行定制化过程只能在专业级显卡上进行这些专业级显卡的昂贵都是出了名的。 3. 对输入素材要求高以妙鸭举例它要求用户输入20张以上高质量的人像照片且每次定制过程都需要重新进行收集。对用户来说非常不友好。 因此我们希望设计一个算法它无需在“测试”定制阶段进行训练只需要一次前向过程就可以在10秒左右进行定制化生成。与此同时这个算法可以在消费级显卡上运行并且只需要用户少量1-3张不对质量有要求的图像。 我们的解决方案也非常简单如图所示首先我们希望在训练时我们的输入图像和输出的目标图像都不来源于同一个图像。其次我们希望送入多个同一ID的图像提取embedding以得到对输出ID的一个全面且统一的表达。这个embedding我们将它命名为Stacked ID embedding。Stacked ID embedding中存取的每个embedding它们的图像来源可能姿态不同表情不同以及配饰不同但ID都是相同的因此可以隐式的将ID与其他与ID无关的信息解耦以使其只表征待输出的ID信息。依赖于Stacked ID embedding我们提出了PhotoMaker。 PhotoMaker可以在用户输入少量图像的前提下生成待定制ID的图像并根据prompt进行上下文的改变。我们还可以改通过简单的改变触发词改变待定制人物的年龄和性别。就比如说我们可以生成Hinton小时候带上博士帽的照片。 身份混合 接下来我们详细介绍我们的算法流程核心思想就是通过多张图像送入这个框架中得到stack ID embedding作为输出ID的信息表征。具体来说首先我们准备好同一ID的多个图像并把最与ID信息无关的背景mask掉。然后将这些同一ID的多个图像送入图像编码器中进行编码得到多个image embedding。如果我们有4个输入图像那就有4个image embedding。我们同时使用text encoder将输入的文本进行编码,并且找出触发词待定制目标的类别词对应的编码后位置。使用该位置的text embedding与image embedding通过MLP一一进行混合得到stacked ID embeddingstacked ID embedding中emebdding的数量仍与输入图像数量一致。 我们将得到的stacked ID embedding与text embedding中对应位触发词位置的embedding进行替换进而得到更新后的text embedding。 我们将更新后的text embedding放入diffusion model中通过cross attention层进行融合。此外我们还在每一个注意力层中添加了LoRA模块进行更新。 在测试阶段我们可以使用来自不同ID的人像进行ID融合就比如说我们可以送入2张LeCun的头像和2张斯佳丽的头像以生成长得像LeCun的斯嘉丽。需要注意的是。送入的图像背景可以不需要被mask遮住。 接下来我们介绍以ID为中心的数据组装流程。为什么需要这个流程呢是因为现有的数据集无法支持训练我们的PhotoMaker.因为第一许多数据集不以ID进行分类比如说LAION和FHHQ等第二以ID分类的数据集只关注人脸区域比如CelebA-HQ以及一些用于人脸检测的数据集等。我们希望组建一个数据准备流程通过这个流程可以得到一个数据集其以ID进行分类且每一个ID都有多张以人物为主体的图像。 具体来说我们首先根据人名的列表对人物图像进行分类下载然后每个文件夹中包含了多个同一ID的图像。接着我们对图像的质量进行过滤过滤掉分辨率低的图像和人脸以及没有人脸的图像。由于每一个文件夹中包含了可能不属于同一ID的图像那么我们需要进行ID的验证就是将每个ID分类中人脸一致的bounding box留下来。在进行完ID验证后我们筛选出了同一ID的bounding box和图像。然后我们对筛选出的图像进行裁剪以使人物为主体与此同时分割出当前ID对应的mask以方便训练时使用。我们给每个图像都生成对应的文本描述。并标记出对应的触发词即类别词。 接下来我们展示两种我们方法进行人物融合的调节策略以展示我们方法的灵活性。第一种是我们可以控制不同ID在输入图像池中的占比来调节融合ID的偏向。比如说我们可以让LeCun的照片在输入图像池中占比更多一些以使生成的图像更像LeCun,反之亦然。 在接下来两个例子中我们可以看到我们的方法可以控制奥巴马和或者拜登在整个输入图像池中的占比来控制输入输出的ID更像奥巴马还是更像拜登。其中50%的意思就是输入的10张图像中5张图像是奥巴马5张图像是拜登。可以看到随着奥巴马的占比更多生成的ID更像奥巴马反之更像拜登。可以看到这个变化是非常平滑的。再者就是斯佳丽和奥巴马夫人进行混合的例子可以看到发色、肤色等有都有一个平滑的过渡。 第二种人物融合调节策略就是通过prompt weighting来调节。具体来说就是通过控制不同ID在stack ID embedding中的权重来调节融合ID的偏向。就比如说我要使输出图像长得更像LeCun就把LeCun对应的embedding权重调大一些。而长得更像斯佳丽就把斯佳丽对应的embedding的权重调大一些。 接下来的例子中我们可以看到我们固定这个拜登对应的embedding权重为1.0调大奥巴马的对应的embedding的权重可以看到图像长得会更加像奥巴马。在安妮海瑟薇的例子中可以看到随着这个Elsa公主的权重调大她的发色和服装以及背景都有相应的平滑改变。 我们文章的核心观点就是通过多个图像的ID嵌入得到stacked ID embedding。如果我们送入更多的图像得到更多的embedding会带来怎样的增益呢首先是客观指标展示所有有关ID保真度的指标随着输入的图像增多都增加了但是文本一致性降低了。 在视觉结果展示中可以看到我们在输入一张图像时输出的图像不像拜登或斯嘉利但是随着输入图像增多输出的图像会长得更加像拜登和斯嘉丽。对于强森我们输入prompt是“一个女人的照片”那可以看到刚开始他还是有女性的特征的但随着输入图像增多虽然更像强森了但输出ID的男性特征越来越明显。 代码 pipe PhotoMakerStableDiffusionXLPipeline.from_pretrained(base_model_path,…) pipe.load_photomaker_adapter(ckpt)-

  • id_encoder PhotoMakerIDEncoder()-CLIPVisionModelWithProjection – visual_projection_2 nn.Linear(1024,1280,biasFalse) – fuse_module FuseModule(2048)
  • id_encoder.load_state_dict(state_dict([id_encoder]))
  • id_image_processor CLIPImageProcessor()
  • load_lora_weights(state_dict[lora_weights],adapter_namephototmaker)
  • self.tokenizer_2.add_tokens([trigger_word],special_tokensTrue) pipe.scheduler EulerDiscreteScheduler.from_config() pipe.fuse_lora()generate_image()- input_ids pipe.tokenizer.encode(prompt)- output_w, output_h aspect_ratios[aspect_ratio_name]- prompt, negative_prompt apply_style(style_name, prompt, negative_prompt)- generator torch.Generator(devicedevice).manual_seed(seed)-images pipe(promptprompt,widthoutput_w,heightoutput_h,input_id_imagesinput_id_images,negative_promptnegative_prompt,num_images_per_promptnum_outputs,num_inference_stepsnum_steps,start_merge_stepstart_merge_step,generatorgenerator,guidance_scaleguidance_scale,).images-
  • 1.check inputs-self.check_inputs()
  • 3.encode input prompt-prompt_embeds self.encode_prompt_with_trigger_word()-
  • 4.encode input prompt without the trigger word for delayed conditioning encode,remove trigger word token,then decodetokens_text_only self.tokenizer.encode(prompt, add_special_tokensFalse)trigger_word_token self.tokenizer.convert_tokens_to_ids(self.trigger_word)tokens_text_only.remove(trigger_word_token)prompt_text_only self.tokenizer.decode(tokens_text_only, add_special_tokensFalse) (prompt_embeds_text_only,negative_prompt_embeds,pooled_prompt_embeds_text_only, # TODO: replace the pooled_prompt_embeds with text only promptnegative_pooled_prompt_embeds, ) self.encode_prompt(promptprompt_text_only,prompt_2prompt_2,devicedevice,num_images_per_promptnum_images_per_prompt,do_classifier_free_guidancedo_classifier_free_guidance,negative_promptnegative_prompt,negative_prompt_2negative_prompt_2,prompt_embedsprompt_embeds_text_only,negative_prompt_embedsnegative_prompt_embeds,pooled_prompt_embedspooled_prompt_embeds_text_only,negative_pooled_prompt_embedsnegative_pooled_prompt_embeds,)
  • 5. Prepare the input ID images id_pixel_values id_pixel_values.unsqueeze(0).to(devicedevice, dtypedtype) # TODO: multiple prompts
  • 6. Get the update text embedding with the stacked ID embedding标识词和image mlp融合再和text_prompt_encode组合 prompt_embeds self.id_encoder(id_pixel_values, prompt_embeds, class_tokens_mask)
  • 7. prepare timesteps self.scheduler.set_timesteps(num_inference_steps, devicedevice)
  • 8. prepare latent variables latents self.prepare_latents(batch_size * num_images_per_prompt,num_channels_latents,height,width,prompt_embeds.dtype,device,generator,latents,)
  • 10. Prepare added time ids embeddingsif self.text_encoder_2 is None:text_encoder_projection_dim int(pooled_prompt_embeds.shape[-1])else:text_encoder_projection_dim self.text_encoder_2.config.projection_dimadd_time_ids self._get_add_time_ids(original_size,crops_coords_top_left,target_size,dtypeprompt_embeds.dtype,text_encoder_projection_dimtext_encoder_projection_dim,)add_time_ids torch.cat([add_time_ids, add_time_ids], dim0)add_time_ids add_time_ids.to(device).repeat(batch_size * num_images_per_prompt, 1) -11. ….