RandAugment để phân loại hình ảnh với Keras/TensorFlow PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.

RandAugment để phân loại hình ảnh với Keras / TensorFlow

Tăng cường dữ liệu trong một thời gian dài đã đóng vai trò như một phương tiện thay thế tập dữ liệu “tĩnh” bằng các biến thể được chuyển đổi, củng cố tính bất biến của Mạng thần kinh hợp pháp (CNN), và thường dẫn đến sự mạnh mẽ cho đầu vào.

Lưu ý: Sự bất biến dẫn đến việc làm cho các mô hình bị mù đối với một số cấu trúc nhất định, khi đưa ra quyết định. Hình ảnh của một con mèo vẫn là hình ảnh của một con mèo nếu bạn soi gương hoặc xoay nó.

Mặc dù việc tăng cường dữ liệu ở dạng mà chúng tôi đang sử dụng nhưng nó mã hóa một thiếu kiến thức về phương sai tịnh tiến, điều này rất quan trọng để phát hiện đối tượng, phân đoạn ngữ nghĩa và thể hiện, v.v. – bất biến nó cung cấp đôi khi thuận lợi cho các mô hình phân loại, và do đó, việc tăng cường được áp dụng phổ biến hơn và mạnh mẽ hơn cho các mô hình phân loại.

Các loại tăng cường

Việc tăng cường bắt đầu rất đơn giản – xoay nhỏ, lật ngang và dọc, dao động độ tương phản hoặc độ sáng, v.v. Trong những năm gần đây, các phương pháp phức tạp hơn đã được nghĩ ra, bao gồm Cắt ra (người bỏ học trong không gian giới thiệu các hình vuông màu đen một cách ngẫu nhiên trong các hình ảnh đầu vào) và trộn lên (trộn các phần của hình ảnh và cập nhật tỷ lệ nhãn) và sự kết hợp của chúng – CắtTrộn. Các phương pháp tăng cường mới hơn thực sự tính đến nhãn và các phương pháp như CutMix thay đổi tỷ lệ nhãn bằng với tỷ lệ của hình ảnh được chiếm bởi các phần của mỗi lớp được trộn lẫn.

Với danh sách ngày càng tăng các phần bổ sung có thể có, một số đã bắt đầu áp dụng chúng một cách ngẫu nhiên (hoặc ít nhất là một số tập hợp con của chúng), với ý tưởng rằng một tập hợp các phần tăng thêm ngẫu nhiên sẽ tăng cường độ mạnh mẽ của các mô hình và thay thế tập hợp ban đầu bằng một tập hợp lớn hơn nhiều không gian của hình ảnh đầu vào. Đây là đâu RandAugment đá vào!

KerasCV và RandAugment

Máy ảnh CV là một gói riêng biệt nhưng vẫn là phần bổ sung chính thức cho Keras, được phát triển bởi nhóm Keras. Điều này có nghĩa là nó có cùng mức độ bóng bẩy và trực quan như gói chính, nhưng nó cũng tích hợp hoàn hảo với các mô hình Keras thông thường và các lớp của chúng. Sự khác biệt duy nhất bạn từng nhận thấy là việc gọi keras_cv.layers... thay vì keras.layers....

KerasCV vẫn đang được phát triển tính đến thời điểm viết bài và đã bao gồm 27 lớp tiền xử lý mới, RandAugment, CutMixMixUp là một số trong số họ. Chúng ta hãy xem nó trông như thế nào khi áp dụng RandAugment hình ảnh và cách chúng tôi có thể đào tạo một bộ phân loại có và không có tăng cường ngẫu nhiên.

Đầu tiên, hãy cài đặt keras_cv:

$ pip install keras_cv

Lưu ý: KerasCV yêu cầu TensorFlow 2.9 để hoạt động. Nếu bạn chưa có nó, hãy chạy $ pip install -U tensorflow đầu tiên.

