RandAugment สำหรับการจำแนกภาพด้วย Keras/TensorFlow PlatoBlockchain Data Intelligence ค้นหาแนวตั้ง AI.

RandAugment สำหรับการจัดประเภทรูปภาพด้วย Keras/TensorFlow

การเพิ่มข้อมูลได้ทำหน้าที่เป็นวิธีการแทนที่ชุดข้อมูล "คงที่" ด้วยตัวแปรที่แปลงแล้วมาเป็นเวลานานแล้วซึ่งสนับสนุนค่าคงที่ของ Convolutional Neural Networks (ซีเอ็นเอ็น)และมักจะนำไปสู่ความแข็งแกร่งในการป้อนข้อมูล

หมายเหตุ ค่าคงที่ลดลงเพื่อทำให้แบบจำลองตาบอดต่อสิ่งรบกวนบางอย่างเมื่อทำการตัดสินใจ รูปภาพของแมวยังคงเป็นภาพแมวหากคุณมิเรอร์หรือหมุนมัน

ในขณะที่การเสริมข้อมูลในรูปแบบที่เราใช้อยู่นั้นเข้ารหัส a ไม่มี ความรู้เกี่ยวกับความแปรปรวนการแปลซึ่งเป็นสิ่งสำคัญสำหรับการตรวจจับวัตถุ การแบ่งส่วนความหมายและอินสแตนซ์ ฯลฯ – ไม่แปรเปลี่ยน มันมักจะให้ผลดีสำหรับแบบจำลองการจำแนกประเภท ดังนั้น การเสริมจึงมักใช้กับแบบจำลองการจำแนกประเภทในเชิงรุกมากกว่า

ประเภทของการเสริมจมูก

การเสริมแต่งเริ่มง่ายมาก – การหมุนเล็กน้อย การพลิกแนวนอนและแนวตั้ง ความเปรียบต่างของคอนทราสต์หรือความสว่าง ฯลฯ ในช่วงไม่กี่ปีที่ผ่านมาได้มีการคิดค้นวิธีการที่ซับซ้อนมากขึ้น รวมถึง ตัดออก (การดรอปเอาท์เชิงพื้นที่แนะนำสี่เหลี่ยมสีดำแบบสุ่มในภาพอินพุต) และ ผสมผสาน (ผสมส่วนต่างๆ ของรูปภาพและอัปเดตสัดส่วนฉลาก) และการผสมผสาน - คัทมิกซ์. วิธีการเสริมที่ใหม่กว่านั้นใช้สำหรับป้ายกำกับจริง ๆ และวิธีการเช่น CutMix เปลี่ยนสัดส่วนฉลากให้เท่ากับสัดส่วนของภาพที่ถ่ายโดยส่วนต่าง ๆ ของแต่ละคลาสที่ปะปนกัน

ด้วยรายการการเสริมที่เป็นไปได้ที่เพิ่มขึ้น บางคนเริ่มใช้แบบสุ่ม (หรืออย่างน้อยก็บางชุดย่อย) ด้วยแนวคิดที่ว่าชุดการเสริมแบบสุ่มจะช่วยเสริมความแข็งแกร่งของแบบจำลอง และแทนที่ชุดเดิมด้วยชุดที่ใหญ่กว่ามาก พื้นที่ของภาพอินพุต นี่คือที่ RandAugment เตะเข้า!

KerasCV และ RandAugment

KerasCV เป็นแพ็คเกจแยกต่างหาก แต่ยังเป็นส่วนเสริมอย่างเป็นทางการของ Keras ที่พัฒนาโดยทีม Keras ซึ่งหมายความว่าได้รับการขัดเกลาและความหยั่งรู้จำนวนเท่ากันของแพ็คเกจหลัก แต่ยังรวมเข้ากับรุ่น Keras ปกติและเลเยอร์ของพวกเขาอย่างไร้ที่ติ ความแตกต่างเพียงอย่างเดียวที่คุณจะสังเกตเห็นได้คือการโทร keras_cv.layers... แทน keras.layers....

