Обнаружение транспортного средства Используя Сетевой Основанный YOLO v2 DAG, Развернутый на FPGA

В этом примере показано, как обучаться и развернуться, вы смотрят только однажды (YOLO) v2 детектор объектов.

Глубокое обучение является мощным методом машинного обучения, который можно использовать, чтобы обучить устойчивые детекторы объектов. Несколько методов для обнаружения объектов существуют, включая Faster R-CNN и вы только смотрите однажды (YOLO) v2. Этот пример обучает детектор YOLO v2 транспортного средства с помощью trainYOLOv2ObjectDetector функция.

Загрузите набор данных

Этот пример использует набор данных небольшого транспортного средства, который содержит 295 изображений. Многие из этих изображений прибывают из Автомобилей Калифорнийского технологического института 1 999 и 2 001 набор данных, доступный в Калифорнийском технологическом институте Вычислительный веб-сайт Видения, созданный Пьетро Пероной и используемый с разрешением. Каждое изображение содержит один или два помеченных экземпляра транспортного средства. Маленький набор данных полезен для исследования метода обучения YOLO v2, но на практике, более помеченные изображения необходимы, чтобы обучить устойчивый детектор. Разархивируйте изображения транспортного средства и загрузите достоверные данные транспортного средства.

unzip vehicleDatasetImages.zip
data = load('vehicleDatasetGroundTruth.mat');
vehicleDataset = data.vehicleDataset;

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

% Add the fullpath to the local vehicle data folder.
vehicleDataset.imageFilename = fullfile(pwd,vehicleDataset.imageFilename);

Разделите набор данных в наборы обучающих данных и наборы тестов. Выберите 60% данных для обучения и остальных для тестирования обученного детектора.

rng(0);
shuffledIndices = randperm(height(vehicleDataset));
idx = floor(0.6 * length(shuffledIndices) );
trainingDataTbl = vehicleDataset(shuffledIndices(1:idx),:);
testDataTbl = vehicleDataset(shuffledIndices(idx+1:end),:);

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

imdsTrain = imageDatastore(trainingDataTbl{:,'imageFilename'});
bldsTrain = boxLabelDatastore(trainingDataTbl(:,'vehicle'));

imdsTest = imageDatastore(testDataTbl{:,'imageFilename'});
bldsTest = boxLabelDatastore(testDataTbl(:,'vehicle'));

Объедините изображение и хранилища данных метки поля.

trainingData = combine(imdsTrain,bldsTrain);
testData = combine(imdsTest,bldsTest);

Создайте Сеть обнаружения объектов YOLO v2

Сеть обнаружения объектов YOLO v2 состоит из двух подсетей. Сеть извлечения признаков сопровождается сетью обнаружения. Сеть извлечения признаков обычно является предварительно обученным CNN (для получения дополнительной информации смотрите Предварительно обученные Глубокие нейронные сети). Этот пример использует ResNet-18 для извлечения признаков. Можно также использовать другие предварительно обученные сети, такие как MobileNet v2 или ResNet-50 в зависимости от требований к приложению. Подсеть обнаружения является маленьким CNN по сравнению с сетью извлечения признаков и состоит из нескольких сверточных слоев и слоев, специфичных для YOLO v2.

Используйте yolov2Layers функция, чтобы автоматически создать сеть обнаружения объектов YOLO v2, учитывая предварительно обученную сеть извлечения признаков ResNet-18. yolov2Layers требует, чтобы вы задали несколько входных параметров, которые параметрируют сеть YOLO v2:

  • Сетевой входной размер

  • Поля привязки

  • Сеть извлечения признаков

Во-первых, укажите размер входного сигнала сети и количество классов. При выборе размера входного сигнала сети учитывайте минимальный размер, требуемый самой сетью, размер обучающих изображений и вычислительные затраты, связанные с обработкой данных при выбранном размере. Когда это возможно, выберите размер входного сигнала сети, который близок к размеру обучающего изображения и больше, чем размер входного сигнала, необходимый для сети. Чтобы уменьшить вычислительные затраты на выполнение примера, укажите размер входного сигнала сети [224 224 3], который является минимальным размером, необходимым для запуска сети.

