Разработка автоматизированной системы классификации товаров по изображениям
Программное обеспечение для получения исходных данных для обучения нейронных сетей и классификации товаров с их помощью. Алгоритм метода обратного распространения ошибки. Методика классификации товаров: составление алгоритма, программная реализация.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | дипломная работа |
Язык | русский |
Дата добавления | 07.06.2012 |
Размер файла | 2,2 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
c. level = (int) reader ["level"];
c. name = (string) reader ["name"];
c. url = (string) reader ["url"];
c. parentURL = (string) reader ["parentUrl"];
return c;
}
protected void GetCommandParameters (SqlParameterCollection parameters)
{
parameters. Clear ();
parameters. Add ("@id", SqlDbType. Int);
parameters. Add ("@level", SqlDbType. Int);
parameters. Add ("@name", SqlDbType. VarChar);
parameters. Add ("@url", SqlDbType. VarChar);
parameters. Add ("@parentUrl", SqlDbType. VarChar);
}
protected void FillCommandParameters (SqlParameterCollection parameters, Category c)
{
parameters ["@id"]. Value = c. id;
parameters ["@level"]. Value = c. level;
parameters ["@name"]. Value = c. name;
parameters ["@url"]. Value = c. url;
parameters ["@parentUrl"]. Value = c. parentURL;
}
#endregion
}
}
Модуль Grabber
using System;
using System. Collections. Generic;
using System. Linq;
using System. Text;
using System.net;
using System. IO;
using System. Windows. Forms;
using System. Text. RegularExpressions;
using System. Threading;
using System. Diagnostics;
using grabberMolotok. Threading;
namespace grabberMolotok
{
class Grabber
{
DBEngine. DBEngine dbEngine; // движок БД
List<Category> categories; // категории
int getItemCounter; // счетчик получения товаров
int getItemWorkAmount; // объём работы получения товаров
int getItemThreadCount; // количество потоков получения товаров
public int GetItemThreadCount
{
get { return getItemThreadCount; }
set { getItemThreadCount = value; }
}
int saveImageCounter; // счетчик сохранения изображений
int saveItemWorkAmount; // объём работы сохранения изображений
int saveItemThreadCount; // количество потоков сохранения изображений
public int SaveItemThreadCount
{
get { return saveItemThreadCount; }
set { saveItemThreadCount = value; }
}
#region События
public delegate void AllCategoriesParseCompletedEventHandler ();
public static event AllCategoriesParseCompletedEventHandler AllCategoriesParseCompletedEvent;
public delegate void AllCategoriesImageSaveCompletedEventHandler ();
public static event AllCategoriesImageSaveCompletedEventHandler AllCategoriesImageSaveCompletedEvent;
public delegate void CategoriesGotEventHandler ();
public static event CategoriesGotEventHandler CategoriesGotEvent;
void OnCategoryParseComplete ()
{
getItemCounter++;
if (getItemCounter == getItemWorkAmount)
{
AllCategoriesParseCompletedEvent ();
}
}
void OnCategoryImageSaveComplete ()
{
saveImageCounter++;
if (saveImageCounter == saveItemWorkAmount)
{
if (AllCategoriesImageSaveCompletedEvent! = null)
AllCategoriesImageSaveCompletedEvent ();
}
}
#endregion События
public Grabber ()
{
Category. CategoryParseCompletedEvent += new Category. CategoryParseCompletedEventHandler (this. OnCategoryParseComplete);
Category. CategoryImageSaveCompletedEvent += new Category. CategoryImageSaveCompletedEventHandler (this. OnCategoryImageSaveComplete);
dbEngine = new DBEngine. DBEngine ();
categories = new List<Category> ();
getItemCounter = 0;
getItemWorkAmount = - 1;
getItemThreadCount = 8;
saveImageCounter = 0;
saveItemWorkAmount = - 1;
saveItemThreadCount = 8;
}
// / <summary>
// / Получает список категорий с молотка
// / </summary>
public void GetCategories ()
{
Debug. WriteLine ("Получение категорий с сайта");
WebBrowser wB = new WebBrowser ();
wB. ScriptErrorsSuppressed = true;
string url = "http://molotok.ru/category_map. php";
wB. NavigateFromRequest (url);
List<HtmlElement> columnDivList = null;
List<HtmlElement> categoriesHtmlList = new List<HtmlElement> ();
columnDivList = wB. WaitElement ("pagecontent1", 10000)
. GetInnerElements ("table", 0)
. GetInnerElements ("tbody", 0)
. GetInnerElements ("tr",
3)
. GetInnerElements ("td", 1)
. GetInnerElements ("div");
foreach (var columnDiv in columnDivList)
{
categoriesHtmlList. AddRange (columnDiv. GetInnerElements ("div"));
}
Debug. WriteLine ("Категории получены с сайта");
ParseCategories (categoriesHtmlList);
if (CategoriesGotEvent! = null)
CategoriesGotEvent ();
}
// / <summary>
// / Парсит полученные с молотка категории
// / </summary>
// / <param name="categoriesHtmlList"></param>
void ParseCategories (List<HtmlElement> categoriesHtmlList)
{
Debug. WriteLine ("Начался парс категорий");
string [] LastLevelURL = new string [4];
string catName;
string catURL;
string catClass;
int catLevel;
int catSiteId;
Stopwatch wholeStopwatch = Stopwatch. StartNew ();
foreach (var categoryHtml in categoriesHtmlList)
{
// Stopwatch stopwatch = Stopwatch. StartNew ();
catName = GetName (categoryHtml);
catURL = GetURL (categoryHtml);
catClass = GetClass (categoryHtml);
catLevel = GetLevel (catClass);
catSiteId = GetSiteID (categoryHtml);
Category c = null;
switch (catLevel)
{
case 0:
{
c = new Category (catURL, "this is root", catName, 0, catLevel);
LastLevelURL [0] = catURL;
categories. Add (c);
break;
}
case 1:
{
c = new Category (catURL, LastLevelURL [0], catName, catSiteId, catLevel);
LastLevelURL [1] = catURL;
categories. Add (c);
break;
}
case 2:
{
c = new Category (catURL, LastLevelURL [1], catName, catSiteId, catLevel);
LastLevelURL [2] = catURL;
categories. Add (c);
break;
}
case 3:
{
c = new Category (catURL, LastLevelURL [2], catName, catSiteId, catLevel);
LastLevelURL [3] = catURL;
categories. Add (c);
break;
}
case 4:
{
c = new Category (catURL, LastLevelURL [3], catName, catSiteId, catLevel);
categories. Add (c);
break;
}
default: { break; }
}
// stopwatch. Stop ();
// Debug. WriteLine ( ( (double) stopwatch. ElapsedTicks / (double) Stopwatch. Frequency). ToString ());
}
wholeStopwatch. Stop ();
Debug. WriteLine ("Время парса всех категорий " + ( (double) wholeStopwatch. ElapsedTicks / (double) Stopwatch. Frequency). ToString () + "с");
Debug. WriteLine ("Парс категорий окончен");
}
#region Методы DBEngine
public void ClearTables ()
{
dbEngine. ClearTables ();
}
public void ClearCategories ()
{
dbEngine. categoryTable. Clear ();
}
public string ReadSetting (string settingName)
{
return dbEngine. settingsTable. ReadSetting (settingName);
}
// / <summary>
// / Сохраняет ссылки на изображения в БД
// / </summary>
// / <param name="c"></param>
public void SaveImages (Category c)
{
dbEngine. imageTable. Insert (c. categoryImages);
}
// / <summary>
// / Загружает ссылки на изображения из БД
// / </summary>
// / <param name="c"></param>
public void LoadImages (Category c)
{
c. categoryImages = dbEngine. imageTable. GetImagesInCategory (c);
}
// / <summary>
// / Сохраняет категории в БД
// / </summary>
public void SaveCategories ()
{
dbEngine. categoryTable. Insert (categories);
}
public Category GetCategoryById (int id)
{
return dbEngine. categoryTable. GetById (id);
}
// / <summary>
// / Загружает категории из БД
// / </summary>
public void LoadCategories ()
{
categories = dbEngine. categoryTable. GetAll ();
if (CategoriesGotEvent! = null)
CategoriesGotEvent ();
}
#endregion
#region Работа со списком категорий
// / <summary>
// / Возвращает список дочерних категорий (рекурсивная)
// / </summary>
// / <param name="root">Начальная категория</param>
// / <returns></returns>
public List<Category> GetAllChildCategories (Category root)
{
List<Category> childs = new List<Category> ();
childs. AddRange (
categories. FindAll (
delegate (Category category)
{
return category. parentURL == root. url;
}
)
);
int count = childs. Count;
if (count > 0 && root. level < 4)
{
for (int i = 0; i < count; i++)
{
childs. AddRange (GetAllChildCategories (childs [i]));
}
}
return childs;
}
// / <summary>
// / Возвращает список дочерних категорий
// / </summary>
// / <param name="root"></param>
// / <returns></returns>
public List<Category> GetChildCategories (Category root)
{
List<Category> childs = new List<Category> ();
childs. AddRange (
categories. FindAll (
delegate (Category category)
{
return category. parentURL == root. url;
}
)
);
return childs;
}
// / <summary>
// / Возвращает категории уровня 0
// / </summary>
// / <returns></returns>
public List<Category> GetRoots ()
{
List<Category> roots = new List<Category> ();
roots. AddRange (
categories. FindAll (
delegate (Category category)
{
return category. level == 0;
}
)
);
return roots;
}
#endregion
#region Вспомогательные функции
string GetName (HtmlElement e)
{
if (e. FirstChild! = null && e. FirstChild. FirstChild! = null) return e. FirstChild. FirstChild. InnerText;
return "";
}
string GetURL (HtmlElement e)
{
if (e. FirstChild! = null) return e. FirstChild. GetAttribute ("href"). Replace ("about:", "http://molotok.ru");
return "";
}
string GetClass (HtmlElement e)
{
Regex classExpression = new Regex (@"class=. {1} ([\w\d\s] *)", RegexOptions. IgnoreCase | RegexOptions.compiled);
Match match = classExpression. Match (e. OuterHtml);
if (match. Success)
{
return match. Groups [1]. Value;
}
return "";
}
int GetLevel (string classLevel)
{
Regex classExpression = new Regex (@" (\d{1})", RegexOptions. IgnoreCase | RegexOptions.compiled);
Match match = classExpression. Match (classLevel);
if (match. Success)
{
return Convert. ToInt32 (match. Groups [1]. Value);
}
return - 1;
}
int GetSiteID (HtmlElement e)
{
Regex siteIdExpression = new Regex (@" (\d{5,})", RegexOptions. IgnoreCase | RegexOptions.compiled);
Match match = siteIdExpression. Match (e. OuterHtml);
if (match. Success)
{
return Convert. ToInt32 (match. Groups [1]. Value);
}
return - 1;
}
#endregion
// / <summary>
// / Получает изображения в категории, в несколько потоков
// / </summary>
// / <param name="cats"></param>
public void ParallelGetItems (List<Category> cats)
{
Debug. WriteLine ("Запуск потоков парса ссылок на изображения");
this. getItemCounter = 0;
this. getItemWorkAmount = cats. Count;
var preparedList = ThreadHelper. SplitList (cats, getItemThreadCount);
foreach (var categories in preparedList)
{
Thread thread = new Thread (
delegate ()
{
foreach (var cat in categories)
{
cat. GetItems ();
Thread. Sleep (10);
}
}
);
thread. SetApartmentState (ApartmentState. STA);
thread. Start ();
thread. Join (10);
}
}
public void ParallelSaveImagesToDisk (List<Category> cats)
{
Debug. WriteLine ("Запуск потоков закачки изображений");
this. saveImageCounter = 0;
this. saveItemWorkAmount = cats. Count;
string initialDirectory = ReadSetting ("initialDirectory");
var preparedList = ThreadHelper. SplitList (cats, saveItemThreadCount);
foreach (var categories in preparedList)
{
Thread thread = new Thread (
delegate ()
{
foreach (var cat in categories)
{
cat. SaveImages (initialDirectory);
Thread. Sleep (10);
}
}
);
thread. SetApartmentState (ApartmentState. STA);
thread. Start ();
thread. Join (10);
}
}
}
}
using System;
using System. Collections. Generic;
using System. Linq;
using System. Text;
using System.net;
using System. IO;
using System. Text. RegularExpressions;
using System. Windows. Forms;
using System. Threading;
using System. Diagnostics;
namespace grabberMolotok
{
public class Category
{
public int id; // ИД категории в системе сайта
public int level; // Уровень вложения
public string name; // Название
public string url; // ссылка
public string parentURL; // ссылка на категорию-родитель
public List<Image> categoryImages; // изображения товаров
#region События
public delegate void CategoryParseCompletedEventHandler ();
public static event CategoryParseCompletedEventHandler CategoryParseCompletedEvent;
public delegate void CategoryImageSaveCompletedEventHandler ();
public static event CategoryImageSaveCompletedEventHandler CategoryImageSaveCompletedEvent;
#endregion
#region Конструкторы
public Category (string url, string parentURL, string name, int id, int level)
{
this. url = url;
this. parentURL = parentURL;
this. name = name;
this. id = id;
this. level = level;
categoryImages = new List<Image> ();
}
public Category (string url)
{
this. id = - 1;
this. level = - 1;
this. name = null;
this. url = url;
this. parentURL = null;
categoryImages = new List<Image> ();
}
public Category ()
{
this. id = - 1;
this. level = - 1;
this. name = null;
this. url = null;
this. parentURL = null;
categoryImages = new List<Image> ();
}
#endregion
// / <summary>
// / Получает список товаров в категории
// / </summary>
public void GetItems ()
{
WebBrowser wB = new WebBrowser ();
wB. ScriptErrorsSuppressed = true;
int pageCount = 0;
List<HtmlElement> htmlItems = new List<HtmlElement> ();
string url = this. url;
wB. NavigateFromRequest (url);
try
{
HtmlElement htmlPageCount = wB. WaitElement ("tabMainBox", 20000)
. GetInnerElements ("div", 0)
. GetInnerElements ("div", 0)
. GetInnerElements ("div", 0)
. GetInnerElements ("span", 1);
Regex pageCountRegex = new Regex (@"< [\D] span> (\d*) < [\D] span>", RegexOptions. IgnoreCase | RegexOptions.compiled);
Match match = pageCountRegex. Match (htmlPageCount. OuterHtml);
if (match. Success)
{
pageCount = Convert. ToInt32 (match. Groups [1]. Value);
}
}
catch (NullReferenceException)
{
pageCount = 1;
}
for (int i = 1; i <= pageCount; i++)
{
for (int tries = 0; tries < 5; tries++)
{
try
{
// Stopwatch watch = Stopwatch. StartNew ();
wB. NavigateFromRequest ("http://molotok.ru/listing. php/showcat? id=" + id. ToString () + "&p=" + i. ToString ());
htmlItems. AddRange (wB. WaitElement ("tabMainBox", 20000)
. GetInnerElements ("div", 1)
. GetInnerElements ("table", 0)
. GetInnerElements ("tbody", 0)
. GetInnerElements ("tr")
);
// watch. Stop ();
// Debug. WriteLine ( ( (double) watch. ElapsedTicks / (double) Stopwatch. Frequency). ToString ());
break;
}
catch (NullReferenceException)
{
Thread. Sleep (50);
}
}
}
ParseItems (htmlItems);
CategoryParseCompletedEvent ();
}
// / <summary>
// / Парсит товары в категории
// / </summary>
// / <param name="itemsHtmlList"></param>
// / <param name="cat"></param>
void ParseItems (List<HtmlElement> itemsHtmlList)
{
Debug. WriteLine ("Начался парс товаров");
Regex itemIdRegex = new Regex ("data-id=\" ([\\d] *)", RegexOptions. IgnoreCase | RegexOptions.compiled);
Regex smallPicturesRegex = new Regex (@" (http://[\w\d] *. allegroimg. pl/photos/64x48 [/\d] * [_\d] *)", RegexOptions. IgnoreCase | RegexOptions.compiled);
Regex bigPicturesRegex = new Regex (@" (http://[\w\d] *. allegroimg. pl/photos/400x300 [/\d] * [_\d] *)", RegexOptions. IgnoreCase | RegexOptions.compiled);
foreach (var item in itemsHtmlList)
{
// Stopwatch watch = Stopwatch. StartNew ();
/************************************/
Int64 itemId = - 1;
List<Image> imgList = new List<Image> ();;
Match matchId = itemIdRegex. Match (item. OuterHtml);
if (matchId. Success)
{
itemId = Convert. ToInt64 (matchId. Groups [1]. Value);
}
Match matchsmallPictures = smallPicturesRegex. Match (item. OuterHtml);
while (matchsmallPictures. Success)
{
this. AddImage (itemId, matchsmallPictures. Groups [1]. Value, false);
matchsmallPictures = matchsmallPictures. NextMatch ();
}
Match matchbigPictures = bigPicturesRegex. Match (item. OuterHtml);
while (matchbigPictures. Success)
{
this. AddImage (itemId, matchbigPictures. Groups [1]. Value, true);
matchbigPictures = matchbigPictures. NextMatch ();
}
/********************************************/
// watch. Stop ();
// Debug. WriteLine ( ( (double) watch. ElapsedTicks / (double) Stopwatch. Frequency). ToString ());
}
}
public void AddImage (Int64 itemId, string thumbnailURL, bool isBig)
{
Image img = new Image (itemId, id, thumbnailURL, isBig);
categoryImages. Add (img);
}
public void SaveImages (string initialDirectory)
{
foreach (var image in categoryImages)
{
Stopwatch watch = Stopwatch. StartNew ();
image. Save (initialDirectory);
watch. Stop ();
Debug. WriteLine ( ( (double) watch. ElapsedTicks / (double) Stopwatch. Frequency). ToString ());
}
CategoryImageSaveCompletedEvent ();
}
}
}
Модуль NetworkController
using System;
using System. Collections. Generic;
using System. Linq;
using System. Text;
using System. IO;
using System. Drawing;
using System. Threading;
using System. Diagnostics;
using grabberMolotok. DBEngine;
using grabberMolotok. Threading;
namespace FANNCategoriesDetector
{
class NetworkController
{
DBEngine dbEngine; // движок бд
List<NeuralNetwork> smallNetworks; // маленькие сети
List<NeuralNetwork> bigNetworks; // большие сети
public Dictionary<NeuralNetwork, double [] > workResult; // результат работы сетей
bool smallNetworksInitialized; // флаг инициализации малых сетей
public bool SmallNetworksInitialized
{
get { return smallNetworksInitialized; }
}
bool bigNetworksInitialized; // флаг инициализации больших сетей
public bool BigNetworksInitialized
{
get { return bigNetworksInitialized; }
set { bigNetworksInitialized = value; }
}
string initialDirectory; // рабочая директория
public string InitialDirectory
{
get { return initialDirectory; }
}
uint [] smallNetworkLayers = { 3072, 512, 1 }; // слои малых сетей
uint [] bigNetworkLayers = { 12000, 1000, 1 }; // слои больших сетей
int trainDataCreationCounter; // счетчик создания данных для обучения
int trainDataCreationWorkAmount; // объём работы данных обучения
int trainDataCreationThreadCount; // количество потоков данных обучения
public int TrainDataCreationThreadCount
{
get { return trainDataCreationThreadCount; }
set { trainDataCreationThreadCount = value; }
}
int networkTrainCounter; // счетчик обучения сетей
int networkTrainWorkAmount; // объём работы обучения сетей
int networkTrainThreadCount; // количество потоков обучения сетей
public int NetworkTrainThreadCount
{
get { return networkTrainThreadCount; }
set { networkTrainThreadCount = value; }
}
int networkCreateCounter; // счетчик создания сетей
int networkCreateWorkAmount; // объём создания сетей
int networkCreateThreadCount; // потоки создания сетей
public int NetworkCreateThreadCount
{
get { return networkCreateThreadCount; }
set { networkCreateThreadCount = value; }
}
#region События
public delegate void AllTrainDataCreationCompletedEventHandler ();
public static event AllTrainDataCreationCompletedEventHandler AllTrainDataCreationCompletedEvent;
public delegate void AllNetworkTrainedEventHandler ();
public static event AllNetworkTrainedEventHandler AllNetworkTrainedEvent;
public delegate void AllNetworkCreatedEventHandler ();
public static event AllNetworkCreatedEventHandler AllNetworkCreatedEvent;
public delegate void AllNetworkWorkedEventHandler ();
public static event AllNetworkWorkedEventHandler AllNetworkWorkedEvent;
public delegate void NetworkCreatedEventHandler ();
public static event NetworkCreatedEventHandler NetworkCreatedEvent;
public delegate void NetworkTrainedEventHandler ();
public static event NetworkTrainedEventHandler NetworkTrainedEvent;
void OnTrainDataCreationComplete ()
{
trainDataCreationCounter++;
if (trainDataCreationCounter == trainDataCreationWorkAmount)
{
if (AllTrainDataCreationCompletedEvent! = null)
AllTrainDataCreationCompletedEvent ();
}
}
void OnNetworkTrained ()
{
networkTrainCounter++;
if (networkTrainCounter == networkTrainWorkAmount)
{
if (AllNetworkTrainedEvent! = null)
AllNetworkTrainedEvent ();
}
}
void OnNetworkCreated ()
{
networkCreateCounter++;
if (networkCreateCounter == networkCreateWorkAmount)
{
if (AllNetworkCreatedEvent! = null)
AllNetworkCreatedEvent ();
smallNetworksInitialized = true;
}
}
#endregion События
public NetworkController ()
{
NetworkController.networkCreatedEvent += new NetworkController.networkCreatedEventHandler (this. OnNetworkCreated);
NetworkController.networkTrainedEvent += new NetworkController.networkTrainedEventHandler (this. OnNetworkTrained);
NeuralNetwork. TrainDataCreatedEvent += new NeuralNetwork. TrainDataCreatedEventHandler (this. OnTrainDataCreationComplete);
dbEngine = new grabberMolotok. DBEngine. DBEngine ();
smallNetworks = new List<NeuralNetwork> ();
initialDirectory = dbEngine. settingsTable. ReadSetting ("initialDirectory");
smallNetworksInitialized = false;
trainDataCreationCounter = 0;
networkTrainCounter = 0;
networkCreateCounter = 0;
trainDataCreationWorkAmount = - 1;
networkTrainWorkAmount = - 1;
networkTrainWorkAmount = - 1;
trainDataCreationThreadCount = 8;
networkTrainThreadCount = 8;
networkCreateThreadCount = 8;
}
public int GetNetworkCreationWorkAmount ()
{
var networks = (new DirectoryInfo (initialDirectory + @"\64x48")). GetFiles ("*. ann");
return networks. Length;
}
void CreateSmallNetworks ()
{
smallNetworks. Clear ();
Debug. WriteLine ("Инициализация нейронных сетей");
var networks = (new DirectoryInfo (initialDirectory + @"\64x48")). GetFiles ("*. ann");
networkCreateWorkAmount = networks. Length;
foreach (var n in networks)
{
Stopwatch watch = Stopwatch. StartNew ();
NeuralNetwork net = new NeuralNetwork (smallNetworkLayers);
net. Create (n. FullName);
Int32. TryParse (n. Name. Replace (". ann", ""), out net. id);
net. category = dbEngine. categoryTable. GetById (net. id);
smallNetworks. Add (net);
NetworkCreatedEvent ();
watch. Stop ();
Debug. WriteLine ( ( (double) watch. ElapsedTicks / (double) Stopwatch. Frequency). ToString ());
}
smallNetworksInitialized = true;
}
void CreateBigNetworks ()
{
bigNetworks. Clear ();
var networks = (new DirectoryInfo (initialDirectory + @"\400x300")). GetFiles ("*. ann");
foreach (var n in networks)
{
NeuralNetwork net = new NeuralNetwork (bigNetworkLayers);
net. Create (n. FullName);
Int32. TryParse (n. Name. Replace (". ann", ""), out net. id);
net. category = dbEngine. categoryTable. GetById (net. id);
bigNetworks. Add (net);
}
smallNetworksInitialized = true;
}
#region Паралельная инициализация сетей
public void ParallelCreateSmallNetworks ()
{
smallNetworks. Clear ();
var networksFilesArray = (new DirectoryInfo (initialDirectory + @"\64x48")). GetFiles ("*. ann");
List<FileInfo> networksFiles = new List<FileInfo> ();
networksFiles. AddRange (networksFilesArray);
networkCreateWorkAmount = networksFiles. Count;
var preparedList = ThreadHelper. SplitList (networksFiles, networkCreateThreadCount);
for (int counter = 0; counter < preparedList. Length; counter++)
{
ParameterForDelegate parameter = new ParameterForDelegate (preparedList, counter);
Thread thread = new Thread (new ParameterizedThreadStart (ParallelCreate));
thread. Start (parameter);
thread. Join (10);
}
}
class ParameterForDelegate
{
public List<FileInfo> [] preparedList;
public int counter;
public ParameterForDelegate (List<FileInfo> [] preparedList, int counter)
{
this. preparedList = preparedList;
this. counter = counter;
}
}
void ParallelCreate (object parameter)
{
List<FileInfo> [] preparedList = ( (ParameterForDelegate) parameter). preparedList;
int counter = ( (ParameterForDelegate) parameter). counter;
for (int j = 0; j < preparedList [counter]. Count; j++)
{
NeuralNetwork net = new NeuralNetwork (smallNetworkLayers);
net. Create (preparedList [counter] [j]. FullName);
Int32. TryParse (preparedList [counter] [j]. Name. Replace (". ann", ""), out net. id);
smallNetworks. Add (net);
Thread. Sleep (10);
if (NetworkCreatedEvent! = null)
NetworkCreatedEvent ();
}
}
#endregion Паралельная инициализация сетей
public /*Dictionary<NeuralNetwork, double [] >*/void Work (object image)
{
Bitmap imageToDetect = (Bitmap) image;
Dictionary<NeuralNetwork, double [] > result = new Dictionary<NeuralNetwork, double [] > ();
if (! smallNetworksInitialized)
CreateSmallNetworks ();
Debug. WriteLine ("Работа нейронных сетей");
foreach (var network in smallNetworks)
{
Stopwatch watch = Stopwatch. StartNew ();
result. Add (network, network. Work (imageToDetect));
watch. Stop ();
Debug. WriteLine ( ( (double) watch. ElapsedTicks / (double) Stopwatch. Frequency). ToString ());
}
workResult = result;
Thread. Sleep (50);
// return result;
AllNetworkWorkedEvent ();
}
public int GetTrainDataCreationWorkAmount ()
{
DirectoryInfo [] trainDirectoryInfo = (new DirectoryInfo (initialDirectory + @"\64x48")). GetDirectories ();
// return trainDirectoryInfo. Length * 2;
return trainDirectoryInfo. Length;
}
public int GetParallelTrainDataCreationWorkAmount ()
{
DirectoryInfo [] trainDirectoryInfo = (new DirectoryInfo (initialDirectory + @"\64x48")). GetDirectories ();
return trainDirectoryInfo. Length;
}
public void CreateSmallTrainData ()
{
WipeTrainData ();
DirectoryInfo [] trainDirectoryInfo = (new DirectoryInfo (initialDirectory + @"\64x48")). GetDirectories (); // Чтение каталога всех категорий
trainDataCreationWorkAmount = trainDirectoryInfo. Length;
for (int i = 0; i < trainDirectoryInfo. Length; i++)
{
DirectoryInfo [] items = trainDirectoryInfo [i]. GetDirectories (); // список товаров в категории
List<FileInfo> images = new List<FileInfo> (); // изображения товаров в категории
List<FileInfo> falseImages = new List<FileInfo> (); // изображения товаров в других категориях
foreach (var item in items)
{
images. AddRange (item. GetFiles ("*. jpg"));
}
for (int j = 0; j < trainDirectoryInfo. Length; j++)
{
if (j == i)
continue;
DirectoryInfo [] falseItems = trainDirectoryInfo [j]. GetDirectories ();
foreach (var item in falseItems)
{
falseImages. AddRange (item. GetFiles ("*. jpg"));
}
}
uint trainImagesCount = (uint) (images. Count + falseImages. Count);
NeuralNetwork net = new NeuralNetwork (smallNetworkLayers);
net. id = Convert. ToInt32 (trainDirectoryInfo [i]. Name);
net. CreateTrainDataFile (trainDirectoryInfo [i]. FullName, images, true);
// net. CreateTrainDataFile (trainDirectoryInfo [i]. FullName, images, true, trainImagesCount);
// net. CreateTrainDataFile (trainDirectoryInfo [i]. FullName, falseImages, false, trainImagesCount);
}
}
public void CreateSmallTrainData (List<DirectoryInfo> trainDirectoryInfo, List<DirectoryInfo> wholeTDI)
{
for (int i = 0; i < trainDirectoryInfo. Count; i++)
{
DirectoryInfo [] items = trainDirectoryInfo [i]. GetDirectories ();
List<FileInfo> images = new List<FileInfo> ();
List<FileInfo> falseImages = new List<FileInfo> ();
foreach (var item in items)
{
images. AddRange (item. GetFiles ("*. jpg"));
}
for (int j = 0; j < wholeTDI. Count; j++)
{
if (wholeTDI [j] == trainDirectoryInfo [i])
continue;
DirectoryInfo [] falseItems = wholeTDI [j]. GetDirectories ();
foreach (var item in falseItems)
{
falseImages. AddRange (item. GetFiles ("*. jpg"));
}
}
uint trainImagesCount = (uint) (images. Count + falseImages. Count);
NeuralNetwork net = new NeuralNetwork (smallNetworkLayers);
net. id = Convert. ToInt32 (trainDirectoryInfo [i]. Name);
// net. CreateTrainDataFile (trainDirectoryInfo [i]. FullName, images, true);
net. CreateTrainDataFile (trainDirectoryInfo [i]. FullName, images, true, trainImagesCount);
net. CreateTrainDataFile (trainDirectoryInfo [i]. FullName, falseImages, false, trainImagesCount);
}
}
public void CreateSmallTrainData (List<DirectoryInfo> trainDirectoryInfo)
{
for (int i = 0; i < trainDirectoryInfo. Count; i++)
{
DirectoryInfo [] items = trainDirectoryInfo [i]. GetDirectories ();
List<FileInfo> images = new List<FileInfo> ();
foreach (var item in items)
{
images. AddRange (item. GetFiles ("*. jpg"));
}
NeuralNetwork net = new NeuralNetwork (smallNetworkLayers);
net. id = Convert. ToInt32 (trainDirectoryInfo [i]. Name);
Stopwatch watch = Stopwatch. StartNew ();
net. CreateTrainDataFile (trainDirectoryInfo [i]. FullName, images, true);
watch. Stop ();
Debug. WriteLine ( ( (double) watch. ElapsedTicks / (double) Stopwatch. Frequency / (double) images. Count). ToString ());
}
}
public void ParallelCreateSmallTrainData ()
{
WipeTrainData ();
DirectoryInfo [] trainDirectoryInfo = (new DirectoryInfo (initialDirectory + @"\64x48")). GetDirectories (); // Чтение каталога всех категорий
trainDataCreationWorkAmount = trainDirectoryInfo. Length;
var preparedList = ThreadHelper. SplitList (trainDirectoryInfo. ToList<DirectoryInfo> (), trainDataCreationThreadCount);
foreach (List<DirectoryInfo> categories in preparedList)
{
Thread thread = new Thread (
delegate ()
{
Debug. WriteLine ("Создание файлов обучения");
CreateSmallTrainData (categories);
}
);
thread. Start ();
thread. Join (10);
}
}
public int GetNetworkTrainWorkAmount ()
{
DirectoryInfo [] trainDirectoryInfo = (new DirectoryInfo (initialDirectory + @"\64x48")). GetDirectories (); // Чтение каталога всех категорий
int counter = 0;
foreach (var category in trainDirectoryInfo)
{
string trainFilePath = category. FullName + " // " + category. Name +". tr";
if (File. Exists (trainFilePath))
{
counter++;
}
}
return counter;
}
public void TrainSmallNetworks ()
{
WipeNetworks ();
networkTrainWorkAmount = GetNetworkTrainWorkAmount ();
DirectoryInfo [] trainDirectoryInfo = (new DirectoryInfo (initialDirectory + @"\64x48")). GetDirectories (); // Чтение каталога всех категорий
foreach (var category in trainDirectoryInfo)
{
string trainFilePath = category. FullName + "\\" + category. Name +". tr";
if (File. Exists (trainFilePath))
{
NeuralNetwork net = new NeuralNetwork (smallNetworkLayers);
net. id = Convert. ToInt32 (category. Name);
Stopwatch watch = Stopwatch. StartNew ();
net. Train (trainFilePath);
watch. Stop ();
Debug. WriteLine ("Training " + ( (double) watch. ElapsedTicks / (double) Stopwatch. Frequency). ToString ());
Stopwatch anotherWatch = Stopwatch. StartNew ();
net. Save (initialDirectory + @"\64x48\");
anotherWatch. Stop ();
Debug. WriteLine ("Saving " + ( (double) anotherWatch. ElapsedTicks / (double) Stopwatch. Frequency). ToString ());
NetworkTrainedEvent ();
}
}
}
public void TrainSmallNetworks (List<DirectoryInfo> trainDirectoryInfo)
{
foreach (var category in trainDirectoryInfo)
{
string trainFilePath = category. FullName + " // " + category. Name +". tr";
if (File. Exists (trainFilePath))
{
NeuralNetwork net = new NeuralNetwork (smallNetworkLayers);
net. id = Convert. ToInt32 (category. Name);
// Stopwatch watch = Stopwatch. StartNew ();
net. Train (trainFilePath);
// watch. Stop ();
// Debug. WriteLine ( ( (double) watch. ElapsedTicks / (double) Stopwatch. Frequency). ToString ());
net. Save (initialDirectory + @"\64x48\");
NetworkTrainedEvent ();
}
}
}
public void ParallelTrainSmallNetworks ()
{
WipeNetworks ();
DirectoryInfo [] trainDirectoryInfo = (new DirectoryInfo (initialDirectory + @"\64x48")). GetDirectories (); // Чтение каталога всех категорий
networkTrainWorkAmount = GetNetworkTrainWorkAmount ();
var preparedList = ThreadHelper. SplitList (trainDirectoryInfo. ToList<DirectoryInfo> (), networkTrainThreadCount);
foreach (List<DirectoryInfo> categories in preparedList)
{
Thread thread = new Thread (
delegate ()
{
Debug. WriteLine ("Обучение сетей");
TrainSmallNetworks (categories);
}
);
thread. SetApartmentState (ApartmentState. STA);
thread. Start ();
thread. Join (50);
}
}
public void CascadeTrainSmallNetworks ()
{
DirectoryInfo [] trainDirectoryInfo = (new DirectoryInfo (initialDirectory + @"\64x48")). GetDirectories (); // Чтение каталога всех категорий
foreach (var category in trainDirectoryInfo)
{
string trainFilePath = category. FullName + " // " + category. Name +". tr";
NeuralNetwork net = new NeuralNetwork (smallNetworkLayers);
net. id = Convert. ToInt32 (category. Name);
net. CascadeTrain (trainFilePath);
net. Save (initialDirectory + @"\64x48\");
}
}
public void WipeTrainData ()
{
DirectoryInfo [] trainDirectoryInfo = (new DirectoryInfo (initialDirectory + @"\64x48")). GetDirectories ();
foreach (var dir in trainDirectoryInfo)
{
var tr = dir. GetFiles ("*. tr");
try
{
tr [0]. Delete ();
}
catch (Exception)
{
continue;
}
}
}
public void WipeNetworks ()
{
var ann = (new DirectoryInfo (initialDirectory + @"\64x48")). GetFiles ("*. ann");
foreach (var n in ann)
{
try
{
n. Delete ();
}
catch (Exception)
{
continue;
}
}
}
public void Wipe ()
{
WipeTrainData ();
WipeNetworks ();
}
}
}
Размещено на Allbest.ru
Подобные документы
Изучение принципа работы интернет-аукциона (на примере сайта molotok.ru). Способ получения информации с веб-ресурсов. Разработка программного обеспечения с целью создания исходных данных для обучения нейронных сетей и классификации товаров с их помощью.
дипломная работа [2,0 M], добавлен 29.06.2012Программная реализация алгоритма составления каталога товаров из сети электронных магазинов с выявлением одинаковых, используя сравнение по изображениям. SURF-метод в основе алгоритма: поиск особых точек на изображении и составление их дескрипторов.
дипломная работа [3,1 M], добавлен 27.06.2012Обучение нейронных сетей как мощного метода моделирования, позволяющего воспроизводить сложные зависимости. Реализация алгоритма обратного распространения ошибки на примере аппроксимации функции. Анализ алгоритма обратного распространения ошибки.
реферат [654,2 K], добавлен 09.06.2014Обучение простейшей и многослойной искусственной нейронной сети. Метод обучения перцептрона по принципу градиентного спуска по поверхности ошибки. Реализация в программном продукте NeuroPro 0.25. Использование алгоритма обратного распространения ошибки.
курсовая работа [1019,5 K], добавлен 05.05.2015Общие сведения о принципах построения нейронных сетей. Искусственные нейронные системы. Математическая модель нейрона. Классификация нейронных сетей. Правила обучения Хэбба, Розенблатта и Видроу-Хоффа. Алгоритм обратного распространения ошибки.
дипломная работа [814,6 K], добавлен 29.09.2014Рассмотрение способов применения и основных понятий нейронных сетей. Проектирование функциональной структуры автоматизированной системы построения нейросети обратного распространения ошибки, ее классов и интерфейсов. Описание периода "бета тестирования".
дипломная работа [3,0 M], добавлен 02.03.2010Создание системы предобработки данных; разработка системы классификации на базе методов и алгоритмов машинного обучения, их реализация в программной системе. Предобработка информации, инструкция пользователя, система классификации, машинный эксперимент.
дипломная работа [917,1 K], добавлен 31.01.2015Диагностический анализ изучения алгоритмов обучения нейронных сетей "с учителем". Сбор входных и выходных переменных для наблюдений и понятие пре/пост процессирования. Подготовка и обобщение многослойного персептрона, модель обратного распространения.
курсовая работа [249,3 K], добавлен 22.06.2011Проектирование и реализация комплекса задач автоматизации учета движения товаров на складе в ЗАО "ГРЕЦ" и технико-экономические расчеты. Обоснование выбора программно-технических средств, блок-схема алгоритма. Описание программного обеспечения системы.
дипломная работа [3,0 M], добавлен 05.12.2011Программная реализация метода оптимальной классификации одномерного упорядоченного множества на основе "склеивания с ближайшим". Проверка работоспособности программы на основе алгоритмов классификации, вычислительные эксперименты по оценке эффективности.
курсовая работа [414,4 K], добавлен 24.05.2015