Разработка инфраструктуры для измерения точности работы нейронных сетей на ИИ-ускорителях

Аппаратная и программная реализация нейронных сетей. Создание улучшенного подхода валидации точности алгоритмов глубокого обучения для применения на ИИ-ускорителях. Разработка гибкого и расширяемого инструмента для инференса искусственных нейронных сетей.

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 28.10.2019
Размер файла 3,9 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

6. William Dally, (2015, July 12), “High performance hardware for machine learning”, NIPS Tutorial. [Online]

7. Karl Freund, (2017, March 3), “A machine learning landscape: where AMD, Intel, Nvidia, Qualcomm and Xilinx AI engines live”, Forbes. [Online]

8. Holt, J. and Hwang, J., “Finite Precision Error Analysis of the Neural Network Hardware Implementations”. IEEE Trans. on Computers, 42:281-290, 1993

9. Dany Bradbury, (2017, July 24), “What sort of silicon brain do you need for artificial intelligence?”, The Register.

10. Nuno Edgar Nunes Fernandes, (2017, April 3), “FPGA chips will be the hardware future for deep learning and AI”, Wordpress. [Online]

11. Yan Goodfellow, Yoshua Bengio, Aaron Courville, “Deep Learning” - MIT Press, 2016 [Online]

12. Partha Deka, Rohit Mittal, “AI Accelerator products” (2019, 5 Feb)[Online]

13. Andrey, “Как выбрать метрики для валидации результата Machine Learning” (2018, March 5) [Online]

14. Open ReID documentation [Online]

15. Jonathan Long, Evan Shelhamer, Trevor Darrell “Fully Convolutional Networks for Semantic Segmentation”(2015, 5 Mar )[Online]

16. Intel OpenVINO developers guide [Online]

17. NVIDIA TensorRT. Programmable Inference Accelerator [Online]

18. Qualcomm Neural Processing SDK for AI [Online]

Приложение 1

UML-диаграмма основных компонентов проекта

Приложение 2

Поддерживаемые конфигурации и параметры для конвертации

AccuracyChecker поддерживает следующие датасеты для конвертации:

Parameter

description

required

Acceptable value

imagenet - конвертирует формат датасета ImageNet для задачи классификации изображений в ClassificationAnnotation формат

annotation_file

текстовый файл аннотации (например, val.txt)

True

Полный или относительный путь до файла

labels_file

текстовый файл, содержащий строковое описание классов в датасете (например, synset_words.txt)

False

Полный или относительный путь до файла

has_background

позволяет добавить к 1000 классам в оригинальном формате датасета дополнительный класс background.

False

True/False (Значение по-умолчанию False)

cifar10 - конвертирует формат датасета CIFAR10 для задачи классификации изображений в ClassificationAnnotation формат

data_batch_file

бинарный файл (pickle), содержащий валидационный сет (например, cifar-10-batches-py/test_batch)

True

полный или относительный путь до файла

convert_images

флаг, позволяющий сконвертировать в формат png и сохранить изображения датасета

False

True/False (по-умолчанию False)

converted_images_dir

Директория для сохранения сконвертированных изображений.

False

Полный или относительный путь до директории. Если директория не существует, то она будет создана.

has_background

позволяет добавить к 10 классам в оригинальном формате датасета дополнительный класс background.

False

True/False (Значение по-умолчанию False)

voc_detection - конвертирует формат датасета Pascal VOC для задачи детектирования объектов в DetecionAnnotation формат

image_set_file

текстовый файл, содержащий список картинок, используемых при валидации

True

Полный или относительный путь до файла

annotations_dir

путь до директории, содержащей аннотационные файлы

True

Полный или относительный путь до папки

images_dir

путь до директории, содержащей валидационные изображения.

False

Полный или относительный путь до папки.

has_background

позволяет добавить/убрать background

False

True/False. Значение по-умолчанию True

voc_segmentation - конвертирует формат датасета Pascal VOC для задачи семантической сегментации в SegmentationAnnotation.

image_set_file

текстовый файл, содержащий список картинок, используемых при валидации

True

Полный или относительный путь до файла

images_dir

путь до директории, содержащей валидационные изображения.

False

Полный или относительный путь до папки.

masks_dir

путь до директории, содержащей ground_truth маски.

False

Полный или относительный путь до папки.

wider - конвертирует формат датасета Wider Face для задачи детектирования лиц в DetectionAnnotation.

annotation_file

текстовый файл аннотации

True

Полный или относительный путь до файла

label_start

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

False

Целое неотрицательное число. По-умолчанию 1.

detection_opencv_storage - конвертирует формат датасетов, хранимых в формате OpenCV detection storage в DetectionAnnotation формат.

annotation_file

файл аннотации в формате xml

True

Полный или относительный путь до файла

label_start

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

False

Целое неотрицательное число. По-умолчанию 1.

background_label

индекс класса background в датасете.

