حسین خسروی

وبلاگ دانشگاهی حسین خسروی، عضو هیات علمی دانشگاه صنعتی شاهرود

حسین خسروی

وبلاگ دانشگاهی حسین خسروی، عضو هیات علمی دانشگاه صنعتی شاهرود

حسین خسروی

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

پیوندهای روزانه

۱۱ مطلب در آذر ۱۳۹۵ ثبت شده است

  • ۰
  • ۰

آموزش نصب OpenCV

کتابخانه ی OpenCV (مخفف Open Computer Vision) از پرکاربردترین کتابخانه ها برای پردازش تصویر، بینایی استریو و یادگیری ماشینی است. در این کتابخانه ماژولهای متعددی از کار با تصاویر و ویدیو گرفته تا انواع طبقه بندهای هوشمند مثل شبکه عصبی و SVM وجود دارد و باتوجه به نوع توسعه آن که با همکاری برنامه نویسان از سراسر جهان اتفاق می افتد، روز به روز امکانات تازه ای به آن اضافه می شود.

این کتابخانه برای اکثر سیستم عاملها مثل ویندوز، لینوکس و اندروید در دسترس است. با توجه به اینکه OpenCV نسخه نصبی ندارد، غالبا برنامه نویسان در ابتدای کار، به مشکل می خورند. در آموزش زیر، طی چند گام، فرایند نصب یا پیکربندی OpenCV به منظور استفاده در ویژوال سی را توضیح میدهیم.

نحوه پیکربندی OpenCV برای استفاده در Visual Studio

  1. دانلود نسخه مورد نظر از بخش دانلود OpenCV
    • لازم به ذکر است که از سال گذشته نسخه 3.0 این کتابخانه آماده شده و همزمان با نسخه های 2.4 در حال توسعه است، اما برخی توابع و ماژولها (مثل SIFT و SURF) متاسفانه هنوز در این نسخه گنجانده نشده است و بسیاری از ماژولها (مثل ماژول یادگیری ماشین cv::ml) هم تغییرات عجیبی کرده اند و کدهای قبلی باید تغییرات زیادی برای سازگاری انجام دهند. ضمن اینکه این نسخه بعضا باگهایی هم دارد که شاید بهتر باشد لااقل تا به روز رسانی عمده بعدی به نسخه 3.2 صبر کنید.
    • در هر صورت اگر نسخه 3.1 را بخواهید به این آدرس و اگر نسخه 2.4.13 را بخواهید به این آدرس مراجعه کنید (معمولا اجازه دسترسی از ایران نداریم و باید با فیل.تر شک.ن وصل شوید)
      OpenCV - اپن سی وی
  2. بازگشایی فایلها در یک مسیر مناسب مثلا C:\OpenCV ...
  • حسین خسروی
  • ۰
  • ۰

در این تمرین باید میانگین و انحراف معیار چند تصویر با درجه تفکیک 1، 2، 4، 8 و 16 مگاپیکسل را روی GPU و CPU محاسبه کرده و مقایسه کنید.

حتی الامکان تنها یک تابع کرنل برای محاسبه میانگین و انحراف معیار بنویسید ولی اگر نتوانستید، دو تابع جداگانه بنویسید.

  • حسین خسروی
  • ۰
  • ۰

در این تمرین باید یک ویدیوی حداقل 2MP (مثلا درجه تفکیک 1600x1200 یا 1920x1080) را به کمک کتابخانه OpenCV بخوانید و سپس فریمها را پردازش کنید. پردازش مورد نظر عملیات لبه یابی به کمک عملگر سوبل است (مقدار بیشینه سوبل افقی و عمودی را در تصویر خروجی نشان دهید). ویدیوی پردازش شده را در یک ویدیوی خروجی ذخیره کنید.

این عملیات را به سه صورت انجام داده و از نظر زمانی مقایسه کنید:

1. پردازش در GPU به کمک Buffer

2. پردازش در GPU به کمک Image2D

3. پردازش در CPU


مهلت تحویل 10 آذر

  • حسین خسروی
  • ۰
  • ۰

