logo
Разработка автоматизированной веб-ориентированной системы составления каталога товаров при поиске по изображениям

3.1 Описание программного обеспечения

Для обработки данных была разработана программа на языке программирования C#, в среде программирования Microsoft Visual Studio 2011 Ultimate Edition beta. Для хранения данных была использована СУБД MS SQL Server 2008 Express Edition.

Программа обрабатывает информацию следующего вида:

1. Страница, с данными о товарной позиции.

1.1 Название товара.

1.2 Ссылка на товар

1.3 Категория товара

1.4 Цена товара

1.5 Цена доставки

1.6 Параметры товара

1.7 Форм-фактор посылки.

1.8 Главное изображение

1.9 Все остальные изображения.

1.10 Отзывы, оставленные покупателями

1.11 Полная информация о покупателях.

2. Главное изображение товара при составлении дескрипторов особых точек для последующего сравнения.

Результатами работы приложения является:

1. Заполненная база данных о товарах.

2. Составленные группы одинаковых товаров.

Как уже говорилось выше, программа выполняет извлечение информации о товарных позициях и составление групп одинаковых товаров. В связи с этим были реализованы модули, отвечающие за каждый этап выполнения программы.

На следующем рисунке представлена структурная схема приложения:

Размещено на http://www.allbest.ru/

Рисунок 1. Структурная схема приложения

На рисунке 2 представлена структура работы приложения.

Размещено на http://www.allbest.ru/

Рис. 3. Структура работы приложения

Основные модули, описывающие работу приложения.

1. Program - главный модуль приложения, отвечающий за его запуск.

2. MagazineClasses - модуль содержащий классы характеризующие сеть электронных магазинов.

3. BrowserExtention - модуль, содержащий расширения для работы с браузером.

4. Parser - модуль, отвечающий за парс товаров

5. CompareWorker - модуль, отвечающий за разбиение товаров на группы.

6. SURF - модуль, отвечающий за реализацию метода SURF.

7. StringCompare - модуль, отвечающий за реализацию метода нечеткого сравнения строк

8. DBWorker - модуль, отвечающий за работу с базой данных

9. UI - модуль отвечающий за пользовательский интерфейс

10. Loger - модуль, отвечающий за запись лога.

11. SettingsWorker - класс для чтения и записи настроек программы.

Описание классов.

Для реализации задачи поставленной в рамках данной дипломной работы был разработан набор классов следующей структуры.

Класс Shop содержит поля для представления магазина.

Класс Product содержит поля для представления товара.

Класс ProductImage содержит поля для представления изображения товара.

Класс Category содержит поля для представления категории товаров.

Класс SubCategory содержит поля для представления подкатегории товара.

Класс MarketUser содержит поля для представления покупателя.

Класс Feedback содержит поля для представления отзыва покупателя о товаре.

Класс ProductInfoForCompare содержит поля и методы для сравнения товаров.

Класс IdenticalProductGroup инкапсулирует в себе данные для построения группы одинаковых товаров.

Класс DBWorker предназначен для работы с базой данных.

Класс ShopValidater предназначен для выявления существующих магазинов.

Класс ParallelShopValidater, содержащий и управляющий коллекцией объектов класса ShopValidater, предназначен для параллельного выявления существующих магазинов в несколько потоков.

Класс ShopParser предназначен для асинхронного извлечения товарных позиций из магазина.

Класс ParseSession предназначен для запоминания и управления данными о процессе парса, для возможности продолжения его в случае отключения электроэнергии или в других нештатных ситуациях.

Класс AliExpressParser, содержащий объекты классов ParallelShopValidater, ShopParser, DBWorker предназначен для инициализации и управления этими объектами.

Класс FindWorker предназначен для поиска товаров в базе по изображениям.

Приведем структуру класса Shop:

class Shop

{

int id; // идентификатор магазина

bool startParse=false; // флаг начала парса

bool endParse = false; // флагокончания парса

List<SubCategory> subCategories; // подкатегории

магазина, определенные сайтом

List<SubCategory> categoriesInShop; // подкатегории

магазина, придуманные саммим сайтом

List<Product> products; // коллекция товаров магазина

}

Приведем структуру класса Product

class Product

{

int id; // идентификатор товара

int subCategoryId; // айди подкатегории товара

int categoryIdInShop; // айди подкатегории товара,

определнной магазином

int shopId; // айди магазина

float price; // цена

float dostavkaPrice; // цена доставки

float totalPrice; // общая цена

string name; // имя товара

string url; // ссылка на товар

string structurePath; // логический путь к товару на сайте

string itemSpecifics; // список основных

характеристик товара

string description; // другие характеристики товара

string html; // хтмл страницы

string mainImagePath; // путь к главной картинки

List<ProductImage> images; // картинки товара

List<Feedback> feedbacks; // отзывы о товаре

List<MarketUser> buyers; // покупатели, оставившие отзывы

}

Приведем структуру класса SubCategory

class SubCategory

{

string name = ""; // название категории

int id = 0; // идентификатор категории

string url = ""; // ссылка на категорию

}

Приведем структуру класса MarketUser:

class MarketUser

{

int newId; // айди

int id; // идентификатор покупателя

string name; // имя покупателя

string country; // страна покупателя

}

Приведем структуру класса MarketUser:

class Feedback

{

int newId;

int id; // идентификатор

int userId; // идентификатор покупателя

int productId; // идентификатор товара

int mark; // оценка

string coment; // текст коментария

int quantity; // количество купленного

}

Приведем структуру класса ProductImage

class ProductImage

{

public int id; // идентификатор изображения

public int productId; // идентификатор товара

public string path=""; // путь

public string url=""; // ссылка на изобржение

}

Приведем структуру класса ProductInfoForCompare

class ProductInfoForCompare

