Разработка ETL-системы
Объект и инструменты исследования. Характеристика платформ для анализа данных. Изучение программных пакетов. Особенности использования DanbooruDownloader. Основы установки Anaconda. Проверка эффективности работы простых методов классификации на тегах.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | дипломная работа |
Язык | русский |
Дата добавления | 30.08.2016 |
Размер файла | 1,1 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Introduction
Area of research and its applicability
Modern world, being firmly footed in the Information Age, is spectacularly efficient in producing large quantities of data of any kind and variety. This includes both human-generated content (music, visual arts, cinema, literature, photography, emails, tweets, programming code, plain speech, 3d blueprints, handwritten text -- you name it) and machine-generated data: genomic data, measurements of anything measurable, historical data of human activities, etc. And while this fact is certainly fascinating on its own merits -- to computer and data geeks at the very least -- it could be entirely inconsequential, if not for its practical applications. As seen in the results of successful projects in the field, it is entirely possible to enhance or even supplant human skills, knowledge and experience with use of sufficiently sophisticated machine learning techniques, enough computational power to train appropriate models and, most crucially, vast amounts of raw data. Several examples are listed below
As of 2016, Google Translate is comparable to human translators (at least, on the semantic level (Haiying Li, 2014)), can processing text thousands of times faster; works in 103 languages, and recognizes printed, handwritten and spoken text.
In 2015, automated classification of plankton using deep neural networks was achieved (Dieleman, 2015).
In the same year, similar techniques were used to remarkable results on diagnostics of diabetic retinopathy, potentially alleviating medical expenditures worth of hundreds of millions of dollars annually (estimation based on (estimated) wages, diagnosis' time and number of patients) (Graham, 2015).
Currently, the effort is underway to construct an analogous solution to the problem of measuring cardiac volumes and deriving ejection fraction, with similar economic potential (Kaggle Inc, 2015).
In the past several years dairy industry has embraced methods of biological data science. Principle idea behind this trend is the usage genetic markers in building predictive models of “lifetime net merit” (and, supposedly, other, more directly measured qualities) of bulls, which turned out to be substantially more effective than traditional methods alone (Madrigal, 2012).
These and many other achievements provide the background: data science is not just a curious plaything for enthusiastic theorists to play with, but also a powerful instrument applicable to business problems in fields many and diverse.
As should be apparent from the fact that data science has only blossomed into maturity in recent years, the task of discovering patterns in the sea of data is not simple, and Big Data is called so for a reason; while constantly shifting with the advance of the technology, lower boundary for what is considered Big Data was in terabytes at least even in 2012 (w:Big data) and projects which produce tens of terabytes of data daily are not unheard of. Even storage (not to mention analysis) of such vast volume is a very nontrivial problem, plainly unsolvable with a single computer system -- no matter how massive.
Fortunately, the solution exists: by and large, analysis of large datasets can be broken down into numerous small tasks, all perfectly manageable by regular machines, all subject to parallel processing. In fact, one of the intentions of this work is to assemble a (software) system capable of that. This is further elaborated upon in the next paragraph.
Aims and purposes
The present study intends to construct an adaptable and scalable ETL and machine learning pipeline as a means of accomplishing the following purposes:
to learn of instruments of large-scale data processing, in particular of those necessary to extract and transform plain text, images and their metadata and to build the aforementioned machine learning layer capable of useful work;
to acquire practical experience in managing such instruments, as theoretical knowledge has no say in the pitfalls and shortcomings of a real system;
to provide a comprehensible (if possible, a step-by-step) guide to recreating the result, as there are too few papers that care for their own reproducibility;
to explicitly demonstrate the successful achievement of the outlined goals.
Глава 1. Объект и инструменты исследования
платформа программный тег
1.1 Датасет
Одной из ключевых компонент исследования является источник данных. В начале работы над исследованием были поставлены следующие критерии, которым оный должен был удовлетворять:
Источник данных должен быть публично доступен.
Источник данных не должен быть «заезженным», т.е.не должен широко использоваться в научных работах по теме: гораздо интереснее проводить анализ, имея хотя бы шанс на получение новых результатов вместо повторения уже проделанной научной работы.
Источник данных должен быть достаточно масштабным: шансы на получение эффективных результатов на малых объёмах невелики, к тому же часть исследования посвящена вопросу масштабирования анализа данных.
Источник данных должен иметь тщательно размечен, т.е. индивидуальные объекты в нём должны быть распределены по множеству различных категорий (с допустимыми пересечениями), что позволит иметь наглядные и легко представимые программно цели для тренировки аналитических моделей.
Результат работы должен иметь хотя бы гипотетическое практическое применение.
В конце концов, хотелось бы иметь датасет интересным или забавным.
В соответствии с этими требованиями были рассмотрены следующие датасеты:
Многие наборы данных, указанные в (Kaggle Inc.) удовлетворяют многим критериям: интересны, объёмны, практически применимы, тщательно промаркированы, очевидно, публично доступны, однако формат платформы Kaggle диктует их популярность: большая часть этих наборов обследована десятками и сотнями исследователей, и по многим из них проведены и опубликованы крупные научно-практические работы.
1.2 Платформа
Существует немалое количество фреймфорков для анализа данных. Одним из них является пакет Anaconda, базирующийся на Python и большом количестве библиотек обработки и анализа данных. Приведём некоторые из них:
* conda, “an open source package management system and environment management system for installing multiple versions of software packages and their dependencies and switching easily between them” (15);
* Matplotlib for intuitively understandable visualizations;
* IPython for interactive development ;
* NumPy for standard implementations of tools of pure mathematics (linear algebra, FFT, matrix operations, multidimensional arrays, random sampling, etc.);
* pandas for yet another way of querying relational data ;
scikit-learn for machine learning in all of its variety: regression, clustering, classification, preprocessing and whatnot.
Причины для выбора именно этого фреймфорка (по сравнению с, к примеру, языком R или средами Wolfram Mathematica и Matlab) таковы:
Предыдущее знакомство с языком.
Широкая популярность как языка, так и потенциально используемых пакетов.
Существование готовых решений по интеграции с системами больших данных (пять библиотек для взаимодействия с одним только Hadoop!)
Средой для разработки кода был выбран IPytrhon/Jupyther по причинам встроенности в дистрибутив Anaconda, простоты и наглядности разработки.
Следует отметить, что, хотя более «свежей» версией Python является 3.5, значительная часть программ и пакетов по историческим причинам реализованы также, или же эксклюзивно под версию 2.7. Несколько экспериментов с установкой и разрешением зависимостей различных пакетов в составе Anaconda привели к мнению, что дистрибутив под версию 2.7 является наиболее функциональным.
1.3 Программные пакеты
Мощным аналитеческим пакетом под Python является Theano, «a Python library that allows you to define, optimize, and evaluate mathematical expressions involving multi-dimensional arrays efficiently» (LISA lab, 2016), в частности из-за потенциального использования GPU и из-за его ориентированность на скорость вычислений, нечастую для Python-пакетов. К сожалению, требования к его установке и работе нетривиальны, и при установке часть из них не удалось удовлетворить по неизвестным причинам.
Другой популярной библиотекой анализа данных является уже упоминавшаяся выше scikit-learn. Она включает в себя такие методы анализа данных как: Support Vector Classification, Random Forest Classifier. Gaussian Naive Bayes, Linear Discriminant Analysis, Quadratic Discriminant Analysis, и так далее.
Наконец, была использован caffe -- «a deep learning framework made with expression, speed, and modularity in mind» (Jia, 2016) -- набор библиотек C++ и интерфейсов к различным средам разработки (в том числе к python), разработанный для удобного конструирования и обучения глубоких нейронных сетей. Он вполне аналогичен Theano по гибкости, также использует GPU-ускорение, и более непосредственно применим в исследовании.
1.4 Вычислительные ресурсы
Вычисления проводились на ПК, укомплектованном двухядерным Intel Core i5 @ 3.2-GHz, 16 ГБ оперативной памяти и видеокартой NVIDIA GeForce GTX 460, совместимой с технологией NVIDIA CUDA.
При проведении исследования обнаружилось, что указанная видеокарта обладает сравнительно малой оперативной памятью (768МБ), в связи с чем была приобретена и установлена новая: NVIDIA GeForce GT 730. Последняя облает преимществом по объёму памяти (4 ГБ), но проигрывает по количеству ядер CUDA: 96 против 336.
В качестве альтернативных вариантов рассматривались облачные вычислительные сервисы, к примеру, Microsoft Azure и Amazon Web Services. Они были отвергунты по двум причинам: излишнее усложнение и без того непростого стека технологий и цена.
Глава 2. Установка. Выбор целей и метрик
2.1 Выгрузка данных
Самым простым способом извлечения и сохранения данных из источника был выбран DanbooruDownloader (Nandaka, 2016) благодаря простоте использования и высокой степени кастомизации:
Рисунок 1 Окно настроек DanbooruDownloader
В первых экспериментах большая часть настроек была оставлена без изменений; исключение составляют Default Save Folder, многократно изменённый с целью ограничения количества изображений в одной папке, и Image Size, установленный в Thumb для усечения размера индивидуальных изображений для экспериментов.
Инструменты анализа
Очевидно, была установлена Anaconda.
Рисунок 2 Окно загрузки Anaconda
Рисунок 3 Окно установки Anaconda
Рисунок 4 Окно установки Anaconda, финал
Были рассмотрены две библиотеки предварительной обработки изображений: PIL/pillow и opencv. Преимущества первой состоят во вхождении в вышеуказанный дистрибутив, и в значительной распространённости; преимущество второй -- в функциональной мозности. В связи с этим в качестве базового инструмента предобработки была задействована PIL/pillow, однако opencv была установлена на случай необходимости сложной предобработки.
Рисунок 5 Установка opencv
Была произведена попытка установить Teano, однако она застопорилась при установке CUDA. В связи с непрозрачностью установки отладка представлялась сложной, и было принято решение отложить Teano в сторону до поры.
Наконец, была установлена caffe. Этот процесс включил в себя:
загрузку исходного кода (т.е. решения Visual Studio 2013) из репозитория (https://github.com/BVLC/caffe/tree/windows);
установку предварительно необходимого ПО:
CUDA, доступную по адресу https://developer.nvidia.com/cuda-toolkit;
cuDNN 4, доступный при регистрации в «Accelerated Computing Developer Program» NVIDIA Corporation;
python-модуля protobuf, т.е. библиотеки Protocol Buffers, разрабатываемой Гуглом (Google Inc., 2008), которую caffe использует для сериализации-десериализации моделей;
установку Microsoft Visual Studio 2013, необходимой для сборки решения в рабочее приложение;
установку параметров сборки:
CuDnnPath -- местонахождение установленного cuDNN
PythonSupport = true для сборки python-пакета;
собственно сборку.
При установке и использовании caffe были обнаружены (и, по возможности, решены) следующие проблемы:
Неудавшаяся первая сборка в связи с недоступностью файлов подгружаемых пакетов Visual Studio. Решено пересборкой.
Неудавшаяся сборка библиотеки libcaffe в связи с недоступностью файла настроек CUDA (CUDA 7.5.props). Проблема вызвана смешением настроек и установок Студий разных версий; решена переносом файла настроек (и сопутствующих) в корректный путь.
Фатальная ошибка при попытке инициализации сети: cudnn_conv_layer.cpp:53] Check failed: status == CUDNN_STATUS_SUCCESS (6 vs. 0) CUDNN_STATUS_ARCH_MISMATCH. Вызвана тем, что cuDNN требует CUDA Compute Capability 3.0 или выше, в то время как имеющеяся видеокарта обеспечивает лишь 2.1. Решено отключением поддержки cuDNN и пересборкой.
Разнообразные фатальные ошибки при попытке инициализации сети, вызванные, опять же, низкой версией CUDA Compute Capability. Попытки корректно выставить параметр CudaArchitecture к успеху не привели: перестала собираться libcaffe, из-за невразумительной ошибки компилятора nvcc, не принимающего заведомо корректные значения вышеупомянутого параметра. Решено установкой CudaArchitecture в ничто, т.е. переход к настройкам по умолчанию. Это решение было бы неэффективно на более качественных видеокартах, т.к. оно бы урезало доступный функционал и снизило бы эффективность подсчётов на графических ядрах, однако при Compute Capability 2.1 эффект должен быть незначительным.
Фатальная ошибка при работе с сетями: syncedmem.cpp:58] Check failed: error == cudaSuccess (2 vs. 0) out of memory. Её причиной действительно является недостаток памяти, но не оперативной, а графической. Проблема решена частично отключением прочих приложений; практически полностью -- приобретением новой видеокарты с 4ГБ памяти. Стоит отметить, что подобная ошибка может возникать на любых доступных объёмах памяти в зависимости от размера и количества обрабатываемых сетей. В связи с этим модели видеокарт с высшими характеристиками, в том числе специализированные для расчётов с помощью caffe, Teano и прочих подобных пакетов, могут иметь и 16ГБ памяти, однако подобные суперкомпьютерные решения стоят от тысяч долларов вверх, и находятся далеко за пределами данного исследования.
2.2 Цели и метрики
Естественная цель. потенциально достижимая с помощью тренировки моделей машинного обучения -- это создание автоматической системы расстановки тегов, способной по изображению (и набору возможных тегов) определять, каким тегам изображение соответствует, а каким -- нет. Эта цель даёт понимание того, какие компоненты набора данных следует считать тренировочными переменными, кодирующими ключевую информацию об объекте, а какие -- целевыми, кодирующими искомые признаки. Именно, в качестве первых можно взять пиксельное представление изображения; вторыми же будет являться (одна на тег) бинарная переменная наличия тега.
Было рассмотрено нсколько распространённых метрик качества модели, в частности:
«Точность классификации» : доля корректно предсказанных значений одной целевой переменной
Logloss:
Эта метрика используется для задач предсказания булевой переменной, где предсказывающий алгоритм должен выдать вероятность истинности переменной . Она жестоко наказывает «слишком уверенные» ошибки: вероятность истиннойтси 1 при действительной ложности переменной приводит к бесконечной ошибке.
Area under curve: метрику, также используемую в задачах бинарной классификации, но использующую для оценки качества классифицирующей модели график корректных и ложноположительных её решений. Эта метрика примечательна тем, что её результат слабо зависит от долей классов в выборке.
Нейронные сети, определённые и тренированные в caffe, используют свои, индивидуальные для каждой сети и весьма нетривиальные метрики ошибки для внутреннего пользования, однако конечный результат тренировки проще всего демонсрировать с помощью всё той же точности классификации.
Во имя простоты реализации была выбрана первая метрика.
Глава 3. Практическая реализация. Эксперименты
Практическая часть данной работы была выполнена в двух этапах. Цель первого этапа состояла в наиболее простом прохождении всех этапов разработки и построении «минимального рабочего продукта», который, при должных доработке и масштабировании, способен исполнить поставленную задачу. Для этого на первом этапе используются следующие инструменты:
DanbooruDownloader для загрузки изображений и фрагментов метаданных;
PIL/pillow для предобработки;
различные простые классификаторы из библиотеки scikit-learn.
Этап 1: минимальный рабочий продукт
Выгрузка данных
Для первых экспериментов на малых объёмах данных в DanbooruDownloader было создано несколько и исполнено несколько пакетных загрузок. Большая часть из них содержала «случайные» изображения (появившиеся в датасете в конкретный день), но некоторые имели цель создать специфические срезы датасета, к примеру, содержащие большое количество изображений, обладающих специфическими тегами:
Рисунок 6 Окно пакетных загрузок DanbooruDownloader
Скорость загрузки составляла от 0.5 до 2 изображений в секунду; всего для первой серии экспериментов было выгружено около 25000 изображений.
Предобработка
Для приведения данных к однородному формату, над изображениями были проделаны следующие операции:
Каждое изображение было дополнено от размера 150ЧX или XЧ150 до 150Ч150 с использованием симметричной чёрной рамки.
Для уменьшения пространства параметров изображения были приведены к оттенкам серого;
Наконец, изображение было преобразовано в строку байт, обозначающих яркость каждого из его пикселей.
Эксперименты
Первая серия экспериментов ставила целью оценку эффективности простых методиком анализа на популярном теге. В следующих таблицах приведены результаты. Каждая таблица предваряется методом классификации и его параметрами; Столбцами таблицы являются:
score: успешность тренировки по выбранной (стандартной) метрике;
time: время, затраченное на тренировку, в секундах;
n: количество изображений в подвыборке;
speed: скорость тренировки, в секундах на миллион изображений.
Таблица 1 Результаты тренировки первой серии (1)
Random Forest, n_estimators=5 |
Random Forest, n_estimators=20 |
||||||||
score |
time |
n |
speed |
score |
time |
n |
speed |
||
0,45 |
0,041 |
100 |
410,00 |
0,5 |
0,149 |
100 |
1489,999 |
||
0,625 |
0,065 |
200 |
325,00 |
0,575 |
0,215 |
200 |
1075 |
||
0,591667 |
0,071 |
300 |
236,67 |
0,641667 |
0,243 |
300 |
810,0001 |
||
0,6 |
0,099 |
400 |
247,50 |
0,65 |
0,38 |
400 |
950,0003 |
||
0,555 |
0,151 |
500 |
302,00 |
0,63 |
0,495 |
500 |
989,9998 |
||
0,6375 |
0,175 |
600 |
291,67 |
0,7125 |
0,817 |
600 |
1361,667 |
||
0,657143 |
0,213 |
700 |
304,29 |
0,689286 |
0,66 |
700 |
942,8573 |
||
0,634375 |
0,243 |
800 |
303,75 |
0,659375 |
0,765 |
800 |
956,2501 |
||
0,661111 |
0,273 |
900 |
303,33 |
0,666667 |
0,893 |
900 |
992,2221 |
||
0,63 |
0,267 |
1000 |
267,00 |
0,69 |
0,955 |
1000 |
954,9999 |
||
0,66875 |
0,767 |
2000 |
383,50 |
0,67 |
2,411 |
2000 |
1205,5 |
||
0,655 |
1,579 |
4000 |
394,75 |
0,689375 |
6,391 |
4000 |
1597,75 |
Таблица 2 Результаты тренировки первой серии (2)
Random Forest, n_estimators=100 |
Random Forest, n_estimators=200 |
||||||||
score |
time |
n |
speed |
score |
time |
n |
speed |
||
0,525 |
0,533 |
100 |
5330 |
0,6 |
1,307 |
100 |
13070 |
||
0,5625 |
0,96 |
200 |
4799,999 |
0,5625 |
1,993 |
200 |
9965 |
||
0,616667 |
1,726 |
300 |
5753,333 |
0,658333 |
2,724 |
300 |
9080 |
||
0,65625 |
1,903 |
400 |
4757,5 |
0,6625 |
3,48 |
400 |
8700 |
||
0,63 |
2,299 |
500 |
4598 |
0,62 |
4,871 |
500 |
9742 |
||
0,683333 |
2,541 |
600 |
4235 |
0,683333 |
6,245 |
600 |
10408,33 |
||
0,714286 |
3,422 |
700 |
4888,571 |
0,735714 |
7,376 |
700 |
10537,14 |
||
0,66875 |
4,229 |
800 |
5286,25 |
0,665625 |
9,166 |
800 |
11457,5 |
||
0,722222 |
4,705 |
900 |
5227,778 |
0,694444 |
9,232 |
900 |
10257,78 |
||
0,7025 |
4,614 |
1000 |
4614 |
0,7125 |
9,16 |
1000 |
9160 |
||
0,701667 |
8,235 |
1500 |
5490 |
0,693333 |
14,751 |
1500 |
9834 |
||
0,72 |
12,66 |
2000 |
6330 |
0,72875 |
25,235 |
2000 |
12617,5 |
||
0,698 |
15,508 |
2500 |
6203,2 |
0,703 |
29,976 |
2500 |
11990,4 |
||
0,700833 |
18,673 |
3000 |
6224,333 |
0,705833 |
38,703 |
3000 |
12901 |
||
0,713571 |
22,785 |
3500 |
6510 |
0,707857 |
51,98 |
3500 |
14851,43 |
||
0,71375 |
27,382 |
4000 |
6845,5 |
0,706875 |
57,134 |
4000 |
14283,5 |
||
Support Vector Classification, kernel=linear |
Naive Bayes |
||||||||
score |
time |
n |
speed |
score |
time |
n |
speed |
||
0,675 |
0,18 |
100 |
1800,001 |
0,725 |
0,065 |
100 |
649,9982 |
||
0,6375 |
0,503 |
200 |
2514,999 |
0,55 |
0,094 |
200 |
469,9993 |
||
0,608333 |
1,112 |
300 |
3706,667 |
0,591667 |
0,157 |
300 |
523,3335 |
||
0,6375 |
2,248 |
400 |
5620 |
0,6 |
0,165 |
400 |
412,4999 |
||
0,605 |
3,223 |
500 |
6446 |
0,58 |
0,248 |
500 |
495,9998 |
||
0,620833 |
5,44 |
600 |
9066,667 |
0,583333 |
0,274 |
600 |
456,6665 |
||
0,664286 |
7,292 |
700 |
10417,14 |
0,6 |
0,282 |
700 |
402,8572 |
||
0,6625 |
9,447 |
800 |
11808,75 |
0,54375 |
0,32 |
800 |
399,9999 |
||
0,652778 |
11,955 |
900 |
13283,33 |
0,577778 |
0,411 |
900 |
456,6667 |
||
0,63 |
15,331 |
1000 |
15331 |
0,5775 |
0,414 |
1000 |
414 |
||
0,63 |
31,011 |
1500 |
20674 |
0,595 |
0,67 |
1500 |
446,6667 |
||
0,6575 |
52,544 |
2000 |
26272 |
0,63 |
0,866 |
2000 |
433 |
||
0,632 |
82,692 |
2500 |
33076,8 |
0,609 |
1,164 |
2500 |
465,5999 |
||
0,635833 |
134,867 |
3000 |
44955,67 |
0,635833 |
1,418 |
3000 |
472,6667 |
||
0,621429 |
194,822 |
3500 |
55663,43 |
0,616429 |
1,607 |
3500 |
459,1428 |
||
0,618125 |
1,947 |
4000 |
486,75 |
На основе полученных результатов можно сделать несколько (по большей части очевидных) выводов.
Random Forest и Naive Bayes -- методы алгоритмической сложности O(n), и их масштабирование не составит труда. Support Vector Classification, однако, квадратичен по скорости, и его применимость на выборках размером в миллионы сомнительна. Конечно, это уже известно из алгоритмической реализации этих методов, однако практическая демонстрация куда нагляднее абстрактного знания.
Ни один из использованных методом не обнаружил способности эффективно классифицировать выбранный тег: в действитепльности, единственный классификатор, чья оценка превзошла долю изображений с тегом в выборке (~0,68) -- это Random Forest, но и он ушёл от этого фундамента весьма недалеко.
Вторая серия экспериментов имела цель проверить эффективность простых методов классификации на тегах, потенциально простых к определению. Использовались следующие выборки и теги: monochromeЧ1000+non-monochromeЧ1000:
Таблица 3 Результаты тренировки второй серии (1)
monochrome/non-monochrome |
|||||||||
Support Vector Classification, kernel='linear' |
Support Vector Classification, kernel='rbf' |
||||||||
score |
time |
n |
speed |
score |
time |
n |
speed |
||
0,775 |
0,159 |
100 |
1589,999 |
0,725 |
0,188 |
100 |
1880 |
||
0,755 |
2,751 |
500 |
5502 |
0,84 |
4,206 |
500 |
8412 |
||
0,795 |
10,103 |
1000 |
10103 |
0,8375 |
17,621 |
1000 |
17621 |
||
0,851667 |
15,695 |
1500 |
10463,33 |
0,883333 |
38,878 |
1500 |
25918,67 |
||
0,882353 |
21,392 |
1996 |
10717,43 |
0,908636 |
51,405 |
1996 |
25754,01 |
||
Random Forest, n_estimators=100 |
Random Forest, n_estimators=200 |
||||||||
score |
time |
n |
speed |
score |
time |
n |
speed |
||
0,775 |
0,434 |
100 |
4340 |
0,7 |
0,949 |
100 |
9489,999 |
||
0,8 |
0,61 |
200 |
3050,001 |
0,7625 |
1,425 |
200 |
7125,001 |
||
0,825 |
1,126 |
300 |
3753,333 |
0,791667 |
1,852 |
300 |
6173,333 |
||
0,80625 |
1,212 |
400 |
3030 |
0,84375 |
2,409 |
400 |
6022,5 |
||
0,83 |
1,423 |
500 |
2846 |
0,83 |
2,934 |
500 |
5868 |
||
0,8 |
1,812 |
600 |
3020 |
0,795833 |
3,623 |
600 |
6038,334 |
||
0,810714 |
2,167 |
700 |
3095,714 |
0,814286 |
4,308 |
700 |
6154,285 |
||
0,796875 |
2,264 |
800 |
2830 |
0,815625 |
4,897 |
800 |
6121,25 |
||
0,805556 |
3,133 |
900 |
3481,111 |
0,802778 |
5,345 |
900 |
5938,889 |
||
0,8375 |
3,726 |
1000 |
3726 |
0,8425 |
7,191 |
1000 |
7191 |
||
0,885 |
6,532 |
1500 |
4354,667 |
0,89 |
13,688 |
1500 |
9125,333 |
||
0,908636 |
9,344 |
1996 |
4681,363 |
0,909887 |
17,028 |
1996 |
8531,062 |
blueЧ1000+randomЧ5000:
Таблица 4 Результаты тренировки второй серии (2)
blue+random |
|||||||||
Naive Bayes |
Random Forest, n_estimators=100 |
||||||||
score |
time |
n |
speed |
score |
time |
n |
speed |
||
1 |
0,051 |
100 |
510,0012 |
0,833333 |
1,912 |
300 |
6373,333 |
||
1 |
0,1 |
200 |
499,9995 |
0,628571 |
4,231 |
700 |
6044,286 |
||
0,225 |
0,146 |
300 |
486,6664 |
0,6175 |
5,889 |
1000 |
5889 |
||
0,46875 |
0,186 |
400 |
465,0003 |
0,671667 |
10,024 |
1500 |
6682,667 |
||
0,505 |
0,236 |
500 |
472,0001 |
0,66375 |
19,536 |
2000 |
9768 |
||
0,516667 |
0,268 |
600 |
446,6665 |
0,6875 |
24,254 |
3000 |
8084,667 |
||
0,5 |
0,343 |
700 |
489,9999 |
0,69 |
30,691 |
4000 |
7672,75 |
||
0,5375 |
0,521 |
800 |
651,2499 |
0,686 |
41,446 |
5000 |
8289,2 |
||
0,527778 |
0,436 |
900 |
484,4446 |
||||||
0,5375 |
0,56 |
1000 |
559,9999 |
Support Vector Classification, kernel='linear' |
|||||
0,505 |
0,937 |
1500 |
624,6667 |
score |
time |
n |
speed |
||
0,47375 |
0,923 |
2000 |
461,5 |
1 |
0,041 |
100 |
409,9989 |
||
0,551 |
1,331 |
2500 |
532,4 |
0,575 |
5,04 |
500 |
10080 |
||
0,535 |
1,968 |
3000 |
656,0001 |
0,5625 |
18,879 |
1000 |
18879 |
||
0,547143 |
1,67 |
3500 |
477,1429 |
0,573333 |
38,069 |
1500 |
25379,33 |
||
0,558125 |
2,008 |
4000 |
502 |
0,57375 |
65,693 |
2000 |
32846,5 |
||
0,499 |
2,299 |
5000 |
459,8 |
Выводы из этих данных уже интереснее.
Подтвердилась гипотеза о возможности эффективной классификации тега monochrome. Интересно также то, что это возможно в том числе после приведения изображений к серой палитре.
Не подтвердилась гипотеза о возможности классификации тега blue. Вероятнее всего, вина лежит на процедуре предобработки, уничтожающей цветовые различия.
Вычислительная сложность Support Vector Classification с параметром kernel='rbf' растёт ещё быстрее, чем с kernel='linear'.
Этап 2: масштаб и нейронные сети.
Целями второго этапа были:
масштабирование и улучшение качества выгрузки данных;
переход к использованию нейронных сетей как инструмента анализа.
Выгрузка данных
Для более структурированной выгрузки, а также для загрузки всех метаданных изображений были написаны python-скрипты dan_json_down и dan_thumb_down.
Первый скрипт, проходясь в цикле по дням с первого дня работы использованного датасета по текущее время, запрашивал у удалённого сервера список изображений, загруженных в конкретный день, к каждому из них запрашивал JSON-представление метаданных, и записывал последнее в индивидуальные файлы по пути
При сетевых ошибках скрипт предпринимал несколько попыток повторной связи; при столкновении с ограничениями на количество запросов, выставленное сервером, замедлялся со стандартной частоты запросов в 1 секунду с экспоненциальным шагом в 1,5, вплоть до 7 минут паузы между запросами.
За неделю постоянной работы скрипт dan_json_down выполнил свою цель, сохранив все доступные метаданные на ~2 млн. изображений.
Второй скрипт, проходясь в том же цикле, но также ограниченный работой первого скрипта, извлекал из записанных файлов метаданные, фильтровал их по критерию цензурности, извлекал ссылки на уменьшенную копию изображения, запрашивал изображения у удалённого сервера и сохранял их на диск по пути .\Dan_json\%year%\%month%\%day%\%id%.jpg. При отсутствии или недоступности изображений скрипт немедленно переходил к следующему.
Скрипту dan_thumb_down потребовалась неделя на то, чтобы выгрузить ~250 тыс. изображений, отфильтровав столько же, т.е. на полную обработку датасета ему бы потребовался месяц. В процессе анализа скрипт продолжал работу, однако полученных к этому времени результатов было более чем достаточно для второго этапа экспериментов.
2.3 Предобработка
Для представления полученных данных в формате, потребном caffe, был написан скрипт dan_class_tagging. Его цель состояла в том, чтобы, последовательно проходясь по выгруженным изображениям, извлекать из метаданных изображения строку тегов, проверять наличие в ней каждого из заданной группы взаимоисключающих тегов, соотносить изображению числовой класс в зависимости от наличия, и записывать путь к изображению вместе с назначенным классом в файл с тренировочной или же проверочной выборкой. Результирующие файлы носили имена .\logs\%tag_group%_%size%_test.txt и .\logs\%tag_group%_%size%_train.txt, где % tag_group% -- название группы тегов, %size% -- размер размеченной подвыборки.
Были использованы следующие группы тегов:
"boys": ["1boy", "2boys", "3boys", "4boys", "5boys", "6+boys"],
"girls": ["1girl", "2girls", "3girls", "4girls", "5girls", "6+girls"],
"solo_hair_color": ["black_hair", "blonde_hair", "blue_hair", "brown_hair", "green_hair", "pink_hair", "purple_hair", "red_hair", "silver_hair"].
При создании подвыборок по последней группе также проводилась фильтрация: среди тегов изображения должен был присутствовать тег "solo".
Перед обработкой собственно нейронной сетью, изображения подвергались следующий преобразованиям: каждое приводилось к размеру 256Ч256 методом растяжения, и из каждого вычиталось условное среднее, посчитанное на стандартном датасете сети архитектуры CaffeNet.
Эксперименты
Для проведения экспериментов был адаптирован IPython Notebook (набор скриптов) 02-fine-tuning, прилагающийся к дистрибутиву caffe. В результирующем скрипте производятся следующие действия:
загрузка данных и их предобработка;
конструирование нейронной сети архитектуры CaffeNet,её инициализация в двух вариантах:параметрами, претренированными на ином датасете, и случайным набором весов;
дотренировка верхних слоёв обеих сетей на сгенерированном выше датасете, вывод результатов и статистики тренировки;
дотренировка всех слоёв обеих сетей, вывод результатов и статистики тренировки.
Тренировка сетей производилась методом СГС -- стохастического градиентного спуска -- со следующими параметрами:
число итераций в одном шаге тренировки: 100000;
скорость обучения: 0,001, с умножением на 0,1 каждые 20000 итераций;
импульс: 0,9
weight_decay = 0,0005
Ниже указаны подвыборки, на которых производилась тренировка сетей, и представлены графики их предсказательной точности (синим -- претренированной сети, зелёным -- иниициализированной случайными параметрами) в зависимости от итерации тренировки (всех слоёв), а также их пиковая точность.
tag_group = "girls", size = 3000:
Пиковая точность: pretrained: 82%; scratch: 86%.
tag_group = "girls", size = 30000:
Пиковая точность: pretrained: 88%; scratch: 88%.
tag_group = "boys", size = 3000:
Пиковая точность: pretrained: 96%; scratch: 98%.
tag_group = "boys", size = 30000:
Пиковая точность: pretrained: 98%; scratch: 98%.
tag_group = "solo_hair_color", size = 30000:
Пиковая точность: pretrained: 58%; scratch: 64%.
Из полученных результатов можно сделать следующие выводы:
Для решения данных задач классификации сеть, претренированная на фотографиях реальных объектов, чаще всего менее эффективна, чем ининциализированная случайно.
На малых объёмах данных выбранный метод тренировки сети попадает в цикл, проходясь по приблизительно одним и тем же состояниям сети каждые 50 итераций. (На более крупных подвыборках эта проблема выражена меньше, но всё равно присутствует.)
Выбранный метод тренировки, работая на анализируемом датасете, не остаётся в локальных максимумах
Заключение
По результатам практической части были достигнуты следующие цели.
Был успешно выгружен весь объём метаданных изображений, предоставленный источником.
Была выгружена заметная часть (>40%) изображений, однако в уменьшенных версиях.
Был приобретён обширный опыт установки ПО, использующегося для анализа данных;
На различных выборках из выгруженных данных была натренирована серия классификаторов, в том числе несколько экземпляров нейронной сети заданной архитектуры.
Были предприняты попытки установки ПО для решения вычислительных задач на машинном кластере, однако в связи со значительным увеличением потребления вычислительных ресурсов и отсутствием собственно кластера это направление было оставлено в пользу получения наглядных результатов.
В конце концов, текущая работа выглядит достаточно результативно: возможно, в ней не были достигнуты все поставленные изначально цели, и направление работы отклонилось от предполагаемого, однако результаты есть, и внушают оптимизм по поводу дальнейшего прогресса.
Среди возможных направлений дальнейшей работы наиболее перспективными представляются следующие:
исследование поведения сети и траекторий её обучения при изменении параметров обучения;
исследование других архитектур нейронных сетей;
модификация стандартных архитектур для лучшего соответствия природе датасета;
использование различных методик преобработки изображений;
переход от анализа уменьшенных копий изображений к полным версиям.
Также в процедуры сбора данных можно внести ряд технических улучшений:
перейти от хранения метаданных изображений в файловой системе к хранению в базе/хранилище данных;
настроить автоматическую (и эффективную) актуализацию метаданных;
извлечь и использовать в анализе дополнительные данные, предоставляемые источником, как-то:
историю изменения тегов;
комментарий художника, при наличии;
комментарии пользователей.
Список литературы
1. Berkeley Vision and Learning Center. (б.д.). Получено из https://github.com/BVLC/caffe/tree/windows
2. Continuum Analytics. (2015). Conda. Получено из Conda documentation: http://conda.pydata.org/docs/
3. Dieleman, S. (17 March 2015 r.). Classifying plankton with deep neural networks. Получено из Sander Dieleman's blog: http://benanne.github.io/2015/03/17/plankton.html
4. Google Inc. (2008). Получено 2016, из https://github.com/google/protobuf
5. Graham, B. (2015). Kaggle Diabetic Retinopathy Detection competition report. University of Warwick, Department of Statistics and Centre for Complexity Science.
6. Haiying Li, A. C. (2014). Comparison of Google Translation with Human Translation. Proceedings of the Twenty-Seventh International Florida Artificial Intelligence Research Society Conference (pp. 190-195). Pensacola Beach, Florida: The AAAI Press, Palo Alto, California.
7. Jia, Y. (2016). Получено из http://caffe.berkeleyvision.org/
8. Kaggle Inc. (14 December 2015 r.). Second Annual Data Science Bowl. Получено 10 March 2016 r., из Kaggle: https://www.kaggle.com/c/second-annual-data-science-bowl
9. Kaggle Inc. (2016). Получено из https://www.kaggle.com/c/shelter-animal-outcomes/details/evaluation
10. Kaggle Inc. (2016). Получено из https://www.kaggle.com/wiki/AreaUnderCurve
11. Kaggle Inc. (б.д.). Kaggle competitions. Получено из Kaggle project Web site: https://www.kaggle.com/competitions
12. LISA lab. (2016). Получено из http://deeplearning.net/software/theano/
13. Madrigal, A. C. (2012). The Perfect Milk Machine: How Big Data Transformed the Dairy Industry. The Atlantic .
14. Nandaka. (2016). Получено из https://github.com/Nandaka/DanbooruDownloader
15. w:Big data. (б.д.). Big data. Получено 10 March 2016 r., из Wikipedia: https://en.wikipedia.org/wiki/Big_data#Definition
Приложение 1
Исходный код
Скрипт выгрузки метаданных
import requests
import time
import os
import json
import shutil
def ensure_dir(f):
d = os.path.dirname(f)
if not os.path.exists(d):
os.makedirs(d)
# Danbooru starts at 2005-05-24.
# This is updated wherever script is stopped.
current_epoch = time.mktime(time.strptime('2010-01-30 12:00:00', '%Y-%m-%d %H:%M:%S'))
shifting_time = current_epoch
while shifting_time + 3600*24*2 < time.time():
time_tuple = time.localtime(shifting_time)
time_string = time.strftime("%Y-%m-%d", time_tuple)
# Download pages here
# Apparently, https works out of the box with github, but not as easily with Danbooru.
# Ahh, it's probably a blocking problem; solved with proxy, but I just won't bother.
# r = requests.get('http://api.github.com/events')
date = time_string
page = 1
day_json = []
pause_interval = 1
retry_count = 5
start_time = time.time()
destination_fs = "base-win"
if destination_fs == "base-win":
base_json_dir = "C:\\temp\\work\\HSE\\Diploma\\Dan_json\\"
day_json_dir = base_json_dir + date[0:4] + "\\" + date[5:7] + "\\" + date[8:10] + "\\" # YYYY\mm\dd
base_thumb_dir = "C:\\temp\\work\\HSE\\Diploma\\Dan_thumb\\"
day_thumb_dir = base_thumb_dir + date[0:4] + "\\" + date[5:7] + "\\" + date[8:10] + "\\" # YYYY\mm\dd
if not os.path.exists(day_thumb_dir):
os.makedirs(day_thumb_dir)
day_file_list = os.listdir(day_json_dir)
#print(day_file_list)
elif destination_fs == "hdfs":
{}
for filename_json in day_file_list:
# To get a thumb:
# loop for days:
# loop for pics per day:
# get "preview_file_url": "/data/preview/5028440e4060560f450eb712921968ef.jpg",
# requests.get()
with open(day_json_dir + filename_json) as data_file:
post_json = json.load(data_file)
filename_thumb = day_thumb_dir + str(post_json['id']) + ".jpg"
if os.path.isfile(filename_thumb):
print(str(post_json['id']) + " is already here, skipping.")
continue;
if not post_json['rating'] in ['s', 'safe']:
continue
try:
thumb_suburl = post_json['preview_file_url']
except KeyError as e:
print("No thumb for " + str(post_json['id']) + ", skipping.")
continue
try:
r = requests.get('http://donmai.us/' + thumb_suburl, stream=True)
except Exception as e:
print("Exception, temporarily skipping " + str(post_json['id']))
if r.status_code in [421, 500, 503]:
# Either we're throttled, or Danbooru is down with 500ths. Let's slow down a bit.
if pause_interval < 300:
pause_interval *= 1.5
print("Status code: " + str(r.status_code) + " . Pausing for " + str(pause_interval) + " sec.")
time.sleep(pause_interval)
continue
else:
pause_interval = 1
if r.status_code in [200, 204]:
# Nothing to do here, moving along.
with open(filename_thumb, 'wb') as f:
r.raw.decode_content = True
shutil.copyfileobj(r.raw, f)
elif r.status_code in [403, 404, 424]:
# I dont'know if this could happen with thumbs. Oh well.
print("Status code: " + str(r.status_code) + " . Pausing for " + str(pause_interval) + " sec and retrying." )
if retry_count > 0:
retry_count -= 1
time.sleep(pause_interval)
continue
else:
retry_count = 5
elif r.status_code in [420, 422, 423]:
# This really shouldn't happen: we're just reading jsons, not trying to alter the posts.
{}
else:
# WTF?
print("Something broke!", r.status_code, r.text)
break
time_spent = time.time() - start_time
#print(time_spent, page, date)
if time_spent<1:
time.sleep(1-time_spent)
shifting_time += 3600*24
time_spent = time.time() - start_time
print(time_spent, len(day_file_list), date)
Скрипт выгрузки изображений
import requests
import time
import os
import json
def ensure_dir(f):
d = os.path.dirname(f)
if not os.path.exists(d):
os.makedirs(d)
# Danbooru starts at 2005-05-24.
# This is updated wherever script is stopped.
current_epoch = time.mktime(time.strptime('2016-05-12 12:00:00', '%Y-%m-%d %H:%M:%S'))
shifting_time = current_epoch
while shifting_time + 3600*24*2 < time.time():
time_tuple = time.localtime(shifting_time)
time_string = time.strftime("%Y-%m-%d", time_tuple)
# Download pages here
# Apparently, https works out of the box with github, but not as easily with Danbooru.
# Ahh, it's probably a blocking problem; solved with proxy, but I just won't bother.
# r = requests.get('http://api.github.com/events')
date = time_string
page = 1
day_json = []
pause_interval = 1
retry_count = 5
start_time = time.time()
while True:
payload = {'tags' : "date:"+date, 'limit' : 100, 'page' : page}
r = requests.get('http://donmai.us/posts.json', params = payload)
if r.status_code in [421, 500, 503]:
# Either we're throttled, or Danbooru is down with 500ths. Let's slow down a bit.
if pause_interval < 300:
pause_interval *= 1.5
print("Status code: " + str(r.status_code) + " . Pausing for " + str(pause_interval) + " sec.")
time.sleep(pause_interval)
continue
else:
pause_interval = 1
if r.status_code in [200, 204]:
# Nothing to do here, moving along.
page_json = r.json()
if page_json == []:
break
else:
day_json += page_json
page += 1
elif r.status_code in [403, 404, 424]:
# This shouldn't really happen: posts.json is always available and ignores malformed parameters.
if retry_count > 0:
retry_count -= 1
continue
else:
retry_count = 5
elif r.status_code in [420, 422, 423]:
# This really shouldn't happen: we're just reading jsons, not trying to alter the posts.
{}
else:
# WTF?
print("Something broke!", r.status_code, r.text)
break
time_spent = time.time() - start_time
#print(time_spent, page, date)
if time_spent<1:
time.sleep(1-time_spent)
# Create an hdfs/win file with appropriate content here
destination_fs = "base-win"
if destination_fs == "base-win":
base_dir = "C:\\temp\\work\\HSE\\Diploma\\Dan_json\\"
day_dir = base_dir + date[0:4] + "\\" + date[5:7] + "\\" + date[8:10] + "\\" # YYYY\mm\dd
if not os.path.exists(day_dir):
os.makedirs(day_dir)
for post_json in day_json:
filename = day_dir + str(post_json['id']) + ".json"
with open(filename, 'w') as outfile:
json.dump(post_json, outfile)
elif destination_fs == "hdfs":
# Not implemented yet
{}
shifting_time += 3600*24
time_spent = time.time() - start_time
print(time_spent, len(day_json), date)
Скрипт предварительной обработки изображений
import os
import time
import json
class GetOutOfLoop( Exception ):
pass
base_thumb_dir = "C:\\temp\\work\\HSE\\Diploma\\Dan_thumb\\"
base_json_dir = "C:\\temp\\work\\HSE\\Diploma\\Dan_json\\"
last_processed = [2007, 10, 29, 150000] # Update as it falls
start_after = last_processed
print("Starting from: ", start_after)
count_limit = 30000
output_period = 1000
years = os.listdir(base_thumb_dir)
year_dirs = [base_thumb_dir + y + "\\" for y in years]
image_count=0
base_log_path = "C:\\temp\\work\\HSE\\Diploma\\logs\\"
tag_lists = {"boys": ["1boy", "2boys", "3boys", "4boys", "5boys", "6+boys"],
"girls": ["1girl", "2girls", "3girls", "4girls", "5girls", "6+girls"],
"solo_hair_color": {0:"black_hair",
1:"blonde_hair",
2:"blue_hair",
3:"brown_hair",
4:"green_hair",
5:"pink_hair",
6:"purple_hair",
7:"red_hair",
8:"silver_ha...
Подобные документы
Программная и техническая характеристика информационных систем предприятия. Требования к информационной и программной совместимости. Проектирование программного обеспечения с использованием специализированных программных пакетов. Разработка базы данных.
отчет по практике [1,3 M], добавлен 11.04.2019Понятие информационной системы и баз данных. Критерии классификации автоматизированных информационных систем. Примеры простых и сложных запросов. Характеристика и анализ возможностей справочно-правовых систем "Кодекс", "Консультант Плюс", "Гарант".
курсовая работа [40,3 K], добавлен 16.05.2017Разработка системы автоматизации для работы инженеров, бухгалтера, менеджера для предприятия, работающего в сфере торговли и обслуживания платформ многоканальной звукозаписи. Требования к функциональным характеристикам базы данных в MS Access.
курсовая работа [774,3 K], добавлен 23.01.2013Создание системы предобработки данных; разработка системы классификации на базе методов и алгоритмов машинного обучения, их реализация в программной системе. Предобработка информации, инструкция пользователя, система классификации, машинный эксперимент.
дипломная работа [917,1 K], добавлен 31.01.2015Изучение принципа работы интернет-аукциона (на примере сайта molotok.ru). Способ получения информации с веб-ресурсов. Разработка программного обеспечения с целью создания исходных данных для обучения нейронных сетей и классификации товаров с их помощью.
дипломная работа [2,0 M], добавлен 29.06.2012Описание систем управления процессами маршрутизации пакетов, передаваемых через компьютерную сеть. Изучение методов теории выбора кратчайших путей. Разработка программы маршрутизации данных и определение кратчайших путей их маршрутов методом Дейкстры.
курсовая работа [495,7 K], добавлен 24.06.2013Роль классификации документов в решении задач информационного поиска. Методы автоматической классификации документов и этапы построения классифицирующей системы: индексация документа, построение классификаторов на базе обучающих данных, оценка их работы.
курсовая работа [354,2 K], добавлен 13.01.2013Описание функций, задач, выявление проблем в деятельности веломастерской. Обоснование выбора использования системы управления базами данных Access. Создание таблиц, запросов, форм, отчетов и простых макросов. Упрощения использования созданной базой.
курсовая работа [930,8 K], добавлен 05.05.2015Методы исследования устойчивости нелинейной следящей системы. Разработка алгоритмического и программного обеспечения автоматизированной системы с использованием инструментальных средств ПЭВМ. Проверка эффективности проекта путем сравнения результатов.
дипломная работа [568,7 K], добавлен 30.04.2011Изучение методов и этапов создания структурированной базы данных в Microsoft Access, позволяющей автоматизировать процесс подбора читателем необходимого программного продукта по заданным характеристикам. Разработка интерфейса базы данных. Реализация ИС.
курсовая работа [2,6 M], добавлен 13.08.2010Характеристика системы управления базами данных. Принципы классификации СУБД. NoSQL как ряд подходов, проектов, направленных на реализацию моделей баз данных. Методологические обоснования подхода NoSQL. Описание некоторых СУБД из данного движения.
реферат [18,1 K], добавлен 06.10.2011Анализ методов и средств выявления мнений пользователей социальных сетей. Обзор средств мониторинга и анализа, подбор необходимого программного обеспечения и технических средств. Разработка архитектуры базы данных, реализация программных модулей.
дипломная работа [3,7 M], добавлен 19.01.2017Обработка данных, возможность коллективного использования ресурсов и оборудования. Централизованное хранение данных. Основы работы настольных СУБД. Наиболее популярные настольные СУБД. Актуальность использования, направления и перспективы развития.
курсовая работа [361,4 K], добавлен 09.11.2008Построение логической и физической структуры базы данных. Сценарии вариантов использования: вход и выход из системы, обновление меню и списка официантов, регистрация и проверка выполнения заказа. Расчёт стоимости и эффективность внедрения программы.
курсовая работа [1,3 M], добавлен 21.09.2015Изучение и разработка алгоритмов сверления. Выбор языка и среды программирования. Исследование структуры системы компьютерного моделирования. Ввод данных о материале инструмента и детали, методе обработки. Визуальная проверка и корректировка данных.
отчет по практике [295,9 K], добавлен 22.05.2013Выбор состава технических и программных средств разработки системы. Описание входных и выходных данных. Выбор модели базы данных. Разработка подсистемы наполнения базы данных, формирования отчетов. Разработка интерфейса пользователя, тестирование системы.
курсовая работа [3,7 M], добавлен 04.12.2014Анализ методов оценки надежности программных средств на всех этапах жизненного цикла, их классификация и типы, предъявляемые требования. Мультиверсионное программное обеспечение. Современные модели и алгоритмы анализа надежности программных средств.
дипломная работа [280,5 K], добавлен 03.11.2013Обзор программных средств разработки приложений и обоснование выбора языка программирования. Классификация приложений для работы с базами данных. Функциональная структура базы данных с указанием назначения программных модулей, руководство пользователя.
дипломная работа [645,3 K], добавлен 21.11.2010Анализ информационных потоков. Разработка структуры таблиц базы данных. Выбор CASE-средства для проектирования информационной системы и среды программирования. Разработка программных модулей (программного обеспечения). Подготовка справочных баз данных.
дипломная работа [6,8 M], добавлен 19.11.2013Разработка программных продуктов на языке программирования Borland Delphi. Применяемые таблицы и связи между ними. Пользовательский интерфейс работы с базой данных. Алгоритм работы программы "Футбольные команды и игроки". Защита от ввода неверных данных.
курсовая работа [788,1 K], добавлен 22.06.2011