models.rst 15.4 KB
Newer Older
1
2
.. _models:

3
4
Models and pre-trained weights
##############################
5

6
The ``torchvision.models`` subpackage contains definitions of models for addressing
7
different tasks, including: image classification, pixelwise semantic
8
segmentation, object detection, instance segmentation, person
9
keypoint detection, video classification, and optical flow.
10

11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
General information on pre-trained weights
==========================================

TorchVision offers pre-trained weights for every provided architecture, using
the PyTorch :mod:`torch.hub`. Instancing a pre-trained model will download its
weights to a cache directory. This directory can be set using the `TORCH_HOME`
environment variable. See :func:`torch.hub.load_state_dict_from_url` for details.

.. note::

    The pre-trained models provided in this library may have their own licenses or
    terms and conditions derived from the dataset used for training. It is your
    responsibility to determine whether you have permission to use the models for
    your use case.

26
.. note ::
27
28
29
30
31
32
33
    Backward compatibility is guaranteed for loading a serialized
    ``state_dict`` to the model created using old PyTorch version.
    On the contrary, loading entire saved models or serialized
    ``ScriptModules`` (serialized using older versions of PyTorch)
    may not preserve the historic behaviour. Refer to the following
    `documentation
    <https://pytorch.org/docs/stable/notes/serialization.html#id6>`_
34

35

36
37
Initializing pre-trained models
-------------------------------
Sasank Chilamkurthy's avatar
Sasank Chilamkurthy committed
38

39
40
41
As of v0.13, TorchVision offers a new `Multi-weight support API
<https://pytorch.org/blog/introducing-torchvision-new-multi-weight-support-api/>`_
for loading different weights to the existing model builder methods:
Sasank Chilamkurthy's avatar
Sasank Chilamkurthy committed
42
43
44

.. code:: python

45
    from torchvision.models import resnet50, ResNet50_Weights
46

47
48
    # Old weights with accuracy 76.130%
    resnet50(weights=ResNet50_Weights.IMAGENET1K_V1)
49

50
51
    # New weights with accuracy 80.858%
    resnet50(weights=ResNet50_Weights.IMAGENET1K_V2)
Sasank Chilamkurthy's avatar
Sasank Chilamkurthy committed
52

53
54
55
    # Best available weights (currently alias for IMAGENET1K_V2)
    # Note that these weights may change across versions
    resnet50(weights=ResNet50_Weights.DEFAULT)
Sasank Chilamkurthy's avatar
Sasank Chilamkurthy committed
56

57
58
    # Strings are also supported
    resnet50(weights="IMAGENET1K_V2")
Sasank Chilamkurthy's avatar
Sasank Chilamkurthy committed
59

60
61
    # No weights - random initialization
    resnet50(weights=None)
62

Sasank Chilamkurthy's avatar
Sasank Chilamkurthy committed
63

64
Migrating to the new API is very straightforward. The following method calls between the 2 APIs are all equivalent:
Sasank Chilamkurthy's avatar
Sasank Chilamkurthy committed
65

66
.. code:: python
Sasank Chilamkurthy's avatar
Sasank Chilamkurthy committed
67

68
    from torchvision.models import resnet50, ResNet50_Weights
69

70
71
72
73
74
    # Using pretrained weights:
    resnet50(weights=ResNet50_Weights.IMAGENET1K_V1)
    resnet50(weights="IMAGENET1K_V1")
    resnet50(pretrained=True)  # deprecated
    resnet50(True)  # deprecated
Sasank Chilamkurthy's avatar
Sasank Chilamkurthy committed
75

76
77
78
79
80
    # Using no weights:
    resnet50(weights=None)
    resnet50()
    resnet50(pretrained=False)  # deprecated
    resnet50(False)  # deprecated
Sasank Chilamkurthy's avatar
Sasank Chilamkurthy committed
81

82
Note that the ``pretrained`` parameter is now deprecated, using it will emit warnings and will be removed on v0.15.
83

84
85
Using the pre-trained models
----------------------------
Sasank Chilamkurthy's avatar
Sasank Chilamkurthy committed
86

87
88
89
90
91
92
Before using the pre-trained models, one must preprocess the image
(resize with right resolution/interpolation, apply inference transforms,
rescale the values etc). There is no standard way to do this as it depends on
how a given model was trained. It can vary across model families, variants or
even weight versions. Using the correct preprocessing method is critical and
failing to do so may lead to decreased accuracy or incorrect outputs.
Sasank Chilamkurthy's avatar
Sasank Chilamkurthy committed
93

