Main Content

yolov3ObjectDetector

Detect objects using YOLO v3 object detector

Since R2021a

Description

The yolov3ObjectDetector object creates a you only look once version 3 (YOLO v3) object detector for detecting objects in an image. Using this object, you can:

  • Create a pretrained YOLO v3 object detector by using YOLO v3 deep learning networks trained on COCO dataset.

  • Create a custom YOLO v3 object detector by using any pretrained or untrained YOLO v3 deep learning network.

Creation

Description

Pretrained YOLO v3 Object Detector

detector = yolov3ObjectDetector(name) creates a pretrained YOLO v3 object detector by using YOLO v3 deep learning networks trained on a COCO dataset.

Note

To use the pretrained YOLO v3 deep learning networks trained on COCO dataset, you must install the Computer Vision Toolbox™ Model for YOLO v3 Object Detection from Add-On Explorer. For more information about installing add-ons, see Get and Manage Add-Ons. To run this function, you will require the Deep Learning Toolbox™.

example

Custom YOLO v3 Object Detector

detector = yolov3ObjectDetector(name,classes,aboxes) creates a pretrained YOLO v3 object detector and configures it to perform transfer learning using a specified set of object classes and anchor boxes. For optimal results, you must train the detector on new training images before performing detection.

detector = yolov3ObjectDetector(net,classes,aboxes) creates an object detector by using the deep learning network net.

If net is a pretrained YOLO v3 deep learning network, the function creates a pretrained YOLO v3 object detector. The classes and aboxes are values used for training the network.

If net is an untrained YOLO v3 deep learning network, the function creates a YOLO v3 object detector to use for training and inference. classes and aboxes specify the object classes and the anchor boxes, respectively, for training the YOLO v3 network.

You must train the detector on a training dataset before performing object detection. For information about how to train a YOLO v3 object detector, see Preprocess Training Data and Train Model sections in the Object Detection Using YOLO v3 Deep Learning example.

detector = yolov3ObjectDetector(baseNet,classes,aboxes,DetectionNetworkSource=layer) creates a YOLO v3 object detector by adding detection heads to a base network, baseNet.

The function adds detection heads to the specified feature extraction layers layer in the base network. To specify the names of the feature extraction layers, use the name-value argument DetectionNetworkSource=layer.

If baseNet is a pretrained deep learning network, the function creates a YOLO v3 object detector and configures it to perform transfer learning with the specified object classes and anchor boxes.

If baseNet is an untrained deep learning network, the function creates a YOLO v3 object detector and configures it for object detection. classes and aboxes specify the object classes and the anchor boxes, respectively, for training the YOLO v3 network.

You must train the detector on a training dataset before performing object detection.

example

detector = yolov3ObjectDetector(___,Name=Value) specifies one or more options using name-value arguments in addition to any combination of input arguments from previous syntaxes. Use this syntax to

  • Modify the detection network sources in a yolo v4 object detection network and train the network with different numbers of object classes, anchor boxes, or both. Specify the new detection network sources using the name-value argument DetectionNetworkSource=layer.

  • Set the InputSize and ModelName properties of the object detector. For example, InputSize=[224 224 3] sets the size of the images used for training to [224 224 3].

Input Arguments

expand all

Name of the pretrained YOLO v3 deep learning network, specified as one of these:

  • 'darknet53-coco' — A pretrained YOLO v3 deep learning network created using DarkNet-53 as the base network and trained on COCO dataset.

  • 'tiny-yolov3-coco' — A pretrained YOLO v3 deep learning network created using a small base network and trained on COCO dataset.

Data Types: char | string

Names of object classes for training the detector, specified as a string vector, cell array of character vectors, or categorical vector. This argument sets the ClassNames property of the yolov3ObjectDetector object.

Data Types: char | string | categorical

Anchor boxes for training the detector, specified as an N-by-1 cell array. N is the number of output layers in the YOLO v3 deep learning network. Each cell contains an M-by-2 matrix, where M is the number of anchor boxes in that layer. Each cell can contain a different number of anchor boxes. Each row in the M-by-2 matrix denotes the size of an anchor box in the form [height width].

