quebeccyb commited on
Commit
0264965
·
verified ·
1 Parent(s): e4cdc79

add mini-resnet cosine encoder (cropped dataset)

Browse files
README.md ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ library_name: transformers
3
+ tags:
4
+ - vehicle
5
+ - metric-learning
6
+ - image-embedding
7
+ pipeline_tag: image-feature-extraction
8
+ ---
9
+
10
+ # Vehicle Cosine Encoder
11
+
12
+ 256-D embedding model for vehicle re-identification. Trained with CosineEmbeddingLoss on ~5k vehicles from used-car marketplace listings.
13
+
14
+ ## Usage
15
+
16
+ ```python
17
+ from transformers import AutoModel
18
+ model = AutoModel.from_pretrained("quebeccyb/<repo-name>", trust_remote_code=True).eval()
19
+ # pixel_values: float tensor (B, 3, 256, 256), letterboxed to square
20
+ emb = model(pixel_values)
__pycache__/configuration_vehicle_encoder.cpython-312.pyc ADDED
Binary file (898 Bytes). View file
 
__pycache__/modeling_vehicle_encoder.cpython-312.pyc ADDED
Binary file (4.55 kB). View file
 
config.json ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "architectures": [
3
+ "VehicleEncoderModel"
4
+ ],
5
+ "auto_map": {
6
+ "AutoConfig": "configuration_vehicle_encoder.VehicleEncoderConfig",
7
+ "AutoModel": "modeling_vehicle_encoder.VehicleEncoderModel"
8
+ },
9
+ "blocks_per_stage": 2,
10
+ "dtype": "float32",
11
+ "img_size": 256,
12
+ "latent_dim": 256,
13
+ "model_type": "vehicle_encoder",
14
+ "transformers_version": "5.12.0"
15
+ }
configuration_vehicle_encoder.py ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from transformers import PretrainedConfig
2
+
3
+
4
+ class VehicleEncoderConfig(PretrainedConfig):
5
+ model_type = "vehicle_encoder"
6
+
7
+ def __init__(
8
+ self,
9
+ latent_dim: int = 256,
10
+ blocks_per_stage: int = 2,
11
+ img_size: int = 256,
12
+ **kwargs,
13
+ ):
14
+ super().__init__(**kwargs)
15
+ self.latent_dim = latent_dim
16
+ self.blocks_per_stage = blocks_per_stage
17
+ self.img_size = img_size
model.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:4f7c61927b676eee3e90d43bf2db3ddfd402860c67859a99ac23c5e534708acc
3
+ size 45280696
modeling_vehicle_encoder.py ADDED
@@ -0,0 +1,65 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import torch
2
+ import torch.nn as nn
3
+ import torch.nn.functional as F
4
+ from transformers import PreTrainedModel
5
+
6
+ from configuration_vehicle_encoder import VehicleEncoderConfig
7
+
8
+
9
+ class ResBlock(nn.Module):
10
+ def __init__(self, in_ch, out_ch, stride=1):
11
+ super().__init__()
12
+ self.conv1 = nn.Conv2d(in_ch, out_ch, 3, stride, 1, bias=False)
13
+ self.bn1 = nn.BatchNorm2d(out_ch)
14
+ self.conv2 = nn.Conv2d(out_ch, out_ch, 3, 1, 1, bias=False)
15
+ self.bn2 = nn.BatchNorm2d(out_ch)
16
+ if stride != 1 or in_ch != out_ch:
17
+ self.skip = nn.Sequential(
18
+ nn.Conv2d(in_ch, out_ch, 1, stride, bias=False),
19
+ nn.BatchNorm2d(out_ch),
20
+ )
21
+ else:
22
+ self.skip = nn.Identity()
23
+
24
+ def forward(self, x):
25
+ identity = self.skip(x)
26
+ out = F.relu(self.bn1(self.conv1(x)), inplace=True)
27
+ out = self.bn2(self.conv2(out))
28
+ return F.relu(out + identity, inplace=True)
29
+
30
+
31
+ def _make_stage(in_ch, out_ch, blocks, stride):
32
+ layers = [ResBlock(in_ch, out_ch, stride=stride)]
33
+ for _ in range(blocks - 1):
34
+ layers.append(ResBlock(out_ch, out_ch, stride=1))
35
+ return nn.Sequential(*layers)
36
+
37
+
38
+ class VehicleEncoderModel(PreTrainedModel):
39
+ config_class = VehicleEncoderConfig
40
+
41
+ def __init__(self, config: VehicleEncoderConfig):
42
+ super().__init__(config)
43
+ bps = config.blocks_per_stage
44
+
45
+ self.stem = nn.Sequential(
46
+ nn.Conv2d(3, 64, 7, 2, 3, bias=False),
47
+ nn.BatchNorm2d(64),
48
+ nn.ReLU(inplace=True),
49
+ nn.MaxPool2d(3, 2, 1),
50
+ )
51
+ self.stage1 = _make_stage( 64, 64, bps, stride=1)
52
+ self.stage2 = _make_stage( 64, 128, bps, stride=2)
53
+ self.stage3 = _make_stage(128, 256, bps, stride=2)
54
+ self.stage4 = _make_stage(256, 512, bps, stride=2)
55
+ self.gap = nn.AdaptiveAvgPool2d(1)
56
+ self.fc = nn.Linear(512, config.latent_dim)
57
+
58
+ self.post_init()
59
+
60
+ def forward(self, pixel_values: torch.Tensor) -> torch.Tensor:
61
+ x = self.stem(pixel_values)
62
+ x = self.stage1(x); x = self.stage2(x)
63
+ x = self.stage3(x); x = self.stage4(x)
64
+ x = self.gap(x).flatten(1)
65
+ return self.fc(x)