94
95
96
97
All the necessary information for the inference transforms of each pre-trained
model is provided on its weights documentation. To simplify inference, TorchVision
bundles the necessary preprocessing transforms into each model weight. These are
accessible via the ``weight.transforms`` attribute:
Sasank Chilamkurthy's avatar
Sasank Chilamkurthy committed
98

99
.. code:: python
100

101
102
103
    # Initialize the Weight Transforms
    weights = ResNet50_Weights.DEFAULT
    preprocess = weights.transforms()
Sasank Chilamkurthy's avatar
Sasank Chilamkurthy committed
104

105
106
    # Apply it to the input image
    img_transformed = preprocess(img)
Sasank Chilamkurthy's avatar
Sasank Chilamkurthy committed
107

108

109
110
111
112
Some models use modules which have different training and evaluation
behavior, such as batch normalization. To switch between these modes, use
``model.train()`` or ``model.eval()`` as appropriate. See
:meth:`~torch.nn.Module.train` or :meth:`~torch.nn.Module.eval` for details.
Sasank Chilamkurthy's avatar
Sasank Chilamkurthy committed
113

114
.. code:: python
Sasank Chilamkurthy's avatar
Sasank Chilamkurthy committed
115

116
117
118
    # Initialize model
    weights = ResNet50_Weights.DEFAULT
    model = resnet50(weights=weights)
119

120
121
    # Set model to eval mode
    model.eval()
Sasank Chilamkurthy's avatar
Sasank Chilamkurthy committed
122

123
124
Using models from Hub
---------------------
Sasank Chilamkurthy's avatar
Sasank Chilamkurthy committed
125

126
Most pre-trained models can be accessed directly via PyTorch Hub without having TorchVision installed:
127

128
.. code:: python
Sasank Chilamkurthy's avatar
Sasank Chilamkurthy committed
129

130
    import torch
131

132
133
    # Option 1: passing weights param as string
    model = torch.hub.load("pytorch/vision", "resnet50", weights="IMAGENET1K_V2")
134

135
136
137
    # Option 2: passing weights param as enum
    weights = torch.hub.load("pytorch/vision", "get_weight", weights="ResNet50_Weights.IMAGENET1K_V2")
    model = torch.hub.load("pytorch/vision", "resnet50", weights=weights)
138

139
140
141
The only exception to the above are the detection models included on
:mod:`torchvision.models.detection`. These models require TorchVision
to be installed because they depend on custom C++ operators.
Bar's avatar
Bar committed
142

143
144
Classification
==============
145

146
.. currentmodule:: torchvision.models
Bar's avatar
Bar committed
147

148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
The following classification models are available, with or without pre-trained
weights:

.. toctree::
   :maxdepth: 1

   models/alexnet
   models/convnext
   models/densenet
   models/efficientnet
   models/efficientnetv2
   models/googlenet
   models/inception
   models/mnasnet
   models/mobilenetv2
   models/mobilenetv3
   models/regnet
   models/resnet
   models/resnext
   models/shufflenetv2
   models/squeezenet
   models/swin_transformer
   models/vgg
   models/vision_transformer
   models/wide_resnet

|

Here is an example of how to use the pre-trained image classification models:
177

178
.. code:: python
179

180
181
    from torchvision.io import read_image
    from torchvision.models import resnet50, ResNet50_Weights
182

183
    img = read_image("test/assets/encode_jpeg/grace_hopper_517x606.jpg")
184

185
186
187
188
    # Step 1: Initialize model with the best available weights
    weights = ResNet50_Weights.DEFAULT
    model = resnet50(weights=weights)
    model.eval()
189

190
191
    # Step 2: Initialize the inference transforms
    preprocess = weights.transforms()
192

193
194
    # Step 3: Apply inference preprocessing transforms
    batch = preprocess(img).unsqueeze(0)
195

196
197
198
199
200
201
    # Step 4: Use the model and print the predicted category
    prediction = model(batch).squeeze(0).softmax(0)
    class_id = prediction.argmax().item()
    score = prediction[class_id].item()
    category_name = weights.meta["categories"][class_id]
    print(f"{category_name}: {100 * score:.1f}%")
202

203
The classes of the pre-trained model outputs can be found at ``weights.meta["categories"]``.
204

205
206
Table of all available classification weights
---------------------------------------------
207

208
Accuracies are reported on ImageNet-1K using single crops:
209

210
.. include:: generated/classification_table.rst
211

212
213
Quantized models
----------------
214

215
.. currentmodule:: torchvision.models.quantization
216

217
218
The following architectures provide support for INT8 quantized models, with or without
pre-trained weights:
219

220
221
.. toctree::
   :maxdepth: 1
222