The first element in the cell array specifies the anchor boxes to associate with the first output layer, the second element in the cell array specifies the anchor boxes to associate with the second output layer, and so on. For accurate detection results, specify large anchor boxes for the first output layer and small anchor boxes for the last output layer. That is, the anchor box sizes must decrease for each output layer in the order in which the layers appear in the YOLO v3 deep learning network.

This argument sets the AnchorBoxes property of the yolov3ObjectDetector object.

Data Types: cell

YOLO v3 deep learning network, specified as a dlnetwork (Deep Learning Toolbox) object. The input network can be either an untrained or a pretrained deep learning network.

Base network for creating the YOLO v3 deep learning network, specified as a dlnetwork (Deep Learning Toolbox) object. The network can be either an untrained or a pretrained deep learning network.

Names of the feature extraction layers in the base network, specified as a cell array of character vectors, or a string array. The function creates a YOLO v3 network by adding detection head layers to the output of the feature extraction layers in the base network.

In the pre-trained YOLO v3 base network, you must connect the detection head layers to feature extraction layers where the input image feature map changes spatial dimension by downsampling factors of 4, 8, 16, and 32.

  • Use the analyzeNetwork (Deep Learning Toolbox) function to display the pre-trained YOLO v3 network architecture to obtain the information about the spatial dimensions of the feature maps.

  • Use this table to know about the default feature extraction layers and choose alternate feature extraction layers supported by the pre-trained YOLO v3 networks. Choose feature extraction layers using empirical evaluation based on the detection accuracy, training speed, and object size to detect.

    • For multi-scale feature extraction and to achieve higher detection accuracy, choose feature extraction layers with both higher and lower downsampling factors. Layers with lower downsampling factor capture small objects and layers with higher downsampling factor ensure a thorough feature refinement.

    • To achieve higher training and inference speeds, choose feature extraction layers with lower downsampling factor.

    • The number of detection network sources specified must be equal to the number of anchor boxes specified at the input.

    BackboneNumber of Detection HeadsDefault Feature Extraction LayersExamples of Alternate Feature Extraction LayersRemarks
    LayerDownsampling FactorLayerDownsampling Factor
    tiny-yolov3-coco2

    leaky_relu_7

    leaky_relu_5

    32

    16

    leaky_relu_6

    leaky_relu_3

    16

    8

    Select any two feature extraction layers with different downsampling factors preceding the leaky_relu_7 layer to use as detection network sources.

    For example, specify the new detection network sources as layer = {'leaky_relu_6','leaky_relu_3'}

    darknet53-coco3

    add_23

    add_19

    add_11

    32

    16

    8

    add_22

    add_21

    add_20

    32

    Select any three feature extraction layers with different downsampling factors preceding the add_23 layer to use as detection network sources.

    For example, specify the new detection network sources as layer = {'add_18','add_10','add_3'}

    add_18

    add_17

    add_16

    add_15

    add_14

    add_13

    add_12

    16

    add_10

    add_9

    add_8

    add_7

    add_6

    add_5

    add_4

    8

    add_3

    add_2

    4

Data Types: char | string | cell

Properties

expand all

This property is read-only.

YOLO v3 deep learning network to use for object detection, stored as a dlnetwork (Deep Learning Toolbox) object.

This property is read-only.

Set of anchor boxes, stored as a N-by-1 cell array. N is the number of output layers in the YOLO v3 deep learning network for which the anchor boxes are defined. Each element in the cell is a M-by-2 matrix. M denotes the number of anchor boxes. Each cell can contain a different number of anchor boxes. Each row in the M-by-2 matrix denotes the size of the anchor box in the form of [height width]. The first element in the cell array specifies the anchor boxes for the first output layer, the second element in the cell array specifies the anchor boxes for the second output layer, and so on.

You can set this property by using the input argument aboxes.

This property is read-only.

Names of object classes to detect, stored as a categorical vector. You can set this property by using the input argument classes.

This property is read-only.