False

Целое неотрицательное число, если указано. Если не указано, считается, что в датасете нет background.

image_names_file

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

False

Полный или относительный путь до файла

mscoco_detection - конвертирует формат датасета MS COCO для задачи детектирования объектов в DetectionAnnotation формат,

mscoco_mask - конвертирует формат датасета MS COCO для задачи instance segmentation в MSCOCOSegmentation формат.

annotation_file

текстовый файл аннотации в формате JSON (например instances2017val.json)

True

Полный или относительный путь до файла

has_background

позволяет добавить/убрать background класс

False

True/False. Значение по-умолчанию False.

use_full_label_map

Позволяет использовать расширенный список классов (91 вместо 80)

False

True/False. Значение по-умолчанию False.

mscoco_keypoints - конвертирует формат датасета MS COCO для задачи определения позы человека в PoseEstimationAnnotation формат.

annotation_file

текстовый файл аннотации в формате JSON (например instances2017val.json)

True

Полный или относительный путь до файла

cityscapes - конвертирует формат датасета CityScapes для задачи семантической сегментации дорожных сцен в SegmentationAnnotation формат.

dataset_root_dir

директория, содержащая структуру датасета.

True

Полный или относительный пудь до директории

images_subfolder

каталог, содержащий изображений внутри структуры датасета

False

Путь относительно директории датасета. По-умолчанию, imgsFine/leftImg8bit/val

masks_subfolder

каталог, содержащий аннотационные маски внутри структуры датасета

False

Путь относительно директории датасета. По-умолчанию, gtFine/val

mars, market1501 конвертируют форматы датасетов MARS и Market1501 для задачи реидентификации людей (Re-ID) в ReidentificationAnnotation формат.

data_dir

директория, где расположены поддиректории galery и query

True

Полный или относительный путь до директории

face_reid_pairwise - конвертирует формат датасета LFW (Labeled Faces in the Wild) для задачи распознавания лиц в ReidentificationClassificationAnnotation.

pairs_file

текстовый файл, содержащий описание пар

True

Полный или относительный путь до файла

landmarks_file

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

False

Полный или относительный путь до файла

landmarks_regression конвертирует формат датасета VGG Face для задачи распознавания лицевых лендмарок в FacialLandmarksAnnotation формат

landmarks_csv_file

аннотационный файл в формате csv. Содержит координаты ключевых точек лица.

True

Полный или относительный путь до файла

bbox_csv_file

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

False

Полный или относительный путь до файла

icdar13_recognition конвертирует формат датасета ICDAR 2013 Challenge 2 (Reading Text in Scene Images) для задачи распознавания текста в CharacterRecognitionAnnotation формат

annotation_file

текстовый аннотационный файл

True

Полный или относительный путь до файла

icdar15_detection конвертирует формат датасета ICDAR 2015 Incidental Scene Text для задачи детектирования текста в TextDetectionAnnotation формат.

data_dir

директория, содержащая аннотационные файлы

True

Полный или относительный путь до директории

Приложение 3

Поддерживаемый набор препроцессоров

AccuracyChecker поддерживает следующий набор препроцессоров:

Parameter

description

required

Acceptable value

resize - изменение размера (уменьшение/увеличение) изображения до заданных размеров

dst_width

dst_hight/size

размер изображения после применения операции

True

Целое положительное число. Вы можете использовать аргумент size, если размерности совпадают).

use_pillow

позволяет использовать библиотеку Pillow для операции resize. По-умолчанию используется OpenCV

False

True/False, по-умолчанию False

Interpolation

метод интерполяции для сглаживания изображения

False

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

OpenCV: Nearest, Linear, Cubic, Area, Max, Lanczos4, Bits, Bits32

Pillow: None, Nearest, Cubic, Bicubic, Box, Bilinear, Lanczos, Antialias, Hamming.

Значение по-умолчанию Linear

aspect_ratio_scale

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

False

width - высота изменяется до фиксированного размера, пропорции по ширине сохраняются

height - ширина изменяется до фиксированного размера, пропорции по высоте сохраняются.

greater - меньшая из размерностей изображения изменяет размер до фиксированного, размер большей вычисляется исходя из пропорций изображения fit_to_window - размеры изображения изменяются таким образом, чтобы новое изображение можно было вписать в прямоугольник размера dst_height x dst_width По-умолчанию, не используется.

normalization - изменение диапазона значений интенсивности пикселей.

Mean

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

False

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

Std

значения, на которые следует разделить значения каждого пикселя поканально.

False

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

bgr_to_rgb - смена цветового пространства изображения. Конвертирует BGR в RGB.

bgr_to_gray - смена цветового пространства изображения. Конвертирует BGR в оттенки серого.

flip - зеркальное отражение изображения вокруг выбранной оси

Mode

ось для отражения - горизонталь или вертикаль

False

horizontal/vertical

Значение по-умолчанию horizontal.