Bây giờ, hãy nhập TensorFlow, Keras và KerasCV, cùng với bộ dữ liệu TensorFlow để dễ dàng truy cập vào Imagenette:

import tensorflow as tf
from tensorflow import keras
import keras_cv
import tensorflow_datasets as tfds

Hãy tải một hình ảnh và hiển thị nó ở dạng ban đầu:

import matplotlib.pyplot as plt
import cv2

cat_img = cv2.cvtColor(cv2.imread('cat.jpg'), cv2.COLOR_BGR2RGB)
cat_img = cv2.resize(cat_img, (224, 224))
plt.imshow(cat_img)

Bây giờ chúng ta hãy áp dụng RandAugment với nó, nhiều lần và xem kết quả:

fig = plt.figure(figsize=(10,10))
for i in range(16):
    ax = fig.add_subplot(4,4,i+1)
    aug_img = keras_cv.layers.RandAugment(value_range=(0, 255))(cat_img)
    
    ax.imshow(aug_img.numpy().astype('int'))

RandAugment để phân loại hình ảnh với Keras/TensorFlow PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.

Lớp có một magnitude đối số, mặc định là 0.5 và có thể được thay đổi để tăng hoặc giảm tác dụng của việc tăng cường:

fig = plt.figure(figsize=(10,10))
for i in range(16):
    ax = fig.add_subplot(4,4,i+1)
    aug_img = keras_cv.layers.RandAugment(value_range=(0, 255), magnitude=0.1)(cat_img)
    ax.imshow(aug_img.numpy().astype('int'))

Khi được đặt thành giá trị thấp, chẳng hạn như 0.1 – bạn sẽ thấy sự gia tăng ít tích cực hơn nhiều:

RandAugment để phân loại hình ảnh với Keras/TensorFlow PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.

Là một lớp – nó có thể được sử dụng trong các mô hình hoặc trong tf.data đường ống dẫn trong khi tạo tập dữ liệu. Điều này làm cho RandAugment khá linh hoạt! Các đối số bổ sung là augmentations_per_imagerate các đối số hoạt động cùng nhau.

Trong 0...augmentations_per_image, lớp thêm một lớp tiền xử lý ngẫu nhiên vào đường ống sẽ được áp dụng cho một hình ảnh. Trong trường hợp mặc định 3 – ba hoạt động khác nhau được thêm vào đường ống. Sau đó, một số ngẫu nhiên được lấy mẫu cho mỗi lần tăng trong quy trình – và nếu nó thấp hơn rate (mặc định là xung quanh 0.9) – phép tăng thêm được áp dụng.

Về bản chất - có xác suất 90% cho mỗi lần tăng cường (ngẫu nhiên) trong quy trình được áp dụng cho hình ảnh.

Xem hướng dẫn thực hành, thực tế của chúng tôi để học Git, với các phương pháp hay nhất, các tiêu chuẩn được ngành công nghiệp chấp nhận và bảng lừa đảo đi kèm. Dừng lệnh Googling Git và thực sự học nó!

Điều này đương nhiên có nghĩa là không phải tất cả các phép tăng cường đều phải được áp dụng, đặc biệt là nếu bạn giảm rate. Bạn cũng có thể tùy chỉnh hoạt động nào được phép thông qua RandomAugmentationPipeline lớp, mà RandAugment là trường hợp đặc biệt của. Hướng dẫn riêng về RandomAugmentationPipeline sẽ sớm được xuất bản.

Đào tạo một Classifier có và không có RandAugment

Để đơn giản hóa khía cạnh chuẩn bị / tải dữ liệu và tập trung vào RandAugment, hãy sử dụng tfds để tải một phần của Imagenette:

(train, valid_set, test_set), info = tfds.load("imagenette", 
                                           split=["train[:70%]", "validation", "train[70%:]"],
                                           as_supervised=True, with_info=True)

