torchvision 0.1.3 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +12 -0
- data/LICENSE.txt +1 -1
- data/README.md +56 -4
- data/lib/torchvision.rb +5 -0
- data/lib/torchvision/datasets/cifar10.rb +2 -1
- data/lib/torchvision/datasets/mnist.rb +2 -2
- data/lib/torchvision/datasets/vision_dataset.rb +2 -0
- data/lib/torchvision/transforms/compose.rb +2 -2
- data/lib/torchvision/transforms/functional.rb +55 -6
- data/lib/torchvision/transforms/normalize.rb +2 -2
- data/lib/torchvision/transforms/random_horizontal_flip.rb +18 -0
- data/lib/torchvision/transforms/random_vertical_flip.rb +18 -0
- data/lib/torchvision/transforms/resize.rb +13 -0
- data/lib/torchvision/transforms/to_tensor.rb +2 -2
- data/lib/torchvision/utils.rb +120 -0
- data/lib/torchvision/version.rb +1 -1
- metadata +20 -44
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9aa604602112403b7f6738a7bb014812deb528b9a4d480ba89cf7f0c6d01b59c
|
4
|
+
data.tar.gz: 3ffa29d3ff5234040df51113d085a807d94a45c6998f8182db72bf60c25d67e7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 89f61279aed314c84ae33c14efe266b849bf74a40a9f90beb650358610b479cb44f6cd247ff56aa89d0227ef6358973b5055fd1ce9bcf1e973402b2118bfe75d
|
7
|
+
data.tar.gz: 4eb63bfd9a79bd3683238c186e0e70aba494028f54ce8f971a551f362eec4b4e55fe83c8e738c7669fde2c3671e3360a01b02c4d29f6c965640a6c08b3c4379d
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,15 @@
|
|
1
|
+
## 0.2.0 (2021-03-11)
|
2
|
+
|
3
|
+
- Added `RandomHorizontalFlip`, `RandomVerticalFlip`, and `Resize` transforms
|
4
|
+
- Added `save_image` method
|
5
|
+
- Added `data` and `targets` methods to datasets
|
6
|
+
- Removed support for Ruby < 2.6
|
7
|
+
|
8
|
+
Breaking changes
|
9
|
+
|
10
|
+
- Added dependency on libvips
|
11
|
+
- MNIST datasets return images instead of tensors
|
12
|
+
|
1
13
|
## 0.1.3 (2020-06-29)
|
2
14
|
|
3
15
|
- Added AlexNet model
|
data/LICENSE.txt
CHANGED
data/README.md
CHANGED
@@ -2,12 +2,16 @@
|
|
2
2
|
|
3
3
|
:fire: Computer vision datasets, transforms, and models for Ruby
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
[![Build Status](https://travis-ci.org/ankane/torchvision.svg?branch=master)](https://travis-ci.org/ankane/torchvision)
|
5
|
+
[![Build Status](https://github.com/ankane/torchvision/workflows/build/badge.svg?branch=master)](https://github.com/ankane/torchvision/actions)
|
8
6
|
|
9
7
|
## Installation
|
10
8
|
|
9
|
+
First, [install libvips](libvips-installation). For Homebrew, use:
|
10
|
+
|
11
|
+
```sh
|
12
|
+
brew install vips
|
13
|
+
```
|
14
|
+
|
11
15
|
Add this line to your application’s Gemfile:
|
12
16
|
|
13
17
|
```ruby
|
@@ -16,7 +20,12 @@ gem 'torchvision'
|
|
16
20
|
|
17
21
|
## Getting Started
|
18
22
|
|
19
|
-
This library follows the [Python API](https://pytorch.org/docs/
|
23
|
+
This library follows the [Python API](https://pytorch.org/docs/stable/torchvision/index.html). Many methods and options are missing at the moment. PRs welcome!
|
24
|
+
|
25
|
+
## Examples
|
26
|
+
|
27
|
+
- [MNIST](https://github.com/ankane/torch.rb/tree/master/examples/mnist)
|
28
|
+
- [Generative Adversarial Networks](https://github.com/ankane/torch.rb/tree/master/examples/gan)
|
20
29
|
|
21
30
|
## Datasets
|
22
31
|
|
@@ -43,6 +52,15 @@ TorchVision::Transforms::Compose.new([
|
|
43
52
|
])
|
44
53
|
```
|
45
54
|
|
55
|
+
Supported transforms are:
|
56
|
+
|
57
|
+
- Compose
|
58
|
+
- Normalize
|
59
|
+
- RandomHorizontalFlip
|
60
|
+
- RandomVerticalFlip
|
61
|
+
- Resize
|
62
|
+
- ToTensor
|
63
|
+
|
46
64
|
## Models
|
47
65
|
|
48
66
|
- [AlexNet](#alexnet)
|
@@ -94,6 +112,40 @@ TorchVision::Models::WideResNet52_2.new
|
|
94
112
|
TorchVision::Models::WideResNet101_2.new
|
95
113
|
```
|
96
114
|
|
115
|
+
## Pretrained Models
|
116
|
+
|
117
|
+
You can download pretrained models with [this script](pretrained.py)
|
118
|
+
|
119
|
+
```sh
|
120
|
+
pip install torchvision
|
121
|
+
python pretrained.py
|
122
|
+
```
|
123
|
+
|
124
|
+
And load them
|
125
|
+
|
126
|
+
```ruby
|
127
|
+
net = TorchVision::Models::ResNet18.new
|
128
|
+
net.load_state_dict(Torch.load("net.pth"))
|
129
|
+
```
|
130
|
+
|
131
|
+
## libvips Installation
|
132
|
+
|
133
|
+
### Ubuntu
|
134
|
+
|
135
|
+
```sh
|
136
|
+
sudo apt install libvips
|
137
|
+
```
|
138
|
+
|
139
|
+
### Mac
|
140
|
+
|
141
|
+
```sh
|
142
|
+
brew install vips
|
143
|
+
```
|
144
|
+
|
145
|
+
### Windows
|
146
|
+
|
147
|
+
Check out [the options](https://libvips.github.io/libvips/install.html).
|
148
|
+
|
97
149
|
## Disclaimer
|
98
150
|
|
99
151
|
This library downloads and prepares public datasets. We don’t host any datasets. Be sure to adhere to the license for each dataset.
|
data/lib/torchvision.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
# dependencies
|
2
2
|
require "numo/narray"
|
3
|
+
require "vips"
|
3
4
|
require "torch"
|
4
5
|
|
5
6
|
# stdlib
|
@@ -10,6 +11,7 @@ require "rubygems/package"
|
|
10
11
|
require "tmpdir"
|
11
12
|
|
12
13
|
# modules
|
14
|
+
require "torchvision/utils"
|
13
15
|
require "torchvision/version"
|
14
16
|
|
15
17
|
# datasets
|
@@ -48,6 +50,9 @@ require "torchvision/models/wide_resnet101_2"
|
|
48
50
|
require "torchvision/transforms/compose"
|
49
51
|
require "torchvision/transforms/functional"
|
50
52
|
require "torchvision/transforms/normalize"
|
53
|
+
require "torchvision/transforms/random_horizontal_flip"
|
54
|
+
require "torchvision/transforms/random_vertical_flip"
|
55
|
+
require "torchvision/transforms/resize"
|
51
56
|
require "torchvision/transforms/to_tensor"
|
52
57
|
|
53
58
|
module TorchVision
|
@@ -43,7 +43,8 @@ module TorchVision
|
|
43
43
|
# TODO remove trues when Numo supports it
|
44
44
|
img, target = @data[index, true, true, true], @targets[index]
|
45
45
|
|
46
|
-
|
46
|
+
img = Utils.image_from_array(img)
|
47
|
+
|
47
48
|
img = @transform.call(img) if @transform
|
48
49
|
|
49
50
|
target = @target_transform.call(target) if @target_transform
|
@@ -2,7 +2,6 @@ module TorchVision
|
|
2
2
|
module Datasets
|
3
3
|
class MNIST < VisionDataset
|
4
4
|
# http://yann.lecun.com/exdb/mnist/
|
5
|
-
|
6
5
|
def initialize(root, train: true, download: false, transform: nil, target_transform: nil)
|
7
6
|
super(root, transform: transform, target_transform: target_transform)
|
8
7
|
@train = train
|
@@ -24,7 +23,8 @@ module TorchVision
|
|
24
23
|
def [](index)
|
25
24
|
img, target = @data[index], @targets[index].item
|
26
25
|
|
27
|
-
|
26
|
+
img = Utils.image_from_array(img)
|
27
|
+
|
28
28
|
img = @transform.call(img) if @transform
|
29
29
|
|
30
30
|
target = @target_transform.call(target) if @target_transform
|
@@ -32,10 +32,30 @@ module TorchVision
|
|
32
32
|
tensor
|
33
33
|
end
|
34
34
|
|
35
|
+
def resize(img, size)
|
36
|
+
raise "img should be Vips::Image. Got #{img.class.name}" unless img.is_a?(Vips::Image)
|
37
|
+
# TODO support array size
|
38
|
+
raise "Got inappropriate size arg: #{size}" unless size.is_a?(Integer)
|
39
|
+
|
40
|
+
w, h = img.size
|
41
|
+
if (w <= h && w == size) || (h <= w && h == size)
|
42
|
+
return img
|
43
|
+
end
|
44
|
+
if w < h
|
45
|
+
ow = size
|
46
|
+
oh = (size * h / w).to_i
|
47
|
+
img.thumbnail_image(ow, height: oh)
|
48
|
+
else
|
49
|
+
oh = size
|
50
|
+
ow = (size * w / h).to_i
|
51
|
+
img.thumbnail_image(ow, height: oh)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
35
55
|
# TODO improve
|
36
56
|
def to_tensor(pic)
|
37
|
-
if !pic.is_a?(Numo::NArray) && !pic.is_a?(
|
38
|
-
raise ArgumentError, "pic should be
|
57
|
+
if !pic.is_a?(Numo::NArray) && !pic.is_a?(Vips::Image)
|
58
|
+
raise ArgumentError, "pic should be Vips::Image or Numo::NArray. Got #{pic.class.name}"
|
39
59
|
end
|
40
60
|
|
41
61
|
if pic.is_a?(Numo::NArray) && ![2, 3].include?(pic.ndim)
|
@@ -44,15 +64,44 @@ module TorchVision
|
|
44
64
|
|
45
65
|
if pic.is_a?(Numo::NArray)
|
46
66
|
if pic.ndim == 2
|
47
|
-
|
67
|
+
pic = pic.reshape(*pic.shape, 1)
|
48
68
|
end
|
49
69
|
|
50
70
|
img = Torch.from_numo(pic.transpose(2, 0, 1))
|
51
|
-
|
71
|
+
if img.dtype == :uint8
|
72
|
+
return img.float.div(255)
|
73
|
+
else
|
74
|
+
return img
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
case pic.format
|
79
|
+
when :uchar
|
80
|
+
img = Torch::ByteTensor.new(Torch::ByteStorage.from_buffer(pic.write_to_memory))
|
81
|
+
else
|
82
|
+
raise Error, "Format not supported yet: #{pic.format}"
|
52
83
|
end
|
53
84
|
|
54
|
-
|
55
|
-
|
85
|
+
img = img.view(pic.height, pic.width, pic.bands)
|
86
|
+
# put it from HWC to CHW format
|
87
|
+
img = img.permute([2, 0, 1]).contiguous
|
88
|
+
img.float.div(255)
|
89
|
+
end
|
90
|
+
|
91
|
+
def hflip(img)
|
92
|
+
if img.is_a?(Torch::Tensor)
|
93
|
+
img.flip(-1)
|
94
|
+
else
|
95
|
+
img.flip(:horizontal)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def vflip(img)
|
100
|
+
if img.is_a?(Torch::Tensor)
|
101
|
+
img.flip(-2)
|
102
|
+
else
|
103
|
+
img.flip(:vertical)
|
104
|
+
end
|
56
105
|
end
|
57
106
|
end
|
58
107
|
end
|
@@ -1,13 +1,13 @@
|
|
1
1
|
module TorchVision
|
2
2
|
module Transforms
|
3
|
-
class Normalize
|
3
|
+
class Normalize < Torch::NN::Module
|
4
4
|
def initialize(mean, std, inplace: false)
|
5
5
|
@mean = mean
|
6
6
|
@std = std
|
7
7
|
@inplace = inplace
|
8
8
|
end
|
9
9
|
|
10
|
-
def
|
10
|
+
def forward(tensor)
|
11
11
|
F.normalize(tensor, @mean, @std, inplace: @inplace)
|
12
12
|
end
|
13
13
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module TorchVision
|
2
|
+
module Transforms
|
3
|
+
class RandomHorizontalFlip < Torch::NN::Module
|
4
|
+
def initialize(p: 0.5)
|
5
|
+
super()
|
6
|
+
@p = p
|
7
|
+
end
|
8
|
+
|
9
|
+
def forward(img)
|
10
|
+
if Torch.rand(1).item < @p
|
11
|
+
F.hflip(img)
|
12
|
+
else
|
13
|
+
img
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module TorchVision
|
2
|
+
module Transforms
|
3
|
+
class RandomVerticalFlip < Torch::NN::Module
|
4
|
+
def initialize(p: 0.5)
|
5
|
+
super()
|
6
|
+
@p = p
|
7
|
+
end
|
8
|
+
|
9
|
+
def forward(img)
|
10
|
+
if Torch.rand(1).item < @p
|
11
|
+
F.vflip(img)
|
12
|
+
else
|
13
|
+
img
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,120 @@
|
|
1
|
+
module TorchVision
|
2
|
+
module Utils
|
3
|
+
class << self
|
4
|
+
def make_grid(tensor, nrow: 8, padding: 2, normalize: false, range: nil, scale_each: false, pad_value: 0)
|
5
|
+
unless Torch.tensor?(tensor) || (tensor.is_a?(Array) && tensor.all? { |t| Torch.tensor?(t) })
|
6
|
+
raise ArgumentError, "tensor or list of tensors expected, got #{tensor.class.name}"
|
7
|
+
end
|
8
|
+
|
9
|
+
# if list of tensors, convert to a 4D mini-batch Tensor
|
10
|
+
if tensor.is_a?(Array)
|
11
|
+
tensor = Torch.stack(tensor, dim: 0)
|
12
|
+
end
|
13
|
+
|
14
|
+
if tensor.dim == 2 # single image H x W
|
15
|
+
tensor = tensor.unsqueeze(0)
|
16
|
+
end
|
17
|
+
if tensor.dim == 3 # single image
|
18
|
+
if tensor.size(0) == 1 # if single-channel, convert to 3-channel
|
19
|
+
tensor = Torch.cat([tensor, tensor, tensor], 0)
|
20
|
+
end
|
21
|
+
tensor = tensor.unsqueeze(0)
|
22
|
+
end
|
23
|
+
|
24
|
+
if tensor.dim == 4 && tensor.size(1) == 1 # single-channel images
|
25
|
+
tensor = Torch.cat([tensor, tensor, tensor], 1)
|
26
|
+
end
|
27
|
+
|
28
|
+
if normalize
|
29
|
+
tensor = tensor.clone # avoid modifying tensor in-place
|
30
|
+
if !range.nil? && !range.is_a?(Array)
|
31
|
+
raise "range has to be an array (min, max) if specified. min and max are numbers"
|
32
|
+
end
|
33
|
+
|
34
|
+
norm_ip = lambda do |img, min, max|
|
35
|
+
img.clamp!(min, max)
|
36
|
+
img.add!(-min).div!(max - min + 1e-5)
|
37
|
+
end
|
38
|
+
|
39
|
+
norm_range = lambda do |t, range|
|
40
|
+
if !range.nil?
|
41
|
+
norm_ip.call(t, range[0], range[1])
|
42
|
+
else
|
43
|
+
norm_ip.call(t, t.min.to_f, t.max.to_f)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
if scale_each
|
48
|
+
tensor.each do |t| # loop over mini-batch dimension
|
49
|
+
norm_range.call(t, range)
|
50
|
+
end
|
51
|
+
else
|
52
|
+
norm_range.call(tensor, range)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
if tensor.size(0) == 1
|
57
|
+
return tensor.squeeze(0)
|
58
|
+
end
|
59
|
+
|
60
|
+
# make the mini-batch of images into a grid
|
61
|
+
nmaps = tensor.size(0)
|
62
|
+
xmaps = [nrow, nmaps].min
|
63
|
+
ymaps = (nmaps.to_f / xmaps).ceil
|
64
|
+
height, width = (tensor.size(2) + padding), (tensor.size(3) + padding)
|
65
|
+
num_channels = tensor.size(1)
|
66
|
+
grid = tensor.new_full([num_channels, height * ymaps + padding, width * xmaps + padding], pad_value)
|
67
|
+
k = 0
|
68
|
+
ymaps.times do |y|
|
69
|
+
xmaps.times do |x|
|
70
|
+
break if k >= nmaps
|
71
|
+
grid.narrow(1, y * height + padding, height - padding).narrow(2, x * width + padding, width - padding).copy!(tensor[k])
|
72
|
+
k += 1
|
73
|
+
end
|
74
|
+
end
|
75
|
+
grid
|
76
|
+
end
|
77
|
+
|
78
|
+
def save_image(tensor, fp, nrow: 8, padding: 2, normalize: false, range: nil, scale_each: false, pad_value: 0)
|
79
|
+
grid = make_grid(tensor, nrow: nrow, padding: padding, pad_value: pad_value, normalize: normalize, range: range, scale_each: scale_each)
|
80
|
+
# Add 0.5 after unnormalizing to [0, 255] to round to nearest integer
|
81
|
+
ndarr = grid.mul(255).add!(0.5).clamp!(0, 255).permute(1, 2, 0).to("cpu", dtype: :uint8)
|
82
|
+
im = image_from_array(ndarr)
|
83
|
+
im.write_to_file(fp)
|
84
|
+
end
|
85
|
+
|
86
|
+
# private
|
87
|
+
# Ruby-specific method
|
88
|
+
# TODO use Numo when bridge available
|
89
|
+
def image_from_array(array)
|
90
|
+
case array
|
91
|
+
when Torch::Tensor
|
92
|
+
# TODO support more dtypes
|
93
|
+
raise "Type not supported yet: #{array.dtype}" unless array.dtype == :uint8
|
94
|
+
|
95
|
+
array = array.contiguous unless array.contiguous?
|
96
|
+
|
97
|
+
width, height = array.shape
|
98
|
+
bands = array.shape[2] || 1
|
99
|
+
data = FFI::Pointer.new(:uint8, array._data_ptr)
|
100
|
+
data.define_singleton_method(:bytesize) do
|
101
|
+
array.numel * array.element_size
|
102
|
+
end
|
103
|
+
|
104
|
+
Vips::Image.new_from_memory(data, width, height, bands, :uchar)
|
105
|
+
when Numo::NArray
|
106
|
+
# TODO support more types
|
107
|
+
raise "Type not supported yet: #{array.class.name}" unless array.is_a?(Numo::UInt8)
|
108
|
+
|
109
|
+
width, height = array.shape
|
110
|
+
bands = array.shape[2] || 1
|
111
|
+
data = array.to_binary
|
112
|
+
|
113
|
+
Vips::Image.new_from_memory(data, width, height, bands, :uchar)
|
114
|
+
else
|
115
|
+
raise "Expected Torch::Tensor or Numo::NArray, not #{array.class.name}"
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
data/lib/torchvision/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: torchvision
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Kane
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-03-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: numo-narray
|
@@ -25,63 +25,35 @@ dependencies:
|
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: ruby-vips
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: '2.1'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: bundler
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - ">="
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '0'
|
48
|
-
type: :development
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - ">="
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '0'
|
40
|
+
version: '2.1'
|
55
41
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - ">="
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '0'
|
62
|
-
type: :development
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - ">="
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '0'
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: minitest
|
42
|
+
name: torch-rb
|
71
43
|
requirement: !ruby/object:Gem::Requirement
|
72
44
|
requirements:
|
73
45
|
- - ">="
|
74
46
|
- !ruby/object:Gem::Version
|
75
|
-
version:
|
76
|
-
type: :
|
47
|
+
version: 0.3.7
|
48
|
+
type: :runtime
|
77
49
|
prerelease: false
|
78
50
|
version_requirements: !ruby/object:Gem::Requirement
|
79
51
|
requirements:
|
80
52
|
- - ">="
|
81
53
|
- !ruby/object:Gem::Version
|
82
|
-
version:
|
83
|
-
description:
|
84
|
-
email: andrew@
|
54
|
+
version: 0.3.7
|
55
|
+
description:
|
56
|
+
email: andrew@ankane.org
|
85
57
|
executables: []
|
86
58
|
extensions: []
|
87
59
|
extra_rdoc_files: []
|
@@ -121,13 +93,17 @@ files:
|
|
121
93
|
- lib/torchvision/transforms/compose.rb
|
122
94
|
- lib/torchvision/transforms/functional.rb
|
123
95
|
- lib/torchvision/transforms/normalize.rb
|
96
|
+
- lib/torchvision/transforms/random_horizontal_flip.rb
|
97
|
+
- lib/torchvision/transforms/random_vertical_flip.rb
|
98
|
+
- lib/torchvision/transforms/resize.rb
|
124
99
|
- lib/torchvision/transforms/to_tensor.rb
|
100
|
+
- lib/torchvision/utils.rb
|
125
101
|
- lib/torchvision/version.rb
|
126
102
|
homepage: https://github.com/ankane/torchvision
|
127
103
|
licenses:
|
128
104
|
- BSD-3-Clause
|
129
105
|
metadata: {}
|
130
|
-
post_install_message:
|
106
|
+
post_install_message:
|
131
107
|
rdoc_options: []
|
132
108
|
require_paths:
|
133
109
|
- lib
|
@@ -135,15 +111,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
135
111
|
requirements:
|
136
112
|
- - ">="
|
137
113
|
- !ruby/object:Gem::Version
|
138
|
-
version: '2.
|
114
|
+
version: '2.6'
|
139
115
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
140
116
|
requirements:
|
141
117
|
- - ">="
|
142
118
|
- !ruby/object:Gem::Version
|
143
119
|
version: '0'
|
144
120
|
requirements: []
|
145
|
-
rubygems_version: 3.
|
146
|
-
signing_key:
|
121
|
+
rubygems_version: 3.2.3
|
122
|
+
signing_key:
|
147
123
|
specification_version: 4
|
148
124
|
summary: Computer vision datasets, transforms, and models for Ruby
|
149
125
|
test_files: []
|