Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk menggunakan teknologi segmentasi semantik imej dalam Python?

Bagaimana untuk menggunakan teknologi segmentasi semantik imej dalam Python?

PHPz
PHPzasal
2023-06-06 08:03:141411semak imbas

Dengan pembangunan berterusan teknologi kecerdasan buatan, teknologi segmentasi semantik imej telah menjadi hala tuju penyelidikan yang popular dalam bidang analisis imej. Dalam segmentasi semantik imej, kami membahagikan kawasan yang berbeza dalam imej dan mengelaskan setiap kawasan untuk mencapai pemahaman yang menyeluruh tentang imej.

Python ialah bahasa pengaturcaraan yang terkenal dengan keupayaan analisis data dan visualisasi data yang berkuasa menjadikannya pilihan pertama dalam bidang penyelidikan teknologi kecerdasan buatan. Artikel ini akan memperkenalkan cara menggunakan teknologi segmentasi semantik imej dalam Python.

1. Pengetahuan prasyarat

Sebelum mempelajari cara menggunakan teknologi segmentasi semantik imej dalam Python, anda perlu terlebih dahulu mempunyai pengetahuan tentang pembelajaran mendalam dan rangkaian saraf konvolusi (CNN) dan pengetahuan asas imej pemprosesan. Jika anda seorang pembangun Python yang berpengalaman tetapi tidak mempunyai pengalaman dengan pembelajaran mendalam dan model CNN, adalah disyorkan agar anda mempelajari beberapa pengetahuan berkaitan terlebih dahulu.

2. Persediaan

Untuk menggunakan teknologi segmentasi semantik imej, kami memerlukan beberapa model yang telah dilatih. Terdapat banyak rangka kerja pembelajaran mendalam yang popular, seperti Keras, PyTorch dan TensorFlow, yang menyediakan model pra-latihan untuk digunakan oleh pembangun.

Dalam artikel ini, kami akan menggunakan rangka kerja TensorFlow dan model segmentasi semantik imej globalnya - DeepLab-v3+, dan perpustakaan Python yang boleh digunakan untuk memproses imej - perpustakaan Bantal.

Kita boleh memasang perpustakaan yang perlu kita gunakan melalui arahan berikut:

pip install tensorflow==2.4.0
pip install Pillow

3 Gunakan rangkaian DeepLab-v3+ untuk segmentasi semantik imej

DeepLab-v3+ adalah cekap. Model rangkaian neural convolutional mendalam untuk segmentasi semantik imej. Ia mempunyai satu siri teknologi termaju, termasuk konvolusi diluaskan (Dilated Convolution), pengagregatan data berbilang skala dan medan rawak bersyarat (Medan Rawak Bersyarat, CRF), dsb.

Pustaka Bantal menyediakan beberapa alatan yang mudah untuk memproses dan membaca fail imej. Seterusnya, kami akan menggunakan kelas Imej daripada perpustakaan Bantal untuk membaca fail imej. Kodnya kelihatan seperti ini:

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

Di sini kita boleh menggantikan example.jpg dengan nama fail imej kita sendiri.

Dengan menggunakan model DeepLab-v3+ dan imej yang kita baca, kita boleh mendapatkan hasil pembahagian semantik imej yang terperinci. Untuk menggunakan model DeepLab-v3+ yang telah dilatih, kami perlu memuat turun fail berat model. Ia boleh didapati di halaman model TensorFlow rasmi.

# 导入预训练的 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

Sekarang kami telah berjaya memuatkan model, kami boleh memulakan pembahagian semantik imej. Kodnya adalah seperti berikut:

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()

Selepas menjalankan kod ini, anda akan mendapat output rangkaian saraf dengan pengedaran warna yang serupa dengan contoh yang ditunjukkan.

4. Ringkasan

Dalam artikel ini, kami memperkenalkan cara menggunakan teknologi pembahagian semantik imej dalam Python dan berjaya memuatkan model DeepLab-v3+ yang telah dilatih. Sudah tentu, contoh yang digunakan di sini hanyalah salah satu kaedah, dan arah penyelidikan yang berbeza memerlukan kaedah pemprosesan yang berbeza. Jika anda berminat, mendalami bidang ini dan gunakan teknik ini dalam projek anda sendiri.

Atas ialah kandungan terperinci Bagaimana untuk menggunakan teknologi segmentasi semantik imej dalam Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn