ChatGPT火了,我连夜详解AIGC原理,并实战生成动漫头像


一、AIGC:人工智能的新时代

AIGC(Artificial Intelligence Generated Content)可能会成为人工智能的下一个时代。尽管很多人还不知道AIGC是什么。

当还有大批人宣扬所谓人工智能、元宇宙都是概念,并且捂紧了口袋里的两百块钱的时候,人工智能行业发生了几件小事。

首先,由人工智能生成的一幅油画作品《太空歌剧院》获得了艺术博览会的冠军。

有人觉得这是什么?各种比赛多了去了,不就是获得个奖吗?

但是这一次不一样,这是一幅油画作品。在此之前,好的油画只能由人工绘制。但是现在人工智能也可以绘制了,并且还拿了个冠军。

很多人类艺术家仰天长叹:“祖师爷啊,我这一代人,在目睹艺术死亡!”

上一次艺术家们发出这样的感慨,还是在1839年,那时照相机问世了。

随后,ChatGPT横空出世。它真正做到了和人类“对答如流”。

当然,它可以处理各种类型的任务。无论是数学题、创作诗歌还是写小说,甚至代码编写和解决Bug,它都无所不能。

最近还发生了一件令人震惊的事情:ChatGPT生成的一篇论文,在班级中获得了最高分。导师惊讶地发现,学生的作业里,段落简洁、例证恰当、论据严谨,并且引用了古今中外的大量文献。教授难以置信,简直不敢相信。

学生紧张地说:“这是由AI生成的内容,我只是想应付一下作业。”

此外,美国89%的大学生都在使用ChatGPT进行作业;以色列总统也在周三发表演讲时,内容也是人工智能生成的。

现在全球都开始讨论这类人工智能技术所带来的影响。它看似带来了巨大的商业价值,实则可能会给人类带来严重的打击。

这项技术就是AIGC(AI-Generated Content),翻译成中文就是:人工智能生成内容。

二、AIGC实战:智能生成动漫头像

确实,在几年前的双十一购物节上,上万商家的广告图都是由人工智能生成的。如今这三个条件——数据、算法和硬件——都达到了要求,这使得AIGC得以大放异彩,成为全民可用的技术。

接下来,我将通过TensorFlow框架,详细讲解从原理到实现的全过程,并提供一个完整的项目源码。

2.1 自动生成的意义

有人问:自动生成内容有什么好处?答案是显而易见的,节省时间和体力。而且,如果成本可控,还能降低生产费用。

以游戏中的海洋怪物为例,下图就是人工智能生成的结果:

AIGC不仅能够提高效率,还能减少人力和资源的浪费。同时,它还有助于提升作品的质量,让创作者有更多时间专注于创意本身。

首先,我们要明确游戏名称为《无人深空》(No Man's Sky),这是一款拥有1840亿颗不同星球的大型模拟器。

在这个游戏中,玩家可以发现形态各异的怪物,在每个星球上探索未知的世界。虽然这款游戏听起来很吸引人,但其视觉效果和内容确实令人惊叹,尤其是那些充满神秘与奇幻色彩的怪物。

然而,对于一些更实际的需求,比如制作人造怪物或者大规模的团队协作,这样的需求会大大增加成本和时间投入。在这种情况下,使用人工智能生成怪物将会成为更加经济高效的选择。

在《无人深空》中,我们尝试使用AI技术来生成动漫头像,这是一个类似的过程。虽然这个过程没有那么炫酷,甚至显得原始一些,但它遵循相同的原理——利用人工智能技术自动完成任务,从而达到同样的视觉效果。

总的来说,《无人深空》是一个非常吸引人的游戏,但面对大规模制作和复杂任务时,使用AI可能是一个更为经济且高效的选择。

**2.2 自动生成的原理**

人工智能生成内容(AI-generated content,简称 AIGC)的核心机制可以用中国古代的一个成语来概括:“读书破万卷,下笔如有神。”这是一种形象且富有诗意的说法。

以生成猫咪照片为例,AIGC 的套路通常如下:

1. **收集数据**:首先,需要大量已有的高质量图像和文本作为训练的基础。这些数据可以来源于各种图片数据库、公开的图像库以及可能的用户反馈等。

2. **特征提取**:接下来,通过对这些图像进行分析和处理,提取出包含猫咪特征的关键点或区域。这一步骤通常是基于深度学习技术(如卷积神经网络),通过训练模型从大量图像中学习到猫咪的特征。

3. **生成新内容**:利用提取出的特征作为输入,训练一个生成器来创造出新的、类似猫咪的图像。这个过程涉及到编码和解码机制,其中编码器将输入特征转化为可以被解码的目标特征表示,而解码器则负责从这些特征中恢复原始的图像。

4. **调整与优化**:在生成的过程中,可能需要不断进行模型训练和参数调整,以提高生成效果。这一步通常涉及使用一些损失函数来评估生成图像的质量,并通过反向传播算法对网络权重进行调整。

5. **输出结果**:最后,生成器会输出一系列接近目标特征的图像,这些图像在视觉上看起来像是真实的猫咪,但并不完全是。这个阶段的结果可能需要人工进一步修改和校正,以确保最终生成的内容符合预期的效果。

总之,AIGC 的原理基于数据积累、特征提取、模型训练以及结果调整等环节的组合,通过人工智能技术不断改进生成质量,从而实现从大量已有的图像中创造新的内容。

首先,程序会设计两个角色:一个叫生成器(艺术家),另一个叫鉴别器(评论家)。

为了便于理解,我们称呼生成器为艺术家,称鉴别器为评论家。

艺术家负责生产内容,也就是创作画猫这样的艺术作品。但不要以为拥有艺术家头衔就很了不起,他可能并不擅长绘画,甚至画得不好也是常有的事。但是,即使他的技艺不高明,他也必须尽力而为,因为这是自己的工作。

评论家呢,相比艺术家就负责一些任务了。首先,他需要研究大量的猫的照片。这些照片中包含了猫的各种特征:两个眼睛、斑纹和胡须等。通过研究这些图像,评论家对猫的特性有了全面的认识。

现在,有趣的环节来了:

当艺术家创作完一幅作品后,他会将这幅画交给评论家。但是,艺术欣赏不仅仅是一种视觉享受,还需要一定的理解和评价能力。评论家需要仔细观察这张画,并给出反馈和建议。

在评论过程中,如果艺术家的作品缺乏某些关键元素,比如轮廓,那么评论家可能会立即提出质疑并给出改进的建议。例如:“连轮廓都没有”。

总之,生成器(艺术家)负责创作,而鉴别器(评论家)则负责评估和提供反馈,两者共同协作以确保艺术作品的质量和美感。

艺术家对评论家提出的要求有些困惑,他想要一个轮廓来开始绘画。在双方讨论后,评论家提出了更详细的建议:先画一个轮廓,随后再提交完整的作品。

然而,评论家并没有直接接受这个要求,并且最终否决了这一提议。不过,他还是给出了其他意见,比如强调没有胡须的重要性。

两人经过了成千上万次的友好磋商,尽管评论家是机器,但他仍然承受着巨大的压力和挑战。艺术家在不断尝试的过程中,逐渐变得更加熟练。

到了最后阶段,当艺术家再次提交画作时,评论家的态度发生了变化。他非常认真地仔细检查,并对比了之前的照片来确认是否真的造假。

最终,评论家坦白自己无法找出任何问题,甚至开始怀疑自己是不是搞错了。此时,他提出:“好吧,我确实没有发现问题,你这次是真的。”

就这样,这个“造假者”和“验真者”的故事结束了。

接下来,我们讨论GAN(生成对抗网络)。这是一种基于神经网络的机器学习方法。它由两个相互竞争的模型组成:一个是生成器,用于产生逼真的图像;另一个是鉴别器,用于辨别真假图片。

当鉴别器无法区分真实图片和伪造图片时,训练过程就会达到平衡。这意味着生成器的能力与鉴别器的能力达到了一个理想的状态。

总的来说,“GAN”这个名字听起来确实有点“损”,但它是一种非常有效的机器学习方法,可以帮助我们提高图像质量并实现更复杂的生成任务。

这些数据来源于公开数据集Anime-Face-Dataset。数据文件不大,大约为274MB。你很容易就能下载下来。

在这段数据集中,包含60,000多张图片。我用我的电脑进行了训练。经过了200分钟的计算,一个epoch(将这些数据处理一遍)还未结束。这意味着……稍微有效果得需要半个月的时间才能完成。

由于AI小作坊的规模限制,无法进行大型任务,所以我只用了20,000张图片,并将其尺寸缩小到56×56像素,同时转换为黑白图像。这样做的结果是提高了训练效率,只要2分钟就可以完成一圈的训练。

下面是处理这些图片的代码:

```python

import cv2

# 存放源图片的文件夹路径

dir_path = "anime"

all_files = os.listdir(dir_path)

for j, res_f_name in enumerate(all_files):

res_f_path = dir_path + "/" + res_f_name

# 读入单通道图像

img1 = cv2.imread(res_f_path, 0)

# 重新定义尺寸为56×56像素,并进行降采样操作以减少计算量

img2 = cv2.resize(img1, (56,56), interpolation=cv2.INTER_NEAREST)

# 转存到face文件夹下

cv2.imwrite("face/" + res_f_name, img2)

# 如果处理的图片数量超过20000张,则退出循环

if j > 20000:

break

```

经过上述处理后,这些图片的辨识度似乎仍然可以接受。

下一步需要将TensorFlow格式化的数据集转换为PIL图像文件。

首先,我们将图片文件转为数组:

```python

from PIL import Image

import pathlib

import numpy as np

# 将图片文件转为数组

dir_path = "face"

data_dir = pathlib.Path(dir_path)

imgs = list(data_dir.glob('*.jpg'))

img_arr = []

for img in imgs:

img = Image.open(str(img))

img_arr.append(np.array(img))

train_images = np.array(img_arr)

# 将数据形状从(20000, 56, 56)升至(20000, 56, 56, 1)

nums = train_images.shape[0]

train_images = train_images.reshape(nums, 56, 56, 1).astype('float32')

```

之后,对数据进行归一化处理:

```python

# 归一化

train_images = (train_images - 127.5) / 127.5

# 转为tensor格式

train_dataset = tf.data.Dataset.from_tensor_slices(train_images).shuffle(nums).batch(256)

```

最后,将数据转换为TensorFlow Dataset。

首先,我们建立一个生成器模型。它用于生成动漫头像的图像。

```python

def make_generator_model():

model = tf.keras.Sequential()

model.add(layers.Dense(7*7*256, use_bias=False, input_shape=(160,)))

model.add(layers.BatchNormalization())

model.add(layers.LeakyReLU())

# 层次处理,最终输出为56x56的图像

model.add(layers.Reshape((7, 7, 256)))

assert model.output_shape == (None, 7, 7, 256)

model.add(layers.Conv2DTranspose(128, (5, 5), strides=(1, 1), padding='same', use_bias=False))

assert model.output_shape == (None, 7, 7, 128)

model.add(layers.BatchNormalization())

model.add(layers.LeakyReLU())

# 反向处理,最终输出为像素值

for i in range(6):

model.add(layers.Conv2DTranspose(128, (5, 5), strides=(2, 2), padding='same', use_bias=False))

assert model.output_shape == (None, 7 * 2**(i + 1) - 2, 7 * 2**(i + 1) - 2, 128)

model.add(layers.BatchNormalization())

model.add(layers.LeakyReLU())

model.add(layers.Conv2DTranspose(3, (5, 5), strides=(2, 2), padding='same', use_bias=False))

assert model.output_shape == (None, 56 * 4 - 1, 56 * 4 - 1, 3)

model.add(layers.BatchNormalization())

model.add(layers.LeakyReLU())

# 输出层,使用tanh激活函数

model.add(layers.Conv2DTranspose(1, (5, 5), strides=(2, 2), padding='same', use_bias=False, activation='tanh'))

assert model.output_shape == (None, 56 * 4 - 3, 56 * 4 - 3, 1)

return model

```

生成器模型结构如下:

1. 输入层:大小为160的一维噪声数据。

2. 每层处理:通过Conv2DTranspose实现上采样,一层传递一层,最终输出56x56的图像。

3. 输出层:使用tanh激活函数,输出56×56组数据,这将会是我们要的像素点。

如果生成一下试试:

```python

generator = make_generator_model()

noise = tf.random.normal([1, 160])

generated_image = generator(noise, training=False)

```

首先,我们需要生成器来产生图片。这个生成器会随机生成像素噪点,其尺寸为56×56。

接下来我们建立鉴别器模型,用于判断动漫头像是否真实。

然后我们将训练鉴别器。训练过程中,我们会不断调整参数以提高鉴别能力,并通过与生成器的交互来增强造假能力。

经过500轮训练后,我们可以看到生成器和鉴别器是如何相互作用的。最终,AIGC将成功实现防伪功能。

从动态图到静态图的转换过程中,整体趋势是在提升画面清晰度。生成的代码非常简洁明了。

为了更直观地展示这一过程,我提供了一个生成的图片作为参考:

![](https://example.com/image.png)

生成该图片时,采用的是人工智能技术。整个生成流程如下:

1. 加载训练模型

2. 从随机噪声中生成测试输入图像

3. 将生成器进行批量处理生成结果

4. 选取其中一张结果作为输出

5. 将像素色值数据还原成图像

为了更好地展示这个过程,这里提供了一个静态图来帮助理解。

### 一、500轮训练的效果

这是200,000张图像,经过500轮训练后的效果。如果图像数量翻倍至百万张,持续数千轮训练的话,AIGC(人工智能生成内容)的仿真过程将变得无比简单。

项目开源地址:gitee.com/bigcool/gan…

### 三、对AIGC应有的态度

近年来,人工智能生成内容(AIGC)的话题引起了全球范围内的激烈讨论。一些地方甚至正在考虑立法禁止学生使用AI工具完成作业。虽然我已多次强调,但仍然有一些人对此持有异议:我的工作如此高深复杂,是有灵魂的工作吗?它能像人类一样流畅写作、编写代码?它懂逻辑吗?

国外有一位IT老先生叫David Gewirtz,从1982年开始就从事编程工作,并在苹果公司任职。他一直认为使用ChatGPT写代码不会有什么惊喜。直到第一次接触AI生成的内容时,他的反应让他大吃一惊。

### 二、AIGC的火爆出圈与立法讨论

#### 炫酷的话题

近年来,随着人工智能技术的发展,AIGC(人工智能生成内容)吸引了大量关注和讨论。一些国家甚至正在考虑立法禁止学生使用AI工具完成作业,以避免其对学生学习的影响。

尽管我多次强调这些观点,但依然有部分人对AIGC持有异议:我的工作如此高深复杂,是有灵魂的工作吗?它能像人类一样流畅写作、编写代码?它懂逻辑吗?

#### 奇怪的反应

国外一位IT老先生叫David Gewirtz。他从1982年开始就从事编程工作,并在苹果公司任职多年。他一直认为使用ChatGPT写代码不会有什么惊喜。直到第一次接触AI生成的内容时,他的反应让他大吃一惊。

#### AIGC的火爆

AIGC的火爆出圈引发了全球范围内的激烈讨论。一些地方甚至正在考虑立法禁止学生使用AI工具完成作业。虽然我多次强调这些观点,但依然有部分人对AIGC持有异议:我的工作如此高深复杂,是有灵魂的工作吗?它能像人类一样流畅写作、编写代码?它懂逻辑吗?

#### 热议和争议

国外有一位IT老先生叫David Gewirtz。他从1982年开始就从事编程工作,并在苹果公司任职多年。他一直认为使用ChatGPT写代码不会有什么惊喜。直到第一次接触AI生成的内容时,他的反应让他大吃一惊。

#### 对AIGC的争议

虽然我多次强调这些观点,但依然有一些人对AIGC持有异议:我的工作如此高深复杂,是有灵魂的工作吗?它能像人类一样流畅写作、编写代码?它懂逻辑吗?

### 四、我们对AI的态度

尽管我对AIGC持保留态度,但我仍认为我们应该以开放的心态对待这一新兴技术。虽然AI生成的内容可能无法完全替代人工创作,但它可以为我们的工作提供新的灵感和工具。通过合理使用和监管,我们可以充分利用AIGC的优势,从而推动人工智能的发展。

### 五、结语

虽然我对AIGC持保留态度,但我仍认为我们应该以开放的心态对待这一新兴技术。虽然AI生成的内容可能无法完全替代人工创作,但它可以为我们的工作提供新的灵感和工具。通过合理使用和监管,我们可以充分利用AIGC的优势,从而推动人工智能的发展。

ChatGPT迅速完成了给顾客网站插件的需求,并且代码简洁规范。虽然它的工作效率高,但它的思维并不独立。

现阶段的人工智能依靠的是大量的数据和计算能力,而你写作的能力得益于丰富的阅读经验和对内容的记忆力。尽管人工智能能记住并分析大量信息,但它没有自己的思考和判断能力。

在面对人类的担忧时,ChatGPT也给出了自己的回答。

我对它观点的赞同程度较高。

然而,持其他看法的人则主要担忧人工智能的普及会让人类变得不再动脑筋。如果时间久了,这种变化会变得很严重。这是他们担心的原因之一。

我对此的看法是:这些都是工具,如同相机问世时,被画家所抵制,因为当时相机拍出的照片过于简单了。现在看,拍照技术复杂化问题吗?没有!同样,计算器在数字时代取代算盘,打字机也取代手写,这都反映了工具的演进。

甚至TensorFlow 2.0的出现,也被1.0版本用户抵制。他们担心开发太简单,以至于开发者无法接触到底层。而我则认为这种担忧是多余的。因为每个时代都会有属于这个时代的产品,就像我们不会用毛笔写字,但古人也没有敲过键盘一样。或许下一个时代的人,连敲键盘也无需了。

作为掘金@TF男孩的编程表演艺术家,我认为人工智能的发展会推动新的工具和技术出现,帮助人们更高效地解决问题。