223
224
225
226
227
228
229
   models/googlenet_quant
   models/inception_quant
   models/mobilenetv2_quant
   models/mobilenetv3_quant
   models/resnet_quant
   models/resnext_quant
   models/shufflenetv2_quant
230

231
|
232

233
Here is an example of how to use the pre-trained quantized image classification models:
234
235
236

.. code:: python

237
238
239
240
241
242
243
244
    from torchvision.io import read_image
    from torchvision.models.quantization import resnet50, ResNet50_QuantizedWeights

    img = read_image("test/assets/encode_jpeg/grace_hopper_517x606.jpg")

    # Step 1: Initialize model with the best available weights
    weights = ResNet50_QuantizedWeights.DEFAULT
    model = resnet50(weights=weights, quantize=True)
245
246
    model.eval()

247
248
    # Step 2: Initialize the inference transforms
    preprocess = weights.transforms()
249

250
251
    # Step 3: Apply inference preprocessing transforms
    batch = preprocess(img).unsqueeze(0)
252

253
254
255
256
257
258
    # Step 4: Use the model and print the predicted category
    prediction = model(batch).squeeze(0).softmax(0)
    class_id = prediction.argmax().item()
    score = prediction[class_id].item()
    category_name = weights.meta["categories"][class_id]
    print(f"{category_name}: {100 * score}%")
259

260
The classes of the pre-trained model outputs can be found at ``weights.meta["categories"]``.
261

262

263
264
Table of all available quantized classification weights
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
265

266
Accuracies are reported on ImageNet-1K using single crops:
267

268
.. include:: generated/classification_quant_table.rst
269

270
271
Semantic Segmentation
=====================
272

273
.. currentmodule:: torchvision.models.segmentation
274

275
276
The following semantic segmentation models are available, with or without
pre-trained weights:
277

278
279
.. toctree::
   :maxdepth: 1
280

281
282
283
284
285
   models/deeplabv3
   models/fcn
   models/lraspp

|
286

287
Here is an example of how to use the pre-trained semantic segmentation models:
288

289
.. code:: python
290

291
292
293
    from torchvision.io.image import read_image
    from torchvision.models.segmentation import fcn_resnet50, FCN_ResNet50_Weights
    from torchvision.transforms.functional import to_pil_image
294

295
    img = read_image("gallery/assets/dog1.jpg")
296

297
298
299
300
    # Step 1: Initialize model with the best available weights
    weights = FCN_ResNet50_Weights.DEFAULT
    model = fcn_resnet50(weights=weights)
    model.eval()
301

302
303
    # Step 2: Initialize the inference transforms
    preprocess = weights.transforms()
304

305
306
    # Step 3: Apply inference preprocessing transforms
    batch = preprocess(img).unsqueeze(0)
307

308
309
310
311
312
313
    # Step 4: Use the model and visualize the prediction
    prediction = model(batch)["out"]
    normalized_masks = prediction.softmax(dim=1)
    class_to_idx = {cls: idx for (idx, cls) in enumerate(weights.meta["categories"])}
    mask = normalized_masks[0, class_to_idx["dog"]]
    to_pil_image(mask).show()
314

315
316
317
318
319
320
321
322
323
324
The classes of the pre-trained model outputs can be found at ``weights.meta["categories"]``.
The output format of the models is illustrated in :ref:`semantic_seg_output`.


Table of all available semantic segmentation weights
----------------------------------------------------

All models are evaluated a subset of COCO val2017, on the 20 categories that are present in the Pascal VOC dataset:

.. include:: generated/segmentation_table.rst
325

326

327
.. _object_det_inst_seg_pers_keypoint_det:
328
329
330
331
332
333

Object Detection, Instance Segmentation and Person Keypoint Detection
=====================================================================

The pre-trained models for detection, instance segmentation and
keypoint detection are initialized with the classification models
334
335
in torchvision. The models expect a list of ``Tensor[C, H, W]``.
Check the constructor of the models for more information.
336

337
338
Object Detection
----------------
339

340
.. currentmodule:: torchvision.models.detection
341

342
343
The following object detection models are available, with or without pre-trained
weights:
344

345
346
.. toctree::
   :maxdepth: 1
347

348
349
350
351
352
   models/faster_rcnn
   models/fcos
   models/retinanet
   models/ssd
   models/ssdlite
353

354
|
355

356
Here is an example of how to use the pre-trained object detection models:
357

358
.. code:: python
359

360

361
362
363
364
    from torchvision.io.image import read_image
    from torchvision.models.detection import fasterrcnn_resnet50_fpn_v2, FasterRCNN_ResNet50_FPN_V2_Weights
    from torchvision.utils import draw_bounding_boxes
    from torchvision.transforms.functional import to_pil_image
