МІНІСТЕРСТВО ОСВІТИ І НАУКИ, МОЛОДІ ТА СПОРТУ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
кафедра захисту інформації

Звіт
про проходження переддипломної практики
Я, Котило Володимир Орестович, проходив практику у період з 15 серпня 2011 р. по 23 вересня 2011 р. на підприємстві «ФОП Котило Н.О.», яке спеціалізується на розробці програмного забезпечення та створення веб-сторінок на замовлення клієнтів.
Метою моєї роботи на підприємстві було вивчення принципів роботи веб-сервера на технології ASP.NET для обробки запитів від користувачів та захист інформації, яка зберігалась на ньому, від копіювання та подальшого її розповсюдження неуповноваженими особами в мережі інтернет.
Особливим акцентом був захист візуальної інформації, зокрема ознайомлення із особливостями створення водяних знаків на зображеннях.
Оскільки у моєму проекті деякі зображення були вже захищені вище згаданим методом, я проявив ініціативу і запропонував розробити алгоритм для виявлення незахищених зображень, методом шаблонного пошуку одного зображення всередині заданого. Таким чином алгоритм допоміг обробити велику кількість інформації за невеликий проміжок часу, що суттєво знизило необхідність використання людини для здійснення цієї рутинної роботи.
Коли я проходив практику, у мене був доступ до великої кількості необхідної для виконанні роботи літератури. Я вивчив основні принципи роботи бібліотеки для обробки зображень OpenCV, зокрема її безкоштовних різновид для веб-сервера ASP.NET – EmguCV. Бібліотека містить у собі функції для пошуку частин зображень, ідентифікації об’єктів із різним нахилом, розміром чи формою.
Мені запропонували обробляти інформацію у середовищі ASP або ASP.NET, обрати останній варіант було найрозумнішим, оскільки він має такі переваги над технологією ASP:
Компільований код виконується швидше, більшість помилок відловлюється ще на стадії розробки
Значно поліпшена обробка помилок часу виконання, з використанням блоків try ... catch
Користувальницькі елементи управління (controls) дозволяють виділяти часто використовувані шаблони, такі як меню сайту
Використання метафор, наприклад, таких як елементи керування та події
Розширюваний набір елементів управління і бібліотек класів дозволяє швидше розробляти програми
ASP.NET спирається на багатомовні можливості .NET, що дозволяє писати код сторінок на мовах VB.NET, Delphi.NET, Visual C/C++ тощо
Можливість кешування всієї сторінки або її частини для збільшення продуктивності
Можливість кешування даних, що використовуються на сторінці
Можливість поділу візуальної частини та бізнес-логіки з різних файлів («code behind»)
Розширювана модель обробки запитів
Розширена подієва модель
Розширювана модель серверних елементів керування
Наявність master-сторінок для завдання шаблонів оформлення сторінок
Підтримка CRUD-операцій при роботі з таблицями через GridView
Вбудована підтримка AJAX
ASP.NET має перевагу у швидкості в порівнянні з іншими технологіями, заснованими на скриптах.
Зокрема я розглянув принципи роботи технології AJAX, яка використовувалась при додаванні коментарів у проект користувачами (CAPTCHA).
Для здійснення перевірки правильності введеного коду, відсилався запит на сервер, який містив введену користувачем фразу. У сесії севрвера зберігалась правильна відповідь. Якщо фраза користувача та правильна відповідь збігалися, у відповідь користувачу за допомогою AJAX відсилали «1», а якщо не збігалось – «0».
Далі, використовуючи мову програмування JavaScript, здійснювалось очікування відповіді від сервера та її аналізу. Якщо отримано «1», на веб-сторінці показувався елемент успішного додавання відповіді, інакше виводилось повідомлення про помилку. Таким чином якщо зловмисник, із метою спаму чи атаки на сервер, не вводив правильної фрази, яку не так просто згенерувати комп’ютерними програмами, його текст чи реклама не зберігалась на сервері і таким чином зекономлювала його ресурси та час адміністратора на видалення повідомлень.
Це був один із розглянутих методів захисту інформації на веб-сторінках.
Під час практики я також ознайомився із основними поняттями .NET:
Платформа - у контексті інформаційних технологій - середовище, що забезпечує виконання програмного коду. Платформа визначається характеристиками процесорів, особливостями операційних систем.
Framework - це інфраструктура середовища виконання програм, щось, що визначає особливості розробки і виконання програмного коду на даній платформі. Передбачає засоби організації взаємодії з операційною системою і прикладними програмами, методи доступу до баз даних, засоби підтримки розподілених (мережевих) додатків, мови програмування, безліч базових класів, уніфіковані інтерфейси користувача, парадигми програмування.
Microsoft .NET - платформа.
.NET Framework - інфраструктура платформи Microsoft .NET. Включає наступні основні компоненти: Common Language Runtime (CLR) і .NET Framework Class Library (.NET FCL).
CLS (Common Language Specification) - загальна специфікація мов програмування. Це набір конструкцій і обмежень, які є інструкцією для розробників бібліотек і компіляторів в середовищі .NET Framework. Бібліотеки, побудовані відповідно до CLS, можуть бути використані у будь-якій мові програмування, що підтримує CLS.
Мови, відповідні CLS (до їх числа відносяться мови Visual C# 2.0, Visual Basic, Visual C++), можуть інтегруватися один з одним. CLS - це основа міжмовної взаємодії в рамках платформи Microsoft .NET.
CLR (Common Language Runtime) - Середовище Часу Виконання або Віртуальна Машина. Забезпечує виконання збірки. Основний компонент .NET Framework. Під Віртуальною Машиною розуміють абстракцію інкапсульованої (відособленої) керованої операційної системи високого рівня, яка забезпечує виконання (керованого) програмного коду.
Керований код - програмний код, який під час виконання здатний використовувати служби, що надаються CLR. Відповідно, некерований код подібною здатністю не володіє.
Тобто, CLR - це набір служб, необхідних для виконання керованого коду. Сама CLR складається з двох головних компонентів: ядра (mscoree.dll) і бібліотеки базових класів (mscorlib.dll). Наявність цих файлів на диску - ознака того, що на комп'ютері, принаймні, була зроблена спроба встановлення платформи .NET.
FCL (.NET Framework Class Library) - відповідна CLS-спеціфікаціії об'єктно-орієнтована бібліотека класів, інтерфейсів і системи типів (типів-значень), які включаються до складу платформи Microsoft .NET. Ця бібліотека забезпечує доступ до функціональних можливостей системи і призначена служити основою при розробці .NET-додатків, компонент, елементів управління.
.NET бібліотека класів є другим компонентом CLR. .NET FCL можуть використовувати усі .NET-додатки, незалежно від призначення архітектури використовуваного при розробці мови програмування, і зокрема:
вбудовані (елементарні) типи, представлені у вигляді класів (на платформі .NET все побудовано на структурах або класах);
класи для розробки графічного користувацького інтерфейсу (Windows Forms);
класи для розробки web-додатків і web-служб на основі технології ASP.NET (Web Forms);
класи для розробки XML і Internet-протоколів (FTP, HTTP, SMTP, SOAP);
класи для розробки додатків, що працюють з базами даних (ADO .NET) і багато що інших.
.NET-програма - програма, розроблена для виконання на платформі Microsoft .NET. Реалізується на мовах програмування, відповідних CLS.
MSIL (Microsoft Intermediate Language) - проміжна мова платформи Microsoft .NET. Вихідні тексти програм для .NET-додатків пишуться на мовах програмування, відповідних специфікації CLS. Для таких мов може бути побудований перетворювач в MSIL. Таким чином, програми на цих мовах можуть транслюватися в проміжний код на MSIL. Завдяки відповідності CLS, в результаті трансляції програмного коду, написаного на різних мовах, виходить сумісний IL-код.
Схема виконання .NET додатків у середовищі CLR:

Рис. 2. Процес запуску .NET-програми.
У середовищі CLR допускається спільна робота і взаємодія компонентів програмного забезпечення, реалізованих на різних мовах програмування. CLR бере на себе вирішення багатьох проблем, які традиційно знаходилися в зоні особливої уваги розробників програмного забезпечення.
До функцій, які виконуються CLR, відносяться:
Перевірка і динамічна (JIT) компіляція MSIL-коду у команди процесора.
Управління пам’яттю, процесами і потоками.
Організація взаємодії процесів.
Вирішення проблем безпеки (в рамках безпеки, що існує в системі політики).
Алгоритм, який виявляв водяні знаки у зображеннях здійснювався за допомогою OpenCV, як вже згадувалось раніше. Я обрав саме цю бібліотеку, оскільки має ряд первеваг над своїми конкурентами. Зокрема, наступні:
opencv_core - основна функціональність. Включає в себе базові структури, обчислення (математичні функції, генератори випадкових чисел) і лінійну алгебру і т. д.
opencv_imgproc - обробка зображень (фільтрація, геометричні перетворення, перетворення колірних просторів і т. д.).
opencv_highgui - простий UI, введення / виведення зображень і відео.
opencv_ml - статистичні моделі машинного навчання (SVM, дерева рішень, навчання зі стимулюванням і т. д.).
opencv_features2d - розпізнавання та опис плоских примітивів (SURF, FAST та інші, включаючи спеціалізований фреймворк).
opencv_video - аналіз руху і відстежування об'єктів (оптичний потік, шаблони руху, усунення фону).
opencv_objdetect - виявлення об'єктів на зображенні (перебування осіб за допомогою алгоритму Віоли-Джонс, розпізнавання людей HOG і т. д.).
opencv_calib3d - калібрування камери, пошук стерео-соответстсвія і елементи обробки тривимірних даних.
opencv_flann - бібліотека швидкого пошуку найближчих сусідів (FLANN 1.5) і обгортки OpenCV.
opencv_contrib - супутній код, ще не готовий для застосування.
opencv_legacy - застарілий код, збережений заради зворотної сумісності.
opencv_gpu - прискорення деяких функцій OpenCV за рахунок CUDA, створений за підтримки NVidia.
Сфери застосування OpenCVвключають:
Набір інструментів для оброзки 2D і 3D графіки
Наближення рухів
Система розпізнавання обличь
Розпізнавання рухів
Взаємодія людина-комп’ютер (Human–computer interaction (HCI))
Мобільна робототехніка
Розуміння руху
Ідентифікація об’єктів
Сегментація та розпізнавання
Стереографічне бачення: сприйняття глибини від двох камер
Структурування від руху (Structure from motion (SFM))
Розроблення алгоритму проводилось у середовищі Visual Studio. Приклад готовї програми для алгоритму наведений нижче:
namespaceUtils.ImageOperations
{
staticclassFindSimilarImage
{
publicstaticvoid Run()
{
//Image<Gray, Byte> observedImage = new Image<Gray, byte>("test.jpg");
Stopwatch watch;
//create storage
using (MemStorage storage = newMemStorage())
{
//calculate foreground points for mask
var modelImageBmp = Image.FromFile("mask.png");
var foregroundPoints = GetForegroundPoints(modelImageBmp, storage);
DirectoryInfo di = newDirectoryInfo(@"C:\Users\Volodia\Downloads\images-folder");
if (di.Exists)
{
var files = di.GetFiles("*.jpg");
foreach (FileInfo fi in files)
{
var fullName = fi.FullName;
var observedImage = newImage<Gray, byte>(fi.FullName);
observedImage.ROI = newRectangle(0, 0, observedImage.Width, observedImage.Height/6);
//set mode
var enumeration = Emgu.CV.CvEnum.TM_TYPE.CV_TM_CCOEFF_NORMED;
Image<Gray, byte> modelImage = newImage<Gray, byte>((Bitmap) modelImageBmp);
//find template
var matchedImage = observedImage.MatchTemplate(modelImage, enumeration);
//
double[] min, max;
Point[] point1, point2;
matchedImage.MinMax(out min, out max, out point1, out point2);
Point p = newPoint();
Image<Bgr, Byte> result = newImage<Bgr, byte>(fullName);
if (min[0] < -0.01)
{
p.X = point1[0].X-1;
p.Y = point1[0].Y-1;
result.Draw(newRectangle(p, modelImage.Size), newBgr(Color.Red), 2);
var modelContours = modelImage.FindContours();
var observedContours = observedImage.FindContours();
//double ratio = contour.MatchShapes(, );
double ratio = CvInvoke.cvMatchShapes(observedContours, modelContours, Emgu.CV.CvEnum.CONTOURS_MATCH_TYPE.CV_CONTOURS_MATCH_I3, 0);
var movedPoints = MoveSeqPoints(foregroundPoints, p, storage);
foreach (Point foregroundPoint in movedPoints)
{
result.Draw(newRectangle(foregroundPoint, newSize(1,1)), newBgr(Color.YellowGreen), 1);
}
}
if (max[0] > 0.01)
{
p.X = point2[0].X;
p.Y = point2[0].Y;
result.Draw(newRectangle(p, modelImage.Size), newBgr(Color.Plum), 2);
}
result.Save(string.Format(@"C:\Users\Volodia\Desktop\ready\{0}", fi.Name));
modelImage.Dispose();
matchedImage.Dispose();
observedImage.Dispose();
result.Dispose();
}
}
//exited from directory, free bitmap
modelImageBmp.Dispose();
}
}
privatestaticSeq<Point> MoveSeqPoints(Seq<Point> foregroundPoints, Point point, MemStorage storage)
{
var fp = newSeq<Point>(storage);
for (int i = 0; i < foregroundPoints.Total; i++)
{
fp.Push(newPoint(foregroundPoints[i].X + point.X, foregroundPoints[i].Y + point.Y));
}
return fp;
}
privatestaticSeq<Point> GetForegroundPoints(Image modelImage, MemStorage storage)
{
FastPixel fp = newFastPixel((Bitmap)modelImage);
fp.Lock();
var points = newSeq<Point>(storage);
if (fp.IsAlphaBitmap)
{
for (int i = 0; i < fp.Width; i++)
{
for (int j = 0; j < fp.Height; j++)
{
///check for the Alpha channel
var a = fp.GetPixelAlphaChannel(i, j);
if (a != 0)
{
points.Push(newPoint(i,j));
}
}
}
}
fp.Unlock(false);
return points;
}
}
Програма виявляє максимальні та мінімальні подібності у областях зображення та позначає прямокутником виявлену частину зображення із шаблону.
Для досягення цієї функції застосовується функція OpenCVMatchTemplate, яка повертає зображення, яке містить області із найбільшою чи найменшою ймовірністю виявлення. Наприклад, при застосуванні типу пошуку Emgu.CV.CvEnum.TM_TYPE.CV_TM_CCOEFF_NORMED, нам потрібно за допомогою функції MinMax використати найбільше значення (у проміжку від -1 до 1), яке вказуватиме на 100% подібність із шаблоном.
Якщо ми отримали значення 0.6, тоді можна вважати, що шаблонне значення було знайдено у вихідному зображенні, а отже водяний знак присутній на картинці. Більше того, та сама функція показує точну позицію знайденого зображення (x,y) для його подальшої обробки.
Висновок:
При проходженні практики я розширив свої знання у веб-програмуванні та ознайомився із принципами захисту інформації від несанкціонованого копіювання у веб-сторінках.
Також я використав базові функції бібліотеки OpenCV, і можузробитивисновок, щоцябібліотека є надзвичайнозручна, швидка у виконанні та дозволяє виконати практично будь-яку поставлену задачу в галузі обробки зображень без особливих математичних знань.