डेटा संवर्द्धन, लंबे समय से, "स्थिर" डेटासेट को रूपांतरित वेरिएंट के साथ बदलने के साधन के रूप में कार्य कर रहा है, जो कि अपरिवर्तनीयता को बढ़ाता है कनवल्शनल न्यूरल नेटवर्क्स (सीएनएन), और आमतौर पर इनपुट को मजबूती प्रदान करता है।
नोट: निर्णय लेने के दौरान, कुछ गड़बड़ी के लिए मॉडल को अंधा बनाने के लिए इनवेरिएंस उबलता है। एक बिल्ली की छवि अभी भी एक बिल्ली की छवि है यदि आप इसे दर्पण करते हैं या इसे घुमाते हैं।
जबकि डेटा संवर्द्धन जिस रूप में हम इसका उपयोग कर रहे हैं, वह एन्कोड करता है a कमी ट्रांसलेशनल वेरिएंस के बारे में ज्ञान, जो ऑब्जेक्ट डिटेक्शन, सिमेंटिक और इंस्टेंस सेगमेंटेशन आदि के लिए महत्वपूर्ण है निश्चरता यह प्रदान करता है अक्सर वर्गीकरण मॉडल के लिए अनुकूल है, और इस प्रकार, वर्गीकरण मॉडल के लिए वृद्धि अधिक सामान्यतः और अधिक आक्रामक रूप से लागू होती है।
वृद्धि के प्रकार
वृद्धि बहुत सरल होने लगी - छोटे घुमाव, क्षैतिज और ऊर्ध्वाधर फ़्लिप, कंट्रास्ट या चमक में उतार-चढ़ाव, आदि। हाल के वर्षों में, अधिक विस्तृत तरीके तैयार किए गए हैं, जिनमें शामिल हैं कट आउट (स्थानिक ड्रॉपआउट इनपुट छवियों में बेतरतीब ढंग से काले वर्गों का परिचय देता है) और Mixup (छवियों के कुछ हिस्सों को मिलाकर और लेबल अनुपात को अद्यतन करना), और उनका संयोजन - कटमिक्स. नई संवर्द्धन विधियां वास्तव में लेबल के लिए जिम्मेदार हैं, और कटमिक्स जैसी विधियां लेबल अनुपात को प्रत्येक वर्ग के कुछ हिस्सों द्वारा मिश्रित छवि के अनुपात के बराबर बदलती हैं।
संभावित संवर्द्धन की बढ़ती सूची के साथ, कुछ ने उन्हें बेतरतीब ढंग से (या उनमें से कम से कम कुछ सबसेट) लागू करना शुरू कर दिया है, इस विचार के साथ कि संवर्द्धन का एक यादृच्छिक सेट मॉडलों की मजबूती को बढ़ा देगा, और मूल सेट को बहुत बड़े के साथ बदल देगा इनपुट छवियों का स्थान। यह कहाँ है RandAugment
पाँव से मारना!
KerasCV और RandAugment
केराससीवी एक अलग पैकेज है, लेकिन फिर भी केरस टीम द्वारा विकसित केरस के लिए एक आधिकारिक अतिरिक्त है। इसका मतलब यह है कि यह मुख्य पैकेज की समान मात्रा में पॉलिश और सहजता प्राप्त करता है, लेकिन यह नियमित रूप से केरस मॉडल और उनकी परतों के साथ भी एकीकृत होता है। केवल एक ही अंतर जिसे आप कभी नोटिस करेंगे, वह है कॉल करना 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 डेटासेट भी आयात करते हैं:
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'))
परत है 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
- आप बहुत कम आक्रामक वृद्धि देखेंगे:
एक परत होने के नाते - इसका उपयोग मॉडल के भीतर या अंदर किया जा सकता है tf.data
डेटासेट बनाते समय पाइपलाइन। यह बनाता है RandAugment
काफी लचीला! अतिरिक्त तर्क हैं augmentations_per_image
और rate
तर्क, जो एक साथ काम करते हैं।
के लिए 0...augmentations_per_image
, परत एक छवि पर लागू करने के लिए पाइपलाइन में एक यादृच्छिक प्रीप्रोसेसिंग परत जोड़ती है। डिफ़ॉल्ट के मामले में 3
- पाइपलाइन में तीन अलग-अलग ऑपरेशन जोड़े जाते हैं। फिर, पाइपलाइन में प्रत्येक वृद्धि के लिए एक यादृच्छिक संख्या का नमूना लिया जाता है - और यदि यह से कम है rate
(लगभग करने के लिए चूक 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))
हमने प्रशिक्षण डेटा के केवल एक हिस्से को लोड किया है, ताकि कम युगों में डेटासेट को ओवरफिट करना आसान हो सके (हमारे प्रयोग को तेजी से चलाने के लिए, प्रभाव में)। चूंकि इमेजनेट में इमेज अलग-अलग आकार की होती हैं, आइए एक बनाते हैं preprocess()
फ़ंक्शन जो उन्हें डेटासेट को मैप करने के लिए आकार देता है, साथ ही एक 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
. एपीआई बहुत समान है, इसलिए अधिकांश अभ्यासकर्ताओं के लिए पोर्टिंग कोड काफी आसान होगा:
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)
वैकल्पिक रूप से, आप करंट का उपयोग कर सकते हैं 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
, नेटवर्क की सटीकता को अधिकतम करने के लिए अन्य प्रशिक्षण तकनीकों के साथ - बस RandAugment
महत्वपूर्ण रूप से मदद की और एक लंबी वृद्धि पाइपलाइन के साथ तुलनीय हो सकता है।
यदि आप प्रशिक्षण सहित प्रशिक्षण वक्रों की तुलना करते हैं और सत्यापन वक्र - यह केवल स्पष्ट हो जाता है कि कितना RandAugment
मदद करता है:
गैर-संवर्धित पाइपलाइन में, नेटवर्क ओवरफिट हो जाता है (प्रशिक्षण सटीकता छत से टकराती है) और सत्यापन सटीकता कम रहती है। संवर्धित पाइपलाइन में, प्रशिक्षण सटीकता शुरू से अंत तक सत्यापन सटीकता से कम रहती है.
उच्च प्रशिक्षण हानि के साथ, नेटवर्क अभी भी गलतियों के बारे में अधिक जागरूक है, और इसे परिवर्तनों के लिए अपरिवर्तनीय बनाने के लिए और अधिक अपडेट किए जा सकते हैं। पूर्व को अद्यतन करने की कोई आवश्यकता नहीं दिखती है, जबकि बाद वाला करता है और क्षमता की सीमा को बढ़ाता है।
निष्कर्ष
केराससीवी एक अलग पैकेज है, लेकिन फिर भी केरस टीम द्वारा विकसित केरस के लिए एक आधिकारिक अतिरिक्त है, जिसका उद्देश्य आपके केरस परियोजनाओं में उद्योग-शक्ति सीवी लाना है। लेखन के रूप में KerasCV अभी भी विकास में है, और इसमें पहले से ही 27 नई प्रीप्रोसेसिंग परतें शामिल हैं, RandAugment
, CutMix
, तथा MixUp
उनमें से कुछ होने के नाते।
इस संक्षिप्त मार्गदर्शिका में, हमने इस पर एक नज़र डाली है कि आप इसका उपयोग कैसे कर सकते हैं RandAugment
लागू परिवर्तनों की दी गई सूची से कई यादृच्छिक परिवर्तनों को लागू करने के लिए, और किसी भी केरस प्रशिक्षण पाइपलाइन में शामिल करना कितना आसान है।
आगे जाना - कंप्यूटर विजन के लिए व्यावहारिक गहन शिक्षण
आपका जिज्ञासु स्वभाव आपको और आगे जाना चाहता है? हम अनुशंसा करते हैं कि हमारी जाँच करें कोर्स: "पायथन के साथ कंप्यूटर विजन के लिए प्रैक्टिकल डीप लर्निंग".
एक और कंप्यूटर विजन कोर्स?
हम MNIST अंकों या MNIST फैशन का वर्गीकरण नहीं करेंगे। उन्होंने बहुत समय पहले अपनी भूमिका निभाई थी। उन्नत ब्लैक-बॉक्स आर्किटेक्चर को प्रदर्शन का बोझ उठाने देने से पहले बहुत से सीखने के संसाधन बुनियादी डेटासेट और बुनियादी आर्किटेक्चर पर ध्यान केंद्रित कर रहे हैं।
हम पर ध्यान केंद्रित करना चाहते हैं रहस्योद्घाटन, व्यावहारिकता, समझ, अंतर्ज्ञान और वास्तविक परियोजनाएं. सीखना चाहते है कैसे आप कुछ कर सकते है? हम आपको हमारे दिमाग की छवियों को संसाधित करने से लेकर स्तन कैंसर के लिए एक शोध-ग्रेड डीप लर्निंग क्लासिफायर लिखने से लेकर गहन शिक्षण नेटवर्क तक ले जाएंगे जो "मतिभ्रम" करते हैं, आपको व्यावहारिक कार्य के माध्यम से सिद्धांत और सिद्धांत सिखाते हैं, आपको इससे लैस करते हैं कंप्यूटर विज़न को हल करने के लिए गहन शिक्षण को लागू करने में विशेषज्ञ बनने के लिए जानकारी और उपकरण।
अंदर क़या है?
- दृष्टि के पहले सिद्धांत और कंप्यूटर को "देखना" कैसे सिखाया जा सकता है
- कंप्यूटर विज़न के विभिन्न कार्य और अनुप्रयोग
- व्यापार के उपकरण जो आपके काम को आसान बना देंगे
- कंप्यूटर विज़न के लिए डेटासेट खोजना, बनाना और उपयोग करना
- दृढ़ तंत्रिका नेटवर्क का सिद्धांत और अनुप्रयोग
- डेटासेट में डोमेन शिफ्ट, सह-घटना और अन्य पूर्वाग्रहों को संभालना
- अपने लाभ के लिए सीखने और दूसरों के प्रशिक्षण समय और कम्प्यूटेशनल संसाधनों का उपयोग करना स्थानांतरित करें
- एक अत्याधुनिक स्तन कैंसर क्लासिफायर का निर्माण और प्रशिक्षण
- मुख्यधारा के विचारों पर संदेह की एक स्वस्थ खुराक कैसे लागू करें और व्यापक रूप से अपनाई गई तकनीकों के निहितार्थ को समझें
- t-SNE और PCA का उपयोग करके ConvNet के "अवधारणा स्थान" की कल्पना करना
- बेहतर परिणाम प्राप्त करने के लिए कंपनियां कंप्यूटर विज़न तकनीकों का उपयोग कैसे करती हैं, इसका केस अध्ययन
- उचित मॉडल मूल्यांकन, गुप्त स्थान विज़ुअलाइज़ेशन और मॉडल के ध्यान की पहचान करना
- डोमेन अनुसंधान करना, अपने स्वयं के डेटासेट को संसाधित करना और मॉडल परीक्षण स्थापित करना
- अत्याधुनिक वास्तुकला, विचारों की प्रगति, उन्हें क्या विशिष्ट बनाता है और उन्हें कैसे लागू किया जाए
- KerasCV - अत्याधुनिक पाइपलाइन और मॉडल बनाने के लिए WIP लाइब्रेरी
- पेपर कैसे पार्स करें और पढ़ें और उन्हें स्वयं कैसे लागू करें
- अपने आवेदन के आधार पर मॉडल का चयन
- एंड-टू-एंड मशीन लर्निंग पाइपलाइन बनाना
- तेजी से आर-सीएनएन, रेटिनानेट्स, एसएसडी और योलो के साथ ऑब्जेक्ट डिटेक्शन पर लैंडस्केप और अंतर्ज्ञान
- इंस्टेंस और सिमेंटिक सेगमेंटेशन
- YOLOv5 . के साथ रीयल-टाइम ऑब्जेक्ट रिकग्निशन
- YOLOv5 ऑब्जेक्ट डिटेक्टरों का प्रशिक्षण
- KerasNLP (उद्योग-शक्ति WIP पुस्तकालय) का उपयोग कर ट्रांसफॉर्मर के साथ कार्य करना
- छवियों के कैप्शन उत्पन्न करने के लिए ट्रांसफॉर्मर को कन्वनेट के साथ एकीकृत करना
- DeepDream
- कंप्यूटर विज़न के लिए डीप लर्निंग मॉडल ऑप्टिमाइज़ेशन