inputSize = [224 224 3];

Задайте количество классов объектов, чтобы обнаружить.

numClasses = width(vehicleDataset)-1;

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

Затем используйте estimateAnchorBoxes оценить поля привязки на основе размера объектов в обучающих данных. С учетом изменения размеров изображений до обучения измените размер обучающих данных для оценки полей привязки. Используйте transform чтобы предварительно обработать обучающие данные, затем задайте количество полей привязки и оцените поля привязки. Измените размер обучающих данных к входному размеру изображения сети с помощью функции поддержки yolo_preprocessData.

trainingDataForEstimation = transform(trainingData,@(data)yolo_preprocessData(data,inputSize));
numAnchors = 7;
[anchorBoxes, meanIoU] = estimateAnchorBoxes(trainingDataForEstimation, numAnchors)
anchorBoxes = 7×2

   145   126
    91    86
   161   132
    41    34
    67    64
   136   111
    33    23

meanIoU = 0.8651

Для получения дополнительной информации о выборе полей привязки смотрите Оценочные Поля Привязки От Обучающих данных (Computer Vision Toolbox) (Computer Vision Toolbox™) и Поля Привязки для Обнаружения объектов (Computer Vision Toolbox).

Теперь используйте resnet18, чтобы загрузить предварительно обученную модель ResNet-18.

featureExtractionNetwork = resnet18;

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

featureLayer = 'res4b_relu';

Создайте сеть обнаружения объектов YOLO v2..

lgraph = yolov2Layers(inputSize,numClasses,anchorBoxes,featureExtractionNetwork,featureLayer);

Можно визуализировать сеть с помощью analyzeNetwork или Deep Network Designer от Deep Learning Toolbox™.

Если больше управления требуется по архитектуре сети YOLO v2, используйте Deep Network Designer, чтобы спроектировать сеть обнаружения YOLO v2 вручную. Для получения дополнительной информации см. Проект Сеть обнаружения YOLO v2 (Computer Vision Toolbox).

Увеличение данных

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

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

augmentedTrainingData = transform(trainingData,@yolo_augmentData);

Предварительно обработайте Обучающие данные и Обучите детектор объектов YOLO v2

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

preprocessedTrainingData = transform(augmentedTrainingData,@(data)yolo_preprocessData(data,inputSize));

Используйте trainingOptions задавать сетевые опции обучения. Установите 'ValidationData' к предварительно обработанным данным о валидации. Установите 'CheckpointPath' к временному местоположению. Это включает сохранение частично обученных детекторов во время учебного процесса. Если обучение прервано, такой как отключением электроэнергии или системным отказом, можно возобновить обучение с сохраненной контрольной точки.

options = trainingOptions('sgdm', ...
        'MiniBatchSize', 16, ....
        'InitialLearnRate',1e-3, ...
        'MaxEpochs',20,...
        'CheckpointPath', tempdir, ...
        'Shuffle','never');

Используйте trainYOLOv2ObjectDetector функция, чтобы обучить детектор объектов YOLO v2.

[detector,info] = trainYOLOv2ObjectDetector(preprocessedTrainingData,lgraph,options);
*************************************************************************
Training a YOLO v2 Object Detector for the following object classes:

* vehicle

Training on single CPU.
Initializing input data normalization.
|========================================================================================|
|  Epoch  |  Iteration  |  Time Elapsed  |  Mini-batch  |  Mini-batch  |  Base Learning  |
|         |             |   (hh:mm:ss)   |     RMSE     |     Loss     |      Rate       |
|========================================================================================|
|       1 |           1 |       00:00:02 |         8.43 |         71.1 |          0.0010 |
|       5 |          50 |       00:01:26 |         0.71 |          0.5 |          0.0010 |
|      10 |         100 |       00:02:46 |         0.75 |          0.6 |          0.0010 |
|      14 |         150 |       00:04:04 |         0.53 |          0.3 |          0.0010 |
|      19 |         200 |       00:05:23 |         0.48 |          0.2 |          0.0010 |
|      20 |         220 |       00:05:53 |         0.57 |          0.3 |          0.0010 |
|========================================================================================|
Detector training complete.
*************************************************************************

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

