AI实战营第二期 第十节 《MMagic 代码课》——笔记11

2023-07-22 05:41:15

AI实战营第二期 第十节 《MMagic 代码课》

MMagic (Multimodal Advanced, Generative, and Intelligent Creation) 是一个供专业人工智能研究人员和机器学习工程师去处理、编辑和生成图像与视频的开源 AIGC 工具箱。
在这里插入图片描述

MMagic 允许研究人员和工程师使用最先进的预训练模型,并且可以轻松训练和开发新的定制模型。

MMagic 支持各种基础生成模型,包括:

  • 无条件生成对抗网络 (GANs)

  • 条件生成对抗网络 (GANs)

  • 内部学习

  • 扩散模型

  • 还有许多其他生成模型即将推出!

MMagic 支持各种应用程序,包括:

  • 图文生成

  • 图像翻译

  • 3D 生成

  • 图像超分辨率

  • 视频超分辨率

  • 视频插帧

  • 图像补全

  • 图像抠图

  • 图像修复

  • 图像上色

  • 图像生成

  • 还有许多其他应用程序即将推出!

在这里插入图片描述

【课程链接】https://www.bilibili.com/video/BV1gM4y1n7vP/
【讲师介绍】张子豪 OpenMMLab算法工程师

OpenMMLab 生成模型+底层视觉+AIGC+多模态 算法库 MMagic
MMagic主页:https://github.com/open-mmlab/mmagic
代码教程:https://github.com/TommyZihao/MMagic_Tutorials
中文文档:https://mmagic.readthedocs.io/zh_CN/latest/

【代码教程目录】
安装配置MMagic环境
黑白老照片上色
文生图-Stable Diffusion
文生图-Dreambooth
图生图-ControlNet

安装配置MMagic

安装Pytorch

!pip3 install install torch==1.10.1+cu113 torchvision==0.11.2+cu113 torchaudio==0.10.1+cu113 -f https://download.pytorch.org/whl/cu113/torch_stable.html

安装MMCV和MMEngine环境

[2]

!pip3 install openmim
!mim install 'mmcv>=2.0.0'
!mim install 'mmengine'

安装MMagic

!mim install 'mmagic'
从源码安装MMagic
!rm -rf mmagic # 删除原有的 mmagic 文件夹(如有)
!git clone https://github.com/open-mmlab/mmagic.git # 下载 mmagic 源代码
import os
os.chdir('mmagic')
!pip3 install -e .

检查安装成功

# 检查 Pytorch
import torch, torchvision
print('Pytorch 版本', torch.__version__)
print('CUDA 是否可用',torch.cuda.is_available())

