ترجمت واجهة Cloud Translation API‏ هذه الصفحة.
Switch to English

تحميل الصور

عرض على TensorFlow.org تشغيل في Google Colab عرض المصدر على جيثب تحميل دفتر

يوضح هذا البرنامج التعليمي كيفية تحميل مجموعة بيانات الصورة ومعالجتها مسبقًا بثلاث طرق. أولاً ، ستستخدم أدوات وطبقات Keras عالية المستوى للمعالجة المسبقة لقراءة دليل للصور على القرص. بعد ذلك ، ستكتب خط أنابيب الإدخال الخاص بك من البداية باستخدام tf.data . أخيرًا ، ستقوم بتنزيل مجموعة بيانات من الكتالوج الكبير المتاح في مجموعات بيانات TensorFlow .

اقامة

import numpy as np
import os
import PIL
import PIL.Image
import tensorflow as tf
import tensorflow_datasets as tfds
print(tf.__version__)
2.3.0

قم بتنزيل مجموعة بيانات الزهور

يستخدم هذا البرنامج التعليمي مجموعة بيانات من عدة آلاف من صور الزهور. تحتوي مجموعة بيانات الزهور على 5 أدلة فرعية ، واحد لكل فئة:

flowers_photos/
  daisy/
  dandelion/
  roses/
  sunflowers/
  tulips/
import pathlib
dataset_url = "https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz"
data_dir = tf.keras.utils.get_file(origin=dataset_url, 
                                   fname='flower_photos', 
                                   untar=True)
data_dir = pathlib.Path(data_dir)
Downloading data from https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz
228818944/228813984 [==============================] - 1s 0us/step

بعد تنزيل (218 ميجابايت) ، يجب أن يكون لديك الآن نسخة من صور الزهور المتاحة. هناك 3670 صورة إجمالية:

image_count = len(list(data_dir.glob('*/*.jpg')))
print(image_count)
3670

يحتوي كل دليل على صور لهذا النوع من الزهور. إليك بعض الورود:

roses = list(data_dir.glob('roses/*'))
PIL.Image.open(str(roses[0]))

بي إن جي

roses = list(data_dir.glob('roses/*'))
PIL.Image.open(str(roses[1]))

بي إن جي

تحميل باستخدام keras.preprocessing

لنقم بتحميل هذه الصور من القرص باستخدام image_dataset_from_directory .

أنشئ مجموعة بيانات

حدد بعض المعلمات للمحمل:

batch_size = 32
img_height = 180
img_width = 180

من الممارسات الجيدة استخدام تقسيم التحقق عند تطوير نموذجك. سنستخدم 80٪ من الصور للتدريب و 20٪ للتحقق.

train_ds = tf.keras.preprocessing.image_dataset_from_directory(
  data_dir,
  validation_split=0.2,
  subset="training",
  seed=123,
  image_size=(img_height, img_width),
  batch_size=batch_size)
Found 3670 files belonging to 5 classes.
Using 2936 files for training.

val_ds = tf.keras.preprocessing.image_dataset_from_directory(
  data_dir,
  validation_split=0.2,
  subset="validation",
  seed=123,
  image_size=(img_height, img_width),
  batch_size=batch_size)
Found 3670 files belonging to 5 classes.
Using 734 files for validation.

يمكنك العثور على أسماء class_names السمة class_names في مجموعات البيانات هذه.

class_names = train_ds.class_names
print(class_names)
['daisy', 'dandelion', 'roses', 'sunflowers', 'tulips']

تصور البيانات

إليك أول 9 صور من مجموعة بيانات التدريب.

import matplotlib.pyplot as plt

plt.figure(figsize=(10, 10))
for images, labels in train_ds.take(1):
  for i in range(9):
    ax = plt.subplot(3, 3, i + 1)
    plt.imshow(images[i].numpy().astype("uint8"))
    plt.title(class_names[labels[i]])
    plt.axis("off")

بي إن جي

يمكنك تدريب نموذج باستخدام مجموعات البيانات هذه عن طريق تمريرها إلى model.fit (يظهر لاحقًا في هذا البرنامج التعليمي). إذا أردت ، يمكنك أيضًا التكرار يدويًا عبر مجموعة البيانات واسترداد مجموعات الصور:

for image_batch, labels_batch in train_ds:
  print(image_batch.shape)
  print(labels_batch.shape)
  break
(32, 180, 180, 3)
(32,)

image_batch هو موتر للشكل (32, 180, 180, 3) . هذه دفعة من 32 صورة للشكل 180x180x3 (يشير البعد الأخير إلى قنوات الألوان RGB). label_batch هي موتر للشكل (32,) ، هذه تسميات مطابقة للصور الـ 32.