I = imread(testDataTbl.imageFilename{2});
I = imresize(I,inputSize(1:2));
[bboxes,scores] = detect(detector,I);

Отобразите результаты.

I_new = insertObjectAnnotation(I,'rectangle',bboxes,scores);
figure
imshow(I_new)

Загрузите предварительно обученную сеть

Загрузите предварительно обученную сеть.

snet=detector.Network;
I_pre=yolo_pre_proc(I);

Используйте analyzeNetwork получить информацию о слоях сети:

analyzeNetwork(snet)

Создайте целевой объект

Создайте целевой объект для своего целевого устройства с именем поставщика и интерфейсом, чтобы соединить ваше целевое устройство к хосту - компьютеру. Интерфейсные опции являются JTAG (значение по умолчанию) и Ethernet. Опциями поставщика является Intel или Xilinx. Используйте установленный Набор Проекта Xilinx Vivado по соединению Ethernet, чтобы программировать устройство.

hTarget = dlhdl.Target('Xilinx', 'Interface', 'Ethernet');

Создайте объект рабочего процесса

Создайте объект dlhdl.Workflow класс. Когда вы создаете объект, задаете сеть и имя потока битов. Задайте сохраненную предварительно обученную серийную сеть, trainedNetNoCar, как сеть. Убедитесь, что имя потока битов совпадает с типом данных и платой FPGA, для которой вы предназначаетесь. В этом примере целевая плата FPGA является Zynq UltraScale + плата MPSoC ZCU102. Поток битов использует один тип данных.

hW=dlhdl.Workflow('Network', snet, 'Bitstream', 'zcu102_single','Target',hTarget)
hW = 
  Workflow with properties:

            Network: [1×1 DAGNetwork]
          Bitstream: 'zcu102_single'
    ProcessorConfig: []
             Target: [1×1 dlhdl.Target]

Скомпилируйте детектор объектов YOLO v2

Скомпилировать snet серийная сеть, запуск функция компиляции dlhdl.Workflow объект.

dn = hW.compile
### Compiling network for Deep Learning FPGA prototyping ...
### Targeting FPGA bitstream zcu102_single ...
### The network includes the following layers:

     1   'data'                  Image Input                224×224×3 images with 'zscore' normalization                          (SW Layer)
     2   'conv1'                 Convolution                64 7×7×3 convolutions with stride [2  2] and padding [3  3  3  3]     (HW Layer)
     3   'bn_conv1'              Batch Normalization        Batch normalization with 64 channels                                  (HW Layer)
     4   'conv1_relu'            ReLU                       ReLU                                                                  (HW Layer)
     5   'pool1'                 Max Pooling                3×3 max pooling with stride [2  2] and padding [1  1  1  1]           (HW Layer)
     6   'res2a_branch2a'        Convolution                64 3×3×64 convolutions with stride [1  1] and padding [1  1  1  1]    (HW Layer)
     7   'bn2a_branch2a'         Batch Normalization        Batch normalization with 64 channels                                  (HW Layer)
     8   'res2a_branch2a_relu'   ReLU                       ReLU                                                                  (HW Layer)
     9   'res2a_branch2b'        Convolution                64 3×3×64 convolutions with stride [1  1] and padding [1  1  1  1]    (HW Layer)
    10   'bn2a_branch2b'         Batch Normalization        Batch normalization with 64 channels                                  (HW Layer)
    11   'res2a'                 Addition                   Element-wise addition of 2 inputs                                     (HW Layer)
    12   'res2a_relu'            ReLU                       ReLU                                                                  (HW Layer)
    13   'res2b_branch2a'        Convolution                64 3×3×64 convolutions with stride [1  1] and padding [1  1  1  1]    (HW Layer)
    14   'bn2b_branch2a'         Batch Normalization        Batch normalization with 64 channels                                  (HW Layer)
    15   'res2b_branch2a_relu'   ReLU                       ReLU                                                                  (HW Layer)
    16   'res2b_branch2b'        Convolution                64 3×3×64 convolutions with stride [1  1] and padding [1  1  1  1]    (HW Layer)
    17   'bn2b_branch2b'         Batch Normalization        Batch normalization with 64 channels                                  (HW Layer)
    18   'res2b'                 Addition                   Element-wise addition of 2 inputs                                     (HW Layer)
    19   'res2b_relu'            ReLU                       ReLU                                                                  (HW Layer)
    20   'res3a_branch2a'        Convolution                128 3×3×64 convolutions with stride [2  2] and padding [1  1  1  1]   (HW Layer)
    21   'bn3a_branch2a'         Batch Normalization        Batch normalization with 128 channels                                 (HW Layer)
    22   'res3a_branch2a_relu'   ReLU                       ReLU                                                                  (HW Layer)
    23   'res3a_branch2b'        Convolution                128 3×3×128 convolutions with stride [1  1] and padding [1  1  1  1]  (HW Layer)
    24   'bn3a_branch2b'         Batch Normalization        Batch normalization with 128 channels                                 (HW Layer)
    25   'res3a'                 Addition                   Element-wise addition of 2 inputs                                     (HW Layer)
    26   'res3a_relu'            ReLU                       ReLU                                                                  (HW Layer)
    27   'res3a_branch1'         Convolution                128 1×1×64 convolutions with stride [2  2] and padding [0  0  0  0]   (HW Layer)
    28   'bn3a_branch1'          Batch Normalization        Batch normalization with 128 channels                                 (HW Layer)
    29   'res3b_branch2a'        Convolution                128 3×3×128 convolutions with stride [1  1] and padding [1  1  1  1]  (HW Layer)
    30   'bn3b_branch2a'         Batch Normalization        Batch normalization with 128 channels                                 (HW Layer)
    31   'res3b_branch2a_relu'   ReLU                       ReLU                                                                  (HW Layer)
    32   'res3b_branch2b'        Convolution                128 3×3×128 convolutions with stride [1  1] and padding [1  1  1  1]  (HW Layer)
    33   'bn3b_branch2b'         Batch Normalization        Batch normalization with 128 channels                                 (HW Layer)
    34   'res3b'                 Addition                   Element-wise addition of 2 inputs                                     (HW Layer)
    35   'res3b_relu'            ReLU                       ReLU                                                                  (HW Layer)
    36   'res4a_branch2a'        Convolution                256 3×3×128 convolutions with stride [2  2] and padding [1  1  1  1]  (HW Layer)
    37   'bn4a_branch2a'         Batch Normalization        Batch normalization with 256 channels                                 (HW Layer)
    38   'res4a_branch2a_relu'   ReLU                       ReLU                                                                  (HW Layer)
    39   'res4a_branch2b'        Convolution                256 3×3×256 convolutions with stride [1  1] and padding [1  1  1  1]  (HW Layer)
    40   'bn4a_branch2b'         Batch Normalization        Batch normalization with 256 channels                                 (HW Layer)
    41   'res4a'                 Addition                   Element-wise addition of 2 inputs                                     (HW Layer)
    42   'res4a_relu'            ReLU                       ReLU                                                                  (HW Layer)
    43   'res4a_branch1'         Convolution                256 1×1×128 convolutions with stride [2  2] and padding [0  0  0  0]  (HW Layer)
    44   'bn4a_branch1'          Batch Normalization        Batch normalization with 256 channels                                 (HW Layer)
    45   'res4b_branch2a'        Convolution                256 3×3×256 convolutions with stride [1  1] and padding [1  1  1  1]  (HW Layer)
    46   'bn4b_branch2a'         Batch Normalization        Batch normalization with 256 channels                                 (HW Layer)
    47   'res4b_branch2a_relu'   ReLU                       ReLU                                                                  (HW Layer)
    48   'res4b_branch2b'        Convolution                256 3×3×256 convolutions with stride [1  1] and padding [1  1  1  1]  (HW Layer)
    49   'bn4b_branch2b'         Batch Normalization        Batch normalization with 256 channels                                 (HW Layer)
    50   'res4b'                 Addition                   Element-wise addition of 2 inputs                                     (HW Layer)
    51   'res4b_relu'            ReLU                       ReLU                                                                  (HW Layer)
    52   'yolov2Conv1'           Convolution                256 3×3×256 convolutions with stride [1  1] and padding 'same'        (HW Layer)
    53   'yolov2Batch1'          Batch Normalization        Batch normalization with 256 channels                                 (HW Layer)
    54   'yolov2Relu1'           ReLU                       ReLU                                                                  (HW Layer)
    55   'yolov2Conv2'           Convolution                256 3×3×256 convolutions with stride [1  1] and padding 'same'        (HW Layer)
    56   'yolov2Batch2'          Batch Normalization        Batch normalization with 256 channels                                 (HW Layer)
    57   'yolov2Relu2'           ReLU                       ReLU                                                                  (HW Layer)
    58   'yolov2ClassConv'       Convolution                42 1×1×256 convolutions with stride [1  1] and padding [0  0  0  0]   (HW Layer)
    59   'yolov2Transform'       YOLO v2 Transform Layer.   YOLO v2 Transform Layer with 7 anchors.                               (SW Layer)
    60   'yolov2OutputLayer'     YOLO v2 Output             YOLO v2 Output with 7 anchors.                                        (SW Layer)

### Optimizing series network: Fused 'nnet.cnn.layer.BatchNormalizationLayer' into 'nnet.cnn.layer.Convolution2DLayer'
5 Memory Regions created.

Skipping: data
Compiling leg: conv1>>pool1 ...
Compiling leg: conv1>>pool1 ... complete.
Compiling leg: res2a_branch2a>>res2a_branch2b ...
Compiling leg: res2a_branch2a>>res2a_branch2b ... complete.
Compiling leg: res2b_branch2a>>res2b_branch2b ...
Compiling leg: res2b_branch2a>>res2b_branch2b ... complete.
Compiling leg: res3a_branch1 ...
Compiling leg: res3a_branch1 ... complete.
Compiling leg: res3a_branch2a>>res3a_branch2b ...
Compiling leg: res3a_branch2a>>res3a_branch2b ... complete.
Compiling leg: res3b_branch2a>>res3b_branch2b ...
Compiling leg: res3b_branch2a>>res3b_branch2b ... complete.
Compiling leg: res4a_branch1 ...
Compiling leg: res4a_branch1 ... complete.
Compiling leg: res4a_branch2a>>res4a_branch2b ...
Compiling leg: res4a_branch2a>>res4a_branch2b ... complete.
Compiling leg: res4b_branch2a>>res4b_branch2b ...
Compiling leg: res4b_branch2a>>res4b_branch2b ... complete.
Compiling leg: yolov2Conv1>>yolov2ClassConv ...
Compiling leg: yolov2Conv1>>yolov2ClassConv ... complete.
Skipping: yolov2Transform
Skipping: yolov2OutputLayer
Creating Schedule...
.....................
Creating Schedule...complete.
Creating Status Table...
....................
Creating Status Table...complete.
Emitting Schedule...
....................
Emitting Schedule...complete.
Emitting Status Table...
......................
Emitting Status Table...complete.

### Allocating external memory buffers:

          offset_name          offset_address    allocated_space 
    _______________________    ______________    ________________

    "InputDataOffset"           "0x00000000"     "24.0 MB"       
    "OutputResultOffset"        "0x01800000"     "4.0 MB"        
    "SchedulerDataOffset"       "0x01c00000"     "4.0 MB"        
    "SystemBufferOffset"        "0x02000000"     "28.0 MB"       
    "InstructionDataOffset"     "0x03c00000"     "4.0 MB"        
    "ConvWeightDataOffset"      "0x04000000"     "20.0 MB"       
    "EndOffset"                 "0x05400000"     "Total: 84.0 MB"