{

int productId; // идентификатор товара

int shopId; // идентификатор магазина

int subCategoryId; // идентификатор категории

string name=""; // имя товара

string imagePath = ""; // путь к картинки

Bitmap image=null; // изображение

float [] [] descriptors = null; // дескрипторы изображения

bool findGroup = false;

}

Приведем структуру класса IdenticalProductGroup

class IdenticalProductGroup

{

int id; // идентификатор группы

int subCategoryId; // категория группы

bool validated; // флаг проверки группы при составлении

групп одинаковых товаров

List<ProductInfoForCompare> products; // товары группы

List<ProductInfoForCompare> etalonProducts;

// эталонные товары группы

List<ProductInfoForCompare> newEtalonProducts; // новые

эталонные товары группы

}

Описание интерфейса работы программы.

При запуска программы появляется главное окно приложения:

Рис. 7. Главное окно приложения

Приведем описание интерфейса

1. Вкладка "Парс" позволяет производить парс магазинов сайта.

Для начала парса необходимо выбрать начальные параметры для проверки магазинов на существование.

Возможны 2 варианта: задание диапазона и задание через список.

Так же необходимо ввести количество потоков для проверки магазинов на существование и для парса магазинов.

После ввода всех данных и нажати кнопки "Запуск" начинается процесс проверки магазинов а затем парс магазинов. Прогресс выполнения задач показывается компонентами ProgressBar. Также отображается сколько магазинов найдено.

2. Вкладка "Группировка" позволяет разбить товары в базе на группы одинаковых.

Для начала необходимо определить необходимые для этого настройки:

a) Точность сравнения для одной точки - максимальная величина разности дескрипторов двух точек, при которой они считаются одинаковыми.

b) Процент удачного сравнения - минимальный процент совпавших точек 2х изображений, при котором они считаются одинаковыми.

c) Количество эталонов в группе - каждая группа одинаковости содержит некоторое количество эталонных товаров, которые её определяют, этот параметр ограничивает их максимальное количество.

После нажатия на кнопку "Запуск" начинается процедура составления дескрипторов и группировка товаров. Т.к. процедура длинная на форме предусмотрены 2 элемента ProgressBar отображающие ход работы.

3. Вкладка "Обзор" позволяет просмотреть созданные группы.

В комбобоксе сверху необходимо выбрать категорию товаров т.к. группы одинаковых товаров формируются внутри конкретной категории, чтобы уменьшить количество сравнений.

В таблице снизу появляются группы одинаковости для этой категории. В таблице только один столбец - id этой группы.

Справа от неё появляется таблица товаров, принадлежащих выбранной группе и соответственно изображение, выбранного товара.

4. Вкладка "Поиск" позволяет производить поиск в базе по изображениям.

Для начала можно изменить настройки поиска, развернув соответствующую панель "Настройки".

Здесь можно выбрать:

§ точность при поточечном сравнении, т.е. максимальную разность особых точек, при которой они считаются одинаковыми.

§ Процент удачного сравнения, т.е. минимальны коэффициент соответствия 2х изображений, при котором они считаются одинаковыми.

§ Количество потоков, т.е. в сколько изображений одновременно будет сравниваться с искомым. Данный параметр прямо пропорционально влияет на скорость производимого поиска.

Далее нужно выбрать изображение, дубликаты которого мы будем искать в базе. Его можно выбрать, нажав кнопку "Обзор" и выбрав соответствующий файл в открывшемся окне OpenFileDialog.

Выбранное изображение отобразится на экране.

Затем следует выбрать категорию или несколько категорий, в которых будет производиться поиск дубликатов.

При нажатии на кнопку поиск программа составит дескрипторы особых точек выбранного изображения, а затем произведет, используя их, поиск в базе и найдет товары с похожими изображениями.

Для уменьшения времени, поиск можно производить в несколько потоков.

Процесс поиска отображается элементов ProgressBar, который появляется на время поиска.

Поиск можно остановить в любой момент времени, нажав на кнопку "Стоп".

В таблице снизу появляются товары, чьё изображение похоже на введенное пользователем. Сбоку от этой таблицы можно увидеть изображение выбранного товара.

Апробация методики

Для осуществления тестирования методики была произведена выборка магазинов имеющих как одинаковые, так и разные товарные позиции.

Парс магазинов осуществлялся в 5 потоков. На парс каждой товарной позиции уходило около 6и секунд. В итоге на парс ушло полтора часа. Все магазины распарсились успешно. Было выявлено 875 товарных позиций.

Составление дескрипторов изображения осуществлялось в 4 потока, т.е. одновременно обрабатывалось 4 изображения по 1,1 секунды каждая.

В результате были сформированы группы одинаковых товаров.

Качество группировки, т.е. количество ошибок, совершаемых программой при формировании групп одинаковых товаров, сильно зависит от настроек точности сравнения и процента удачного сравнения.

По этой причине было произведен ряд опытов, в ходе которых были выявлены оптимальные настройки для формирования групп.

Опыты производились на группе изображений, имеющих разный процент сходства и разное количество шумов. В группу так же были добавлены изображения другого товара.

При увеличении точности сравнений дескрипторов особых точек в группу одинаковости попадали только те изображения, которые были идентичны или имели низкий уровень шумов, что не может удовлетворять запросам т.к. в каждом магазине на изображение товара накладывается логотип магазина и другие дополнительные знаки.

При её чрезмерном уменьшении в группу начинали попадать товары совершенно непохожие на эталонные. В результате была найдена оптимальная точность для сравнения дескрипторов, равная 0.4, что и отображено на диаграмме.

Подобное поведение, что предсказуемо, наблюдалось и в отношении параметра "процент удачного сравнения". Его оптимальной величиной является 0.7, что также видно на диаграмме.