توحيد البيانات

قيم قناة RGB موجودة في النطاق [0, 255] . هذا ليس مثاليًا للشبكة العصبية ؛ بشكل عام يجب أن تسعى إلى جعل قيم المدخلات الخاصة بك صغيرة. هنا ، سنقوم بتوحيد القيم لتكون في [0, 1] باستخدام طبقة إعادة القياس.

from tensorflow.keras import layers

normalization_layer = tf.keras.layers.experimental.preprocessing.Rescaling(1./255)

هناك طريقتان لاستخدام هذه الطبقة. يمكنك تطبيقه على مجموعة البيانات عن طريق استدعاء الخريطة:

normalized_ds = train_ds.map(lambda x, y: (normalization_layer(x), y))
image_batch, labels_batch = next(iter(normalized_ds))
first_image = image_batch[0]
# Notice the pixels values are now in `[0,1]`.
print(np.min(first_image), np.max(first_image)) 
0.0 0.96902645

أو يمكنك تضمين الطبقة داخل تعريف النموذج لتبسيط عملية النشر. سوف نستخدم الطريقة الثانية هنا.

تكوين مجموعة البيانات للأداء

دعنا نتأكد من استخدام الجلب المسبق المخزن حتى نتمكن من إنتاج البيانات من القرص دون أن يصبح الإدخال / الإخراج محظورًا. هاتان طريقتان مهمتان يجب عليك استخدامهما عند تحميل البيانات.

.cache() يحتفظ بالصور في الذاكرة بعد تحميلها خارج القرص خلال المرحلة الأولى. سيضمن ذلك عدم تحول مجموعة البيانات إلى عنق زجاجة أثناء تدريب نموذجك. إذا كانت مجموعة البيانات الخاصة بك كبيرة جدًا بحيث لا تتناسب مع الذاكرة ، فيمكنك أيضًا استخدام هذه الطريقة لإنشاء ذاكرة تخزين مؤقت على القرص.

.prefetch() يتداخل مع المعالجة المسبقة للبيانات وتنفيذ النموذج أثناء التدريب.

يمكن للقراء المهتمين معرفة المزيد حول كلتا الطريقتين ، بالإضافة إلى كيفية تخزين البيانات مؤقتًا على القرص في دليل أداء البيانات .

AUTOTUNE = tf.data.experimental.AUTOTUNE

train_ds = train_ds.cache().prefetch(buffer_size=AUTOTUNE)
val_ds = val_ds.cache().prefetch(buffer_size=AUTOTUNE)

تدريب نموذج

من أجل الاكتمال ، سوف نوضح كيفية تدريب نموذج بسيط باستخدام مجموعات البيانات التي أعددناها للتو. لم يتم ضبط هذا النموذج بأي شكل من الأشكال - والهدف هو إظهار الآليات باستخدام مجموعات البيانات التي أنشأتها للتو. لمعرفة المزيد حول تصنيف الصور ، قم بزيارة هذا البرنامج التعليمي .

num_classes = 5

model = tf.keras.Sequential([
  layers.experimental.preprocessing.Rescaling(1./255),
  layers.Conv2D(32, 3, activation='relu'),
  layers.MaxPooling2D(),
  layers.Conv2D(32, 3, activation='relu'),
  layers.MaxPooling2D(),
  layers.Conv2D(32, 3, activation='relu'),
  layers.MaxPooling2D(),
  layers.Flatten(),
  layers.Dense(128, activation='relu'),
  layers.Dense(num_classes)
])
model.compile(
  optimizer='adam',
  loss=tf.losses.SparseCategoricalCrossentropy(from_logits=True),
  metrics=['accuracy'])
model.fit(
  train_ds,
  validation_data=val_ds,
  epochs=3
)
Epoch 1/3
92/92 [==============================] - 6s 67ms/step - loss: 1.3187 - accuracy: 0.4401 - val_loss: 1.1184 - val_accuracy: 0.5681
Epoch 2/3
92/92 [==============================] - 1s 10ms/step - loss: 1.0639 - accuracy: 0.5838 - val_loss: 1.0369 - val_accuracy: 0.5926
Epoch 3/3
92/92 [==============================] - 1s 10ms/step - loss: 0.9236 - accuracy: 0.6458 - val_loss: 0.9955 - val_accuracy: 0.5995

<tensorflow.python.keras.callbacks.History at 0x7f1f5d110ba8>