class_names = info.features["label"].names
n_classes = info.features["label"].num_classes
print(f'Class names: {class_names}') 
print('Num of classes:', n_classes) 

print("Train set size:", len(train)) 
print("Test set size:", len(test_set)) 
print("Valid set size:", len(valid_set)) 

Chúng tôi chỉ tải một phần dữ liệu huấn luyện vào để giúp dễ dàng điều chỉnh quá mức tập dữ liệu trong ít kỷ nguyên hơn (thực tế là giúp thử nghiệm của chúng tôi chạy nhanh hơn). Vì các hình ảnh trong Imagenette có kích thước khác nhau nên hãy tạo một preprocess() chức năng thay đổi kích thước chúng để ánh xạ tập dữ liệu, cũng như augment() chức năng tăng cường hình ảnh trong một tf.data.Dataset:

def preprocess(images, labels):
  return tf.image.resize(images, (224, 224)), tf.one_hot(labels, 10)
  
def augment(images, labels):
  inputs = {"images": images, "labels": labels}
  outputs = keras_cv.layers.RandAugment(value_range=(0, 255))(inputs)
  return outputs['images'], outputs['labels']

Bây giờ - chúng tôi đã mã hóa nhanh các nhãn. Chúng tôi không nhất thiết phải làm vậy, nhưng đối với những phần bổ sung như CutMix làm xáo trộn nhãn và tỷ lệ của chúng, bạn sẽ phải làm vậy. Vì bạn có thể muốn áp dụng những điều đó cũng như RandAugment hoạt động thực sự hiệu quả với chúng để tạo ra các bộ phân loại mạnh mẽ – hãy để lại mã hóa một lần. Ngoài ra, RandAugment đưa vào từ điển có hình ảnh và nhãn chính xác là vì điều này – một số tính năng bổ sung mà bạn có thể thêm sẽ thực sự thay đổi nhãn, vì vậy chúng là bắt buộc. Bạn có thể trích xuất các hình ảnh và nhãn được tăng cường từ outputs từ điển dễ dàng, vì vậy đây là một bước bổ sung, nhưng đơn giản, cần thực hiện trong quá trình nâng cấp.

Hãy ánh xạ các tập dữ liệu hiện có được trả về từ tfds với preprocess() chức năng, hàng loạt chúng và chỉ tăng cường bộ đào tạo:

valid_set = valid_set.map(preprocess).batch(32).prefetch(tf.data.AUTOTUNE)
train_set = train.map(preprocess).batch(32).prefetch(tf.data.AUTOTUNE)
train_set_aug = train.map(preprocess).map(augment_data, 
                                          num_parallel_calls=tf.data.AUTOTUNE).batch(32).prefetch(tf.data.AUTOTUNE)

Hãy đào tạo một mạng lưới! keras_cv.models có một số mạng tích hợp, tương tự như keras.applications. Mặc dù danh sách vẫn còn ngắn - nó sẽ mở rộng theo thời gian và tiếp quản keras.applications. API rất giống nhau, vì vậy việc chuyển mã sẽ khá dễ dàng đối với hầu hết những người thực hành:


effnet = keras_cv.models.EfficientNetV2B0(include_rescaling=True, include_top=True, classes=10)
          
effnet.compile(
    loss='categorical_crossentropy',
    optimizer='adam',
    metrics=['accuracy']
)

history = effnet.fit(train_set, epochs=25, validation_data = valid_set)

Ngoài ra, bạn có thể sử dụng dòng điện keras.applications:

effnet = keras.applications.EfficientNetV2B0(weights=None, classes=10)

effnet.compile(
  loss='categorical_crossentropy',
  optimizer='adam',
  metrics=['accuracy']
)

history1 = effnet.fit(train_set, epochs=50, validation_data=valid_set)

Điều này dẫn đến một mô hình không thực sự hoạt động tốt:

Epoch 1/50
208/208 [==============================] - 60s 238ms/step - loss: 2.7742 - accuracy: 0.2313 - val_loss: 3.2200 - val_accuracy: 0.3085
...
Epoch 50/50
208/208 [==============================] - 48s 229ms/step - loss: 0.0272 - accuracy: 0.9925 - val_loss: 2.0638 - val_accuracy: 0.6887

Bây giờ, hãy huấn luyện cách thiết lập mạng tương tự trên tập dữ liệu tăng cường. Mỗi lô được tăng cường riêng lẻ, do đó, bất cứ khi nào cùng một loạt hình ảnh (trong kỷ nguyên tiếp theo) xuất hiện – chúng sẽ có các mức tăng khác nhau:

effnet = keras.applications.EfficientNetV2B0(weights=None, classes=10)
effnet.compile(
  loss='categorical_crossentropy',
  optimizer='adam',
  metrics=['accuracy']
)

history2 = effnet.fit(train_set_aug, epochs=50, validation_data = valid_set)
Epoch 1/50
208/208 [==============================] - 141s 630ms/step - loss: 2.9966 - accuracy: 0.1314 - val_loss: 2.7398 - val_accuracy: 0.2395
...
Epoch 50/50
208/208 [==============================] - 125s 603ms/step - loss: 0.7313 - accuracy: 0.7583 - val_loss: 0.6101 - val_accuracy: 0.8143

Tốt hơn nhiều! Mặc dù bạn vẫn muốn áp dụng các phần bổ sung khác, chẳng hạn như CutMixMixUp, cùng với các kỹ thuật đào tạo khác để tối đa hóa độ chính xác của mạng – chỉ RandAugment đã giúp đáng kể và có thể được so sánh với một đường ống tăng cường dài hơn.

Nếu bạn so sánh các đường cong đào tạo, bao gồm cả đào tạo đường cong xác nhận - nó chỉ trở nên rõ ràng bao nhiêu RandAugment giúp:

RandAugment để phân loại hình ảnh với Keras/TensorFlow PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.

Trong đường dẫn không tăng cường, mạng hoạt động quá mức (độ chính xác đào tạo đạt mức trần) và độ chính xác xác thực vẫn ở mức thấp. Trong quy trình tăng cường, độ chính xác đào tạo vẫn thấp hơn độ chính xác xác nhận từ đầu đến cuối.

Với tổn thất đào tạo cao hơn, mạng nhận thức rõ hơn nhiều về những sai lầm mà nó vẫn mắc phải và có thể thực hiện nhiều bản cập nhật hơn để làm cho nó bất biến với các phép biến đổi. Cái trước cho rằng không cần phải cập nhật, trong khi cái sau thì làm và tăng trần tiềm năng.

Kết luận

Máy ảnh CV là một gói riêng biệt, nhưng vẫn là một bổ sung chính thức cho Keras, được phát triển bởi nhóm Keras, nhằm mục đích mang lại CV sức mạnh ngành cho các dự án Keras của bạn. KerasCV vẫn đang được phát triển tính đến thời điểm viết bài và đã bao gồm 27 lớp tiền xử lý mới, RandAugment, CutMixMixUp là một số trong số họ.

Trong hướng dẫn ngắn này, chúng tôi đã xem xét cách bạn có thể sử dụng RandAugment để áp dụng một số phép biến đổi ngẫu nhiên từ một danh sách các phép biến đổi được áp dụng đã cho và việc đưa vào bất kỳ quy trình đào tạo Keras nào dễ dàng như thế nào.

Tiến xa hơn - Học sâu thực tế cho thị giác máy tính

Bản tính ham học hỏi của bạn khiến bạn muốn tiến xa hơn? Chúng tôi khuyên bạn nên kiểm tra Khóa học: “Học sâu thực tế cho thị giác máy tính với Python”.

RandAugment để phân loại hình ảnh với Keras/TensorFlow PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.

Một khóa học thị giác máy tính khác?

