当前位置:   article > 正文

AI作画技术实践第二期|用腾讯云智能图片融合优化AI绘画的效果_腾讯云ai绘画文生图

腾讯云ai绘画文生图

上一篇文章《AI作画技术实践第一期》提到用腾讯云智能能力如何实现简易版的AI画画,发布后受到大量网友关注,也在思考还能不能做出更好的效果。最近发现AI绘画玩法在短视频平台也掀起了一波热潮,结合在网上看到有一些很优秀的AI画画模型,也想尝试在上一篇的基础上做出更好的体验效果。

接下来完整的分享下我的实践过程,感兴趣的朋友也可以尝试。

1.实现思路

通过AI生成人像图,然后调用腾讯云智能能力进行人脸融合,最终生成一张效果比较好的人像图。

1.1 详细流程:

 

2.准备工作

2.1 Stable-Diffusion部署

Stable Diffusion 是一个开源的文本转图像模型,可以通过输入一段文字,生成一张符合语义的图片。 具体可以看github的介绍: GitHub - CompVis/stable-diffusion: A latent text-to-image diffusion model

按照文档安装,安装过程大同小异, 不再赘述。

通过脚本的方式生成图片: 

  1. from torch import autocast
  2. from diffusers import StableDiffusionPipeline
  3. import sys
  4. # 指定模型
  5. pipe = StableDiffusionPipeline.from_pretrained(
  6. # "CompVis/stable-diffusion-v1-4",
  7. "runwayml/stable-diffusion-v1-5",
  8. # "hakurei/waifu-diffusion",
  9. use_auth_token=True
  10. ).to("cuda")
  11. prompt = "a photo of an astronaut riding a horse on mars"
  12. prompt = sys.argv[1]
  13. with autocast("cuda"):
  14. image = pipe(prompt, num_inference_steps=100).images[0]
  15. image.save(sys.argv[2] + ".png")

指定关键词,调用输出,看下生成效果: 

python3 interface.py "*******" out

 

3.小程序demo实践

下面是我通过小程序端来实现AI作画的过程。

3.1 AI画画服务端:

模型部署好后只能本地执行, 我们简单实现下功能:

一、用户把任务提交到cos上,服务通过拉去cos的内容来执行AI画画任务。

二、通过执行shell命令,并将生成好的图片上传到cos。

COS文档: 对象存储简介_对象存储购买指南_对象存储操作指南-腾讯云

AI画画模型执行代码:

  1. type Request struct {
  2. SessionId string `json:"session_id"`
  3. JobId string `json:"job_id"`
  4. Prompt string `json:"prompt"`
  5. ModelUrl string `json:"model_url"`
  6. ImageUrl string `json:"image_url"`
  7. }
  8. type JobInfo struct {
  9. JobId string `json:"job_id"`
  10. Request
  11. }
  12. func run(req *JobInfo) {
  13. begin := time.Now()
  14. Log("got a job, %+v", req)
  15. jobId := req.JobId
  16. cmd := exec.Command("sh", "start.sh", req.Prompt, jobId)
  17. err := cmd.Run()
  18. if err != nil {
  19. fmt.Println("Execute Command failed:" + err.Error())
  20. return
  21. }
  22. result, err := os.ReadFile(fmt.Sprintf("output/%s.png", jobId))
  23. if err != nil {
  24. panic(err)
  25. }
  26. url, err := cos.PutObject(context.Background(), fmt.Sprintf("aidraw/%s.png", jobId), result)
  27. if err != nil {
  28. panic(err)
  29. }
  30. resp := &Response{
  31. SessionId: req.SessionId,
  32. JobId: jobId,
  33. JobStatus: "FINISNED",
  34. CostTime: time.Since(begin).Milliseconds(),
  35. ResultUrl: url,
  36. }
  37. Log("job finished, %+v", resp)
  38. data, _ := json.Marshal(resp)
  39. pushResult(jobId, string(data))
  40. }

通过cos来实现任务管理,涉及到任务拉取和结果上传, 以下是实现代码:

  1. func pullJob() *JobInfo {
  2. res, _, err := cos.GetInstance().Bucket.Get(context.Background(), &cossdk.BucketGetOptions{
  3. Prefix: JOB_QUEUE_PUSH,
  4. Delimiter: "",
  5. EncodingType: "",
  6. Marker: "",
  7. MaxKeys: 10000,
  8. })
  9. if err != nil {
  10. return nil
  11. }
  12. var jobId string
  13. for _, v := range res.Contents {
  14. if !objectExist(fmt.Sprintf("%s/%s", JOB_QUEUE_RESULT, getNameByPath(v.Key))) {
  15. jobId = v.Key
  16. break
  17. }
  18. }
  19. if len(jobId) == 0 {
  20. return nil
  21. }
  22. jobId = getNameByPath(jobId)
  23. Log("new job %s", jobId)
  24. resp, err := cos.GetInstance().Object.Get(context.Background(), fmt.Sprintf("%s/%s", JOB_QUEUE_PUSH, jobId), &cossdk.ObjectGetOptions{})
  25. if err != nil {
  26. panic(err)
  27. }
  28. defer resp.Body.Close()
  29. if resp.StatusCode != 200 {
  30. return ni
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小惠珠哦/article/detail/981091
推荐阅读
相关标签
  

闽ICP备14008679号