قد تلاحظ أن دقة التحقق من الصحة منخفضة مقارنة بدقة التدريب ، مما يشير إلى أن نموذجنا مناسب. يمكنك معرفة المزيد حول التجهيز الزائد وكيفية تقليله في هذا البرنامج التعليمي .

استخدام tf.data للتحكم الدقيق

تعد الأدوات المساعدة keras.preprocessing المذكورة أعلاه طريقة ملائمة لإنشاء tf.data.Dataset من دليل للصور. للتحكم tf.data الحبوب ، يمكنك كتابة خط أنابيب الإدخال الخاص بك باستخدام tf.data . يوضح هذا القسم كيفية القيام بذلك ، بدءًا من مسارات الملفات من ملف zip الذي قمنا بتنزيله مسبقًا.

list_ds = tf.data.Dataset.list_files(str(data_dir/'*/*'), shuffle=False)
list_ds = list_ds.shuffle(image_count, reshuffle_each_iteration=False)
for f in list_ds.take(5):
  print(f.numpy())
b'/home/kbuilder/.keras/datasets/flower_photos/dandelion/3530500952_9f94fb8b9c_m.jpg'
b'/home/kbuilder/.keras/datasets/flower_photos/sunflowers/16656015339_2ccb7cd18d.jpg'
b'/home/kbuilder/.keras/datasets/flower_photos/sunflowers/8480886751_71d88bfdc0_n.jpg'
b'/home/kbuilder/.keras/datasets/flower_photos/dandelion/14021281124_89cc388eac_n.jpg'
b'/home/kbuilder/.keras/datasets/flower_photos/daisy/2632216904_274aa17433.jpg'

يمكن استخدام هيكل الشجرة للملفات لتجميع قائمة class_names .

class_names = np.array(sorted([item.name for item in data_dir.glob('*') if item.name != "LICENSE.txt"]))
print(class_names)
['daisy' 'dandelion' 'roses' 'sunflowers' 'tulips']

قسّم مجموعة البيانات إلى تدريب وتحقق:

val_size = int(image_count * 0.2)
train_ds = list_ds.skip(val_size)
val_ds = list_ds.take(val_size)

يمكنك رؤية طول كل مجموعة بيانات على النحو التالي:

print(tf.data.experimental.cardinality(train_ds).numpy())
print(tf.data.experimental.cardinality(val_ds).numpy())
2936
734

اكتب دالة قصيرة تحول مسار ملف إلى زوج (img, label) :

def get_label(file_path):
  # convert the path to a list of path components
  parts = tf.strings.split(file_path, os.path.sep)
  # The second to last is the class-directory
  one_hot = parts[-2] == class_names
  # Integer encode the label
  return tf.argmax(one_hot)
def decode_img(img):
  # convert the compressed string to a 3D uint8 tensor
  img = tf.image.decode_jpeg(img, channels=3)
  # resize the image to the desired size
  return tf.image.resize(img, [img_height, img_width])
def process_path(file_path):
  label = get_label(file_path)
  # load the raw data from the file as a string
  img = tf.io.read_file(file_path)
  img = decode_img(img)
  return img, label

استخدم Dataset.map لإنشاء مجموعة بيانات image, label أزواج image, label :

# Set `num_parallel_calls` so multiple images are loaded/processed in parallel.
train_ds = train_ds.map(process_path, num_parallel_calls=AUTOTUNE)
val_ds = val_ds.map(process_path, num_parallel_calls=AUTOTUNE)
for image, label in train_ds.take(1):
  print("Image shape: ", image.numpy().shape)
  print("Label: ", label.numpy())
Image shape:  (180, 180, 3)
Label:  3

تكوين مجموعة البيانات للأداء

لتدريب نموذج باستخدام مجموعة البيانات هذه ، ستحتاج إلى البيانات:

  • ليتم خلطها بشكل جيد.
  • على دفعات.
  • ستكون الدُفعات متاحة في أقرب وقت ممكن.

يمكن إضافة هذه الميزات باستخدام tf.data API. لمزيد من التفاصيل ، راجع دليل أداء خط أنابيب الإدخال .

def configure_for_performance(ds):
  ds = ds.cache()
  ds = ds.shuffle(buffer_size=1000)
  ds = ds.batch(batch_size)
  ds = ds.prefetch(buffer_size=AUTOTUNE)
  return ds

train_ds = configure_for_performance(train_ds)
val_ds = configure_for_performance(val_ds)

تصور البيانات

يمكنك تصور مجموعة البيانات هذه بشكل مشابه لتلك التي قمت بإنشائها مسبقًا.

image_batch, label_batch = next(iter(train_ds))

