Разработка инфраструктуры для измерения точности работы нейронных сетей на ИИ-ускорителях
Аппаратная и программная реализация нейронных сетей. Создание улучшенного подхода валидации точности алгоритмов глубокого обучения для применения на ИИ-ускорителях. Разработка гибкого и расширяемого инструмента для инференса искусственных нейронных сетей.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | дипломная работа |
Язык | русский |
Дата добавления | 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