From b554cd66f1e92e79c00d5ebf26821f97184d96e2 Mon Sep 17 00:00:00 2001 From: wxywb Date: Wed, 12 Oct 2022 20:29:39 +0800 Subject: [PATCH] update the repo. Signed-off-by: wxywb --- .DS_Store | Bin 0 -> 8196 bytes README.md | 2 +- __init__.py | 2 +- cap.png | Bin 0 -> 12709 bytes clip/__init__.py | 1 - clip/bpe_simple_vocab_16e6.txt.gz | 3 - clip/clip.py | 193 ------------- clip/model.py | 437 ------------------------------ clip/simple_tokenizer.py | 132 --------- clip_caption_reward.py | 69 ++++- mclip/clip.py | 3 +- tabular.png | Bin 0 -> 96116 bytes 12 files changed, 66 insertions(+), 776 deletions(-) create mode 100644 .DS_Store create mode 100644 cap.png delete mode 100644 clip/__init__.py delete mode 100644 clip/bpe_simple_vocab_16e6.txt.gz delete mode 100644 clip/clip.py delete mode 100644 clip/model.py delete mode 100644 clip/simple_tokenizer.py create mode 100644 tabular.png diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..9bb3ccd6c16b03e7ea42b4e6ad408cd48accdf47 GIT binary patch literal 8196 zcmeHMF>ljA6n+Om4TPX9kvbJKR7ebwIv|0>;8u=A2SjN`2HGaYL2~K3QVN}e1GuJ8GVh3LV4@JAWHyX3DdISxW)%SPou9fQ3wl~P@zB-Ds+hDZ`_^O}^^(M`t9@J`JE%Oj{VYD74s$Rc4#(XL6mp_44y=rC)(> z%Je8-i>KH{daP%gBCzXQ-0Bzan>LeA>+F>mua$P=SW~S$yOp=T#(8Iumvy;|+#x-* zveQjgX2QedP diff --git a/__init__.py b/__init__.py index bfd331d..c27ca48 100644 --- a/__init__.py +++ b/__init__.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -from clip_caption_reward import ClipCaptionReward +from .clip_caption_reward import ClipCaptionReward def clip_caption_reward(model_name: str): return ClipCaptionReward(model_name) diff --git a/cap.png b/cap.png new file mode 100644 index 0000000000000000000000000000000000000000..1d641a70131f7e299cedb51b926d9db786756228 GIT binary patch literal 12709 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 Kk}Mb3_y0e;*;-Wq literal 0 HcmV?d00001 diff --git a/clip/__init__.py b/clip/__init__.py deleted file mode 100644 index dcc5619..0000000 --- a/clip/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .clip import * diff --git a/clip/bpe_simple_vocab_16e6.txt.gz b/clip/bpe_simple_vocab_16e6.txt.gz deleted file mode 100644 index 36a1585..0000000 --- a/clip/bpe_simple_vocab_16e6.txt.gz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:924691ac288e54409236115652ad4aa250f48203de50a9e4722a6ecd48d6804a -size 1356917 diff --git a/clip/clip.py b/clip/clip.py deleted file mode 100644 index 76f241b..0000000 --- a/clip/clip.py +++ /dev/null @@ -1,193 +0,0 @@ -import hashlib -import os -import urllib -import warnings -from typing import Union, List - -import torch -from PIL import Image -from torchvision.transforms import Compose, Resize, CenterCrop, ToTensor, Normalize -from tqdm import tqdm - -from .model import build_model -from .simple_tokenizer import SimpleTokenizer as _Tokenizer - -__all__ = ["available_models", "load", "tokenize"] -_tokenizer = _Tokenizer() - -_MODELS = { - "RN50": "https://openaipublic.azureedge.net/clip/models/afeb0e10f9e5a86da6080e35cf09123aca3b358a0c3e3b6c78a7b63bc04b6762/RN50.pt", - "RN101": "https://openaipublic.azureedge.net/clip/models/8fa8567bab74a42d41c5915025a8e4538c3bdbe8804a470a72f30b0d94fab599/RN101.pt", - "RN50x4": "https://openaipublic.azureedge.net/clip/models/7e526bd135e493cef0776de27d5f42653e6b4c8bf9e0f653bb11773263205fdd/RN50x4.pt", - "ViT-B/32": "https://openaipublic.azureedge.net/clip/models/40d365715913c9da98579312b702a82c18be219cc2a73407c4526f58eba950af/ViT-B-32.pt", -} - - -def _download(url: str, root: str = os.path.expanduser("~/.cache/clip")): - os.makedirs(root, exist_ok=True) - filename = os.path.basename(url) - - expected_sha256 = url.split("/")[-2] - download_target = os.path.join(root, filename) - - if os.path.exists(download_target) and not os.path.isfile(download_target): - raise RuntimeError(f"{download_target} exists and is not a regular file") - - if os.path.isfile(download_target): - if hashlib.sha256(open(download_target, "rb").read()).hexdigest() == expected_sha256: - return download_target - else: - warnings.warn(f"{download_target} exists, but the SHA256 checksum does not match; re-downloading the file") - - with urllib.request.urlopen(url) as source, open(download_target, "wb") as output: - with tqdm(total=int(source.info().get("Content-Length")), ncols=80, unit='iB', unit_scale=True) as loop: - while True: - buffer = source.read(8192) - if not buffer: - break - - output.write(buffer) - loop.update(len(buffer)) - - if hashlib.sha256(open(download_target, "rb").read()).hexdigest() != expected_sha256: - raise RuntimeError(f"Model has been downloaded but the SHA256 checksum does not not match") - - return download_target - - -def _transform(n_px): - return Compose([ - Resize(n_px, interpolation=Image.BICUBIC), - CenterCrop(n_px), - lambda image: image.convert("RGB"), - ToTensor(), - Normalize((0.48145466, 0.4578275, 0.40821073), (0.26862954, 0.26130258, 0.27577711)), - ]) - - -def available_models() -> List[str]: - """Returns the names of available CLIP models""" - return list(_MODELS.keys()) - - -def load(name: str, device: Union[str, torch.device] = "cuda" if torch.cuda.is_available() else "cpu", jit=True): - """Load a CLIP model - - Parameters - ---------- - name : str - A model name listed by `clip.available_models()`, or the path to a model checkpoint containing the state_dict - - device : Union[str, torch.device] - The device to put the loaded model - - jit : bool - Whether to load the optimized JIT model (default) or more hackable non-JIT model. - - Returns - ------- - model : torch.nn.Module - The CLIP model - - preprocess : Callable[[PIL.Image], torch.Tensor] - A torchvision transform that converts a PIL image into a tensor that the returned model can take as its input - """ - if name in _MODELS: - model_path = _download(_MODELS[name]) - elif os.path.isfile(name): - model_path = name - else: - raise RuntimeError(f"Model {name} not found; available models = {available_models()}") - - try: - # loading JIT archive - model = torch.jit.load(model_path, map_location=device if jit else "cpu").eval() - state_dict = None - except RuntimeError: - # loading saved state dict - if jit: - warnings.warn(f"File {model_path} is not a JIT archive. Loading as a state dict instead") - jit = False - state_dict = torch.load(model_path, map_location="cpu") - - if not jit: - model = build_model(state_dict or model.state_dict()).to(device) - if str(device) == "cpu": - model.float() - return model, _transform(model.visual.input_resolution) - - # patch the device names - device_holder = torch.jit.trace(lambda: torch.ones([]).to(torch.device(device)), example_inputs=[]) - device_node = [n for n in device_holder.graph.findAllNodes("prim::Constant") if "Device" in repr(n)][-1] - - def patch_device(module): - graphs = [module.graph] if hasattr(module, "graph") else [] - if hasattr(module, "forward1"): - graphs.append(module.forward1.graph) - - for graph in graphs: - for node in graph.findAllNodes("prim::Constant"): - if "value" in node.attributeNames() and str(node["value"]).startswith("cuda"): - node.copyAttributes(device_node) - - model.apply(patch_device) - patch_device(model.encode_image) - patch_device(model.encode_text) - - # patch dtype to float32 on CPU - if str(device) == "cpu": - float_holder = torch.jit.trace(lambda: torch.ones([]).float(), example_inputs=[]) - float_input = list(float_holder.graph.findNode("aten::to").inputs())[1] - float_node = float_input.node() - - def patch_float(module): - graphs = [module.graph] if hasattr(module, "graph") else [] - if hasattr(module, "forward1"): - graphs.append(module.forward1.graph) - - for graph in graphs: - for node in graph.findAllNodes("aten::to"): - inputs = list(node.inputs()) - for i in [1, 2]: # dtype can be the second or third argument to aten::to() - if inputs[i].node()["value"] == 5: - inputs[i].node().copyAttributes(float_node) - - model.apply(patch_float) - patch_float(model.encode_image) - patch_float(model.encode_text) - - model.float() - - return model, _transform(model.input_resolution.item()) - - -def tokenize(texts: Union[str, List[str]], context_length: int = 77) -> torch.LongTensor: - """ - Returns the tokenized representation of given input string(s) - - Parameters - ---------- - texts : Union[str, List[str]] - An input string or a list of input strings to tokenize - - context_length : int - The context length to use; all CLIP models use 77 as the context length - - Returns - ------- - A two-dimensional tensor containing the resulting tokens, shape = [number of input strings, context_length] - """ - if isinstance(texts, str): - texts = [texts] - - sot_token = _tokenizer.encoder["<|startoftext|>"] - eot_token = _tokenizer.encoder["<|endoftext|>"] - all_tokens = [[sot_token] + _tokenizer.encode(text) + [eot_token] for text in texts] - result = torch.zeros(len(all_tokens), context_length, dtype=torch.long) - - for i, tokens in enumerate(all_tokens): - if len(tokens) > context_length: - raise RuntimeError(f"Input {texts[i]} is too long for context length {context_length}") - result[i, :len(tokens)] = torch.tensor(tokens) - - return result diff --git a/clip/model.py b/clip/model.py deleted file mode 100644 index 049391e..0000000 --- a/clip/model.py +++ /dev/null @@ -1,437 +0,0 @@ -from collections import OrderedDict -from typing import Tuple, Union - -import torch -import torch.nn.functional as F -from torch import nn - - -class Bottleneck(nn.Module): - expansion = 4 - - def __init__(self, inplanes, planes, stride=1): - super().__init__() - - # all conv layers have stride 1. an avgpool is performed after the second convolution when stride > 1 - self.conv1 = nn.Conv2d(inplanes, planes, 1, bias=False) - self.bn1 = nn.BatchNorm2d(planes) - - self.conv2 = nn.Conv2d(planes, planes, 3, padding=1, bias=False) - self.bn2 = nn.BatchNorm2d(planes) - - self.avgpool = nn.AvgPool2d(stride) if stride > 1 else nn.Identity() - - self.conv3 = nn.Conv2d(planes, planes * self.expansion, 1, bias=False) - self.bn3 = nn.BatchNorm2d(planes * self.expansion) - - self.relu = nn.ReLU(inplace=True) - self.downsample = None - self.stride = stride - - if stride > 1 or inplanes != planes * Bottleneck.expansion: - # downsampling layer is prepended with an avgpool, and the subsequent convolution has stride 1 - self.downsample = nn.Sequential(OrderedDict([ - ("-1", nn.AvgPool2d(stride)), - ("0", nn.Conv2d(inplanes, planes * self.expansion, 1, stride=1, bias=False)), - ("1", nn.BatchNorm2d(planes * self.expansion)) - ])) - - def forward(self, x: torch.Tensor): - identity = x - - out = self.relu(self.bn1(self.conv1(x))) - out = self.relu(self.bn2(self.conv2(out))) - out = self.avgpool(out) - out = self.bn3(self.conv3(out)) - - if self.downsample is not None: - identity = self.downsample(x) - - out += identity - out = self.relu(out) - return out - - -class AttentionPool2d(nn.Module): - def __init__(self, spacial_dim: int, embed_dim: int, num_heads: int, output_dim: int = None): - super().__init__() - self.positional_embedding = nn.Parameter(torch.randn(spacial_dim ** 2 + 1, embed_dim) / embed_dim ** 0.5) - self.k_proj = nn.Linear(embed_dim, embed_dim) - self.q_proj = nn.Linear(embed_dim, embed_dim) - self.v_proj = nn.Linear(embed_dim, embed_dim) - self.c_proj = nn.Linear(embed_dim, output_dim or embed_dim) - self.num_heads = num_heads - - def forward(self, x): - x = x.reshape(x.shape[0], x.shape[1], x.shape[2] * x.shape[3]).permute(2, 0, 1) # NCHW -> (HW)NC - # print(x.shape, self.positional_embedding.shape) - x = torch.cat([x.mean(dim=0, keepdim=True), x], dim=0) # (HW+1)NC - x = x + self.positional_embedding[0, :, None, :].to(x.dtype) # (HW+1)NC - x, _ = F.multi_head_attention_forward( - query=x, key=x, value=x, - embed_dim_to_check=x.shape[-1], - num_heads=self.num_heads, - q_proj_weight=self.q_proj.weight, - k_proj_weight=self.k_proj.weight, - v_proj_weight=self.v_proj.weight, - in_proj_weight=None, - in_proj_bias=torch.cat([self.q_proj.bias, self.k_proj.bias, self.v_proj.bias]), - bias_k=None, - bias_v=None, - add_zero_attn=False, - dropout_p=0, - out_proj_weight=torch.ones_like(self.q_proj.weight), - out_proj_bias=torch.zeros_like(self.q_proj.bias), - # out_proj_weight=self.c_proj.weight, - # out_proj_bias=self.c_proj.bias, - use_separate_proj_weight=True, - training=self.training, - need_weights=False - ) - - return x[0] - - -class ModifiedResNet(nn.Module): - """ - A ResNet class that is similar to torchvision's but contains the following changes: - - There are now 3 "stem" convolutions as opposed to 1, with an average pool instead of a max pool. - - Performs anti-aliasing strided convolutions, where an avgpool is prepended to convolutions with stride > 1 - - The final pooling layer is a QKV attention instead of an average pool - """ - - def __init__(self, layers, output_dim, heads, input_resolution=224, width=64): - super().__init__() - self.output_dim = output_dim - self.input_resolution = input_resolution - - # the 3-layer stem - self.conv1 = nn.Conv2d(3, width // 2, kernel_size=3, stride=2, padding=1, bias=False) - self.bn1 = nn.BatchNorm2d(width // 2) - self.conv2 = nn.Conv2d(width // 2, width // 2, kernel_size=3, padding=1, bias=False) - self.bn2 = nn.BatchNorm2d(width // 2) - self.conv3 = nn.Conv2d(width // 2, width, kernel_size=3, padding=1, bias=False) - self.bn3 = nn.BatchNorm2d(width) - self.avgpool = nn.AvgPool2d(2) - self.relu = nn.ReLU(inplace=True) - - # residual layers - self._inplanes = width # this is a *mutable* variable used during construction - self.layer1 = self._make_layer(width, layers[0]) - self.layer2 = self._make_layer(width * 2, layers[1], stride=2) - self.layer3 = self._make_layer(width * 4, layers[2], stride=2) - self.layer4 = self._make_layer(width * 8, layers[3], stride=2) - - embed_dim = width * 32 # the ResNet feature dimension - self.attnpool = AttentionPool2d(input_resolution // 32, embed_dim, heads, output_dim) - - def _make_layer(self, planes, blocks, stride=1): - layers = [Bottleneck(self._inplanes, planes, stride)] - - self._inplanes = planes * Bottleneck.expansion - for _ in range(1, blocks): - layers.append(Bottleneck(self._inplanes, planes)) - - return nn.Sequential(*layers) - - def forward(self, x): - def stem(x): - for conv, bn in [(self.conv1, self.bn1), (self.conv2, self.bn2), (self.conv3, self.bn3)]: - x = self.relu(bn(conv(x))) - x = self.avgpool(x) - return x - - x = x.type(self.conv1.weight.dtype) - x = stem(x) - x = self.layer1(x) - x = self.layer2(x) - x = self.layer3(x) - x = self.layer4(x) - # print(x.shape) - # x = self.attnpool(x) - attnpool = self.attnpool(x) - - return (x, attnpool) - - -class LayerNorm(nn.LayerNorm): - """Subclass torch's LayerNorm to handle fp16.""" - - def forward(self, x: torch.Tensor): - orig_type = x.dtype - ret = super().forward(x.type(torch.float32)) - return ret.type(orig_type) - - -class QuickGELU(nn.Module): - def forward(self, x: torch.Tensor): - return x * torch.sigmoid(1.702 * x) - - -class ResidualAttentionBlock(nn.Module): - def __init__(self, d_model: int, n_head: int, attn_mask: torch.Tensor = None): - super().__init__() - - self.attn = nn.MultiheadAttention(d_model, n_head) - self.ln_1 = LayerNorm(d_model) - self.mlp = nn.Sequential(OrderedDict([ - ("c_fc", nn.Linear(d_model, d_model * 4)), - ("gelu", QuickGELU()), - ("c_proj", nn.Linear(d_model * 4, d_model)) - ])) - self.ln_2 = LayerNorm(d_model) - self.attn_mask = attn_mask - - def attention(self, x: torch.Tensor): - self.attn_mask = self.attn_mask.to(dtype=x.dtype, device=x.device) if self.attn_mask is not None else None - return self.attn(x, x, x, need_weights=False, attn_mask=self.attn_mask)[0] - - def forward(self, x: torch.Tensor): - x = x + self.attention(self.ln_1(x)) - x = x + self.mlp(self.ln_2(x)) - return x - - -class Transformer(nn.Module): - def __init__(self, width: int, layers: int, heads: int, attn_mask: torch.Tensor = None): - super().__init__() - self.width = width - self.layers = layers - self.resblocks = nn.Sequential(*[ResidualAttentionBlock(width, heads, attn_mask) for _ in range(layers)]) - - def forward(self, x: torch.Tensor): - return self.resblocks(x) - - -class VisualTransformer(nn.Module): - def __init__(self, input_resolution: int, patch_size: int, width: int, layers: int, heads: int, output_dim: int): - super().__init__() - self.input_resolution = input_resolution - self.output_dim = output_dim - self.conv1 = nn.Conv2d(in_channels=3, out_channels=width, kernel_size=patch_size, stride=patch_size, bias=False) - - scale = width ** -0.5 - self.class_embedding = nn.Parameter(scale * torch.randn(width)) - self.positional_embedding = nn.Parameter(scale * torch.randn((input_resolution // patch_size) ** 2 + 1, width)) - self.ln_pre = LayerNorm(width) - - self.transformer = Transformer(width, layers, heads) - - self.ln_post = LayerNorm(width) - self.proj = nn.Parameter(scale * torch.randn(width, output_dim)) - - def forward(self, x: torch.Tensor): - x = self.conv1(x) # shape = [*, width, grid, grid] - x = x.reshape(x.shape[0], x.shape[1], -1) # shape = [*, width, grid ** 2] - x = x.permute(0, 2, 1) # shape = [*, grid ** 2, width] - x = torch.cat([self.class_embedding.to(x.dtype) + torch.zeros(x.shape[0], 1, x.shape[-1], dtype=x.dtype, device=x.device), x], dim=1) # shape = [*, grid ** 2 + 1, width] - x = x + self.positional_embedding.to(x.dtype) - x = self.ln_pre(x) - - x = x.permute(1, 0, 2) # NLD -> LND - x = self.transformer(x) - x = x.permute(1, 0, 2) # LND -> NLD - - # x = self.ln_post(x[:, 0, :]) - - x = self.ln_post(x) - # if self.proj is not None: - # x = x @ self.proj - - return x - - -class CLIP(nn.Module): - def __init__(self, - embed_dim: int, - # vision - image_resolution: int, - vision_layers: Union[Tuple[int, int, int, int], int], - vision_width: int, - vision_patch_size: int, - # text - context_length: int, - vocab_size: int, - transformer_width: int, - transformer_heads: int, - transformer_layers: int - ): - super().__init__() - - self.context_length = context_length - - if isinstance(vision_layers, (tuple, list)): - vision_heads = vision_width * 32 // 64 - self.visual = ModifiedResNet( - layers=vision_layers, - output_dim=embed_dim, - heads=vision_heads, - input_resolution=image_resolution, - width=vision_width - ) - else: - vision_heads = vision_width // 64 - self.visual = VisualTransformer( - input_resolution=image_resolution, - patch_size=vision_patch_size, - width=vision_width, - layers=vision_layers, - heads=vision_heads, - output_dim=embed_dim - ) - - self.transformer = Transformer( - width=transformer_width, - layers=transformer_layers, - heads=transformer_heads, - attn_mask=self.build_attention_mask() - ) - - self.vocab_size = vocab_size - self.token_embedding = nn.Embedding(vocab_size, transformer_width) - self.positional_embedding = nn.Parameter(torch.empty(self.context_length, transformer_width)) - self.ln_final = LayerNorm(transformer_width) - - self.text_projection = nn.Parameter(torch.empty(transformer_width, embed_dim)) - self.logit_scale = nn.Parameter(torch.ones([])) - - self.initialize_parameters() - - def initialize_parameters(self): - nn.init.normal_(self.token_embedding.weight, std=0.02) - nn.init.normal_(self.positional_embedding, std=0.01) - - if isinstance(self.visual, ModifiedResNet): - if self.visual.attnpool is not None: - std = self.visual.attnpool.c_proj.in_features ** -0.5 - nn.init.normal_(self.visual.attnpool.q_proj.weight, std=std) - nn.init.normal_(self.visual.attnpool.k_proj.weight, std=std) - nn.init.normal_(self.visual.attnpool.v_proj.weight, std=std) - nn.init.normal_(self.visual.attnpool.c_proj.weight, std=std) - - for resnet_block in [self.visual.layer1, self.visual.layer2, self.visual.layer3, self.visual.layer4]: - for name, param in resnet_block.named_parameters(): - if name.endswith("bn3.weight"): - nn.init.zeros_(param) - - proj_std = (self.transformer.width ** -0.5) * ((2 * self.transformer.layers) ** -0.5) - attn_std = self.transformer.width ** -0.5 - fc_std = (2 * self.transformer.width) ** -0.5 - for block in self.transformer.resblocks: - nn.init.normal_(block.attn.in_proj_weight, std=attn_std) - nn.init.normal_(block.attn.out_proj.weight, std=proj_std) - nn.init.normal_(block.mlp.c_fc.weight, std=fc_std) - nn.init.normal_(block.mlp.c_proj.weight, std=proj_std) - - if self.text_projection is not None: - nn.init.normal_(self.text_projection, std=self.transformer.width ** -0.5) - - def build_attention_mask(self): - # lazily create causal attention mask, with full attention between the vision tokens - # pytorch uses additive attention mask; fill with -inf - mask = torch.empty(self.context_length, self.context_length) - mask.fill_(float("-inf")) - mask.triu_(1) # zero out the lower diagonal - return mask - - @property - def dtype(self): - return self.visual.conv1.weight.dtype - - def encode_image(self, image): - return self.visual(image.type(self.dtype)) - - def encode_text(self, text): - x = self.token_embedding(text).type(self.dtype) # [batch_size, n_ctx, d_model] - - x = x + self.positional_embedding.type(self.dtype) - x = x.permute(1, 0, 2) # NLD -> LND - x = self.transformer(x) - x = x.permute(1, 0, 2) # LND -> NLD - x = self.ln_final(x).type(self.dtype) - - # x.shape = [batch_size, n_ctx, transformer.width] - # take features from the eot embedding (eot_token is the highest number in each sequence) - x = x[torch.arange(x.shape[0]), text.argmax(dim=-1)] @ self.text_projection - - return x - - def forward(self, image, text): - image_features = self.encode_image(image) - text_features = self.encode_text(text) - - # normalized features - image_features = image_features / image_features.norm(dim=-1, keepdim=True) - text_features = text_features / text_features.norm(dim=-1, keepdim=True) - - # cosine similarity as logits - logit_scale = self.logit_scale.exp() - logits_per_image = logit_scale * image_features @ text_features.t() - logits_per_text = logit_scale * text_features @ image_features.t() - - # shape = [global_batch_size, global_batch_size] - return logits_per_image, logits_per_text - - -def convert_weights(model: nn.Module): - """Convert applicable model parameters to fp16""" - - def _convert_weights_to_fp16(l): - if isinstance(l, (nn.Conv1d, nn.Conv2d, nn.Linear)): - l.weight.data = l.weight.data.half() - if l.bias is not None: - l.bias.data = l.bias.data.half() - - if isinstance(l, nn.MultiheadAttention): - for attr in [*[f"{s}_proj_weight" for s in ["in", "q", "k", "v"]], "in_proj_bias", "bias_k", "bias_v"]: - tensor = getattr(l, attr) - if tensor is not None: - tensor.data = tensor.data.half() - - for name in ["text_projection", "proj"]: - if hasattr(l, name): - attr = getattr(l, name) - if attr is not None: - attr.data = attr.data.half() - - model.apply(_convert_weights_to_fp16) - - -def build_model(state_dict: dict): - vit = "visual.proj" in state_dict - - if vit: - vision_width = state_dict["visual.conv1.weight"].shape[0] - vision_layers = len([k for k in state_dict.keys() if k.startswith("visual.") and k.endswith(".attn.in_proj_weight")]) - vision_patch_size = state_dict["visual.conv1.weight"].shape[-1] - grid_size = round((state_dict["visual.positional_embedding"].shape[0] - 1) ** 0.5) - image_resolution = vision_patch_size * grid_size - else: - counts: list = [len(set(k.split(".")[2] for k in state_dict if k.startswith(f"visual.layer{b}"))) for b in [1, 2, 3, 4]] - vision_layers = tuple(counts) - vision_width = state_dict["visual.layer1.0.conv1.weight"].shape[0] - output_width = round((state_dict["visual.attnpool.positional_embedding"].shape[0] - 1) ** 0.5) - vision_patch_size = None - assert output_width ** 2 + 1 == state_dict["visual.attnpool.positional_embedding"].shape[0] - image_resolution = output_width * 32 - - embed_dim = state_dict["text_projection"].shape[1] - context_length = state_dict["positional_embedding"].shape[0] - vocab_size = state_dict["token_embedding.weight"].shape[0] - transformer_width = state_dict["ln_final.weight"].shape[0] - transformer_heads = transformer_width // 64 - transformer_layers = len(set(k.split(".")[2] for k in state_dict if k.startswith(f"transformer.resblocks"))) - - model = CLIP( - embed_dim, - image_resolution, vision_layers, vision_width, vision_patch_size, - context_length, vocab_size, transformer_width, transformer_heads, transformer_layers - ) - - for key in ["input_resolution", "context_length", "vocab_size"]: - if key in state_dict: - del state_dict[key] - - convert_weights(model) - model.load_state_dict(state_dict) - return model.eval() diff --git a/clip/simple_tokenizer.py b/clip/simple_tokenizer.py deleted file mode 100644 index 0a66286..0000000 --- a/clip/simple_tokenizer.py +++ /dev/null @@ -1,132 +0,0 @@ -import gzip -import html -import os -from functools import lru_cache - -import ftfy -import regex as re - - -@lru_cache() -def default_bpe(): - return os.path.join(os.path.dirname(os.path.abspath(__file__)), "bpe_simple_vocab_16e6.txt.gz") - - -@lru_cache() -def bytes_to_unicode(): - """ - Returns list of utf-8 byte and a corresponding list of unicode strings. - The reversible bpe codes work on unicode strings. - This means you need a large # of unicode characters in your vocab if you want to avoid UNKs. - When you're at something like a 10B token dataset you end up needing around 5K for decent coverage. - This is a signficant percentage of your normal, say, 32K bpe vocab. - To avoid that, we want lookup tables between utf-8 bytes and unicode strings. - And avoids mapping to whitespace/control characters the bpe code barfs on. - """ - bs = list(range(ord("!"), ord("~")+1))+list(range(ord("¡"), ord("¬")+1))+list(range(ord("®"), ord("ÿ")+1)) - cs = bs[:] - n = 0 - for b in range(2**8): - if b not in bs: - bs.append(b) - cs.append(2**8+n) - n += 1 - cs = [chr(n) for n in cs] - return dict(zip(bs, cs)) - - -def get_pairs(word): - """Return set of symbol pairs in a word. - Word is represented as tuple of symbols (symbols being variable-length strings). - """ - pairs = set() - prev_char = word[0] - for char in word[1:]: - pairs.add((prev_char, char)) - prev_char = char - return pairs - - -def basic_clean(text): - text = ftfy.fix_text(text) - text = html.unescape(html.unescape(text)) - return text.strip() - - -def whitespace_clean(text): - text = re.sub(r'\s+', ' ', text) - text = text.strip() - return text - - -class SimpleTokenizer(object): - def __init__(self, bpe_path: str = default_bpe()): - self.byte_encoder = bytes_to_unicode() - self.byte_decoder = {v: k for k, v in self.byte_encoder.items()} - merges = gzip.open(bpe_path).read().decode("utf-8").split('\n') - merges = merges[1:49152-256-2+1] - merges = [tuple(merge.split()) for merge in merges] - vocab = list(bytes_to_unicode().values()) - vocab = vocab + [v+'' for v in vocab] - for merge in merges: - vocab.append(''.join(merge)) - vocab.extend(['<|startoftext|>', '<|endoftext|>']) - self.encoder = dict(zip(vocab, range(len(vocab)))) - self.decoder = {v: k for k, v in self.encoder.items()} - self.bpe_ranks = dict(zip(merges, range(len(merges)))) - self.cache = {'<|startoftext|>': '<|startoftext|>', '<|endoftext|>': '<|endoftext|>'} - self.pat = re.compile(r"""<\|startoftext\|>|<\|endoftext\|>|'s|'t|'re|'ve|'m|'ll|'d|[\p{L}]+|[\p{N}]|[^\s\p{L}\p{N}]+""", re.IGNORECASE) - - def bpe(self, token): - if token in self.cache: - return self.cache[token] - word = tuple(token[:-1]) + ( token[-1] + '',) - pairs = get_pairs(word) - - if not pairs: - return token+'' - - while True: - bigram = min(pairs, key = lambda pair: self.bpe_ranks.get(pair, float('inf'))) - if bigram not in self.bpe_ranks: - break - first, second = bigram - new_word = [] - i = 0 - while i < len(word): - try: - j = word.index(first, i) - new_word.extend(word[i:j]) - i = j - except: - new_word.extend(word[i:]) - break - - if word[i] == first and i < len(word)-1 and word[i+1] == second: - new_word.append(first+second) - i += 2 - else: - new_word.append(word[i]) - i += 1 - new_word = tuple(new_word) - word = new_word - if len(word) == 1: - break - else: - pairs = get_pairs(word) - word = ' '.join(word) - self.cache[token] = word - return word - - def encode(self, text): - bpe_tokens = [] - text = whitespace_clean(basic_clean(text)).lower() - for token in re.findall(self.pat, text): - token = ''.join(self.byte_encoder[b] for b in token.encode('utf-8')) - bpe_tokens.extend(self.encoder[bpe_token] for bpe_token in self.bpe(token).split(' ')) - return bpe_tokens - - def decode(self, tokens): - text = ''.join([self.decoder[token] for token in tokens]) - text = bytearray([self.byte_decoder[c] for c in text]).decode('utf-8', errors="replace").replace('', ' ') - return text diff --git a/clip_caption_reward.py b/clip_caption_reward.py index e528172..aba1a33 100644 --- a/clip_caption_reward.py +++ b/clip_caption_reward.py @@ -11,11 +11,20 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. +import sys import pathlib - +import json +from pathlib import Path +from PIL import Image +import numpy as np +import torch from torch import nn +from torchvision.transforms import Compose, Resize, CenterCrop, ToTensor, Normalize +from torchvision.transforms.functional import InterpolationMode from timm.models.vision_transformer import resize_pos_embed from towhee.types.image_utils import to_pil +from towhee.types.arg import arg, to_image_color +from towhee.operator.base import NNOperator, OperatorFlag class ClipCaptionReward(NNOperator): @@ -26,14 +35,22 @@ class ClipCaptionReward(NNOperator): super().__init__() sys.path.append(str(Path(__file__).parent)) from utils import opts - import clip - opt = opts.parse_opt(parse=False, cfg=cfg) + from transformer_model import TransformerModel + from captioning.models.model_utils import decode_sequence + self.decode_sequence = decode_sequence + import mclip + sys.path.pop() + path = pathlib.Path(__file__).parent + + cfg = self._configs()[model_name] + config = str(path) + cfg['config'] + opt = opts.parse_opt(parse=False, cfg=(config)) dict_json = json.load(open("{}/data/cocotalk.json".format(path))) ix_to_word = dict_json["ix_to_word"] self.device = "cuda" if torch.cuda.is_available() else "cpu" - clip_model, clip_transform = clip.load("RN50", jit=False, device=self.device) + clip_model, clip_transform = mclip.load("RN50", jit=False, device=self.device) self.clip_model = clip_model self.clip_transform = clip_transform @@ -59,7 +76,12 @@ class ClipCaptionReward(NNOperator): ) self.clip_model.visual.attnpool.positional_embedding = pos_embed + ckpt_path = str(path) + cfg['weights'] + raw_state_dict = torch.load(ckpt_path, map_location=torch.device('cpu')) + self.model = TransformerModel(opt) + self.model.load_state_dict(raw_state_dict) + self.image_mean = ( torch.Tensor([0.48145466, 0.4578275, 0.40821073]) .to(self.device) @@ -70,17 +92,25 @@ class ClipCaptionReward(NNOperator): .to(self.device) .reshape(3, 1, 1) ) + self._preprocess = Compose( + [ + Resize((448, 448), interpolation= InterpolationMode.BILINEAR), + CenterCrop((448, 448)), + ToTensor(), + ] + ) + self.eval_kwargs = {} + self.eval_kwargs.update(vars(opt)) @arg(1, to_image_color('RGB')) def inference_single_data(self, data): text = self._inference_from_image(data) return text - @arg(1, to_image_color('RGB')) def _inference_from_image(self, img): img = to_pil(img) img = self._preprocess(img) - self._inference_from_image(img) + img = torch.tensor(np.stack([img])).to(self.device) img -= self.image_mean img /= self.image_std tmp_att, tmp_fc = self.clip_model.encode_image(img) @@ -88,9 +118,27 @@ class ClipCaptionReward(NNOperator): att_feat = tmp_att - return att_feat + + with torch.no_grad(): + fc_feats = torch.zeros((1, 0)).to(self.device) + att_feats = att_feat.view(1, 196, 2048).float().to(self.device) + att_masks = None + + # forward the model to also get generated samples for each image + # Only leave one feature for each image, in case duplicate sample + tmp_eval_kwargs = self.eval_kwargs.copy() + tmp_eval_kwargs.update({"sample_n": 1}) + seq, seq_logprobs = self.model( + fc_feats, att_feats, att_masks, opt=tmp_eval_kwargs, mode="sample" + ) + seq = seq.data + + sents = self.decode_sequence(self.model.vocab, seq) + + return sents[0] def __call__(self, data): + results = [] if not isinstance(data, list): data = [data] else: @@ -103,3 +151,10 @@ class ClipCaptionReward(NNOperator): else: return results + def _configs(self): + config = {} + config['clipRN50_clips_grammar'] = {} + config['clipRN50_clips_grammar']['weights'] = '/weights/clipRN50_clips_grammar-last.pth' + config['clipRN50_clips_grammar']['config'] = '/configs/phase2/clipRN50_clips_grammar.yml' + return config + diff --git a/mclip/clip.py b/mclip/clip.py index 76f241b..262fa02 100644 --- a/mclip/clip.py +++ b/mclip/clip.py @@ -7,6 +7,7 @@ from typing import Union, List import torch from PIL import Image from torchvision.transforms import Compose, Resize, CenterCrop, ToTensor, Normalize +from torchvision.transforms.functional import InterpolationMode from tqdm import tqdm from .model import build_model @@ -57,7 +58,7 @@ def _download(url: str, root: str = os.path.expanduser("~/.cache/clip")): def _transform(n_px): return Compose([ - Resize(n_px, interpolation=Image.BICUBIC), + Resize(n_px, interpolation=InterpolationMode.BILINEAR), CenterCrop(n_px), lambda image: image.convert("RGB"), ToTensor(), diff --git a/tabular.png b/tabular.png new file mode 100644 index 0000000000000000000000000000000000000000..81a55eec86f70057238a435e396eb320e3c840c4 GIT binary patch literal 96116 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 Hw~6>4_%&5f literal 0 HcmV?d00001