plt.figure(figsize=(10, 10))
for i in range(9):
  ax = plt.subplot(3, 3, i + 1)
  plt.imshow(image_batch[i].numpy().astype("uint8"))
  label = label_batch[i]
  plt.title(class_names[label])
  plt.axis("off")

بي إن جي

استمر في تدريب النموذج

لقد قمت الآن بإنشاء tf.data.Dataset مشابه يدويًا لتلك التي تم إنشاؤها بواسطة keras.preprocessing أعلاه. يمكنك متابعة تدريب النموذج به. كما كان من قبل ، سوف نتدرب على فترات قليلة فقط لجعل وقت الجري قصيرًا.

model.fit(
  train_ds,
  validation_data=val_ds,
  epochs=3
)
Epoch 1/3
92/92 [==============================] - 2s 19ms/step - loss: 0.7869 - accuracy: 0.7054 - val_loss: 0.7747 - val_accuracy: 0.7071
Epoch 2/3
92/92 [==============================] - 1s 11ms/step - loss: 0.5762 - accuracy: 0.7892 - val_loss: 0.8838 - val_accuracy: 0.6689
Epoch 3/3
92/92 [==============================] - 1s 11ms/step - loss: 0.4070 - accuracy: 0.8556 - val_loss: 0.9416 - val_accuracy: 0.6812

<tensorflow.python.keras.callbacks.History at 0x7f1fc09c2828>

استخدام مجموعات بيانات TensorFlow

حتى الآن ، ركز هذا البرنامج التعليمي على تحميل البيانات من القرص. يمكنك أيضًا العثور على مجموعة بيانات لاستخدامها من خلال استكشاف الكتالوج الكبير لمجموعات البيانات سهلة التنزيل في مجموعات بيانات TensorFlow . نظرًا لأنك قمت مسبقًا بتحميل مجموعة بيانات الزهور من القرص ، فلنرى كيفية استيرادها باستخدام مجموعات بيانات TensorFlow.

قم بتنزيل مجموعة بيانات الزهور باستخدام مجموعات بيانات TensorFlow.

(train_ds, val_ds, test_ds), metadata = tfds.load(
    'tf_flowers',
    split=['train[:80%]', 'train[80%:90%]', 'train[90%:]'],
    with_info=True,
    as_supervised=True,
)
Downloading and preparing dataset tf_flowers/3.0.1 (download: 218.21 MiB, generated: 221.83 MiB, total: 440.05 MiB) to /home/kbuilder/tensorflow_datasets/tf_flowers/3.0.1...

Warning:absl:Dataset tf_flowers is hosted on GCS. It will automatically be downloaded to your
local data directory. If you'd instead prefer to read directly from our public
GCS bucket (recommended if you're running on GCP), you can instead pass
`try_gcs=True` to `tfds.load` or set `data_dir=gs://tfds-data/datasets`.


Dataset tf_flowers downloaded and prepared to /home/kbuilder/tensorflow_datasets/tf_flowers/3.0.1. Subsequent calls will reuse this data.

تتكون مجموعة بيانات الزهور من خمس فئات.

num_classes = metadata.features['label'].num_classes
print(num_classes)
5

استرجع صورة من مجموعة البيانات.

get_label_name = metadata.features['label'].int2str

image, label = next(iter(train_ds))
_ = plt.imshow(image)
_ = plt.title(get_label_name(label))

بي إن جي

كما كان من قبل ، تذكر تجميع كل مجموعة بيانات للأداء وتبديلها عشوائيًا وتكوينها.

train_ds = configure_for_performance(train_ds)
val_ds = configure_for_performance(val_ds)
test_ds = configure_for_performance(test_ds)

يمكنك العثور على مثال كامل للعمل مع مجموعة بيانات الزهور ومجموعات بيانات TensorFlow من خلال زيارة البرنامج التعليمي لزيادة البيانات .

الخطوات التالية

أظهر هذا البرنامج التعليمي طريقتين لتحميل الصور من القرص. أولاً ، تعلمت كيفية تحميل مجموعة بيانات الصورة ومعالجتها مسبقًا باستخدام طبقات وأدوات معالجة Keras المسبقة. بعد ذلك ، تعلمت كيفية كتابة مسار إدخال من البداية باستخدام tf.data. أخيرًا ، تعلمت كيفية تنزيل مجموعة بيانات من مجموعات بيانات TensorFlow. كخطوة تالية ، يمكنك معرفة كيفية إضافة زيادة البيانات من خلال زيارة هذا البرنامج التعليمي . لمعرفة المزيد حول tf.data ، يمكنك زيارة هذا الدليل .