Maison  >  Article  >  développement back-end  >  Comment utiliser la technologie de segmentation sémantique d'images en Python ?

Comment utiliser la technologie de segmentation sémantique d'images en Python ?

PHPz
PHPzoriginal
2023-06-06 08:03:141461parcourir

Avec le développement continu de la technologie de l'intelligence artificielle, la technologie de segmentation sémantique des images est devenue une direction de recherche populaire dans le domaine de l'analyse d'images. Dans la segmentation sémantique d'image, nous segmentons différentes zones d'une image et classons chaque zone pour obtenir une compréhension globale de l'image.

Python est un langage de programmation bien connu. Ses puissantes capacités d'analyse et de visualisation de données en font le premier choix dans le domaine de la recherche sur les technologies d'intelligence artificielle. Cet article expliquera comment utiliser la technologie de segmentation sémantique d'images en Python.

1. Connaissances préalables

Avant d'apprendre à utiliser la technologie de segmentation sémantique d'images en Python, vous devez avoir des connaissances sur l'apprentissage profond et le réseau neuronal convolutif (Convolutional Neural Network) . Network, CNN) et les bases du traitement d'images. Si vous êtes un développeur Python expérimenté mais que vous n'avez aucune expérience en matière d'apprentissage profond et de modèles CNN, il est recommandé d'acquérir d'abord certaines connaissances pertinentes.

2. Préparation

Afin d'utiliser la technologie de segmentation sémantique d'images, nous avons besoin de modèles pré-entraînés. Il existe de nombreux frameworks d'apprentissage profond populaires, tels que Keras, PyTorch et TensorFlow, qui fournissent des modèles pré-entraînés que les développeurs peuvent utiliser.

Dans cet article, nous utiliserons le framework TensorFlow et son modèle global de segmentation sémantique d'images - DeepLab-v3+, ainsi qu'une bibliothèque Python pouvant être utilisée pour traiter des images - la bibliothèque Pillow.

Nous pouvons installer les bibliothèques que nous devons utiliser via la commande suivante :

pip install tensorflow==2.4.0
pip install Pillow

3. Utilisez le réseau DeepLab-v3+ pour la segmentation sémantique des images

DeepLab-v3+ est un modèle de réseau neuronal à convolution profonde efficace pour la segmentation sémantique d'images. Il dispose d'une série de technologies avancées, notamment la convolution dilatée (Dilated Convolution), l'agrégation de données multi-échelles et le champ aléatoire conditionnel (Conditional Random Field, CRF), etc.

La bibliothèque Pillow fournit des outils pratiques pour traiter et lire les fichiers image. Ensuite, nous utiliserons la classe Image de la bibliothèque Pillow pour lire un fichier image. Le code ressemble à ceci :

from PIL import Image
im = Image.open('example.jpg')

Ici, nous pouvons remplacer example.jpg par notre propre nom de fichier image.

En utilisant le modèle DeepLab-v3+ et l'image que nous lisons, nous pouvons obtenir un résultat détaillé de segmentation sémantique d'image. Afin d'utiliser le modèle DeepLab-v3+ pré-entraîné, nous devons télécharger le fichier de poids du modèle. Il peut être trouvé sur la page officielle du modèle TensorFlow.

# 导入预训练的 DeepLab-v3+ 模型
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Input
from tensorflow.keras.applications import MobileNetV2
from tensorflow.keras.layers import Conv2DTranspose, Concatenate, Activation, MaxPooling2D, Conv2D, BatchNormalization, Dropout 

def create_model(num_classes):
    # 加载 MobileNetV2 预训练模型
    base_model = MobileNetV2(input_shape=(256, 256, 3), include_top=False, weights='imagenet')

    # 获取对应层输出的张量
    low_level_features = base_model.get_layer('block_1_expand_relu').output
    x = base_model.get_layer('out_relu').output

    # 通过使用反卷积尺寸进行上采样和空洞卷积,构建 DeepLab-v3+ 系统,并针对特定的数据集来训练其分类器
    x = Conv2D(256, (1, 1), activation='relu', padding='same', name='concat_projection')(x)
    x = Dropout(0.3)(x)
    x = Conv2DTranspose(128, (3, 3), strides=(2, 2), padding='same', name='decoder_conv0')(x)
    x = BatchNormalization(name='decoder_bn0')(x)
    x = Activation('relu', name='decoder_relu0')(x)
    x = Concatenate(name='decoder_concat0')([x, low_level_features])
    x = Conv2D(128, (1, 1), padding='same', name='decoder_conv1')(x)
    x = Dropout(0.3)(x)
    x = Conv2DTranspose(64, (3, 3), strides=(2, 2), padding='same', name='decoder_conv2')(x)
    x = BatchNormalization(name='decoder_bn2')(x)
    x = Activation('relu', name='decoder_relu2')(x)
    x = Conv2D(num_classes, (1, 1), padding='same', name='decoder_conv3')(x)
    x = Activation('softmax', name='softmax')(x)

    # 创建 Keras 模型,并返回它
    model = Model(inputs=base_model.input, outputs=x)

    return model

Maintenant que nous avons chargé le modèle avec succès, nous pouvons lancer la segmentation sémantique de l'image. Le code est le suivant :

import numpy as np
import urllib.request

# 读取图像
urllib.request.urlretrieve('https://www.tensorflow.org/images/surf.jpg', 'image.jpg')
image = Image.open('image.jpg')
image_array = np.array(image)

# 加载训练好的模型
model = create_model(num_classes=21)
model.load_weights('deeplabv3_xception_tf_dim_ordering_tf_kernels.h5')
print('模型加载成功。')

# 将输入图像调整为模型所需形状,并进行语义分割
input_tensor = tf.convert_to_tensor(np.expand_dims(image_array, 0))
output_tensor = model(input_tensor)

# 显示语义分割结果
import matplotlib.pyplot as plt

parsed_results = output_tensor.numpy().squeeze()
parsed_results = np.argmax(parsed_results, axis=2)
plt.imshow(parsed_results)
plt.show()

Après avoir exécuté ce code, vous obtiendrez une sortie de réseau neuronal avec une distribution de couleurs similaire à celle montrée dans l'exemple.

4. Résumé

Dans cet article, nous avons présenté comment utiliser la technologie de segmentation sémantique d'image en Python et chargé avec succès le modèle DeepLab-v3+ pré-entraîné. Bien entendu, l’exemple utilisé ici n’est qu’une méthode parmi d’autres, et différentes directions de recherche nécessitent différentes méthodes de traitement. Si vous êtes intéressé, explorez ce domaine et utilisez ces techniques dans vos propres projets.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn