پروژه تشخیص گربه و سگ با بینایی ماشین با پایتون

محتویات
در این آموزش ما یک مدل آماده را که برای تشخیص انواع تصاویر آموزش دیده است، دوباره آموزش میدهیم تا بتوانیم پروژه تشخیص سگ و گربه را راه اندازی کنیم. این مدل موجود ویژگی های مختلف یک تصویر را بررسی میکند و ما یک لایه جدید به آن اضافه میکنیم تا به توانایی های آن اضافه کنیم.
شما در نهایت میتوانید مشاهده کنید تصویر ارسالی شما چقدر به موارد مختلف شباهت دارد. این آموزش بسیار کامل و جذاب است.
به چه چیزی نیاز دارید؟
- یک کامپیوتر یا رزبری پای
- یک اتصال اینترنتی
- یک حساب کاربری گوگل
به جای آموزش یک مدل کاملاً جدید، برای این پروژه از یک مدل موجود به نام MobileNetV2 استفاده میکنیم. مدل MobileNetV2 برای طبقه بندی بسیاری از تصاویر مختلف آموزش دیده است، به این معنی که قبلاً برای شناسایی ویژگی های جالب تصاویر آموزش دیده است. بنابراین ما فقط قابلیت تشخیص گربه و سگ را به این مدل اضافه میکنیم تا سریع تر پیش رفته باشیم.
مدل یادگیری ماشین چیست؟
هر مدل مجموعه ای از قوانینی است که رایانه برای تکمیل یک کار یاد گرفته است، مانند آنچه در تصویر نشان داده شده است. این قوانین به چند لایه تقسیم می شوند. هر لایه به نتایج لایه قبل از خود نگاه می کند و آنها را در برابر برخی قوانین آزمایش می کند تا تصمیم بگیرد که چه نتایجی به لایه بعدی منتقل شود.
یک دایره مشکی که با فلش به هر دایره در ستونی از سه دایره صورتی متصل است. هر یک از آن دایره ها به نوبه خود با فلش هایی به دو دایره در ستون از دو بعدی متصل می شوند، که هر یک از آنها با فلش ها به دایره های ستون بعدی (ستون با چهار دایره صورتی) متصل میشوند. در نهایت، آن چهار دایره با فلش به دو دایره سبز رنگ متصل می شوند.
در هر لایه دایره ها نمایانگر یک قانون هستند و بررسی میکنند ورودی با کدام قانون سازگار است.
اولین لایه ورودی مدل (تصویر مورد نظر) است . به همین دلیل لایه اول اغلب لایه ورودی نامیده می شود. آخرین لایه (خروجی) یک مدل طبقهبندی کننده همیشه دارای تعدادی گره برابر با تعداد طبقهبندیهایی است که مدل برای شناسایی آموزش دیده است. به عنوان مثال، در مدل این پروژه، دو گره در لایه نهایی وجود خواهد داشت، زیرا ورودی های خود را به دو دسته تصاویر سگ یا گربه طبقه بندی می کند.
تست عملکرد مدل یادگیری ماشین
یک پروژه Google Colab با مقداری کد شروع برای شما آماده شده است. اولین کاری که باید انجام دهید این است که آن را باز کنید و کپی خود را ذخیره کنید تا روی آن کار کنید. قبل از شروع به تغییر هر چیزی، مطمئن شوید که نوت بوک را در درایو خود ذخیره کرده اید تا بتوانید کار خود را حفظ کنید! با رفتن به منوی File و انتخاب گزینه Save a copy in Drive یک کپی بگیرید.
ابتدا اندازه تصاویری که استفاده می کنید را مشخص کنید. مجموعه داده ای که برای آموزش مدل استفاده می کنید از تصاویر 160×160 پیکسل تشکیل شده است و این مقدار قبلاً در یک متغیر IMAGE_SIZE ذخیره شده است. با این حال، به دلیل نحوه عملکرد رنگ در رایانه ها، تصاویر در واقع سه مجموعه 160×160 پیکسل هستند که هر کدام مقادیر قرمز، آبی و سبز هستند. در نهایت ترکیب شده و رنگ نمایش داده شده در هر پیکسل را تشکیل می دهند.
اکنون، در زیر متغیر IMAGE_SHAPE
، مدل MobileNetV2 را وارد کنید که برای شناسایی بارهای اشیاء مختلف آموزش دیده است. IMAGE_SHAPE خود را به عنوان ورودی_شکل آن ارسال کنید و آن را در یک متغیر original_model ذخیره کنید.
original_model = tf.keras.applications.MobileNetV2(input_shape=IMAGE_SHAPE)
از آنجایی که MobileNetV2 برای کار بر روی یک دستگاه تلفن همراه با باتری محدود، مانند تلفن، طراحی شده است، به اندازه برخی مدلهای دیگر بزرگ یا قدرتمند نیست. این بدان معنی است که قدرت تشخیص آن کاملا دقیق نیست. قبل از اینکه آن را ویرایش کنیم بیایید بررسی کنیم یک سگ را چقدر خوب تشخیص میدهد.
در زیر import، این خط را اضافه کنید:
predict_with_old_model('https://dojo.soy/predict-dog')
حالا وقت آن است که کد را اجرا کنیم تا ببینیم برنامه چقدر خوب عمل میکند. با باز کردن منوی Runtime و انتخاب Run all می توانید تمام کدها را اجرا کنید. اولین باری که این کار را انجام می دهید، ممکن است کمی طول بکشد، زیرا برنامه شما باید داده های زیادی را هم برای مجموعه داده آموزشی و هم برای خود مدل دانلود کند.
نتیجه به شرح زیر است:
چند نژاد سگ در این مدل ها وجود دارد اما طبقه بندی مناسبی نیست. ما میخواهیم آن را بهبود ببخشیم. حالا وقت آن است که خطی که اضافه کردید یعنی predict_with_old_model
را حذف کنید زیرا فقط برای تست استفاده میشود.
شما باید لایه بالایی را از مدل MobileNetV2 موجود حذف کنید. این لایه جایی است که مدل تصمیم میگیرد بگوید چه چیزی در تصویر است. بنابراین باید آن را حذف کنید و لایه های مربوط به گربه ها و سگ ها را اضافه کنید. وقتی مدل را بارگذاری می کنید می توانید این کار را انجام دهید. نمودار همان لایه های دایره های سیاه، صورتی و سبز را که قبلا مشاهده کردید در نظر بگیرید. با این تفاوت که در لایه نهایی مجموعه ای از چند نقطه آبی حذف شده اند و یک جفت نقطه سبز در آن قرار گرفته اند.
خطی را که در آن original_model بارگذاری می کنید به روز کنید تا پارامتر include_top
را اضافه کنید و آن را روی False
قرار دهید.
original_model = tf.keras.applications.MobileNetV2(input_shape=IMAGE_SHAPE, include_top=False)
در نهایت، چون نمیخواهید چیز دیگری را در مدل اصلی تغییر دهید، باید آن را در حالت غیر قابل آموزش تنظیم کنید.
در زیر خطی که original_model را ایجاد می کنید، ویژگی Trainable
آن را روی False
قرار دهید.
original_model.trainable = False
تنظیم داده های آموزشی مدل بینایی کامپیوتر
در مرحله بعد، باید مدل را با مقداری داده آموزش دهید. مدلها از مثالها، معمولاً هزاران نمونه، یاد میگیرند و از آنها برای ایجاد قوانین خود استفاده میکنند. برخی از آن قواعد ممکن است تشخیص اجزا و سپس ترکیب آن برای تشخیص باشد. اگر از داده های متنوع برای آموزش مدل خود استفاده نکنید، با مشکلاتی روبرو میشوید. به طور مثال اگر در تصاویر آموزشی، یک گربه سیاه قرار دهید اما هیچ سگ سیاهی قرار ندهید، مدل فرض میکند که “سیاه = گربه”.
بنابراین باید از هر کدام نمونه های خیلی زیادی قرار دهید تا دقت عملکرد مدل بالا رود. برای این پروژه، از مجموعه دادههای موجود از گربهها و سگها استفاده میکنیم که توسط کتابخانه TensorFlow ارائه شده است.
شایان ذکر است که یکی از چیزهای جالب در مورد مدلهای یادگیری ماشینی این است که آنها همه چیزهایی را که از دادههای آموزشی آموختهاند، بدون نیاز به ذخیره خود دادههای آموزشی به خاطر میآورند. این بدان معناست که میتوانید از میلیونها تصویر برای آموزش یک مدل بدون اینکه حجم آن خیلی زیاد شود استفاده کنید. حتما تا الان میدانید که مدلی که روی میلیون ها تصویر آموزش دیده باشد، در حدس زدن بسیار بهتر از مدلی است که فقط روی چند تصویر آموزش دیده است.
کدی در سلول دوم وجود دارد که داده های آموزشی cats_vs_dogs را بارگیری می کند. این دادهها مجموعهای از فایلهای تصویری و برچسبهای این فایلها هستند که به رایانه میگویند که کدام تصویر گربه و کدام یک سگ است.
import tensorflow_datasets as tfds (raw_training, raw_validation, raw_testing), metadata = tfds.load( 'cats_vs_dogs', split=['train[:80%]', 'train[80%:90%]', 'train[90%:]'], with_info=True, as_supervised=True, )
داده ها با درصدهای تعریف شده در پارامتر split
به سه گروه تقسیم می شوند:
- داده های آموزشی: برای آموزش مدل استفاده می شود – برای یادگیری قوانین و تصمیم گیری در مورد اهمیت آنها
- داده های اعتبارسنجی: برای ارزیابی عملکرد مدل در حین آموزش استفاده می شود. در طول فرآیند آموزش به طور منظم بررسی می شود. این مورد ها باید جدا از دادههای آموزشی باشند، در غیر این صورت مدل ممکن است فقط تصاویر دقیق را که در دادههای آموزشی آموخته است تشخیص دهد.
- دادههای تست: در طول فرآیند آموزش استفاده نمیشود، اما برای ارزیابی عملکرد آن بر روی دادههای دیده نشده استفاده میشود.
دادههای این سه گروه باید به دستهای تقسیم شوند که تعیین میکنند هر قانون چقدر مهم است. هر چه دسته بزرگتر باشد، فاصله بین بهروزرسانیها بیشتر میشود. هیچ قانون واقعی برای اینکه دسته های شما چقدر باید بزرگ باشند وجود ندارد، و ممکن است ارزش آن را داشته باشد که اندازه های دسته های مختلف را روی داده های مختلف آزمایش کنید تا ببینید آیا نتایج بهتری می گیرید یا خیر. دستههای کوچکتر نیز میتوانند به شما کمک کنند تا یک مدل را در رایانهای با حافظه کمتر (مثلاً در Raspberry Pi) آموزش دهید. اندازه های محبوب 32، 64، 128 و 256 هستند. می توان از دسته هایی به کوچکی یک تصویر یا به بزرگی کل مجموعه داده خود استفاده کرد. در این آموزش از 32 استفاده خواهیم کرد.
در دومین سلول خالی نوت بوک، یک متغیر BATCH_SIZE با مقدار 32 ایجاد کنید.
BATCH_SIZE = 32
استفاده از حروف بزرگ در اینجا به این معنی است که به صورت دستی توسط برنامه نویس تنظیم می شوند، اما در طول برنامه تغییر نمی کنند. اگر بخواهید میتوانید 32 را مستقیماً در جایی که متغیر مورد استفاده قرار میگیرد وارد کنید.
هر دسته به طور تصادفی از میان بافر تصادفی تصاویر انتخاب شده از مجموعه آزمایشی کامل، اعتبارسنجی یا آموزش انتخاب می شود. شما باید اندازه این بافر را مشخص کنید. هرچه بزرگتر باشد معمولا خوب است، اما برنامه کندتر اجرا می شود. دوباره با ایجاد یک متغیر برای اندازه بافر به کار خود ادامه میدهیم.
زیر متغیر BATCH_SIZE قبلی، این کد را اضافه کنید:
SHUFFLE_BUFFER_SIZE = 1000
اکنون که اندازه های دسته و بافر خود را تنظیم کرده اید، باید داده های آموزشی، اعتبارسنجی و آزمایش خود را به 3 دسته تقسیم کنید. این کد بافرهای ترکیبی را ایجاد می کند و دسته ها را از بین آنها انتخاب می کند. این کد ها را در زیر دو متغیری که ایجاد کردید اضافه کنید.
Training_batches = training_data.shuffle(SHUFFLE_BUFFER_SIZE).batch(BATCH_SIZE) validation_batches = validation_data.shuffle(SHUFFLE_BUFFER_SIZE).batch(BATCH_SIZE) testing_batches = testing_data.shuffle(SHUFFLE_BUFFER_SIZE).batch(BATCH_SIZE)
اضافه کردن لایه های جدید به مدل یادگیری ماشین
برای آموزش مدل MobileNetV2 که برای شناسایی گربه ها و سگ ها بارگذاری کرده اید، باید دو لایه به آن اضافه کنید. یکی برای تبدیل خروجی های موجود از مدل به قالبی که برای تصاویر شما منطقی باشد و دیگری برای ارائه طبقه بندی نهایی تصویر به عنوان گربه یا سگ.
در سلول خالی بعدی در نوت بوک، این خط کد را اضافه کنید تا لایه ای ایجاد شود که خروجی های مدل موجود را تغییر شکل می دهد و آن را در یک متغیر ذخیره می کند.
global_average_layer = tf.keras.layers.GlobalAveragePooling2D()
شما فقط از آن نوع لایه استفاده کردید که TensorFlow آن را تامین میکند، اما برای لایه بعدی باید آنچه را که در مورد دادههای خود میدانید گرفته و آن را اعمال کنید. یعنی مدل شما باید بین سگ یا گربه یک نمونه را انتخاب کند. خروجی باید دو عدد مختلف باشد.
در زیر global_average_layer
، یک متغیر برای prediction_layer
اضافه کنید:
prediction_layer = tf.keras.layers.Dense(2)
اکنون باید لایه های خود را با مدل اصلی که وارد کرده اید کنار هم قرار دهید. این کار با استفاده از تابع Sequential
انجام می شود، زیرا آنها را به ترتیبی که آنها را به تابع ارسال می کنید، از پایین به بالا مونتاژ می کند.
زیر متغیر prediction_layer
کد زیر را اضافه کنید تا لایه های خود را با مدل MobileNetV2 ترکیب کنید
model = tf.keras.Sequential([ original_model, global_average_layer, prediction_layer ])
لایه global_average_layer
و prediction_layer
در بالای original_model
قرار میگیرد.
در مرحله بعد، شما باید مدل خود را کامپایل کنید. یعنی آن را به فرمی تبدیل کنید که بتوانید آموزش دهید و از آن برای پیش بینی استفاده کنید. برای انجام این کار، باید دو مقدار تنظیم کنید: نرخ یادگیری مدل خود و یک تابع ضرر.
نرخ یادگیری به مدل شما می گوید که چقدر سریع یاد بگیرد. اگر آن را خیلی کوچک در نظر بگیرید، فرآیند یادگیری خیلی طولانی شود. اگر آن را بزرگ در نظر بگیرید، مدل ممکن است عجله کند و یک قانون مهم را از دست بدهد. ما نرخ 0.0001 را پیشنهاد میکنیم.
تابع ضرر برای بررسی عملکرد مدل شما در طول تمرین است. شما از یک تابع ضرر به نام cross-entropy loss استفاده خواهید کرد که انتخاب خوبی برای طبقه بندی تصاویر است.
با کد موجود در زیر، یک متغیر برای نرخ یادگیری پایه ایجاد میکنید، سپس مدل را با آن پارامتر و cross-entropy loss کامپایل میکنید. همچنین به مدل میگویید که در حین آموزش دقت خود را چاپ کند.
BASE_LEARNING_RATE = 0.0001 model.compile(optimizer=tf.keras.optimizers.RMSprop(lr=BASE_LEARNING_RATE), loss=tf.keras.losses.SparseCategoricalCrossentropy(), metrics=['accuracy'])
در نهایت به مدلی که کامپایل کرده اید نگاهی بیندازید. در پایان کدی که از قبل دارید، این خط را اضافه کنید:
model.summary()
با باز کردن منوی Runtime و انتخاب Run all، تمام کدهای موجود در نوت بوک را اجرا کنید.
به خلاصه مدلی که چاپ شده است نگاه کنید. به طور خاص، به سه خط آخر نگاه کنید. این مدل بیش از دو میلیون پارامتر دارد، اما شما فقط کمی بیش از هزار مورد از آنها را آموزش می دهید. این مزیت بزرگ آموزش مجدد یک مدل نسبت به ساخت یک مدل کاملا جدید است.
آموزش مدل یادگیری ماشین برای تشخیص سگ و گربه
شما داده های خود را آماده کرده اید، مدل خود را ساخته اید و اکنون زمان آموزش است!
اولین کاری که باید انجام دهید این است که تعداد دوره هایی را که برای آنها تمرین خواهید کرد، تعیین کنید. یک دوره یک گذر کامل از داده های آموزشی است. معمولاً باید چندین بار داده های آموزشی را مرور کنید تا بهترین نتیجه را بگیرید. با این حال، هر دوره به زمان لازم برای آموزش مدل اضافه می کند، بنابراین نباید از تعداد زیادی استفاده کنید. در حال حاضر، از ده دوره استفاده خواهیم کرد.
در سلول خالی بعدی، یک متغیر TRAINING_EPOCHS
ایجاد کنید و آن را روی 10 قرار دهید.
TRAINING_EPOCHS = 10
حتی با تعیین ده دوره هنوز هم داده های زیادی است و زمان زیادی برای آموزش نیاز دارد. در واقع، اگر بخواهید مدل را همین الان آموزش دهید، بیش از یک ساعت طول می کشد! خوشبختانه، Colab به شما این امکان را می دهد که نوت بوک خود را طوری تنظیم کنید که از GPU ها به جای CPU استفاده کند. به دلیل نوع ریاضیاتی که رایانه برای یادگیری ماشین انجام می دهد، مشخص شد که GPU ها بسیار سریعتر از CPU ها هستند.
بنابراین به TensorFlow بگویید تا زمانی که دستگاه GPU با مدل شما مطابقت دارد از آن استفاده کند. شما باید دستههای آموزشی و اعتبارسنجی را که قبلاً ایجاد کردهاید در تابع model.fit
ارائه دهید.
زیر خط TRAINING_EPOCHS
، موارد زیر را اضافه کنید:
with tf.device('/device:GPU:0'): history = model.fit(training_batches, epochs=TRAINING_EPOCHS, validation_data=validation_batches)
با باز کردن منوی Runtime و انتخاب Run all، تمام کدهای موجود در نوت بوک را اجرا کنید.
این کار احتمالاً بیش از ده دقیقه طول می کشد. برگه را باز بگذارید و تقریباً هردقیقه دوباره بررسی کنید تا مدل خود را در حال چاپ نتایج برای هر دوره ببینید. تماشا کنید که چطور loss کاهش می یابد و accuracy بالا می رود!
مدل خود را تست کنید!
حالا شما یک مدل آماده دارید و می توانید از تصاویر گربه ها و سگ ها برای آزمایش آن استفاده کنید! در آخرین سلول خالی، دستور predict_image را اضافه کنید و URL یک تصویر آزمایشی را قرار دهید.
predict_image('https://dojo.soy/predict-dog')
دقت کنید که الان نباید از گزینه Run all استفاده کنید. باید روی دکمه روی دکمه ▶ که در سمت چپ سلول ظاهر می شود کلیک کنید تا فقط محتویات آن سلول اجرا شود. سپس میتوانید نتیجه کار خود را ببینید!
سعی کنید چند تصویر مختلف را در آن بارگذاری کنید تا ببینید چطور پیش بینی ها را انجام می دهد. شما باید از تصاویر میزبانی شده در اینترنت استفاده کنید.
امیدوارم این آموزش برای شما مفید بوده باشد. اگر سوالی دارید در قسمت نظرات اعلام کنید.
سلام من شنیدم در این زمینه خیلی خوب کار کرده.
a100 میده با رم ۴۰ گیک. با تخفیف های دانشجویی و دوره ای. امکان خاموش کردن و حذف سیستم هم وجود داره. پشتیبانیشم میگن خیلی خوب جواب میدن.
سلام
بسیارعالی بود
خداقوت بهتون
سلام عزیز
خوشحالم که براتون مفید بوده
سلام لطفا pdf مطالب رو برای داملود بگذارید . ممنون
سلام عزیز
چشم سعی میکنیم قرار بدیم