KerasCV ยังคงอยู่ในการพัฒนาในขณะที่เขียนและมีเลเยอร์การประมวลผลล่วงหน้าใหม่ 27 เลเยอร์แล้ว RandAugment, CutMixและ MixUp เป็นบางส่วนของพวกเขา สมัครแล้วหน้าตาเป็นยังไง RandAugment ไปจนถึงรูปภาพ และวิธีที่เราสามารถฝึกลักษณนามแบบมีและไม่มีการเพิ่มแบบสุ่ม

ก่อนติดตั้ง keras_cv:

$ pip install keras_cv

หมายเหตุ KerasCV ต้องการ TensorFlow 2.9 เพื่อทำงาน หากคุณยังไม่มีให้เรียกใช้ $ pip install -U tensorflow ก่อน

ตอนนี้ มานำเข้า TensorFlow, Keras และ KerasCV พร้อมกับชุดข้อมูล TensorFlow เพื่อให้เข้าถึง Imagenette ได้ง่าย:

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

มาโหลดรูปภาพและแสดงในรูปแบบดั้งเดิม:

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)

มาสมัครกันเถอะ RandAugment ไปหลายครั้งแล้วดูผลลัพธ์:

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 สำหรับการจำแนกภาพด้วย Keras/TensorFlow PlatoBlockchain Data Intelligence ค้นหาแนวตั้ง AI.

เลเยอร์มี a magnitude อาร์กิวเมนต์ซึ่งมีค่าเริ่มต้นเป็น 0.5 และสามารถเปลี่ยนแปลงเพิ่มหรือลดผลของการเสริมได้ดังนี้

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

เมื่อตั้งค่าเป็นค่าต่ำ เช่น 0.1 – คุณจะเห็นการเสริมที่ดุดันน้อยกว่ามาก:

RandAugment สำหรับการจำแนกภาพด้วย Keras/TensorFlow PlatoBlockchain Data Intelligence ค้นหาแนวตั้ง AI.

เป็นเลเยอร์ - สามารถใช้ภายในโมเดลหรือใน tf.data ไปป์ไลน์ขณะสร้างชุดข้อมูล สิ่งนี้ทำให้ RandAugment คล่องตัวมาก! อาร์กิวเมนต์เพิ่มเติมคือ augmentations_per_image และ rate ข้อโต้แย้งที่ทำงานร่วมกัน

สำหรับ 0...augmentations_per_imageเลเยอร์จะเพิ่มเลเยอร์การประมวลผลล่วงหน้าแบบสุ่มไปยังไปป์ไลน์เพื่อนำไปใช้กับรูปภาพ ในกรณีผิดนัด 3 – เพิ่มการดำเนินการที่แตกต่างกันสามรายการในไปป์ไลน์ จากนั้นจะมีการสุ่มตัวอย่างตัวเลขสำหรับการเสริมแต่ละครั้งในไปป์ไลน์ – และหากต่ำกว่า rate (ค่าเริ่มต้นเป็น around 0.9) – การเสริมถูกนำไปใช้

โดยพื้นฐานแล้ว - มีความเป็นไปได้ 90% ของการเสริม (สุ่ม) แต่ละรายการในไปป์ไลน์ที่นำไปใช้กับรูปภาพ

ดูคู่มือเชิงปฏิบัติสำหรับการเรียนรู้ Git ที่มีแนวทางปฏิบัติที่ดีที่สุด มาตรฐานที่ยอมรับในอุตสาหกรรม และเอกสารสรุปรวม หยุดคำสั่ง Googling Git และจริงๆ แล้ว เรียน มัน!

นี่ย่อมหมายความว่าไม่จำเป็นต้องเสริมแต่งทั้งหมด โดยเฉพาะอย่างยิ่งถ้าคุณลดระดับ rate. คุณยังสามารถปรับแต่งการดำเนินการที่อนุญาตผ่าน a RandomAugmentationPipeline ชั้นซึ่ง RandAugment เป็นกรณีพิเศษของ คู่มือแยกต่างหากเกี่ยวกับ RandomAugmentationPipeline จะได้รับการเผยแพร่เร็ว ๆ นี้

