تقویت داده های تصویر برای یادگیری عمیق

بدانید که افزایش داده های تصویر چیست و چگونه از آن با استفاده از Keras برای پروژه های یادگیری عمیق خود استفاده کنید

عکس کریس لاتون on می Unsplash

اگر تا به حال انجام تشخیص تصویر را با استفاده از یادگیری عمیق امتحان کرده اید، اهمیت یک مجموعه داده خوب برای آموزش را می دانید. با این حال، یافتن تصاویر کافی برای آموزش همیشه آسان نیست و دقت مدل شما مستقیماً به کیفیت داده‌های آموزشی وابسته است.

خوشبختانه، تکنیک‌هایی وجود دارد که می‌توانید برای تکمیل مجموعه داده‌های تصاویر که برای آموزش استفاده می‌کنند، استفاده کنید. یکی از تکنیک ها نام دارد افزایش داده های تصویر. در این مقاله، در مورد اینکه تقویت داده های تصویر چیست، چگونه کار می کند، چرا در یادگیری عمیق مفید است و در نهایت چگونه می توان با استفاده از کتابخانه Keras تقویت داده های تصویر را انجام داد، صحبت خواهم کرد.

افزایش داده های تصویری تکنیکی است که تصاویر جدیدی از تصاویر موجود ایجاد می کند. برای انجام این کار، تغییرات کوچکی مانند تنظیم روشنایی تصویر، یا چرخش تصویر، یا جابجایی سوژه در تصویر به صورت افقی یا عمودی در آنها ایجاد می کنید.

تکنیک های تقویت تصویر به شما این امکان را می دهد که به طور مصنوعی اندازه مجموعه آموزشی خود را افزایش دهید و در نتیجه داده های بسیار بیشتری را برای مدل خود برای آموزش فراهم کنید. این به شما این امکان را می دهد که دقت مدل خود را با افزایش توانایی مدل خود در تشخیص انواع جدید داده های آموزشی خود بهبود بخشید.

انواع افزایش داده های تصویری

تقویت تصویر به اشکال مختلفی انجام می شود، در اینجا برخی از موارد رایج وجود دارد - تغییر عمودی، تغییر افقی، چرخش عمودی، چرخش افقی، چرخش، تنظیم روشنایی، و بزرگنمایی/کوچک کردن.

من ابتدا تکنیک های مختلف تقویت تصویر را با استفاده از پایتون و کراس نشان خواهم داد. اگر می خواهید این کار را انجام دهید، مطمئن شوید که نرم افزار و بسته های زیر را نصب کرده اید:

پس از نصب Anaconda و TensorFlow، یک Jupyter Notebook جدید ایجاد کنید.

تغییر عمودی

اولین تکنیک تقویت تصویری که می خواهم نشان دهم این است تغییر عمودی. تغییر عمودی به طور تصادفی تصویر را به صورت عمودی به بالا یا پایین تغییر می دهد. برای این مثال، من قصد دارم از تصویری به نام استفاده کنم 747.jpg، در همان پوشه من Jupyter Notebook قرار دارد.

منبع تصویر: https://commons.wikimedia.org/wiki/File:Qantas_Boeing_747-438ER_VH-OEI_at_LAX.jpg. این فایل تحت مجوز عوام خلاق Attribution-Share Alike 2.0 عمومی مجوز.

قطعه کد زیر از ImageDataGenerator کلاس در Keras برای جابجایی عمودی تصویر.

La ImageDataGenerator کلاس از Keras دسته‌ای از داده‌های تصویر را با افزایش داده‌های بلادرنگ تولید می‌کند.

#--- وارد کردن ماژول ها ---
numpy را به عنوان np وارد کنید
matplotlib.pyplot را به صورت plt وارد کنید
از tensorflow.keras.preprocessing.image import load_img
از tensorflow.keras.preprocessing.img_to_array واردات تصویر
از tensorflow.keras.preprocessing.image import ImageDataGenerator
#---تصویر را بارگذاری کنید---
image_filename = '747.jpg'
img = load_img (نام_فایل تصویر)
#---تبدیل تصویر به آرایه سه بعدی ---
image_data = img_to_array(img)
#---تبدیل به یک آرایه 4 بعدی از 1 عنصر آرایه سه بعدی نشان دهنده
# تصویر---
images_data = np.expand_dims(تصویر_داده، محور=0)
#---ایجاد تولید کننده افزایش داده تصویر---
datagen = ImageDataGenerator (width_shift_range=0.2)
#---تکرارگر را آماده کنید. flow () یک آرایه 4 بعدی را می گیرد و برمی گرداند
# تکرار کننده حاوی دسته ای از تصاویر ---
train_generator = datagen.flow(images_data، batch_size=1)
ردیف = 5
ستون = 4
#--- 5 سطر و 4 ستون را رسم کنید ---
fig، axes = plt.subplots (ردیف ها، ستون ها)
برای r در محدوده (ردیف):
برای c در محدوده (ستون ها):
#---تصویر بعدی را در دسته دریافت کنید (یک تصویر از دسته
# سایز 1 است)---
image_batch = train_generator.next()

#--- تبدیل به اعداد صحیح بدون علامت برای مشاهده ---
image = image_batch[0].atype('uint8')

#---نمایش تصویر---
axes[r,c].imshow(تصویر)
#---اندازه شکل را تنظیم کنید---
fig.set_size_inches (15,10،XNUMX)

قطعه کد بالا خروجی زیر را تولید می کند:

همانطور که از خروجی بالا می بینید، هر بار که با آن تماس می گیرید next() روش از train_generator شی، تصویری دریافت می کنید که کمی تغییر یافته است. در قطعه کد بالا، هر بار که با آن تماس می گیرید، یک تصویر جدید که 20 درصد بر اساس ارتفاع تصویر اصلی جابه جا می شود، برگردانده می شود. next() روش:

datagen = ImageDataGenerator(width_shift_range=0.2)

جالب است که برای این نسخه از ImageDataGenerator (tensorflow.keras.preprocessing.image) کلاس، مشخص کردن width_shift_range پارامتر تصویر را به جای افقی به صورت عمودی جابجا می کند (که رفتار قدیمی تر استImageDataGeneratorاز keras.preprocessing.image مدول). به همین ترتیب، اگر می خواهید تصویر به صورت افقی جابجا شود، باید از آن استفاده کنید height_shift_range پارامتر (به بخش بعدی مراجعه کنید).

توجه داشته باشید که next() متد هر چند بار که بخواهید یک تصویر تقویت شده را برمی گرداند. در قطعه کد بالا، 20 بار آن را فراخوانی کردیم (5 ردیف در 4 ستون).

شیفت افقی

اکنون می توانید سعی کنید با استفاده از این تصویر را به صورت افقی تغییر دهید height_shift_range پارامتر:

datagen = ImageDataGenerator(height_shift_range=0.2)
train_generator = datagen.flow(images_data، batch_size=1)
ردیف = 5
ستون = 4
fig، axes = plt.subplots (ردیف ها، ستون ها)
برای r در محدوده (ردیف):
برای c در محدوده (ستون ها):
image_batch = train_generator.next()
image = image_batch[0].atype('uint8')
axes[r,c].imshow(تصویر)
fig.set_size_inches (15,10،XNUMX)

قطعه کد بالا خروجی زیر را تولید می کند:

تلنگر افقی

گاهی اوقات منطقی است که تصویر را به صورت افقی برگردانید. در مورد هواپیما، قسمت جلویی هواپیما ممکن است به سمت چپ یا راست باشد:

datagen = ImageDataGenerator(horizontal_flip=درست است)
train_generator = datagen.flow(images_data، batch_size=1)
ردیف = 2
ستون = 2
fig، axes = plt.subplots (ردیف ها، ستون ها)
برای r در محدوده (ردیف):
برای c در محدوده (ستون ها):
image_batch = train_generator.next()
image = image_batch[0].atype('uint8')
axes[r,c].imshow(تصویر)
fig.set_size_inches (15,10،XNUMX)

برای قطعه کد بالا، ایجاد چهار تصویر به اندازه کافی خوب است زیرا ممکن است قسمت جلوی هواپیما به سمت چپ یا راست باشد:

به یاد داشته باشید که ورق زدن تصادفی است (گاهی اوقات شما هر چهار تصویر اصلی را دریافت می کنید و گاهی اوقات تصاویری دریافت می کنید که به صورت افقی برگردانده می شوند). این احتمال وجود دارد که چهار تصویر بالا همگی یکسان باشند. اگر این اتفاق افتاد، فقط آن بلوک کد را دوباره اجرا کنید.

چرخش عمودی

درست مانند چرخش افقی، می توانید چرخش عمودی را نیز انجام دهید:

datagen = ImageDataGenerator(vertical_flip=درست است)
train_generator = datagen.flow(images_data، batch_size=1)
ردیف = 2
ستون = 2
fig، axes = plt.subplots (ردیف ها، ستون ها)
برای r در محدوده (ردیف):
برای c در محدوده (ستون ها):
image_batch = train_generator.next()
image = image_batch[0].atype('uint8')
axes[r,c].imshow(تصویر)
fig.set_size_inches (15,10،XNUMX)

در مورد هواپیماها، شاید خیلی منطقی نباشد که هواپیمای خود را وارونه کنیم! اگر می‌خواهید تشخیص تصویر را انجام دهید، به احتمال زیاد تصاویر شما از هواپیماها قائم هستند و بنابراین آموزش مدل خود برای تشخیص هواپیماهای وارونه ممکن است چندان رایج نباشد. برای موارد دیگر، چرخش عمودی بسیار منطقی است.

چرخش

چرخش، همانطور که از نام آن پیداست، تصویر شما را می چرخاند. این برای تصویر هواپیمای ما بسیار مفید خواهد بود. قطعه کد زیر به صورت تصادفی تصویر را تا 50 درجه می چرخاند:

datagen = ImageDataGenerator(rotation_range=50)
train_generator = datagen.flow(images_data)
ردیف = 5
ستون = 4
fig، axes = plt.subplots (ردیف ها، ستون ها)
برای r در محدوده (ردیف):
برای c در محدوده (ستون ها):
image_batch = train_generator.next()
image = image_batch[0].atype('uint8')
axes[r,c].imshow(تصویر)
fig.set_size_inches (15,10،XNUMX)

با چرخش، خروجی هواپیماها را در موقعیت‌های مختلف نشان می‌دهد - شبیه‌سازی موقعیت‌های برخاست و فرود:

روشنایی

یکی دیگر از تکنیک های تقویت، تنظیم روشنایی تصویر است. قطعه کد زیر محدوده ای از مقادیر تغییر روشنایی را تنظیم می کند:

datagen = ImageDataGenerator(محدوده_روشنایی=[0.15,2.0،XNUMX])
train_generator = datagen.flow(images_data، batch_size=1)
ردیف = 5
ستون = 4
fig، axes = plt.subplots (ردیف ها، ستون ها)
برای r در محدوده (ردیف):
برای c در محدوده (ستون ها):
image_batch = train_generator.next()
image = image_batch[0].atype('uint8')
axes[r,c].imshow(تصویر)
fig.set_size_inches (15,10،XNUMX)

خروجی شامل مجموعه ای از تصاویر با روشنایی متفاوت است:

زوم کردن

همچنین می توانید تصاویر را بزرگ یا کوچک کنید:

datagen = ImageDataGenerator(zoom_range=[5,0.5])
train_generator = datagen.flow(images_data، batch_size=1)
ردیف = 5
ستون = 4
fig، axes = plt.subplots (ردیف ها، ستون ها)
برای r در محدوده (ردیف):
برای c در محدوده (ستون ها):
image_batch = train_generator.next()
image = image_batch[0].atype('uint8')
axes[r,c].imshow(تصویر)
fig.set_size_inches (15,10،XNUMX)

خروجی تصویر را در نسبت های مختلف زوم نشان می دهد:

توجه داشته باشید که بزرگنمایی تصاویر نسبت تصویر را تغییر می دهد.

ترکیب همه تقویت ها

البته، تمام تکنیک‌های تقویت‌کننده‌ای که تاکنون در مورد آنها صحبت کردم، قابل ترکیب هستند:

datagen = ImageDataGenerator(width_shift_range=0.2،
height_shift_range=0.2،
horizontal_flip=درست است،
rotation_range=50،
محدوده_روشنایی=[0.15,2.0،XNUMX]،
zoom_range=[5,0.5]
)
train_generator = datagen.flow(images_data، batch_size=1)ردیف = 8
ستون = 8
fig، axes = plt.subplots (ردیف ها، ستون ها)
برای r در محدوده (ردیف):
برای c در محدوده (ستون ها):
image_batch = train_generator.next()
image = image_batch[0].atype('uint8')
axes[r,c].imshow(تصویر)
fig.set_size_inches (15,10،XNUMX)

توجه داشته باشید که من چرخش عمودی را کنار گذاشته ام زیرا برای مثال ما معنی ندارد.

اکنون خروجی تصویر را با افزایش های مختلف اعمال شده نشان می دهد:

بخش‌های قبلی اصول اولیه تقویت داده‌های تصویر و نحوه اعمال آن بر روی یک تصویر را نشان داد. در یادگیری عمیق، ما اغلب با مجموعه ای از تصاویر سروکار داریم. بنابراین بیایید اکنون ببینیم که چگونه می توان تقویت تصویر را برای مجموعه ای از تصاویر اعمال کرد. برای مثال، می‌خواهم فرض کنم که در پوشه‌ای که حاوی نوت بوک Jupyter شما است، یک میوه ها پوشه و زیر پوشه های زیر:

میوه ها
|__موز
|__banana1.jpg
|__banana2.jpg
|__banana3.jpg
|__...
|__دوریان
|__durian1.jpg
|__durian2.jpg
|__durian3.jpg
|__...
|__نارنجی
|__orange1.jpg
|__orange2.jpg
|__orange3.jpg
|__...
|__توت فرنگی
|__strawberry1.jpg
|__strawberry2.jpg
|__strawberry3.jpg
|__...

هر زیر پوشه شامل مجموعه ای از تصاویر است. به عنوان مثال موز پوشه شامل تعدادی تصویر به نام banana1.jpg, banana2.jpg، و غیره. نام زیرپوشه ها به عنوان برچسب برای تصاویر مختلف عمل می کند. این بدان معنی است که تمام فایل های زیر موز پوشه حاوی تصاویر موز و غیره است.

برای بارگذاری یک سری تصاویر از دیسک، اکنون با شماره تماس بگیرید flow_from_directory() روش ImageDataGenerator نمونه به جای flow() روش (برای بارگذاری تصاویر از حافظه):

train_datagen = ImageDataGenerator(
horizontal_flip=درست است،
vertical_flip=درست است،
rotation_range=50،
)
دسته_اندازه = 8قطار_ژنراتور = train_datagen.flow_from_directory(
"./میوه ها"،
target_size=(224,224)
color_mode='rgb'،
batch_size=بچ_اندازه،
class_mode='categorical',
زدن=درست)

توجه کنید که من اکنون تنظیم کردم batch_size تا 8. به زودی استفاده از اندازه دسته را خواهید دید.

با استفاده از تکرار کننده بازگشتی، می توانم برچسب های میوه های مختلف (موز، دوریان، پرتقال و توت فرنگی) را پیدا کنم:

class_dictionary = train_generator.class_indices#--- ایجاد فرهنگ لغت از برچسب ها ---
class_dictionary = { value:key for key,value in
class_dictionary.items()}
#---تبدیل فرهنگ لغت به لیست ---
class_list = [مقدار _، مقدار در class_dictionary.items()]
چاپ (فهرست_کلاس)

خروجی زیر را خواهید دید:

54 تصویر متعلق به 4 کلاس پیدا شد.
['موز'، 'دوریان'، 'پرتقال'، 'توت فرنگی']

در کل، در مجموع 54 تصویر در 4 پوشه وجود دارد. همچنین class_list متغیر شامل لیست میوه ها است.

من اکنون مجموعه ای از تصاویر افزوده شده را چاپ می کنم ImageDataGenerator کلاس من به‌طور دلخواه ردیف‌ها را روی 10 تنظیم می‌کنم و برای هر ردیف، می‌خواهم دسته‌ای از تصاویر بازگشتی را چاپ کنم (که در این مثال 8 است):

ردیف = 10fig، axes = plt.subplots (ردیف‌ها، اندازه دسته)برای r در محدوده (ردیف):    
#---دسته ای از تصاویر تقویت شده را دریافت کنید---
image_batch = train_generator.next()
#---تعداد تصاویر برگشتی را دریافت کنید---
images_count = image_batch[0].shape[0]

برای c در محدوده (تصاویر_شمار):
#--- تبدیل به اعداد صحیح بدون علامت برای مشاهده ---
image = image_batch[0][c].atype('uint8')

#---نمایش تصویر---
axes[r,c].imshow(تصویر)

#---نمایش برچسب تصویر ---
axes[r,c].title.set_text(
class_list[np.argmax(image_batch[1][c])])
#--- تیک های x و y را پنهان می کند---
axes[r,c].set_xticks([])
axes[r,c].set_yticks([])
fig.set_size_inches (15,18،XNUMX)

از آنجا که batch_size اکنون روی 8 (و نه دیگر 1) تنظیم شده است train_generator.next() روش شما را برمی گرداند a دسته هر بار که با آن تماس می گیرید، هشت تصویر افزوده شده است. تعداد تصاویر برگردانده شده بر اساس آن است batch_size که قبلا در flow_from_directory() روش:

train_generator = train_datagen.flow_from_directory(
"./میوه ها"،
target_size=(224,224)
color_mode='rgb'،
batch_size=بچ_اندازه، # اندازه_ دسته = 8
class_mode='categorical',
زدن=درست)

مقدار image_batch متغیر (برگردانده شده توسط next() روش) مجموعه ای از دو عنصر است:

  • عنصر اول (image_batch[0]) آرایه ای از دسته_اندازه تصاویر (آرایه 4 بعدی)
  • عنصر دوم (image_batch[1]) حاوی برچسب هایی برای تصاویر است

قطعه کد بالا خروجی زیر را تولید می کند:

توجه داشته باشید که در ردیف هفتم، دو نمودار خالی بدون تصویر وجود دارد. به یاد بیاورید که در مجموع 54 تصویر در مجموعه تصاویر وجود دارد، و از آنجایی که هر دسته 8 تصویر (در هر ردیف) را برمی گرداند، هفت ردیف اول در مجموع 54 تصویر (8×6 + 6) نمایش می دهند. شکل زیر به وضوح نشان می دهد:

توجه داشته باشید که می توانید تنظیم کنید rows به هر شماره و ImageDataGenerator کلاس به تولید تصاویر جدید افزوده شده برای شما ادامه خواهد داد.

ساخت مدل با استفاده از یادگیری انتقالی

اکنون می دانید که چگونه از آن استفاده کنید ImageDataGenerator برای بارگذاری مجموعه ای از تصاویر از دیسک برای تقویت. اما چگونه از آن برای آموزش استفاده می کنید؟ قطعه کد زیر نحوه ساخت یک مدل یادگیری عمیق را با استفاده از آن نشان می دهد انتقال یادگیری.

یادگیری انتقالی یک روش یادگیری ماشینی است که در آن یک مدل توسعه‌یافته برای یک کار به عنوان نقطه شروع برای یک مدل در یک کار دوم دوباره استفاده می‌شود. یادگیری انتقالی مدت زمانی را که برای آموزش صرف می کنید کاهش می دهد.