Image size used for training, stored as a vector of form [height width] or [height width channels]. To set this property, specify it at object creation.

For example, detector = yolov3ObjectDetector(net,classes,aboxes,InputSize=[224 224 3]).

Name for the object detector, stored as a character vector. To set this property, specify it at object creation.

For example, yolov3ObjectDetector(net,classes,aboxes,'ModelName','customDetector') sets the name for the object detector to 'customDetector'.

This property is read-only.

Bounding box format for an object detector, stored as "axis-aligned" or "rotated". When the PredictedBoxType is "axis-aligned", the object detector will train and perform inference on only axis-aligned bounding boxes. If it is set to "rotated", the object detector will train and perform inference on only rotated bounding boxes. Set this property when you create the object.

Object Functions

detectDetect objects using YOLO v3 object detector
preprocessPreprocess training and test images
forwardCompute YOLO v3 deep learning network output for training
predictCompute YOLO v3 deep learning network outputs for inference

Examples

collapse all

Specify the name of a pretrained YOLO v3 deep learning network.

name = 'tiny-yolov3-coco';

Create YOLO v3 object detector by using the pretrained YOLO v3 network.

detector = yolov3ObjectDetector(name);

Display and inspect the properties of the YOLO v3 object detector.

disp(detector)
  yolov3ObjectDetector with properties:

             Network: [1x1 dlnetwork]
         AnchorBoxes: {2x1 cell}
          ClassNames: [80x1 categorical]
           InputSize: [416 416 3]
    PredictedBoxType: 'axis-aligned'
           ModelName: 'tiny-yolov3-coco'

Use analyzeNetwork to display the YOLO v3 network architecture and get information about the network layers. The network has two detection heads attached to the feature extraction network.

analyzeNetwork(detector.Network)

Detect objects in an unknown image by using the pretrained YOLO v3 object detector.

img = imread('sherlock.jpg');
img = preprocess(detector,img);
img = im2single(img);
[bboxes,scores,labels] = detect(detector,img,'DetectionPreprocessing','none');

Display the detection results.

detectedImg = insertObjectAnnotation(img,'Rectangle',bboxes,labels);
figure
imshow(detectedImg)

Figure contains an axes object. The hidden axes object contains an object of type image.

This example shows how to create a custom YOLO v3 object detector by using a pretrained SqueezeNet as the base network.

Load a pretrained SqueezeNet network. The SqueezeNet network is a convolutional neural network that you can use as the base network for creating a YOLO v3 object detector.

net = imagePretrainedNetwork("squeezenet");

Inspect the architecture of the base network by using analyzeNetwork (Deep Learning Toolbox) function.

analyzeNetwork(net)

Specify the anchor boxes and the classes to use to train the YOLO v3 network.

aboxes = {[150,127;97,90;68,67];[38,42;41,29;31,23]};
classes = ["Car","Truck"];

Select two feature extraction layers in the base network to serve as the source for detection subnetwork.

layer = ["fire9-concat","fire8-concat"];

Create a custom YOLO v3 object detector by adding detection heads to the feature extraction layers of the base network. Specify the model name, classes, and the anchor boxes.

detector = yolov3ObjectDetector(net,classes,aboxes, ...
    ModelName="Custom YOLO v3",DetectionNetworkSource=layer);

Inspect the architecture of the YOLO v3 deep learning network by using analyzeNetwork (Deep Learning Toolbox) function.

analyzeNetwork(detector.Network)

Inspect the properties of the YOLO v3 object detector. You can now train the YOLO v3 object detector on a custom training dataset and perform object detection.

disp(detector)
  yolov3ObjectDetector with properties:

             Network: [1x1 dlnetwork]
         AnchorBoxes: {2x1 cell}
          ClassNames: [2x1 categorical]
           InputSize: [227 227 3]
    PredictedBoxType: 'axis-aligned'
           ModelName: 'Custom YOLO v3'

For information about how to train a YOLO v3 object detector, see the Object Detection Using YOLO v3 Deep Learning example.

Extended Capabilities

Version History

Introduced in R2021a

expand all