crop - центральное кадрирование изображения.

dst_width

dst_hight/size

размер изображения после применения операции

True

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

central_fraction

центральная доля изображения для кадрирования в соотношении к исходному размеру

False

число с плавающей точкой в диапазоне (0, 1]

use_pillow

Позволяет использовать возможности библиотеки Pillow для данной операции

False

True/False. Значение по-умолчанию False.

crop_rectangle - кадрирование обрамляющего прямоугольника, указанного в аннотации.

point_aligment - аффинное преобразование изображения относительно ключевых точек, сохраненных в аннотации.

draw_points

Позволяет отрисовать точки на изображении

False

True/False

Normalize

позволяет нормализовать координаты точек перед использованием.

False

True/False

dst_width

dst_hight/size

размер изображения после применения операции

True

Целое положительное число. Вы можете использовать аргумент size, если размерности совпадают)

padding - дополнение области вокруг изображения до определенного размера.

Stride

шаг для операции

False

Целое число. Минимальное значение - 1.

pad_value

значение для заполнение обрамляющей области.

False

число из диапазона от 0 до 255 или список чисел, разделенных запятой по числу каналов.

dst_width

dst_hight/size

размер изображения после применения операции

True

Целое положительное число. Вы можете использовать аргумент size, если размерности совпадают)

tiling - разбиение изображения на равные части.

Margin

размер полей для фрагментов изображения.

dst_width

dst_hight/size

размер фрагмента изображения после применения операции

True

Целое положительное число. Вы можете использовать аргумент size (если размерности совпадают)

Приложение 4

Набор поддерживаемых постпроцессоров

В зависимости от типа представления AccuracyChecker поддерживает следующие постпроцессоры:

Detection Postrocessing, типы данных для обработки DetectionAnnotation, TextDetectionAnnotation, DetectionPrediction TextDetectionPrediction соответственно.

Parameter

description

required

Acceptable value

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

round_policy

политика округления значений с плавающей точкой.

False

Одно из следующих значений:

nearest - округление до ближайшего целого

greater - округление в большую сторону

lower - округление в меньшую сторону

nearest_to_zero - округление к ближайшему к 0 числу (т.е. в меньшую сторону для положительных чисел и в большую сторону для отрицательных)

clip_boxes - ограничение размеров обрамляющих прямоугольников (bounding boxes) в пределах диапазона значений (0, max], при котором координаты меньше 0 заменяются на 0, а большие на max.

normilized_boxes

флаг, говорящий о том, что координаты боксов должны быть в диапазоне от (0, 1]

False

True/False

dst_width

dst_hight/size

максимальный допустимый размер бокса по высоте/ширине

False

Целое положительное число. Вы можете использовать аргумент size, если размерности совпадают). Если размеры не указаны используется размер исходного изображения в качестве максимального значения.

apply_to

задает к annotation или/и prediction будет применена операция.

True

Доступные опции:

annotations,

predictions,

all

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

nms - Non-maximum Suppression, в данном контексте, это уточнение координат bounding boxes посредством фильтрации наиболее пересекающихся областей предсказания.

Overlap

максимально допустимая степень пересечения объектов.

False

Число в диапазоне (0,1).

Значение по-умолчанию 0.5

filter - фильтрация данных по различным критериям. Параметры фильтрации:

- min_confidance - минимальное значение уверенности предсказания

- is_empty - фильтрация пустых и невалидных боксов

- height_range, width_range, area_range - фильтрация объектов имеющих высоту/ширину/площадь вне указанного диапазона значений. Если представлено только одно значение, то оно считается нижней границей диапазона.

- area_ratio, aspect_ratio - фильтрация по отношению площади объекта к площади изображения, соотношению сторон

- labels - фильтрация по значению класса объекта.

- min_visibility - минимальный уровень видимости объекта.

apply_to

задает к annotation или/и prediction будет применена операция.

True

Доступные опции:

annotations,

predictions,

all (для одновременного применения и к тому, и к другому).

remove_filtered

позволяет удалить отфильтрованные значения.

False

True/False. Если данный аргумент не используется,то отфильтрованные значения получают отметку о фильтрации и в последствии могут быть проигнорированы при подсчете метрики.

Segmentation Postprocessing применяется к SegmentationAnnotation, SegmentationPrediction

Parameter

description

required

Acceptable value

encode_segmentation_mask - раскодирование ground truth маски, представленной в цветовой кодировке.

resize_segmentation_mask - увеличение/уменьшение размера сегментационной маски.

apply_to

задает к annotation или/и prediction будет применена операция.

True

Доступные опции:

annotations,

predictions,

all (для одновременного применения и к тому, и к другому).

dst_width

dst_hight/size

размер маски после применения операции

False

Целое положительное число. Вы можете использовать аргумент size, если размерности совпадают). Если размер не указан, то размер исходного изображения будет использован.