Chúng tôi sẽ không phân loại các chữ số MNIST hoặc thời trang MNIST. Họ đã phục vụ phần của họ từ lâu lắm rồi. Quá nhiều tài nguyên học tập đang tập trung vào bộ dữ liệu cơ bản và kiến ​​trúc cơ bản trước khi để các kiến ​​trúc hộp đen nâng cao gánh vác gánh nặng về hiệu suất.

Chúng tôi muốn tập trung vào sự làm sáng tỏ, tính thực tiễn, sự hiểu biết, trực giácdự án thực tế. Muốn học làm thế nào Bạn có thể làm nên điều khác biệt? Chúng tôi sẽ đưa bạn đi từ cách bộ não của chúng ta xử lý hình ảnh để viết một bộ phân loại học sâu cấp độ nghiên cứu cho bệnh ung thư vú đến mạng lưới học tập sâu "ảo giác", dạy cho bạn các nguyên tắc và lý thuyết thông qua công việc thực tế, trang bị cho bạn bí quyết và công cụ để trở thành chuyên gia ứng dụng học sâu để giải quyết vấn đề thị giác máy tính.

Có gì bên trong?

  • Các nguyên tắc đầu tiên của tầm nhìn và cách máy tính có thể được dạy để "nhìn"
  • Các tác vụ và ứng dụng khác nhau của thị giác máy tính
  • Các công cụ giao dịch sẽ giúp công việc của bạn dễ dàng hơn
  • Tìm kiếm, tạo và sử dụng bộ dữ liệu cho thị giác máy tính
  • Lý thuyết và ứng dụng của Mạng nơ ron chuyển đổi
  • Xử lý sự thay đổi tên miền, đồng xuất hiện và các sai lệch khác trong tập dữ liệu
  • Chuyển giao Học tập và tận dụng thời gian đào tạo cũng như các tài nguyên tính toán của người khác vì lợi ích của bạn
  • Xây dựng và đào tạo một máy phân loại ung thư vú tiên tiến nhất
  • Cách áp dụng liều lượng hoài nghi lành mạnh vào các ý tưởng chủ đạo và hiểu được hàm ý của các kỹ thuật được áp dụng rộng rãi
  • Hình dung “không gian khái niệm” của ConvNet bằng t-SNE và PCA
  • Các nghiên cứu điển hình về cách các công ty sử dụng kỹ thuật thị giác máy tính để đạt được kết quả tốt hơn
  • Đánh giá mô hình thích hợp, hình dung không gian tiềm ẩn và xác định sự chú ý của mô hình
  • Thực hiện nghiên cứu miền, xử lý tập dữ liệu của riêng bạn và thiết lập các thử nghiệm mô hình
  • Các kiến ​​trúc tiên tiến, sự phát triển của các ý tưởng, điều gì làm cho chúng trở nên độc đáo và cách thực hiện chúng
  • KerasCV - một thư viện WIP để tạo các mô hình và đường ống hiện đại
  • Cách phân tích cú pháp và đọc các bài báo và tự thực hiện chúng
  • Lựa chọn mô hình tùy thuộc vào ứng dụng của bạn
  • Tạo một đường dẫn học máy từ đầu đến cuối
  • Phong cảnh và trực giác khi phát hiện đối tượng với R-CNN, RetinaNets, SSD và YOLO nhanh hơn
  • Phân đoạn phiên bản và ngữ nghĩa
  • Nhận dạng đối tượng trong thời gian thực với YOLOv5
  • Đào tạo máy dò đối tượng YOLOv5
  • Làm việc với Máy biến áp bằng KerasNLP (thư viện WIP dành cho ngành công nghiệp)
  • Tích hợp Transformers với ConvNets để tạo phụ đề cho hình ảnh
  • Ngủ sâu
  • Tối ưu hóa mô hình Deep Learning cho thị giác máy tính

Dấu thời gian:

Thêm từ xếp chồng lên nhau