### Network compilation complete.
dn = struct with fields:
             weights: [1×1 struct]
        instructions: [1×1 struct]
           registers: [1×1 struct]
    syncInstructions: [1×1 struct]

Программируйте Поток битов на FPGA и Веса Сети Загрузки

Чтобы развернуть сеть на Zynq® UltraScale +™ оборудование MPSoC ZCU102, запустите развернуть функцию dlhdl.Workflow объект. Эта функция использует выход функции компиляции, чтобы программировать плату FPGA при помощи программирования file.The, функция также загружает сетевые веса и смещения. Развернуть функция проверяет на инструмент Xilinx Vivado и поддерживаемую версию инструмента. Это затем начинает программировать устройство FPGA при помощи потока битов, сообщений о ходе выполнения отображений и время, которое требуется, чтобы развернуть сеть.

hW.deploy
### Programming FPGA Bitstream using Ethernet...
Downloading target FPGA device configuration over Ethernet to SD card ...
# Copied /tmp/hdlcoder_rd to /mnt/hdlcoder_rd
# Copying Bitstream hdlcoder_system.bit to /mnt/hdlcoder_rd
# Set Bitstream to hdlcoder_rd/hdlcoder_system.bit
# Copying Devicetree devicetree_dlhdl.dtb to /mnt/hdlcoder_rd
# Set Devicetree to hdlcoder_rd/devicetree_dlhdl.dtb
# Set up boot for Reference Design: 'AXI-Stream DDR Memory Access : 3-AXIM'

Downloading target FPGA device configuration over Ethernet to SD card done. The system will now reboot for persistent changes to take effect.


System is rebooting . . . . . .
### Programming the FPGA bitstream has been completed successfully.
### Loading weights to Conv Processor.
### Conv Weights loaded. Current time is 04-Jan-2021 13:59:03

Загрузите изображение в качестве примера и запустите предсказание

Выполните предсказать функцию на dlhdl.Workflow возразите и отобразите результат:

[prediction, speed] = hW.predict(I_pre,'Profile','on');
### Finished writing input activations.
### Running single input activations.


              Deep Learning Processor Profiler Performance Results

                   LastFrameLatency(cycles)   LastFrameLatency(seconds)       FramesNum      Total Latency     Frames/s
                         -------------             -------------              ---------        ---------       ---------
Network                   16974672                  0.07716                       1           16974672             13.0
    conv1                  2224187                  0.01011 
    pool1                   573166                  0.00261 
    res2a_branch2a          972763                  0.00442 
    res2a_branch2b          972632                  0.00442 
    res2a                   209363                  0.00095 
    res2b_branch2a          972674                  0.00442 
    res2b_branch2b          973107                  0.00442 
    res2b                   209914                  0.00095 
    res3a_branch1           538478                  0.00245 
    res3a_branch2a          747078                  0.00340 
    res3a_branch2b          904530                  0.00411 
    res3a                   104830                  0.00048 
    res3b_branch2a          904540                  0.00411 
    res3b_branch2b          904278                  0.00411 
    res3b                   104900                  0.00048 
    res4a_branch1           485804                  0.00221 
    res4a_branch2a          485923                  0.00221 
    res4a_branch2b          880309                  0.00400 
    res4a                    52446                  0.00024 
    res4b_branch2a          880071                  0.00400 
    res4b_branch2b          880065                  0.00400 
    res4b                    52456                  0.00024 
    yolov2Conv1             880210                  0.00400 
    yolov2Conv2             880375                  0.00400 
    yolov2ClassConv         179300                  0.00081 
 * The clock frequency of the DL processor is: 220MHz

Отобразите результаты предсказания.

[bboxesn, scoresn, labelsn] = yolo_post_proc(prediction,I_pre,anchorBoxes,{'Vehicle'});
I_new3 = insertObjectAnnotation(I,'rectangle',bboxesn,scoresn);
figure
imshow(I_new3)