تمرین سری ششم درس شبکه های عصبی: LVQ

دو سری نمونه متعلق به دو کلاس، یکی درون دایره و دیگری بیرون دایره و داخل مربعی با مساحت دوبرابر مساحت دایره، در نظر بگیرید. از هر کلاس 100 نمونه. سپس در حالتهای زیر شبکه LVQ را اجرا کرده و نتایج را به صورت تصویری گزارش کنید:
1.    برای هر کدام از کلاسها 4 بردار در نظر بگیرید.
2.    برای هر کدام 20 بردار در نظر بگیرید.
3.    برای هر کدام 50 بردار در نظر بگیرید.

دایره درون مربع

موعد ارسال تمرین:  30 آذر

نحوه ارسال: فایلهای متلب یا C به علاوه یک فایل word شامل اطلاعات نویسندگان، کد نوشته شده و نتایج به دست آمده.



  • حسین خسروی
  • ۰
  • ۰

تمرین سری هفتم درس مبانی برنامه‌نویسی

1.    برنامه ‌ای بنویسید که یک رشته را در یک فایل جستجو کرده و با رشته‌ی دیگری تعویض کند. نتیجه در فایل دیگری ذخیره شود. برنامه باید 4 کلید داشته باشد:
•    in- برای دریافت نام فایل ورودی،
•    out- برای دریافت نام فایل خروجی،
•    src- برای کلمه مورد جستجو
•    dst- برای کلمه جایگزین
برای مثال جهت اصلاح کلمه univercity از فایل input.txt با کلمه university در فایل output.txt باید به صورت زیر عمل کنیم:

>> Replace –in  input.txt –out output.txt -src univercity –dst university
>> Operation completed successfully; 21 matches found.

در مثال فوق 21 بار عبارت univercity یافت شده است.
اگر فایل ورودی وجود نداشت یا فایل خروجی را نتوانستید ایجاد کنید باید پیغام مناسب ذکر شود.

راهنمایی

برای کار با فایل متنی از توابع fopen, fprintf, fscanf, fgets کمک بگیرید. برای جستجوی رشته هم از strstr استفاده کنید.

روش تهیه و ارسال تمرینها

  • یک فایل word ایجاد کنید و کد نوشته شده به همراه یک نمونه اجرای برنامه را در آن قرار دهید (از خروجی برنامه با فشردن هم‌زمان دکمه‌های Alt و Print Screen عکس بگیرید و داخل فایل word کپی کنید).
  • به پوشه پروژه ای که ایجاد کرده اید رفته و فایلهای با پسوند c, cpp, h, cbp, vcxproj را در پوشه ای با نام خودتان (مثلا HosseinKhosravi) کپی کنید (پوشه‌های Debug و Release و ipch را نباید اضافه کنید).
  • فایل word را هم در همان پوشه کپی کنید و سپس پوشه را zip کنید.
  • اگر مراحل فوق درست انجام شده باشد فایل zip شده باید حجمی کمتر از 200 کیلوبایت داشته باشد. این فایل را به آدرس استاد حل تمرین بفرستید
  • عنوان ایمیل (subject) حتما شامل عبارت C_HW_03 باشد.

موعد تحویل: 7 دی ماه

  • حسین خسروی
  • ۰
  • ۰

1.    با استفاده از ساختار، برنامه ‌ای بنویسید که ابتدا یک دستور read یا write از کاربر دریافت کند و کارهای زیر را انجام دهد:
•    اگر دستور write دریافت شد: اطلاعات تعدادی دانشجو شامل: شماره دانشجو، نام و نام خانوادگی، سال تولد و معدل دیپلم را گرفته و در انتهای یک فایل متنی با نام Students.txt ذخیره کند. هرگاه شماره دانشجویی عدد منفی وارد شد، فایل را ببندد و از برنامه خارج شود. دقت کنید که اطلاعات قبلی موجود در فایل نباید پاک شود (به جای wt از at استفاده کنید)
•    اگر دستور read دریافت شد: فایل متنی Students.txt را خوانده و اطلاعات آن را در یک آرایه یا اشاره گر از نوع ساختاری که تولید کرده اید، بارگذاری کند و به صورت جدول به کاربر نشان دهد.
•    استثنائات را مدیریت کنید: مثلا اگر فایل تهی بود، یا معدل خارج از محدوده 0 و 20 بود یا سال تولد بیش از 1380 بود، خطا گزارش کند.