extend_segmentation_mask - эквивалентно операции паддинга аннотационной маски до размера предсказанной.

filling_label

значение для заполнения обрамляющей части

False

Целое число в диапазоне от 0 до 255. (По-умолчанию 255)

zoom_segmentation_mask - масштабирование предсказанной сегментационной маски.

Zoom

шаг для масштабирования

False

Целое число, минимальное значение 1. (значение по-умолчанию, 1)

Pose Estimation Posttprocessing применяется к PoseEstimationAnnotation, PoseEstimationPrediction

Parameter

description

required

Acceptable value

filter - фильтрация данных по различным критериям. Параметры фильтрации:

height_range, width_range, area_range - фильтрация объектов имеющих высоту/ширину/площадь вне указанного диапазона значений. Если представлено только одно значение, то оно считается нижней границей диапазона.

apply_to

задает к annotation или/и prediction будет применена операция.

True

Доступные опции:

annotations,

predictions,

all.

Landmarks Regression Postprocessing применяется к FacialLandmarksAnnotations, FacialLandmarksPrediction

Parameter

description

required

Acceptable value

normalize_landmarks_points - приведение координат ключевых точек к диапазону [0, 1]

use_annotation_rect

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

False

True/False. (по-умолчанию False)

Приложение 5

Пример конфигурационного файла

models:

- name: SampLeNet_example

# list of launchers for your topology.

launchers:

# launcher framework (e.g. caffe, dlsdk)

- framework: dlsdk

# device for infer (e.g. for dlsdk cpu, gpu, hetero:cpu, gpu ...)

device: CPU

# topology IR (*.prototxt for caffe, *.xml for InferenceEngine, etc)

# path to topology is prefixed with directory, specified in "-m/--models"

option

caffe_model: SampLeNet.prototxt

# topology weights binary (*.caffemodel for caffe, *.bin for

InferenceEngine)

caffe_weights: SampLeNet.caffemodel

# launcher returns raw result, so it should be converted

# to an appropriate representation with adapter

adapter: classification

# metrics, preprocessing and postprocessing are typically dataset specific, so

dataset field

# specifies data and all other steps required to validate topology

# there is typically definitions file, which contains options for common

datasets and which is merged

# during evaluation, but since "sample_dataset" is not used anywhere else,

this config contains full definition

datasets:

# uniquely distinguishable name for dataset

# note that all other steps are specific for this dataset only

# if you need to test topology on multiple datasets, you need to specify

# every step explicitly for each dataset

- name: sample_dataset

# directory where input images are searched.

# prefixed with directory specified in "-s/--source" option

data_source: sample_dataset/test

# name of converted annotation file (specified in -a option during annotation

conversion)

# prefixed with directory specified in "-a/--annotations" option

annotation: sample_annotation

# list of preprocessing, applied to each image during validation

# order of entries matters

preprocessing:

# resize input image to topology input size

# you may specify size to which image should be resized

# via dst_width, dst_height fields

- type: resize

size: 32

# topology is trained on RGB images, but OpenCV reads in BGR

# thence it must be converted to RGB

- type: bgr_to_rgb

# dataset mean and standard deviation

- type: normalization

# you may specify precomputed statistics manually or use precomputed

values, such as ImageNet as well

mean: (125.307, 122.961, 113.8575)

std: (51.5865, 50.847, 51.255)

# list of metrics, calculated on dataset

metrics:

- type: accuracy

top_k: 1

Приложение 6

Пример добавление конвертера для датасета

from accuracy_checker.representation import ClassificationAnnotation

from accuracy_checker.utils import get_path, read_txt

from .format_converter import BaseFormatConverter

# test directory contains files with names XXXX_class.png

# we use regular expression to extract class names

FILE_PATTERN_REGEX = re.compile(r"\d+_(\w+)\.png")

class SampleConverter(BaseFormatConverter):

"""

Sample dataset converter. All annotation converters should be derived from

BaseFormatConverter class.

"""

# register name for this converter

# this name will be used for converter class look up

__provider__ = "sample"

def convert(self, dataset_directory: str):

"""

This method is executed automatically when convert.py is started.

All arguments are automatically forwarded from command line arguments

Args:

dataset_directory: path to sample dataset

Returns:

annotations: list of annotation representation objects.

meta: dictionary with additional dataset level metadata

"""

dataset_directory = get_path(dataset_directory, is_directory=True)

# read and convert annotation

labels = self._read_labels(dataset_directory / 'labels.txt')

annotations = self._convert_annotations(dataset_directory / 'test', labels)

# convert label list to label map

label_map = {i: labels[i] for i in range(len(labels))}

metadata = {'label_map': label_map}

return annotations, metadata

@staticmethod

def _read_labels(labels_file):

"""Extract label names from labels.txt file"""

return read_txt(labels_file)

@staticmethod

def _convert_annotations(test_dir, labels):

"""Create annotation representations list"""

annotations = []

# iterate over all png images in test directory

for image in test_dir.glob("*.png"):

# get file name (e.g. from /foo/bar/image.png we get image.png)

image_base = str(image.parts[-1])

# extract class name from file name

regex_match = re.match(FILE_PATTERN_REGEX, image_base)

image_label = regex_match.group(1)

# look up class index in label list

class_id = labels.index(image_label)

# create annotation representation object

annotations.append(ClassificationAnnotation(image_base, class_id))

return annotations

Приложение 7

Листинг программы

accuracy_checker/evaluators/model_evaluator.py

import time

import copy

import pickle

from ..utils import get_path, set_image_metadata,

extract_image_representations

from ..dataset import Dataset

from ..launcher import create_launcher, DummyLauncher, InputFeeder

from ..launcher.loaders import PickleLoader

from ..logging import print_info

from ..metrics import MetricsExecutor

from ..postprocessor import PostprocessingExecutor

from ..preprocessor import PreprocessingExecutor

from ..adapters import create_adapter

from ..config import ConfigError

from ..data_readers import BaseReader

class ModelEvaluator:

def __init__( self, launcher, input_feeder, adapter, reader, preprocessor,

postprocessor, dataset, metric, async_mode):

self.launcher = launcher

self.input_feeder = input_feeder

self.adapter = adapter

self.reader = reader

self.preprocessor = preprocessor

self.postprocessor = postprocessor

self.dataset = dataset

self.metric_executor = metric

self.dataset_processor = self.process_dataset if not async_mode else

self.process_dataset_async

self._annotations = []

self._predictions = []

@classmethod

def from_configs(cls, launcher_config, dataset_config):

dataset_name = dataset_config['name']

data_reader_config = dataset_config.get('reader', 'opencv_imread')

data_source = dataset_config.get('data_source')

if isinstance(data_reader_config, str):

data_reader = BaseReader.provide(data_reader_config, data_source)

elif isinstance(data_reader_config, dict):

data_reader = BaseReader.provide(data_reader_config['type'], data_source,

data_reader_config)

else:

raise ConfigError('reader should be dict or string')

dataset = Dataset(dataset_config)

async_mode = launcher_config.get('async_mode', False)

launcher = create_launcher(launcher_config)

config_adapter = launcher_config.get('adapter')

adapter = None if not config_adapter else create_adapter(config_adapter,

launcher, dataset)

input_feeder = InputFeeder(launcher.config.get('inputs', []),

launcher.inputs, launcher.fit_to_input, launcher.default_layout

preprocessor = PreprocessingExecutor dataset_config.get('preprocessing'),

dataset_name, dataset.metadata, launcher.inputs_info_for_meta())

postprocessor =

PostprocessingExecutor(dataset_config.get('postprocessing'),

dataset_name, dataset.metadata)

metric_dispatcher = MetricsExecutor(dataset_config.get('metrics', []),

dataset)

return cls(launcher, input_feeder, adapter, data_reader, preprocessor,

postprocessor, dataset, metric_dispatcher, async_mode)

def _get_batch_input(self, batch_annotation):

batch_identifiers = [annotation.identifier for annotation in batch_annotation]

batch_input = [self.reader(identifier=identifier) for identifier in

batch_identifiers]

for annotation, input_data in zip(batch_annotation, batch_input):

set_image_metadata(annotation, input_data)

annotation.metadata['data_source'] = self.reader.data_source

batch_input = self.preprocessor.process(batch_input, batch_annotation)

_, batch_meta = extract_image_representations(batch_input)

filled_inputs = self.input_feeder.fill_inputs(batch_input)

return filled_inputs, batch_meta, batch_identifiers

def process_dataset_async(self, stored_predictions, progress_reporter, *args,

**kwargs):

def _process_ready_predictions(batch_predictions, batch_identifiers,

batch_meta, adapter, raw_outputs_callback):

if raw_outputs_callback:

raw_outputs_callback([batch_predictions])

if adapter:

batch_predictions = self.adapter.process(batch_predictions,

batch_identifiers, batch_meta)

return batch_predictions

if self._is_stored(stored_predictions) or isinstance(self.launcher,

DummyLauncher):

self._annotations, self._predictions =

self._load_stored_predictions(stored_predictions, progress_reporter)

self.dataset.batch = self.launcher.batch

predictions_to_store = []

dataset_iterator = iter(enumerate(self.dataset))

free_irs = self.launcher.infer_requests

queued_irs = []

wait_time = 0.01

while free_irs or queued_irs:

self._fill_free_irs(free_irs, queued_irs, dataset_iterator)

free_irs[:] = []

ready_irs, queued_irs = self._wait_for_any(queued_irs)

if ready_irs:

wait_time = 0.01

for batch_id, batch_annotation, batch_meta, batch_predictions, ir in

ready_irs:

batch_identifiers = [annotation.identifier for annotation in batch_annotation]