การฝึกอบรมลักษณนามที่มีและไม่มี RandAugment

เพื่อลดความซับซ้อนด้านการเตรียมข้อมูล/การโหลดและเน้นที่ RandAugmentมาใช้กันเถอะ tfds เพื่อโหลดในส่วนของ 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)) 

เราได้โหลดข้อมูลการฝึกเพียงบางส่วนเท่านั้น เพื่อช่วยให้ง่ายต่อการใส่ชุดข้อมูลในยุคที่น้อยลง (ทำให้การทดสอบของเราทำงานเร็วขึ้น มีผลจริง) เนื่องจากรูปภาพใน Imagenette มีขนาดต่างกัน มาสร้าง a . กันเถอะ preprocess() ฟังก์ชันที่ปรับขนาดให้แมปชุดข้อมูลด้วย เช่นเดียวกับ an augment() ฟังก์ชันที่เสริมภาพใน a 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']

ตอนนี้ – เราเข้ารหัสฉลากแล้ว เราไม่จำเป็นต้องทำอย่างนั้น แต่สำหรับการเสริมเช่น CutMix ที่คุณต้องแก้ไขฉลากและสัดส่วน เนื่องจากคุณอาจต้องการใช้สิ่งเหล่านั้นเช่นกัน RandAugment ใช้งานได้ดีกับพวกมันเพื่อสร้างตัวแยกประเภทที่แข็งแกร่ง – ปล่อยให้การเข้ารหัสแบบลัดเข้าไว้ด้วยกัน นอกจากนี้ RandAugment ใช้พจนานุกรมที่มีรูปภาพและป้ายกำกับด้วยเหตุนี้ - การเสริมบางอย่างที่คุณสามารถเพิ่มได้จะเปลี่ยนป้ายกำกับจริง ๆ ดังนั้นจึงเป็นข้อบังคับ คุณสามารถแยกรูปภาพและป้ายกำกับที่เสริมออกจาก outputs พจนานุกรมอย่างง่ายดาย ดังนั้น นี่เป็นขั้นตอนพิเศษแต่เรียบง่ายที่ต้องทำในระหว่างการเสริม

มาแมปชุดข้อมูลที่มีอยู่ซึ่งส่งคืนจาก tfds กับ preprocess() ฟังก์ชัน แบทช์และเพิ่มเฉพาะชุดการฝึก:

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)

มาฝึกเครือข่ายกันเถอะ! keras_cv.models มีเครือข่ายในตัวคล้ายกับ keras.applications. ในขณะที่รายการยังสั้น – มันจะขยายเวลาและเข้าครอบครอง keras.applications. API มีความคล้ายคลึงกันมาก ดังนั้นการพอร์ตโค้ดจึงค่อนข้างง่ายสำหรับผู้ปฏิบัติงานส่วนใหญ่:


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)

หรือคุณสามารถใช้ current 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)

ส่งผลให้โมเดลทำงานได้ไม่ดีนัก:

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

ตอนนี้ มาฝึกการตั้งค่าเครือข่ายเดียวกันในชุดข้อมูลเสริมกัน แต่ละชุดจะถูกเสริมแยกกัน ดังนั้นเมื่อใดก็ตามที่ภาพชุดเดียวกัน (ในยุคถัดไป) มาถึง ภาพเหล่านั้นจะมีการเสริมที่แตกต่างกัน:

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

ดีขึ้นมาก! ขณะที่คุณยังต้องการใช้การเสริมอื่นๆ เช่น CutMix และ MixUpควบคู่ไปกับเทคนิคการฝึกอบรมอื่นๆ เพื่อเพิ่มความแม่นยำของเครือข่าย – just RandAugment ช่วยได้มากและสามารถเทียบได้กับไปป์ไลน์การเสริมที่ยาวขึ้น