موعد تحویل: 30 آذر

  • حسین خسروی
  • ۰
  • ۰

اسلایدهای مربوط به بحث شبکه عصبی کانولوشن را از آدرس زیر دانلود کنید:

Convolutional Neural Networks

  • حسین خسروی
  • ۰
  • ۰

این ویدیو توضیحات مثال قبلی است که متاسفانه کیفیت صدای آن در برخی لحظات خوب نیست. برخی فریمها هم ناقص ضبط شده اند.

  • حسین خسروی
  • ۰
  • ۰

این مثال دو بخش دارد، یکی ایجاد پایگاه داده از اطلاعات کتابها و نوشتن آنها در فایل باینری book_data.db و بخش دوم شامل خواندن اطلاعات از همین فایل و نمایش آنها. ویدیوی ضبط شده مربوط به این مثال در پست بعدی منتشر می شود.


#include "stdafx.h"
#include <iostream>

struct BookInfo
{
	char name[30];
	char author[30];
	int  nPage;
	float price;
	int year;
};

void CreateDatabase()
{
	printf("To start, enter number of books you want to store in the database\n");
	int n = 0;
	scanf_s("%d", &n);
	printf("Please enter Book information for %d books as follows\n", n);
	printf("Name, Author, Pages, Price, Year of Publication\n");

	BookInfo *books = new BookInfo[n];
	for (int i = 0; i < n; i++)
	{
		std::cin.ignore();
		printf("\n#%d Name: ", i + 1);
		gets_s(books[i].name, 30);
		printf("\n#%d Author: ", i + 1);
		gets_s(books[i].author, 30);
		printf("\n#%d Pages: ", i + 1);
		scanf_s("%d", &books[i].nPage);
		printf("\n#%d Price: ", i + 1);
		scanf_s("%f", &books[i].price);
		printf("\n#%d Year: ", i + 1);
		scanf_s("%d", &books[i].year);
	}
	FILE* fp = 0;
	fopen_s(&fp, "book_data.db", "wb");
	if (!fp)
	{
		printf("File can't be oppened.\n");
		return;
	}

	fwrite(books, sizeof(BookInfo), n, fp);
	fclose(fp);

	printf("Data saved successfully\n");
}

void ReadDatabase()
{
	int n = 2;

	BookInfo *books = new BookInfo[n];

	FILE* fp = 0;
	fopen_s(&fp, "book_data.db", "rb");
	if (!fp)
	{
		printf("File can't be oppened.\n");
		return;
	}

	fread(books, sizeof(BookInfo), n, fp);
	for (int i = 0; i < n; i++)
	{
		printf("\n#%d Name: %s", i + 1, books[i].name);

		printf("\n#%d Author: %s", i + 1, books[i].author);

		printf("\n#%d Pages: %d", i + 1, books[i].nPage);

		printf("\n#%d Price: %.1f", i + 1, books[i].price);

		printf("\n#%d Year: %d", i + 1, books[i].year);

		printf("\n--------------------------------------------");
	}

	fclose(fp);
	delete[] books;
}

int main()
{
	printf("Welcome to Book Database Application:\n");
	bool create_data = false; //change to false for read mode

	if (create_data)
		CreateDatabase();
	else
		ReadDatabase();

	getchar();
    return 0;
}
  • حسین خسروی
  • ۰
  • ۰

در این مثال نحوه ایجاد فایل باینری و توابع نوشتن و خواندن (fread, fwrite) توضیح داده شده و یک فایل حاوی صد عدد اعشاری به دو صورت باینری و متنی ساخته شده و مقایسه می شوند:


  • حسین خسروی