افزایش داده برای مدت طولانی به عنوان وسیله ای برای جایگزینی یک مجموعه داده "ایستا" با انواع تبدیل شده عمل می کند و عدم تغییر را تقویت می کند. شبکه های عصبی کانولوشن (CNN)، و معمولاً منجر به استحکام ورودی می شود.
توجه داشته باشید: تغییر ناپذیری به این خلاصه میشود که در هنگام تصمیمگیری، مدلها نسبت به ابهامات خاص کور شوند. اگر آن را آینه کنید یا بچرخانید، تصویر گربه همچنان تصویری از گربه است.
در حالی که افزایش داده ها به شکلی که ما از آن استفاده می کردیم، 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'))
لایه دارای یک 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 را با بهترین روش ها، استانداردهای پذیرفته شده در صنعت و برگه تقلب شامل بررسی کنید. دستورات Google Git را متوقف کنید و در واقع یاد گرفتن آی تی!
این به طور طبیعی به این معنی است که همه تقویتها نباید اعمال شوند، به خصوص اگر میزان را پایین بیاورید rate
. همچنین میتوانید عملیات مجاز را از طریق a سفارشی کنید RandomAugmentationPipeline
لایه، که RandAugment
مورد خاص است. راهنمای جداگانه در RandomAugmentationPipeline
به زودی منتشر خواهد شد.
آموزش Classifier با و بدون 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()
تابعی که اندازه آنها را تغییر می دهد تا مجموعه داده را با آن ترسیم کند، و همچنین یک 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)
به طور متناوب، می توانید از جریان استفاده کنید 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 یک بسته جداگانه است، اما همچنان یک افزودنی رسمی به Keras است که توسط تیم Keras توسعه یافته است، با هدف ارائه CV با قدرت صنعتی به پروژه های Keras شما. KerasCV هنوز در حال توسعه است و در حال حاضر شامل 27 لایه پیش پردازش جدید است. RandAugment
, CutMix
و MixUp
برخی از آنها بودن
در این راهنمای کوتاه، نگاهی به نحوه استفاده شما انداخته ایم RandAugment
برای اعمال تعدادی تبدیل تصادفی از یک لیست داده شده از تبدیل های کاربردی، و چقدر آسان است که در هر خط لوله آموزشی Keras گنجانده شود.
رفتن به جلو - یادگیری عمیق عملی برای بینایی کامپیوتر
طبیعت کنجکاو شما باعث می شود که بخواهید جلوتر بروید؟ توصیه می کنیم ما را بررسی کنید دوره: "یادگیری عمیق عملی برای بینایی کامپیوتر با پایتون".
یکی دیگر از دوره های بینایی کامپیوتر؟
ما طبقه بندی ارقام MNIST یا مد MNIST را انجام نخواهیم داد. آنها مدتها پیش نقش خود را انجام دادند. بسیاری از منابع یادگیری قبل از اینکه به معماریهای جعبه سیاه پیشرفته اجازه دهند بار عملکرد را به دوش بکشند، روی مجموعه دادههای پایه و معماریهای پایه تمرکز میکنند.
ما می خواهیم روی آن تمرکز کنیم ابهام زدایی, عملی بودن, درک, شهود و پروژه های واقعی. می خواهند یاد بگیرند چگونه تو می توانی تفاوت ایجاد کنی؟ ما شما را از روشی که مغزمان تصاویر را پردازش میکند تا نوشتن طبقهبندیکننده یادگیری عمیق برای سرطان سینه تا شبکههای یادگیری عمیق که «توهم میکنند»، آموزش اصول و تئوری به شما از طریق کار عملی، و تجهیز شما به دانش و ابزارهایی برای تبدیل شدن به یک متخصص در استفاده از یادگیری عمیق برای حل بینایی کامپیوتر.
داخل چیست؟
- اولین اصول بینایی و نحوه آموزش دیدن کامپیوترها
- وظایف و کاربردهای مختلف بینایی کامپیوتر
- ابزارهای تجارت که کار شما را آسان می کند
- یافتن، ایجاد و استفاده از مجموعه داده ها برای بینایی کامپیوتری
- تئوری و کاربرد شبکه های عصبی کانولوشنال
- مدیریت تغییر دامنه، همزمانی و سایر سوگیری ها در مجموعه داده ها
- آموزش را انتقال دهید و از زمان آموزشی و منابع محاسباتی دیگران به نفع خود استفاده کنید
- ساخت و آموزش پیشرفته ترین طبقه بندی سرطان سینه
- چگونه می توان دوز سالمی از شک و تردید را در ایده های جریان اصلی به کار برد و پیامدهای تکنیک های پذیرفته شده را درک کرد
- تجسم فضای مفهومی ConvNet با استفاده از t-SNE و PCA
- مطالعات موردی چگونگی استفاده شرکت ها از تکنیک های بینایی کامپیوتری برای دستیابی به نتایج بهتر
- ارزیابی صحیح مدل، تجسم فضای پنهان و شناسایی توجه مدل
- انجام تحقیقات دامنه، پردازش مجموعه داده های خود و ایجاد آزمون های مدل
- معماری های پیشرفته، پیشرفت ایده ها، آنچه آنها را منحصر به فرد می کند و نحوه اجرای آنها
- KerasCV - یک کتابخانه WIP برای ایجاد خطوط لوله و مدل های پیشرفته
- نحوه تجزیه و خواندن مقالات و پیاده سازی آنها توسط خودتان
- انتخاب مدل ها بسته به برنامه شما
- ایجاد خط لوله یادگیری ماشینی سرتاسر
- چشم انداز و شهود در تشخیص اشیا با R-CNN سریعتر، رتینا نت، SSD و YOLO
- نمونه و تقسیم بندی معنایی
- تشخیص شی در زمان واقعی با YOLOv5
- آموزش آشکارسازهای شی YOLOv5
- کار با ترانسفورماتورها با استفاده از KerasNLP (کتابخانه WIP با قدرت صنعتی)
- ادغام ترانسفورماتورها با ConvNets برای تولید شرح تصاویر
- عمیق
- بهینه سازی مدل یادگیری عمیق برای بینایی کامپیوتر