از tensorflow.keras.models import Model
از tensorflow.keras.applications واردات VGG16
از tensorflow.keras.layers واردات متراکم، GlobalAveragePooling2D
#---تعداد میوه ها---
NO_CLASSES = max(train_generator.class_indices.values()) + 1
#---لود مدل VGG16 به عنوان مدل پایه برای آموزش ---
base_model = VGG16(include_top=False, input_shape=(224, 224, 3))
#---لایه های خودمان را اضافه کنیم---
x = base_model.output
x = GlobalAveragePooling2D()(x)
x = Dense(1024,activation='relu')(x) # لایه های متراکم اضافه کنید تا
# که مدل می تواند
# پیچیده تر یاد بگیرید
# توابع و
# طبقه بندی برای بهتر
# نتایج.
x = متراکم (1024، فعال سازی = 'relu') (x) # لایه متراکم 2
x = متراکم (512، فعال سازی = 'relu') (x) # لایه متراکم 3
preds = متراکم (NO_CLASSES،
activation='softmax')(x) # لایه نهایی با
# فعال سازی softmax
#---یک مدل جدید با مدل اصلی مدل پایه ایجاد کنید
# ورودی و خروجی مدل جدید ---
model = مدل (ورودی ها = base_model.input، خروجی ها = preds)
#---19 لایه اول را آموزش ندهید - 0..18---
برای لایه در model.layers[:19]:
layer.trainable=نادرست
#---بقیه لایه ها را آموزش دهید - 19 به بعد---
برای لایه در model.layers[19:]:
layer.trainable=درست است

#---کامپایل مدل ---
model.compile(optimizer='Adam',
loss='categorical_crossentropy',
متریک=['دقت'])

توضیح نحوه عملکرد یادگیری انتقالی از حوصله این مقاله خارج است. آن را برای مقاله دیگری می گذارم.

استفاده از تصاویر تولید شده برای آموزش

برای استفاده از تصاویر افزوده شده برای آموزش، عبور کنید train_generator به fit() روش مدل:

#---مدل را آموزش دهید---
step_size_train = train_generator.n // train_generator.batch_size
model.fit(train_generator,
Steps_per_epoch=step_size_train،
دوره = 15)

La steps_per_epoch پارامتر اساساً به این معنی است که در یک دوره چند مرحله وجود دارد - این به تعداد تصاویری که دارید و اندازه دسته ای که قبلاً تعریف شده است بستگی دارد. اگر این عدد را روی یک عدد بالا تنظیم کنید، پس در حال انجام تمرینات تکراری هستید. شما باید آن را بر اساس این فرمول تنظیم کنید:

تعداد تصاویر / اندازه دسته ای

در مثال ما در مجموع 54 تصویر داریم. و بنابراین در هر دوره، ImageDataGenerator کلاس تمام 54 تصویر را برای آموزش تغییر می دهد. در هر دوره مدل تغییرات مختلفی از تصاویر را دریافت می کند. اگر 15 دوره دارید، در مجموع تغییرات 15×54 از تصاویر تولید شده و به مدل آموزشی وارد می شود.

La ImageDataGenerator class به مدل شما اجازه می دهد تا تغییرات جدیدی از تصاویر را در هر دوره دریافت کند. اما به یاد داشته باشید که فقط تصاویر تبدیل شده را برمی گرداند و آن را به مجموعه تصاویری که دارید اضافه نمی کند.

امیدوارم این مقاله به شما ایده خوبی از تقویت داده های تصویری داده باشد و چرا در آموزش مدل های یادگیری عمیق خود به آنها نیاز دارید. به طور خاص، من آن را با استفاده از ماژول Keras در کتابخانه TensorFlow نشان داده‌ام.

افزایش داده‌های تصویر برای یادگیری عمیق از منبع https://towardsdatascience.com/image-data-augmentation-for-deep-learning-77a87fabd2bf?source=rss—-7f60cf5620c9—4 از طریق https://towardsdatascience.com/

<!–

->

تمبر زمان:

بیشتر از مشاوران بلاک چین