Ubuntu commited on
Commit
ec94c75
1 Parent(s): 8e8918c
Files changed (2) hide show
  1. .ipynb_checkpoints/app-checkpoint.py +134 -0
  2. app.py +1 -1
.ipynb_checkpoints/app-checkpoint.py ADDED
@@ -0,0 +1,134 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+ def video_identity(video,user_name,class_name,trainortest,ready):
15
+ if ready=='yes':
16
+
17
+ data_dir = Path(str(user_name)+'/train')
18
+ train_ds = ImageFolder(data_dir)
19
+
20
+
21
+ test_dir = Path(str(user_name)+'/test')
22
+ test_ds = ImageFolder(test_dir)
23
+
24
+ label2id = {}
25
+ id2label = {}
26
+
27
+ for i, class_name in enumerate(train_ds.classes):
28
+ label2id[class_name] = str(i)
29
+ id2label[str(i)] = class_name
30
+
31
+ class ImageClassificationCollator:
32
+ def __init__(self, feature_extractor):
33
+ self.feature_extractor = feature_extractor
34
+
35
+ def __call__(self, batch):
36
+ encodings = self.feature_extractor([x[0] for x in batch], return_tensors='pt')
37
+ encodings['labels'] = torch.tensor([x[1] for x in batch], dtype=torch.long)
38
+ return encodings
39
+ feature_extractor = ViTFeatureExtractor.from_pretrained('google/vit-base-patch16-224-in21k')
40
+ model = ViTForImageClassification.from_pretrained(
41
+ 'google/vit-base-patch16-224-in21k',
42
+ num_labels=len(label2id),
43
+ label2id=label2id,
44
+ id2label=id2label
45
+ )
46
+ collator = ImageClassificationCollator(feature_extractor)
47
+ class Classifier(pl.LightningModule):
48
+
49
+ def __init__(self, model, lr: float = 2e-5, **kwargs):
50
+ super().__init__()
51
+ self.save_hyperparameters('lr', *list(kwargs))
52
+ self.model = model
53
+ self.forward = self.model.forward
54
+ self.val_acc = Accuracy(
55
+ task='multiclass' if model.config.num_labels > 2 else 'binary',
56
+ num_classes=model.config.num_labels
57
+ )
58
+
59
+ def training_step(self, batch, batch_idx):
60
+ outputs = self(**batch)
61
+ self.log(f"train_loss", outputs.loss)
62
+ return outputs.loss
63
+
64
+ def validation_step(self, batch, batch_idx):
65
+ outputs = self(**batch)
66
+ self.log(f"val_loss", outputs.loss)
67
+ acc = self.val_acc(outputs.logits.argmax(1), batch['labels'])
68
+ self.log(f"val_acc", acc, prog_bar=True)
69
+ return outputs.loss
70
+
71
+ def configure_optimizers(self):
72
+ return torch.optim.Adam(self.parameters(), lr=self.hparams.lr)
73
+
74
+
75
+
76
+ train_loader = DataLoader(train_ds, batch_size=8, collate_fn=collator, num_workers=8, shuffle=True)
77
+ test_loader = DataLoader(test_ds, batch_size=8, collate_fn=collator, num_workers=2)
78
+
79
+
80
+ for name, param in model.named_parameters():
81
+ param.requires_grad = False
82
+ if name.startswith("classifier"): # choose whatever you like here
83
+ param.requires_grad = True
84
+
85
+ pl.seed_everything(42)
86
+ classifier = Classifier(model, lr=2e-5)
87
+ trainer = pl.Trainer(accelerator='gpu', devices=1, precision=16, max_epochs=3)
88
+
89
+ trainer.fit(classifier, train_loader, test_loader)
90
+
91
+ for batch_idx, data in enumerate(test_loader):
92
+ outputs = model(**data)
93
+ img=data['pixel_values'][0][0]
94
+ preds=str(outputs.logits.softmax(1).argmax(1))
95
+ labels=str(data['labels'])
96
+
97
+ return img, preds, labels
98
+
99
+ else:
100
+ capture = cv2.VideoCapture(video)
101
+
102
+ user_d=str(user_name)+'/'+str(trainortest)
103
+ class_d=str(user_name)+'/'+str(trainortest)+'/'+str(class_name)
104
+ if not os.path.exists(user_d):
105
+ os.makedirs(user_d)
106
+ if not os.path.exists(class_d):
107
+ os.makedirs(class_d)
108
+ frameNr = 0
109
+ while (True):
110
+
111
+ success, frame = capture.read()
112
+
113
+ if success:
114
+ cv2.imwrite(f'{class_d}/frame_{frameNr}.jpg', frame)
115
+
116
+ else:
117
+ break
118
+
119
+ frameNr = frameNr+10
120
+
121
+ img=cv2.imread(class_d+'/frame_0.jpg')
122
+
123
+ return img, trainortest, class_d
124
+ demo = gr.Interface(video_identity,
125
+ inputs=[gr.Video(source='upload'),
126
+ gr.Text(),
127
+ gr.Text(),
128
+ gr.Text(label='Which set is this? (type train or test)'),
129
+ gr.Text(label='Are you ready? (type yes or no)')],
130
+ outputs=[gr.Image(),
131
+ gr.Text(),
132
+ gr.Text()],
133
+ cache_examples=True)
134
+ demo.launch(debug=True)
app.py CHANGED
@@ -84,7 +84,7 @@ def video_identity(video,user_name,class_name,trainortest,ready):
84
 
85
  pl.seed_everything(42)
86
  classifier = Classifier(model, lr=2e-5)
87
- trainer = pl.Trainer(accelerator='cpu', devices=1, precision=16, max_epochs=3)
88
 
89
  trainer.fit(classifier, train_loader, test_loader)
90
 
 
84
 
85
  pl.seed_everything(42)
86
  classifier = Classifier(model, lr=2e-5)
87
+ trainer = pl.Trainer(accelerator='gpu', devices=1, precision=16, max_epochs=3)
88
 
89
  trainer.fit(classifier, train_loader, test_loader)
90