[

检查 mmcv

import mmcv
from mmcv.ops import get_compiling_cuda_version, get_compiler_version
print('MMCV版本', mmcv.__version__)
print('CUDA版本', get_compiling_cuda_version())
print('编译器版本', get_compiler_version())

检查 mmagic

import mmagic
print('MMagic版本', mmagic.__version__)
MMagic版本 1.0.2dev0

安装其它工具包

!pip install opencv-python pillow matplotlib seaborn tqdm -i https://pypi.tuna.tsinghua.edu.cn/simple
!pip install clip transformers gradio 'httpx[socks]' diffusers==0.14.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
!mim install 'mmdet>=3.0.0'

黑白照片上色

进入 MMagic 主目录

import os
os.chdir('mmagic')

下载样例图片

[2]

!wget https://zihao-openmmlab.obs.cn-east-3.myhuaweicloud.com/20230613-MMagic/data/test_colorization.jpg -O test_colorization.jpg

运行预测

[3]
!python demo/mmagic_inference_demo.py
–model-name inst_colorization
–img test_colorization.jpg
–result-out-dir out_colorization.png

文生图-Stable Diffusion

from mmagic.apis import MMagicInferencer
sd_inferencer = MMagicInferencer(model_name='stable_diffusion')
text_prompts = 'A panda is having dinner at KFC'

text_prompts = 'A Persian cat walking in the streets of New York'

sd_inferencer.infer(text=text_prompts, low_cpu_mem_usage=True,result_out_dir='output/sd_res.png')

在这里插入图片描述

文生图-Dreambooth

新建文件夹data/dreambooth/imgs/

在这里插入图片描述
修改config/dreambooth/文件夹中的dreambooth-lora.py脚本
在这里插入图片描述

dataset = dict(
    type='DreamBoothDataset',
    data_root='./data/dreambooth',
    # TODO: rename to instance
    concept_dir='imgs',
    prompt='a photo of gril',
    pipeline=pipeline)

然后执行命令:

!bash tools/dist_train.sh configs/dreambooth/dreambooth-lora.py 1

用训练好的模型做预测

from mmengine import Config

from mmagic.registry import MODELS
from mmagic.utils import register_all_modules

register_all_modules()
cfg = Config.fromfile('./mmagic/configs/dreambooth/dreambooth-lora.py')
dreambooth_lora = MODELS.build(cfg.model)

state = torch.load('mmagic/work_dirs/dreambooth-lora/iter_1000.pth')['state_dict']

def convert_state_dict(state):
    state_dict_new = {}
    for k, v in state.items():
        if '.module' in k:
            k_new = k.replace('.module', '')
        else:
            k_new = k
        if 'vae' in k:
            if 'to_q' in k:
                k_new = k.replace('to_q', 'query')
            elif 'to_k' in k:
                k_new = k.replace('to_k', 'key')
            elif 'to_v' in k:
                k_new = k.replace('to_v', 'value')
            elif 'to_out' in k:
                k_new = k.replace('to_out.0', 'proj_attn')
        state_dict_new[k_new] = v
    return state_dict_new
dreambooth_lora.load_state_dict(convert_state_dict(state))
dreambooth_lora = dreambooth_lora.cuda()
samples = dreambooth_lora.infer('side view of gril', guidance_scale=5)
samples['samples'][0]

请添加图片描述

图生图-ControlNet-Canny

导入工具包

import cv2
import numpy as np
import mmcv
from mmengine import Config
from PIL import Image

from mmagic.registry import MODELS
from mmagic.utils import register_all_modules

register_all_modules()

载入ControlNet模型

cfg = Config.fromfile('configs/controlnet/controlnet-canny.py')
controlnet = MODELS.build(cfg.model).cuda()

输入Canny边缘图

control_url = 'https://user-images.githubusercontent.com/28132635/230288866-99603172-04cb-47b3-8adb-d1aa532d1d2c.jpg'
control_img = mmcv.imread(control_url)
control = cv2.Canny(control_img, 100, 200)
control = control[:, :, None]
control = np.concatenate([control] * 3, axis=2)
control = Image.fromarray(control)

咒语Prompt

prompt ='Room with blue walls and a yellow ceiling.'

执行预测

output_dict = controlnet.infer(prompt, control=control)
samples = output_dict['samples']
for idx, sample in enumerate(samples):
    sample.save(f'sample_{idx}.png')
controls = output_dict['controls']
for idx, control in enumerate(controls):
    control.save(f'control_{idx}.png')

图生图-ControlNet-Pose

import mmcv
from mmengine import Config
from PIL import Image

from mmagic.registry import MODELS
from mmagic.utils import register_all_modules

register_all_modules()

载入ControlNet模型

cfg = Config.fromfile('configs/controlnet/controlnet-pose.py')
# convert ControlNet's weight from SD-v1.5 to Counterfeit-v2.5
cfg.model.unet.from_pretrained = 'gsdf/Counterfeit-V2.5'
cfg.model.vae.from_pretrained = 'gsdf/Counterfeit-V2.5'
cfg.model.init_cfg['type'] = 'convert_from_unet'
controlnet = MODELS.build(cfg.model).cuda()
# call init_weights manually to convert weight
controlnet.init_weights()

咒语Prompt

prompt = 'masterpiece, best quality, sky, black hair, skirt, sailor collar, looking at viewer, short hair, building, bangs, neckerchief, long sleeves, cloudy sky, power lines, shirt, cityscape, pleated skirt, scenery, blunt bangs, city, night, black sailor collar, closed mouth'

输入Pose图

control_url = 'https://user-images.githubusercontent.com/28132635/230380893-2eae68af-d610-4f7f-aa68-c2f22c2abf7e.png'
control_img = mmcv.imread(control_url)
control = Image.fromarray(control_img)
control.save('control.png')

在这里插入图片描述

执行预测

output_dict = controlnet.infer(prompt, control=control, width=512, height=512, guidance_scale=7.5)
samples = output_dict['samples']
for idx, sample in enumerate(samples):
    sample.save(f'sample_{idx}.png')
controls = output_dict['controls']
for idx, control in enumerate(controls):
    control.save(f'control_{idx}.png')

图生图-ControlNet Animation

方式一:Gradio命令行

!python demo/gradio_controlnet_animation.py

点击URL,打开Gradio在线交互式网站,上传视频,执行预测
方式二:MMagic API

# 导入工具包
from mmagic.apis import MMagicInferencer

# Create a MMEdit instance and infer
editor = MMagicInferencer(model_name='controlnet_animation')
# 指定 prompt 咒语
prompt = 'a girl, black hair, T-shirt, smoking, best quality, extremely detailed'
negative_prompt = 'longbody, lowres, bad anatomy, bad hands, missing fingers, extra digit, fewer digits, cropped, worst quality, low quality'

# 待测视频
# https://user-images.githubusercontent.com/12782558/227418400-80ad9123-7f8e-4c1a-8e19-0892ebad2a4f.mp4
video = '../run_forrest_frames_rename_resized.mp4'
save_path = '../output_video.mp4'
# 执行预测
editor.infer(video=video, prompt=prompt, image_width=512, image_height=512, negative_prompt=negative_prompt, save_path=save_path)

训练自己的ControlNet

下载数据集

!rm -rf fill50k.zip fill50k
!wget https://huggingface.co/lllyasviel/ControlNet/blob/main/training/fill50k.zip
!unzip fill50k.zip >> /dev/null # 解压压缩包
!rm -rf fill50k.zip # 删除压缩包

训练

!bash tools/dist_train.sh configs/controlnet/controlnet-1xb1-demo_dataset 1
from mmagic.apis import MMagicInferencer
import matplotlib.pyplot as plt
sd_inferencer = MMagicInferencer(model_name='stable_diffusion')

import cv2
import numpy as np
import mmcv
from mmengine import Config
from PIL import Image

from mmagic.registry import MODELS
from mmagic.utils import register_all_modules

register_all_modules()
cfg = Config.fromfile('configs/controlnet/controlnet-canny.py')
controlnet = MODELS.build(cfg.model).cuda()
control_img = mmcv.imread('11.JPG')
control = cv2.Canny(control_img, 100, 200)
control = control[:, :, None]
control = np.concatenate([control] * 3, axis=2)
control = Image.fromarray(control)
plt.subplot(121)
plt.imshow(control_img)
plt.subplot(122)
plt.imshow(control)
plt.show()
prompt = 'Make this room full of warmth.'
output_dict = controlnet.infer(prompt, control=control)
samples = output_dict['samples']
for idx, sample in enumerate(samples):
    sample.save(f'sample_{idx}.png')
controls = output_dict['controls']
for idx, control in enumerate(controls):
    control.save(f'control_{idx}.png')

plt.subplot(121)
plt.imshow(control_img)
plt.subplot(122)
sample_0 = mmcv.imread('./sample_0.png')
plt.imshow(sample_0)
plt.show()

请添加图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

更多推荐

Vue3项目中使用插槽

前言:此文章仅记录插槽的使用,用于自己后期学习查看。代码实现过程中,HelloWorld为子组件,HomeView为父组件<slot></slot>元素:是一个插槽出口,是写在子组件中的,表示了父组件提供的插槽内容将在子组件哪一个位置展示。默认插槽:HellowVorld组件内容:情况一:HomeView组件不提供插槽

百川的大模型KnowHow

卷友们好,我是rumor。大模型是一个实验工程,涉及数据清洗、底层框架、算法策略等多个工序,每个环节都有很多坑,因此知道如何避坑和技术选型非常重要,可以节省很多算力和时间,说白了就是一摞摞毛爷爷。近期百川智能发布了Baichuan2的7B和13B版本,可能不少卷友被刷屏惯了没有仔细看,他们在放出模型的同时也给了一份技术

vue.js路由如何配置,及全局前置路由守卫(做所有请求登录验证)、路由独享守卫(访问路由前身份验证)

1.编写路由配置文件router.js以及配置全局前置路由守卫和路由独享守卫//路由配置文件//作用是将指定的路由地址切换成对应的模块//eslint-disable-next-lineno-unused-varsimportRouterfrom"vue-router"//eslint-disable-next-lin

HelpLook全新升级!定制AI问答机器人,企业内容中心焕新

一直以来,企业都在努力解决内外部“企业知识管理”问题:从纸质手册发放,转线上电子文档传阅(pdf/ppt/word等),再到整理客户常见问题(FAQ)和内部知识库(wiki),但始终没有找到一套完整方案将“企业知识”很好地集中管理及分享查阅。持续困扰大家的⬇️❌要么是软件系统更新太困难、或搭建费用太昂贵❌要么是没人知道

MybatisX快速生成代码(mybatis plus模板)

文章目录1、概述2、基本使用2.1、插件安装2.2、集成数据库1、概述MybatisX是一款基于IDEA的快速开发插件,为效率而生。在开发过程中,相信大家都遇到过一个数据库内有着十几张或比之更多的数据表的情况。而面对这众多的数据表,实体类、服务类、服务实现类、Mapper接口及其对应的XML文件更是头大,这无疑是成倍增

IPV6真的神

ipv6地址短缺的现实,万物互联的未来<全局可达性>1、路由表更小。地址分配遵循聚类原则,路由表用Entry的路由表示一片子网。2、更强的组播以及流控制。为媒体服务质量QoS。控制提供了良好的网络平台。3、DHCPv6,自动配置地址。使得网(尤其是局域网)的管理更加方便和快捷。4、自带IPSec,端对端安全。在网络层的

通讯网关软件001——利用CommGate X2Access-U实现OPC UA数据转储Access

本文介绍利用CommGateX2ACCESS-U实现从OPCUAServer读取数据并同步转储至ACCESS数据库。CommGateX2ACCESS-U是宁波科安网信开发的网关软件,软件可以登录到网信智汇(http://wangxinzhihui.com)下载。【案例】如下图所示,实现从OPCUAServer实时读取数

linux vim操作汇总

汇总起来,备忘查看~目录1、复制复制一行包括换行符复制光标开始到行末的文本复制光标开始到行首的文本复制当前单词复制单行或多行到指定行后2、粘贴、剪贴3、移动4、删除删除整行删除光标所在行删除光标所在行开始的3行删除一行带复制(当前光标所在行)删除当前行开始的几行(包括当前行)删除到本行行首/行尾删除字符删除单词/符号5

探索Go语言在机器学习领域的应用局限与前景

🌷🍁博主猫头虎带您GotoNewWorld.✨🍁🦄博客首页——猫头虎的博客🎐🐳《面试题大全专栏》文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺🌊《IDEA开发秘籍专栏》学会IDEA常用操作,工作效率翻倍~💐🌊《100天精通Golang(基础入门篇)》学会Golang语言,畅玩云原生,走遍大

Pytest系列-数据驱动@pytest.mark.parametrize(7)

简介unittest和pytest参数化对比:pytest与unittest的一个重要区别就是参数化,unittest框架使用的第三方库ddt来参数化的而pytest框架:前置/后置处理函数fixture,它有个参数params专门与request结合使用来传递参数,也可以用parametrize结合request来传

【linux】paramiko介绍 + 路由器设置tc命令使用

背景:要给网络灵活的设置各种带宽限制,通过对路由器下发tc命令实现。设置python脚本的ssh链接+tc脚本下发+针对某一个id进行配置。Paramiko是一个用于在Python中进行SSH(SecureShell)协议通信的库。它提供了在远程服务器上执行命令、上传和下载文件、建立SSH连接等功能,使得开发者可以轻松

热文推荐