หากคุณเปรียบเทียบเส้นโค้งการฝึก รวมถึงการฝึก และ เส้นโค้งการตรวจสอบ - มันชัดเจนเท่านั้นว่า RandAugment ช่วย:

RandAugment สำหรับการจำแนกภาพด้วย Keras/TensorFlow PlatoBlockchain Data Intelligence ค้นหาแนวตั้ง AI.

ในไปป์ไลน์ที่ไม่ได้เสริม เครือข่ายเกินพอดี (ความแม่นยำในการฝึกอบรมถึงเพดาน) และความแม่นยำในการตรวจสอบยังคงต่ำ ในท่อเสริม ความแม่นยำในการฝึกยังคงต่ำกว่าความแม่นยำในการตรวจสอบตั้งแต่ต้นจนจบ.

ด้วยการสูญเสียการฝึกอบรมที่สูงขึ้น เครือข่ายจึงตระหนักถึงข้อผิดพลาดที่ยังคงทำอยู่ และสามารถอัปเดตเพิ่มเติมเพื่อให้ไม่เปลี่ยนแปลงกับการเปลี่ยนแปลง แบบแรกไม่เห็นความจำเป็นต้องปรับปรุง ในขณะที่แบบหลังทำและเพิ่มเพดานของศักยภาพ

สรุป

KerasCV เป็นแพ็คเกจแยกต่างหาก แต่ยังเป็นส่วนเสริมอย่างเป็นทางการของ Keras ซึ่งพัฒนาโดยทีม Keras โดยมีเป้าหมายเพื่อนำ CV ที่มีความแข็งแกร่งของอุตสาหกรรมมาสู่โครงการ Keras ของคุณ KerasCV ยังคงอยู่ในการพัฒนาในขณะที่เขียนและมีเลเยอร์การประมวลผลล่วงหน้าใหม่ 27 เลเยอร์แล้ว RandAugment, CutMixและ MixUp เป็นบางส่วนของพวกเขา

ในคู่มือฉบับย่อนี้ เราได้มาดูวิธีการใช้งานของคุณ RandAugment เพื่อใช้การแปลงแบบสุ่มจำนวนหนึ่งจากรายการการแปลงที่นำไปใช้ และความง่ายในการรวมไว้ในไปป์ไลน์การฝึกอบรมของ Keras

ก้าวต่อไป – การเรียนรู้เชิงลึกเชิงปฏิบัติสำหรับคอมพิวเตอร์วิทัศน์

ธรรมชาติที่อยากรู้อยากเห็นของคุณทำให้คุณต้องการไปต่อหรือไม่? เราขอแนะนำให้ตรวจสอบของเรา คอร์ส: “การเรียนรู้เชิงลึกเชิงปฏิบัติสำหรับคอมพิวเตอร์วิทัศน์ด้วย Python”.

RandAugment สำหรับการจำแนกภาพด้วย Keras/TensorFlow PlatoBlockchain Data Intelligence ค้นหาแนวตั้ง AI.

หลักสูตร Computer Vision อื่น?

เราจะไม่ทำการจำแนกตัวเลข MNIST หรือแฟชั่น MNIST พวกเขาทำหน้าที่ส่วนของตนเมื่อนานมาแล้ว ทรัพยากรการเรียนรู้จำนวนมากเกินไปมุ่งเน้นไปที่ชุดข้อมูลพื้นฐานและสถาปัตยกรรมพื้นฐาน ก่อนปล่อยให้สถาปัตยกรรมกล่องดำขั้นสูงรับภาระด้านประสิทธิภาพ

เราต้องการที่จะมุ่งเน้นไปที่ การทำให้ลึกลับ, การปฏิบัติจริง, ความเข้าใจ, ปรีชา และ โครงการจริง. ต้องการเรียน อย่างไร คุณสามารถสร้างความแตกต่าง? เราจะพาคุณเดินทางตั้งแต่วิธีที่สมองของเราประมวลผลภาพไปจนถึงการเขียนตัวแยกประเภทการเรียนรู้เชิงลึกระดับการวิจัยสำหรับมะเร็งเต้านม ไปจนถึงเครือข่ายการเรียนรู้เชิงลึกที่ "หลอน" สอนหลักการและทฤษฎีแก่คุณผ่านการทำงานจริง เพื่อให้คุณมี ความรู้และเครื่องมือในการเป็นผู้เชี่ยวชาญในการประยุกต์ใช้การเรียนรู้เชิงลึกเพื่อแก้ปัญหาคอมพิวเตอร์วิทัศน์

