聊聊图像识别的小原理,动手实现自己的图像分类

图灵汇官网

开篇直入主题

虽然ChatGPT推动了人工智能的发展,但它还没有找到合适的盈利模式。这让投资者微软不得不亲自上阵,充当OpenAI的销售人员。微软甚至提着2.5升的矿泉水,背着电脑包,四处奔波,努力寻找行业的实际应用和产品落地。

人工智能在视觉领域的应用

在计算机视觉领域,人工智能已经开始赚到钱了。人们用AI生成衣服图片代替模特,也用AI生成游戏怪物取代特效师。甚至在传统的图书出版行业中,也有书籍开始使用AI生成插图。

因此,我打算探讨人工智能在视觉处理方面的原理,并通过实践,从零开始创建一个图像分类的开放能力。

实例展示

为了让大家直观感受AI在视觉处理上的能力,我将先演示一个低成本的图像分类代码。后面,我们将详细讲解原理,并逐步构建自己的系统。

```python from transformers import AutoImageProcessor, ResNetForImageClassification import torch from PIL import Image

加载预训练模型

processor = AutoImageProcessor.frompretrained("model") model = ResNetForImageClassification.frompretrained("model")

加载图片

image = Image.open("pics/dog.jpeg") inputs = processor(image, return_tensors="pt")

进行预测

with torch.nograd(): logits = model(**inputs).logits predictedlabel = logits.argmax(-1).item()

print(model.config.id2label[predicted_label]) ```

这段代码展示了如何使用transformers库加载一个预训练的图像分类模型,并对一张图片进行分类。

文件结构

以下是项目的文件结构:

|---- model # 模型权重 |---- config.json |---- preprocessor_config.json |---- pytorch_model.bin |---- pics # 测试图片 |---- dog.jpeg # 一张狗的图片 |---- main.py # 主程序

模型文件夹中包含了预训练的模型权重,可以直接使用。此外,还需安装相关依赖库,例如transformerstorch

图像分类效果展示

我测试了几种动物的图片,发现该模型不仅能区分猫、狗、老鼠和兔子,还能进一步识别出具体的品种。例如,它能识别出金毛犬和松鼠。

原理解析

图像构成

计算机视觉的核心在于理解图像的构成。我们知道红、绿、蓝(RGB)是三原色,通过不同组合可以生成各种色彩。每张图像实际上是由许多像素点组成的,每个像素点由RGB三个数值表示。

卷积神经网络原理

图像处理离不开卷积神经网络(CNN)。CNN包含卷积层、池化层和全连接层。卷积层负责提取图像的特征,池化层则通过降采样减少数据量,全连接层则进行最终分类。

具体实现

接下来,我们将通过TensorFlow搭建一个图像分类模型,用于识别天气图片。我们将使用3个类别:晴天、多云、有雨。

神经网络结构

```python import tensorflow as tf from tensorflow.keras import layers from tensorflow.keras.models import Sequential

model = Sequential([ layers.Rescaling(1./255, input_shape=(200, 200, 3)), layers.Conv2D(16, 3, padding='same', activation='relu'), layers.MaxPooling2D(), layers.Conv2D(32, 3, padding='same', activation='relu'), layers.MaxPooling2D(), layers.Conv2D(64, 3, padding='same', activation='relu'), layers.MaxPooling2D(), layers.Dropout(0.2), layers.Flatten(), layers.Dense(128, activation='relu'), layers.Dense(3) ]) ```

数据准备与训练

```python

加载训练数据

trainds = tf.keras.utils.imagedatasetfromdirectory( "datasets", imagesize=(200, 200), batchsize=24 )

配置模型

model.compile(optimizer='adam', loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True), metrics=['accuracy'])

启动训练

cpcallback = tf.keras.callbacks.ModelCheckpoint(filepath="tf2/checkpoint", saveweightsonly=True) model.fit(trainds, epochs=10, callbacks=[cp_callback]) ```

预测数据

```python

加载模型

model.load_weights("tf2/checkpoint")

加载图片

img = tf.keras.utils.loadimg("test.png", targetsize=(200, 200)) imgarray = tf.keras.utils.imgtoarray(img) imgarray = tf.expanddims(imgarray, 0)

进行预测

predictions = model.predict(img_array) score = tf.nn.softmax(predictions[0])

输出分类

print("分类 {}, 得分 {:.2f}".format(names[np.argmax(score)], 100 * np.max(score))) ```

总结

通过上述步骤,我们成功搭建了一个图像分类模型,并进行了训练和预测。如果你想深入了解更多细节,可以查看我在GitHub上的完整代码。

希望这篇文章对你有所帮助,祝你在人工智能领域取得成功!

本文来源: 图灵汇 文章作者: 老陈盘点