batch_predictions = _process_ready_predictions(

batch_predictions, batch_identifiers, batch_meta, self.adapter,

kwargs.get('output_callback')

)

free_irs.append(ir)

if stored_predictions:

predictions_to_store.extend(copy.deepcopy(batch_predictions))

annotations, predictions =

self.postprocessor.process_batch(batch_annotation, batch_predictions)

if not self.postprocessor.has_dataset_processors:

self.metric_executor.update_metrics_on_batch(annotations, predictions)

self._annotations.extend(annotations)

self._predictions.extend(predictions)

if progress_reporter:

progress_reporter.update(batch_id, len(batch_predictions))

else:

time.sleep(wait_time)

wait_time = max(wait_time * 2, .16)

if progress_reporter:

progress_reporter.finish()

if stored_predictions:

self.store_predictions(stored_predictions, predictions_to_store)

if self.postprocessor.has_dataset_processors:

self.metric_executor.update_metrics_on_batch(self._annotations,

self._predictions)

return self.postprocessor.process_dataset(self._annotations,

self._predictions)

def process_dataset(self, stored_predictions, progress_reporter, *args,

**kwargs):

if self._is_stored(stored_predictions) or isinstance(self.launcher,

DummyLauncher):

self._annotations, self._predictions = self.load(stored_predictions,

progress_reporter)

self._annotations, self._predictions =

self.postprocessor.full_process(self._annotations, self._predictions)

self.metric_executor.update_metrics_on_batch(self._annotations,

self._predictions)

return self._annotations, self._predictions

self.dataset.batch = self.launcher.batch

predictions_to_store = []

for batch_id, batch_annotation in enumerate(self.dataset):

filled_inputs, batch_meta, batch_identifiers =

self._get_batch_input(batch_annotation)

batch_predictions = self.launcher.predict(filled_inputs, batch_meta, *args,

**kwargs)

if self.adapter:

self.adapter.output_blob = self.adapter.output_blob or

self.launcher.output_blob

batch_predictions = self.adapter.process(batch_predictions,

batch_identifiers, batch_meta)

if stored_predictions:

predictions_to_store.extend(copy.deepcopy(batch_predictions))

annotations, predictions =

self.postprocessor.process_batch(batch_annotation, batch_predictions,

batch_meta)

if not self.postprocessor.has_dataset_processors:

self.metric_executor.update_metrics_on_batch(annotations, predictions)

self._annotations.extend(annotations)

self._predictions.extend(predictions)

if progress_reporter:

progress_reporter.update(batch_id, len(batch_predictions))

if progress_reporter:

progress_reporter.finish()

if stored_predictions:

self.store_predictions(stored_predictions, predictions_to_store)

if self.postprocessor.has_dataset_processors:

self.metric_executor.update_metrics_on_batch(self._annotations,

self._predictions)

return self.postprocessor.process_dataset(self._annotations,

self._predictions)

@staticmethod

def _is_stored(stored_predictions=None):

if not stored_predictions:

return False

try:

get_path(stored_predictions)

return True

except OSError:

return False

def _load_stored_predictions(self, stored_predictions, progress_reporter):

self._annotations, self._predictions = self.load(stored_predictions,

progress_reporter)

self._annotations, self._predictions =

self.postprocessor.full_process(self._annotations, self._predictions)

self.metric_executor.update_metrics_on_batch(self._annotations,

self._predictions)

return self._annotations, self._predictions

@staticmethod

def _wait_for_any(irs):

if not irs:

return [], []

result = []

free_indexes = []

for ir_id, (batch_id, batch_annotation, batch_meta, ir) in enumerate(irs):

if ir.wait(0) == 0:

result.append((batch_id, batch_annotation, batch_meta, [ir.outputs], ir))

free_indexes.append(ir_id)

irs = [ir for ir_id, ir in enumerate(irs) if ir_id not in free_indexes]

return result, irs

def _fill_free_irs(self, free_irs, queued_irs, dataset_iterator):

for ir in free_irs:

try:

batch_id, batch_annotation = next(dataset_iterator)

except StopIteration:

break

batch_input, batch_meta, _ = self._get_batch_input(batch_annotation)

self.launcher.predict_async(ir, batch_input, batch_meta)

queued_irs.append((batch_id, batch_annotation, batch_meta, ir))

return free_irs, queued_irs

def compute_metrics(self, output_callback=None,

ignore_results_formatting=False):

for result_presenter, evaluated_metric in

self.metric_executor.iterate_metrics(

self._annotations, self._predictions):

result_presenter.write_result(evaluated_metric, output_callback,

ignore_results_formatting)

def load(self, stored_predictions, progress_reporter):

self._annotations = self.dataset.annotation

launcher = self.launcher

if not isinstance(launcher, DummyLauncher):

launcher = DummyLauncher({

'framework': 'dummy',

'loader': PickleLoader.__provider__,

'data_path': stored_predictions

}, adapter=None)

