AlicanA commited on
Commit
f61dc88
·
1 Parent(s): 5a66324
Files changed (4) hide show
  1. Dockerfile +13 -0
  2. Dockerfile:Zone.Identifier +4 -0
  3. app.py +137 -0
  4. requirements.txt +8 -0
Dockerfile ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM docker.io/library/python:3.8.9@sha256:49d05fff9cb3b185b15ffd92d8e6bd61c20aa916133dca2e3dbe0215270faf53
2
+ RUN --ipc=host
3
+ RUN --rm -it --name ubuntu --shm-size=2gb ubuntu
4
+ RUN --mount=target=pre-requirements.txt,source=pre-requirements.txt pip install --no-cache-dir -r pre-requirements.txt
5
+ RUN --mount=target=/root/packages.txt,source=packages.txt sed -i 's http://deb.debian.org http://cdn-aws.deb.debian.org g' /etc/apt/sources.list && sed -i 's http://archive.ubuntu.com http://us-east-1.ec2.archive.ubuntu.com g' /etc/apt/sources.list && sed -i '/security/d' /etc/apt/sources.list && apt-get update && xargs -r -a /root/packages.txt apt-get install -y && rm -rf /var/lib/apt/lists/*
6
+ RUN pip install --no-cache-dir pip==22.3.1 && pip install --no-cache-dir datasets "huggingface-hub>=0.12.1" "protobuf<4" "click<8.1"
7
+ RUN pip install --no-cache-dir gradio==3.27.0
8
+ RUN --mount=target=requirements.txt,source=requirements.txt pip install --no-cache-dir -r requirements.txt
9
+ RUN useradd -m -u 1000 user
10
+ WORKDIR /home/user/app
11
+ RUN sed -i 's http://deb.debian.org http://cdn-aws.deb.debian.org g' /etc/apt/sources.list && sed -i 's http://archive.ubuntu.com http://us-east-1.ec2.archive.ubuntu.com g' /etc/apt/sources.list && sed -i '/security/d' /etc/apt/sources.list && apt-get update && apt-get install -y git git-lfs ffmpeg libsm6 libxext6 cmake libgl1-mesa-glx && rm -rf /var/lib/apt/lists/* && git lfs install
12
+ COPY --link --chown=1000 --from=lfs /app /home/user/app
13
+ COPY --link --chown=1000 ./ /home/user/app
Dockerfile:Zone.Identifier ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ [ZoneTransfer]
2
+ ZoneId=3
3
+ ReferrerUrl=https://gitlab.com/envision-ml/layout-parser/-/blob/staging/Dockerfile
4
+ HostUrl=https://gitlab.com/envision-ml/layout-parser/-/raw/staging/Dockerfile?inline=false
app.py ADDED
@@ -0,0 +1,137 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import os
3
+ import cv2
4
+ from encoded_video import EncodedVideo, write_video
5
+ import torch
6
+ import numpy as np
7
+ from torchvision.datasets import ImageFolder
8
+ from transformers import ViTFeatureExtractor, ViTForImageClassification, AutoFeatureExtractor, ViTMSNForImageClassification
9
+ from pathlib import Path
10
+ import pytorch_lightning as pl
11
+ from torch.utils.data import DataLoader
12
+ from torchmetrics import Accuracy
13
+
14
+
15
+
16
+
17
+ def video_identity(video,user_name,class_name,trainortest,ready):
18
+ if ready=='yes':
19
+
20
+ data_dir = Path(str(user_name)+'/train')
21
+ train_ds = ImageFolder(data_dir)
22
+
23
+
24
+ test_dir = Path(str(user_name)+'/test')
25
+ test_ds = ImageFolder(test_dir)
26
+
27
+ label2id = {}
28
+ id2label = {}
29
+
30
+ for i, class_name in enumerate(train_ds.classes):
31
+ label2id[class_name] = str(i)
32
+ id2label[str(i)] = class_name
33
+
34
+ class ImageClassificationCollator:
35
+ def __init__(self, feature_extractor):
36
+ self.feature_extractor = feature_extractor
37
+
38
+ def __call__(self, batch):
39
+ encodings = self.feature_extractor([x[0] for x in batch], return_tensors='pt')
40
+ encodings['labels'] = torch.tensor([x[1] for x in batch], dtype=torch.long)
41
+ return encodings
42
+ feature_extractor = ViTFeatureExtractor.from_pretrained('google/vit-base-patch16-224-in21k')
43
+ model = ViTForImageClassification.from_pretrained(
44
+ 'google/vit-base-patch16-224-in21k',
45
+ num_labels=len(label2id),
46
+ label2id=label2id,
47
+ id2label=id2label
48
+ )
49
+ collator = ImageClassificationCollator(feature_extractor)
50
+ class Classifier(pl.LightningModule):
51
+
52
+ def __init__(self, model, lr: float = 2e-5, **kwargs):
53
+ super().__init__()
54
+ self.save_hyperparameters('lr', *list(kwargs))
55
+ self.model = model
56
+ self.forward = self.model.forward
57
+ self.val_acc = Accuracy(
58
+ task='multiclass' if model.config.num_labels > 2 else 'binary',
59
+ num_classes=model.config.num_labels
60
+ )
61
+
62
+ def training_step(self, batch, batch_idx):
63
+ outputs = self(**batch)
64
+ self.log(f"train_loss", outputs.loss)
65
+ return outputs.loss
66
+
67
+ def validation_step(self, batch, batch_idx):
68
+ outputs = self(**batch)
69
+ self.log(f"val_loss", outputs.loss)
70
+ acc = self.val_acc(outputs.logits.argmax(1), batch['labels'])
71
+ self.log(f"val_acc", acc, prog_bar=True)
72
+ return outputs.loss
73
+
74
+ def configure_optimizers(self):
75
+ return torch.optim.Adam(self.parameters(), lr=self.hparams.lr)
76
+
77
+
78
+
79
+ train_loader = DataLoader(train_ds, batch_size=8, collate_fn=collator, num_workers=8, shuffle=True)
80
+ test_loader = DataLoader(test_ds, batch_size=8, collate_fn=collator, num_workers=8)
81
+
82
+
83
+ for name, param in model.named_parameters():
84
+ param.requires_grad = False
85
+ if name.startswith("classifier"): # choose whatever you like here
86
+ param.requires_grad = True
87
+
88
+ pl.seed_everything(42)
89
+ classifier = Classifier(model, lr=2e-5)
90
+ trainer = pl.Trainer(accelerator='cpu', devices=1, precision=16, max_epochs=3)
91
+
92
+ trainer.fit(classifier, train_loader, test_loader)
93
+
94
+ for batch_idx, data in enumerate(test_loader):
95
+ outputs = model(**data)
96
+ img=data['pixel_values'][0][0]
97
+ preds=str(outputs.logits.softmax(1).argmax(1))
98
+ labels=str(data['labels'])
99
+
100
+ return img, preds, labels
101
+
102
+ else:
103
+ capture = cv2.VideoCapture(video)
104
+
105
+ user_d=str(user_name)+'/'+str(trainortest)
106
+ class_d=str(user_name)+'/'+str(trainortest)+'/'+str(class_name)
107
+ if not os.path.exists(user_d):
108
+ os.makedirs(user_d)
109
+ if not os.path.exists(class_d):
110
+ os.makedirs(class_d)
111
+ frameNr = 0
112
+ while (True):
113
+
114
+ success, frame = capture.read()
115
+
116
+ if success:
117
+ cv2.imwrite(f'{class_d}/frame_{frameNr}.jpg', frame)
118
+
119
+ else:
120
+ break
121
+
122
+ frameNr = frameNr+10
123
+
124
+ img=cv2.imread(class_d+'/frame_0.jpg')
125
+
126
+ return img, trainortest, class_d
127
+ demo = gr.Interface(video_identity,
128
+ inputs=[gr.Video(source='upload'),
129
+ gr.Text(),
130
+ gr.Text(),
131
+ gr.Text(label='Which set is this? (type train or test)'),
132
+ gr.Text(label='Are you ready? (type yes or no)')],
133
+ outputs=[gr.Image(),
134
+ gr.Text(),
135
+ gr.Text()],
136
+ cache_examples=True)
137
+ demo.launch(debug=True)
requirements.txt ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ opencv-python
2
+ encoded-video
3
+ torch
4
+ numpy
5
+ pytorch-lightning
6
+ torchvision
7
+ transformers
8
+ pathlib