365

366
    img = read_image("test/assets/encode_jpeg/grace_hopper_517x606.jpg")
Hu Ye's avatar
Hu Ye committed
367

368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
    # Step 1: Initialize model with the best available weights
    weights = FasterRCNN_ResNet50_FPN_V2_Weights.DEFAULT
    model = fasterrcnn_resnet50_fpn_v2(weights=weights, box_score_thresh=0.9)
    model.eval()

    # Step 2: Initialize the inference transforms
    preprocess = weights.transforms()

    # Step 3: Apply inference preprocessing transforms
    batch = [preprocess(img)]

    # Step 4: Use the model and visualize the prediction
    prediction = model(batch)[0]
    labels = [weights.meta["categories"][i] for i in prediction["labels"]]
    box = draw_bounding_boxes(img, boxes=prediction["boxes"],
                              labels=labels,
                              colors="red",
                              width=4, font_size=30)
    im = to_pil_image(box.detach())
    im.show()

The classes of the pre-trained model outputs can be found at ``weights.meta["categories"]``.
For details on how to plot the bounding boxes of the models, you may refer to :ref:`instance_seg_output`.

Table of all available Object detection weights
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Box MAPs are reported on COCO val2017:

.. include:: generated/detection_table.rst
Hu Ye's avatar
Hu Ye committed
398
399


400
401
Instance Segmentation
---------------------
402

403
.. currentmodule:: torchvision.models.detection
404

405
406
The following instance segmentation models are available, with or without pre-trained
weights:
407

408
409
.. toctree::
   :maxdepth: 1
410

411
   models/mask_rcnn
412

413
|
414

415

416
For details on how to plot the masks of the models, you may refer to :ref:`instance_seg_output`.
417

418
419
Table of all available Instance segmentation weights
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
420

421
Box and Mask MAPs are reported on COCO val2017:
422

423
.. include:: generated/instance_segmentation_table.rst
424

425
426
Keypoint Detection
------------------
427

428
.. currentmodule:: torchvision.models.detection
429

430
431
The following person keypoint detection models are available, with or without
pre-trained weights:
432

433
434
.. toctree::
   :maxdepth: 1
435

436
   models/keypoint_rcnn
437

438
|
439

440
441
The classes of the pre-trained model outputs can be found at ``weights.meta["keypoint_names"]``.
For details on how to plot the bounding boxes of the models, you may refer to :ref:`keypoint_output`.
442

443
444
Table of all available Keypoint detection weights
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
445

446
Box and Keypoint MAPs are reported on COCO val2017:
447

448
.. include:: generated/detection_keypoint_table.rst
449

450
451

Video Classification
452
453
====================

454
.. currentmodule:: torchvision.models.video
455

456
457
The following video classification models are available, with or without
pre-trained weights:
458

459
460
.. toctree::
   :maxdepth: 1
461

462
   models/video_resnet
463

464
465
466
467
468
|

Here is an example of how to use the pre-trained video classification models:

.. code:: python
469
470


471
472
    from torchvision.io.video import read_video
    from torchvision.models.video import r3d_18, R3D_18_Weights
473

474
    vid, _, _ = read_video("test/assets/videos/v_SoccerJuggling_g23_c01.avi", output_format="TCHW")
475
    vid = vid[:32]  # optionally shorten duration
476

477
478
479
480
    # Step 1: Initialize model with the best available weights
    weights = R3D_18_Weights.DEFAULT
    model = r3d_18(weights=weights)
    model.eval()
481

482
483
    # Step 2: Initialize the inference transforms
    preprocess = weights.transforms()
484

485
486
    # Step 3: Apply inference preprocessing transforms
    batch = preprocess(vid).unsqueeze(0)
487

488
489
490
491
492
493
    # Step 4: Use the model and print the predicted category
    prediction = model(batch).squeeze(0).softmax(0)
    label = prediction.argmax().item()
    score = prediction[label].item()
    category_name = weights.meta["categories"][label]
    print(f"{category_name}: {100 * score}%")
494

495
The classes of the pre-trained model outputs can be found at ``weights.meta["categories"]``.
496

497

498
499
Table of all available video classification weights
---------------------------------------------------
500

501
Accuracies are reported on Kinetics-400 using single crops for clip length 16:
502

503
.. include:: generated/video_table.rst
504

505
Optical Flow
506
507
============

508
509
510
.. currentmodule:: torchvision.models.optical_flow

The following Optical Flow models are available, with or without pre-trained
511

512
513
.. toctree::
   :maxdepth: 1
514

515
   models/raft