predictions = launcher.predict([annotation.identifier for annotation in

self._annotations])

if progress_reporter:

progress_reporter.finish(False)

return self._annotations, predictions

@staticmethod

def store_predictions(stored_predictions, predictions):

# since at the first time file does not exist and then created we can not

use it as a pathlib.Path object

with open(stored_predictions, "wb") as content:

pickle.dump(predictions, content)

print_info("prediction objects are save to {}".format(stored_predictions))

def release(self):

self.launcher.release()

accuracy_checker/dataset.py

from copy import deepcopy

from pathlib import Path

from .annotation_converters import BaseFormatConverter,

save_annotation, make_subset, analyze_dataset

from .config import ConfigValidator, StringField, PathField, ListField,

DictField, BaseField, NumberField, ConfigError

from .utils import JSONDecoderWithAutoConversion, read_json, get_path,

contains_all

from .representation import BaseRepresentation

from .data_readers import DataReaderField

class DatasetConfig(ConfigValidator):

"""

Specifies configuration structure for dataset

"""

name = StringField()

annotation = PathField(optional=True, check_exists=False)

data_source = PathField(optional=True, check_exists=False)

dataset_meta = PathField(optional=True, check_exists=False)

metrics = ListField(allow_empty=False, optional=True)

postprocessing = ListField(allow_empty=False, optional=True)

preprocessing = ListField(allow_empty=False, optional=True)

reader = DataReaderField(optional=True)

annotation_conversion = DictField(optional=True)

subsample_size = BaseField(optional=True)

subsample_seed = NumberField(floats=False, min_value=0, optional=True)

analyze_dataset = BaseField(optional=True)

class Dataset:

def __init__(self, config_entry):

self._config = config_entry

self.batch = 1

self.iteration = 0

dataset_config = DatasetConfig('Dataset')

dataset_config.validate(self._config)

annotation, meta = None, None

use_converted_annotation = True

self._images_dir = Path(self._config.get('data_source', ''))

if 'annotation' in self._config:

annotation_file = Path(self._config['annotation'])

if annotation_file.exists():

annotation = read_annotation(get_path(annotation_file))

meta = self._load_meta()

use_converted_annotation = False

if not annotation and 'annotation_conversion' in self._config:

annotation, meta = self._convert_annotation()

if not annotation:

raise ConfigError('path to converted annotation or data for conversion

should be specified')

subsample_size = self._config.get('subsample_size')

if subsample_size:

subsample_seed = self._config.get('subsample_seed', 666)

if isinstance(subsample_size, str):

if subsample_size.endswith('%'):

subsample_size = float(subsample_size[:-1]) / 100 * len(annotation)

subsample_size = int(subsample_size)

annotation = make_subset(annotation, subsample_size, subsample_seed)

if self._config.get('analyze_dataset', False):

analyze_dataset(annotation, meta)

if use_converted_annotation and contains_all(self._config, ['annotation',

'annotation_conversion']):

annotation_name = self._config['annotation']

meta_name = self._config.get('dataset_meta')

if meta_name:

meta_name = Path(meta_name)

save_annotation(annotation, meta, Path(annotation_name), meta_name)

self._annotation = annotation

self._meta = meta

self.size = len(self._annotation)

self.name = self._config.get('name')

@property

def annotation(self):

return self._annotation

@property

def config(self):

return deepcopy(self._config) #read-only

def __len__(self):

return self.size

@property

def metadata(self):

return deepcopy(self._meta) #read-only

@property

def labels(self):

return self._meta.get('label_map', {})

def __call__(self, context, *args, **kwargs):

batch_annotation = self.__getitem__(self.iteration)

self.iteration += 1

context.annotation_batch = batch_annotation

context.identifiers_batch = [annotation.identifier for annotation in

batch_annotation]

def __getitem__(self, item):

if self.size <= item * self.batch:

raise IndexError

batch_start = item * self.batch

batch_end = min(self.size, batch_start + self.batch)

batch_annotation = self._annotation[batch_start:batch_end]

return batch_annotation

@staticmethod

def set_image_metadata(annotation, images):

image_sizes = []

data = images.data

if not isinstance(data, list):

data = [data]

for image in data:

image_sizes.append(image.shape)

annotation.set_image_size(image_sizes)

def set_annotation_metadata(self, annotation, image, data_source):

self.set_image_metadata(annotation, image.data)

annotation.set_data_source(data_source)

def _load_meta(self):

meta_data_file = self._config.get('dataset_meta')

return read_json(meta_data_file, cls=JSONDecoderWithAutoConversion)

if meta_data_file else None

def _convert_annotation(self):

conversion_params = self._config.get('annotation_conversion')

converter = conversion_params['converter']

annotation_converter = BaseFormatConverter.provide(converter,

conversion_params)

results = annotation_converter.convert()

if isinstance(results, tuple) and len(results) == 2:

annotation, meta = results

else:

annotation, meta = results, None

return annotation, meta

def read_annotation(annotation_file: Path):

annotation_file = get_path(annotation_file)

result = []

with annotation_file.open('rb') as file:

while True:

try:

result.append(BaseRepresentation.load(file))

except EOFError:

break

return result

Размещено на allbest.ru

...

Подобные документы

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

    презентация [582,1 K], добавлен 25.06.2013

  • Диагностический анализ изучения алгоритмов обучения нейронных сетей "с учителем". Сбор входных и выходных переменных для наблюдений и понятие пре/пост процессирования. Подготовка и обобщение многослойного персептрона, модель обратного распространения.

    курсовая работа [249,3 K], добавлен 22.06.2011

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

    реферат [158,2 K], добавлен 16.03.2011

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

    реферат [347,6 K], добавлен 17.12.2011

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

    курсовая работа [1,5 M], добавлен 15.10.2012

  • Анализ применения нейронных сетей для прогнозирования ситуации и принятия решений на фондовом рынке с помощью программного пакета моделирования нейронных сетей Trajan 3.0. Преобразование первичных данных, таблиц. Эргономическая оценка программы.

    дипломная работа [3,8 M], добавлен 27.06.2011

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

    дипломная работа [1,8 M], добавлен 08.02.2017

  • Способы применения технологий нейронных сетей в системах обнаружения вторжений. Экспертные системы обнаружения сетевых атак. Искусственные сети, генетические алгоритмы. Преимущества и недостатки систем обнаружения вторжений на основе нейронных сетей.

    контрольная работа [135,5 K], добавлен 30.11.2015

  • Общие сведения о принципах построения нейронных сетей. Искусственные нейронные системы. Математическая модель нейрона. Классификация нейронных сетей. Правила обучения Хэбба, Розенблатта и Видроу-Хоффа. Алгоритм обратного распространения ошибки.

    дипломная работа [814,6 K], добавлен 29.09.2014

  • Способы применения нейронных сетей для решения различных математических и логических задач. Принципы архитектуры их построения и цели работы программных комплексов. Основные достоинства и недостатки каждой из них. Пример рекуррентной сети Элмана.

    курсовая работа [377,4 K], добавлен 26.02.2015

  • Понятие искусственного нейрона и искусственных нейронных сетей. Сущность процесса обучения нейронной сети и аппроксимации функции. Смысл алгоритма обучения с учителем. Построение и обучение нейронной сети для аппроксимации функции в среде Matlab.

    лабораторная работа [1,1 M], добавлен 05.10.2010

  • Нейронные сети как средство анализа процесса продаж мобильных телефонов. Автоматизированные решения на основе технологии нейронных сетей. Разработка программы прогнозирования оптово-розничных продаж мобильных телефонов на основе нейронных сетей.

    дипломная работа [4,6 M], добавлен 22.09.2011

  • Модели нейронных сетей и их реализации. Последовательный и параллельный методы резолюции как средства логического вывода. Зависимость между логическим следованием и логическим выводом. Применение технологии CUDA и реализация параллельного алгоритма.

    дипломная работа [1,5 M], добавлен 22.09.2016

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

    презентация [150,8 K], добавлен 19.08.2013

  • Гибкая технологии извлечения знаний из нейронных сетей, настраиваемой с учетом предпочтений пользователя. Тестирование, пробная эксплуатация и разработка новой версии программных средств, реализующих данную технологию. Индивидуальные пространства смыслов.

    дипломная работа [336,3 K], добавлен 07.06.2008

  • Технологии решения задач с использованием нейронных сетей в пакетах расширения Neural Networks Toolbox и Simulink. Создание этого вида сети, анализ сценария формирования и степени достоверности результатов вычислений на тестовом массиве входных векторов.

    лабораторная работа [352,2 K], добавлен 20.05.2013

  • Исследование задачи и перспектив использования нейронных сетей на радиально-базисных функциях для прогнозирования основных экономических показателей: валовый внутренний продукт, национальный доход Украины и индекс потребительских цен. Оценка результатов.

    курсовая работа [4,9 M], добавлен 14.12.2014

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

    курсовая работа [322,5 K], добавлен 14.03.2009

  • Простейшая сеть, состоящая из группы нейронов, образующих слой. Свойства нейрокомпьютеров (компьютеров на основе нейронных сетей), привлекательных с точки зрения их практического использования. Модели нейронных сетей. Персептрон и сеть Кохонена.

    реферат [162,9 K], добавлен 30.09.2013

  • Сущность и функции искусственных нейронных сетей (ИНС), их классификация. Структурные элементы искусственного нейрона. Различия между ИНС и машинами с архитектурой фон Неймана. Построение и обучение данных сетей, области и перспективы их применения.

    презентация [1,4 M], добавлен 14.10.2013

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.