อะไรอยู่ข้างใน?

  • หลักการมองเห็นเบื้องต้นและวิธีการสอนคอมพิวเตอร์ให้ “มองเห็น”
  • งานต่างๆ และการประยุกต์ใช้คอมพิวเตอร์วิทัศน์
  • เครื่องมือการค้าที่จะทำให้งานของคุณง่ายขึ้น
  • การค้นหา การสร้าง และการใช้ชุดข้อมูลสำหรับคอมพิวเตอร์วิทัศน์
  • ทฤษฎีและการประยุกต์ใช้ Convolutional Neural Networks
  • การจัดการการเปลี่ยนแปลงโดเมน การเกิดขึ้นร่วม และอคติอื่นๆ ในชุดข้อมูล
  • ถ่ายทอดการเรียนรู้และใช้เวลาฝึกอบรมและทรัพยากรการคำนวณของผู้อื่นเพื่อประโยชน์ของคุณ
  • การสร้างและฝึกอบรมผู้จำแนกมะเร็งเต้านมที่ล้ำสมัย
  • วิธีการใช้ความสงสัยที่ดีต่อสุขภาพกับแนวคิดกระแสหลักและทำความเข้าใจกับความหมายของเทคนิคที่นำมาใช้กันอย่างแพร่หลาย
  • การแสดงภาพ "พื้นที่แนวคิด" ของ ConvNet โดยใช้ t-SNE และ PCA
  • กรณีศึกษาวิธีที่บริษัทต่างๆ ใช้เทคนิคการมองเห็นด้วยคอมพิวเตอร์เพื่อให้ได้ผลลัพธ์ที่ดีขึ้น
  • การประเมินแบบจำลองที่เหมาะสม การสร้างภาพพื้นที่แฝง และการระบุความสนใจของแบบจำลอง
  • ดำเนินการวิจัยโดเมน ประมวลผลชุดข้อมูลของคุณเอง และสร้างการทดสอบแบบจำลอง
  • สถาปัตยกรรมล้ำสมัย ความก้าวหน้าของแนวคิด สิ่งที่ทำให้มีเอกลักษณ์เฉพาะตัว และวิธีนำไปใช้
  • KerasCV – ไลบรารี WIP สำหรับสร้างไปป์ไลน์และโมเดลที่ทันสมัย
  • วิธีแยกวิเคราะห์และอ่านเอกสารและนำไปใช้เอง
  • การเลือกรุ่นขึ้นอยู่กับการใช้งานของคุณ
  • การสร้างไปป์ไลน์การเรียนรู้ของเครื่องแบบ end-to-end
  • ภูมิทัศน์และสัญชาตญาณในการตรวจจับวัตถุด้วย R-CNN ที่เร็วกว่า, RetinaNets, SSD และ YOLO
  • การแบ่งกลุ่มตัวอย่างและความหมาย
  • การจดจำวัตถุแบบเรียลไทม์ด้วย YOLOv5
  • การฝึกอบรมเครื่องตรวจจับวัตถุ YOLOv5
  • การทำงานกับ Transformers โดยใช้ KerasNLP (ไลบรารี WIP ที่มีความแข็งแกร่งในอุตสาหกรรม)
  • การรวม Transformers เข้ากับ ConvNets เพื่อสร้างคำบรรยายภาพ
  • Deepdream
  • การเพิ่มประสิทธิภาพโมเดล Deep Learning สำหรับคอมพิวเตอร์วิทัศน์

ประทับเวลา:

เพิ่มเติมจาก สแต็ค