Tanishq commited on
Commit
84360bb
·
1 Parent(s): d1f7784

Upload 9 files

Browse files
__pycache__/model_main.cpython-311.pyc ADDED
Binary file (8.8 kB). View file
 
best_model.h5 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:363304a55bc92c6da7a7c463af4bdfdf7edb5b2eebcfad154ad177d54e7fd241
3
+ size 71970004
captions.txt ADDED
The diff for this file is too large to render. See raw diff
 
eye.png ADDED
features.pkl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:d62b45d8a5e42a978f7652fbb08d744e48fc05e5a38808faff93446022216bc5
3
+ size 133064982
model.png ADDED
model_main.py ADDED
@@ -0,0 +1,185 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import pickle
3
+ import numpy as np
4
+ from tqdm.notebook import tqdm
5
+
6
+ from tensorflow.keras.applications.vgg16 import VGG16, preprocess_input
7
+ from tensorflow.keras.preprocessing.image import load_img, img_to_array
8
+ from tensorflow.keras.preprocessing.text import Tokenizer
9
+ from tensorflow.keras.preprocessing.sequence import pad_sequences
10
+ from tensorflow.keras.models import Model
11
+ from tensorflow.keras.utils import to_categorical, plot_model
12
+ from tensorflow.keras.layers import Input, Dense, LSTM, Embedding, Dropout, add
13
+
14
+ # load vgg16 model
15
+ model = VGG16()
16
+ # restructure the model
17
+ model = Model(inputs=model.inputs, outputs=model.layers[-2].output)
18
+
19
+ with open('features.pkl', 'rb') as f:
20
+ features = pickle.load(f)
21
+
22
+ with open('captions.txt', 'r') as f:
23
+ next(f)
24
+ captions_doc = f.read()
25
+
26
+ # # create mapping of image to captions
27
+ mapping = {}
28
+ # process lines
29
+ for line in tqdm(captions_doc.split('\n')):
30
+ # split the line by comma(,)
31
+ tokens = line.split(',')
32
+ if len(line) < 2:
33
+ continue
34
+ image_id, caption = tokens[0], tokens[1:]
35
+ # remove extension from image ID
36
+ image_id = image_id.split('.')[0]
37
+ # convert caption list to string
38
+ caption = " ".join(caption)
39
+ # create list if needed
40
+ if image_id not in mapping:
41
+ mapping[image_id] = []
42
+ # store the caption
43
+ mapping[image_id].append(caption)
44
+
45
+ def clean(mapping):
46
+ for key, captions in mapping.items():
47
+ for i in range(len(captions)):
48
+ # take one caption at a time
49
+ caption = captions[i]
50
+ # preprocessing steps
51
+ # convert to lowercase
52
+ caption = caption.lower()
53
+ # delete digits, special chars, etc.,
54
+ caption = caption.replace('[^A-Za-z]', '')
55
+ # delete additional spaces
56
+ caption = caption.replace('\s+', ' ')
57
+ # add start and end tags to the caption
58
+ caption = 'startseq ' + " ".join([word for word in caption.split() if len(word)>1]) + ' endseq'
59
+ captions[i] = caption
60
+
61
+ clean(mapping)
62
+
63
+ all_captions = []
64
+ for key in mapping:
65
+ for caption in mapping[key]:
66
+ all_captions.append(caption)
67
+
68
+ # tokenize the text
69
+ tokenizer = Tokenizer()
70
+ tokenizer.fit_on_texts(all_captions)
71
+ vocab_size = len(tokenizer.word_index) + 1
72
+
73
+ # get maximum length of the caption available
74
+ max_length = max(len(caption.split()) for caption in all_captions)
75
+
76
+
77
+ # create data generator to get data in batch (avoids session crash)
78
+ def data_generator(data_keys, mapping, features, tokenizer, max_length, vocab_size, batch_size):
79
+ # loop over images
80
+ X1, X2, y = list(), list(), list()
81
+ n = 0
82
+ while 1:
83
+ for key in data_keys:
84
+ n += 1
85
+ captions = mapping[key]
86
+ # process each caption
87
+ for caption in captions:
88
+ # encode the sequence
89
+ seq = tokenizer.texts_to_sequences([caption])[0]
90
+ # split the sequence into X, y pairs
91
+ for i in range(1, len(seq)):
92
+ # split into input and output pairs
93
+ in_seq, out_seq = seq[:i], seq[i]
94
+ # pad input sequence
95
+ in_seq = pad_sequences([in_seq], maxlen=max_length)[0]
96
+ # encode output sequence
97
+ out_seq = to_categorical([out_seq], num_classes=vocab_size)[0]
98
+
99
+ # store the sequences
100
+ X1.append(features[key][0])
101
+ X2.append(in_seq)
102
+ y.append(out_seq)
103
+ if n == batch_size:
104
+ X1, X2, y = np.array(X1), np.array(X2), np.array(y)
105
+ yield [X1, X2], y
106
+ X1, X2, y = list(), list(), list()
107
+ n = 0
108
+
109
+ # encoder model
110
+ # image feature layers
111
+ inputs1 = Input(shape=(4096,))
112
+ fe1 = Dropout(0.4)(inputs1)
113
+ fe2 = Dense(256, activation='relu')(fe1)
114
+ # sequence feature layers
115
+ inputs2 = Input(shape=(max_length,))
116
+ se1 = Embedding(vocab_size, 256, mask_zero=True)(inputs2)
117
+ se2 = Dropout(0.4)(se1)
118
+ se3 = LSTM(256)(se2)
119
+
120
+ # decoder model
121
+ decoder1 = add([fe2, se3])
122
+ decoder2 = Dense(256, activation='relu')(decoder1)
123
+ outputs = Dense(vocab_size, activation='softmax')(decoder2)
124
+
125
+ model = Model(inputs=[inputs1, inputs2], outputs=outputs)
126
+ model.compile(loss='categorical_crossentropy', optimizer='adam')
127
+
128
+ # plot the model
129
+ plot_model(model, show_shapes=True)
130
+
131
+ from keras.models import load_model
132
+ model = load_model("best_model.h5")
133
+
134
+ def idx_to_word(integer, tokenizer):
135
+ for word, index in tokenizer.word_index.items():
136
+ if index == integer:
137
+ return word
138
+ return None
139
+
140
+
141
+ # generate caption for an image
142
+ def predict_caption(model, image, tokenizer, max_length):
143
+ # add start tag for generation process
144
+ in_text = 'startseq'
145
+ # iterate over the max length of sequence
146
+ for i in range(max_length):
147
+ # encode input sequence
148
+ sequence = tokenizer.texts_to_sequences([in_text])[0]
149
+ # pad the sequence
150
+ sequence = pad_sequences([sequence], max_length)
151
+ # predict next word
152
+ yhat = model.predict([image, sequence], verbose=0)
153
+ # get index with high probability
154
+ yhat = np.argmax(yhat)
155
+ # convert index to word
156
+ word = idx_to_word(yhat, tokenizer)
157
+ # stop if word not found
158
+ if word is None:
159
+ break
160
+ # append word as input for generating next word
161
+ in_text += " " + word
162
+ # stop if we reach end tag
163
+ if word == 'endseq':
164
+ break
165
+
166
+ return in_text
167
+
168
+ vgg_model = VGG16()
169
+ # restructure the model
170
+ vgg_model = Model(inputs=vgg_model.inputs, outputs=vgg_model.layers[-2].output)
171
+
172
+ def generate_caption(image_path):
173
+ image_path = image_path
174
+ # load image
175
+ image = load_img(image_path, target_size=(224, 224))
176
+ # convert image pixels to numpy array
177
+ image = img_to_array(image)
178
+ # reshape data for model
179
+ image = image.reshape((1, image.shape[0], image.shape[1], image.shape[2]))
180
+ # preprocess image for vgg
181
+ image = preprocess_input(image)
182
+ # extract features
183
+ feature = vgg_model.predict(image, verbose=0)
184
+ # predict from the trained model
185
+ return predict_caption(model, feature, tokenizer, max_length)[9: -7]
requirements.txt ADDED
@@ -0,0 +1,363 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ absl-py==1.4.0
2
+ aiohttp==3.8.4
3
+ aiosignal==1.3.1
4
+ altair==5.0.1
5
+ anyascii==0.3.2
6
+ anyio==3.7.0
7
+ apache-beam==2.48.0
8
+ apparmor==3.1.6
9
+ application-utility==1.3.2
10
+ argon2-cffi==21.3.0
11
+ argon2-cffi-bindings==21.2.0
12
+ array-record==0.4.0
13
+ arrow==1.2.3
14
+ asttokens==2.2.1
15
+ astunparse==1.6.3
16
+ async-lru==2.0.2
17
+ async-timeout==4.0.2
18
+ attrs==22.2.0
19
+ autocommand==2.2.2
20
+ avro-python3==1.10.2
21
+ Babel==2.12.1
22
+ backcall==0.2.0
23
+ bcrypt==4.0.1
24
+ beautifulsoup4==4.12.2
25
+ bleach==6.0.0
26
+ blinker==1.6.2
27
+ blis==0.7.9
28
+ btrfsutil==6.3.2
29
+ cachetools==5.3.1
30
+ catalogue==2.0.8
31
+ certifi==2023.5.7
32
+ cffi==1.15.1
33
+ chardet==5.1.0
34
+ charset-normalizer==3.1.0
35
+ click==8.1.4
36
+ cloudpickle==2.2.1
37
+ cmake==3.26.4
38
+ colorama==0.4.6
39
+ comm==0.1.3
40
+ confection==0.1.0
41
+ configobj==5.0.8
42
+ contextlib2==21.6.0
43
+ contourpy==1.0.7
44
+ crcmod==1.7
45
+ cryptography==41.0.1
46
+ cssselect2==0.7.0
47
+ cycler==0.11.0
48
+ cymem==2.0.7
49
+ Cython==0.29.35
50
+ datasets==2.13.1
51
+ dbus-python==1.3.2
52
+ debugpy==1.6.7
53
+ decorator==5.1.1
54
+ defusedxml==0.7.1
55
+ dill==0.3.6
56
+ dm-tree==0.1.8
57
+ dnspython==2.3.0
58
+ docopt==0.6.2
59
+ duplicity==1.2.3
60
+ en-core-web-sm @ https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-3.5.0/en_core_web_sm-3.5.0-py3-none-any.whl#sha256=0964370218b7e1672a30ac50d72cdc6b16f7c867496f1d60925691188f4d2510
61
+ etils==1.3.0
62
+ ewmh==0.1.6
63
+ executing==1.2.0
64
+ Farama-Notifications==0.0.4
65
+ fastavro==1.7.4
66
+ fasteners==0.18
67
+ fastjsonschema==2.17.1
68
+ ffmpeg-python==0.2.0
69
+ filelock==3.12.0
70
+ flatbuffers==23.5.26
71
+ fonttools==4.39.4
72
+ fqdn==1.5.1
73
+ frozenlist==1.3.3
74
+ fsspec==2023.6.0
75
+ future==0.18.3
76
+ gast==0.4.0
77
+ gdown==4.7.1
78
+ gin-config==0.5.0
79
+ gitdb==4.0.10
80
+ GitPython==3.1.31
81
+ google-api-core==2.11.0
82
+ google-api-python-client==2.88.0
83
+ google-auth==2.18.1
84
+ google-auth-httplib2==0.1.0
85
+ google-auth-oauthlib==1.0.0
86
+ google-pasta==0.2.0
87
+ googleapis-common-protos==1.59.1
88
+ grpcio==1.54.2
89
+ grpcio-tools==1.55.1
90
+ gufw==22.4.0
91
+ gym==0.26.2
92
+ gym-notices==0.0.8
93
+ gymnasium==0.28.1
94
+ h5py==3.8.0
95
+ hdfs==2.7.0
96
+ hparam==0.1.4
97
+ hparams==0.3.0
98
+ html2text==2020.1.16
99
+ httplib2==0.22.0
100
+ huggingface-hub==0.16.4
101
+ ibm-cloud-sdk-core==3.16.7
102
+ ibm-watson==7.0.0
103
+ idna==3.4
104
+ imageio==2.31.1
105
+ immutabledict==2.2.4
106
+ importlib-metadata==4.13.0
107
+ importlib-resources==5.12.0
108
+ inflect==6.1.0
109
+ ipykernel==6.23.1
110
+ ipython==8.14.0
111
+ ipython-genutils==0.2.0
112
+ ipywidgets==8.0.7
113
+ isoduration==20.11.0
114
+ jaraco.context==4.3.0
115
+ jaraco.functools==3.8.0
116
+ jaraco.text==3.11.1
117
+ jax==0.4.12
118
+ jax-jumpy==1.0.0
119
+ jedi==0.18.2
120
+ Jinja2==3.1.2
121
+ joblib==1.2.0
122
+ json5==0.9.14
123
+ jsonpickle==3.0.1
124
+ jsonpointer==2.3
125
+ jsonschema==4.17.3
126
+ jupyter-events==0.6.3
127
+ jupyter-lsp==2.2.0
128
+ jupyter_client==8.2.0
129
+ jupyter_core==5.3.0
130
+ jupyter_server==2.6.0
131
+ jupyter_server_terminals==0.4.4
132
+ jupyterlab==4.0.2
133
+ jupyterlab-pygments==0.2.2
134
+ jupyterlab-widgets==3.0.8
135
+ jupyterlab_server==2.23.0
136
+ kaggle==1.5.13
137
+ keras==2.12.0
138
+ kiwisolver==1.4.4
139
+ langcodes==3.3.0
140
+ layoutswitcherlib==0.8.36
141
+ LibAppArmor==3.1.6
142
+ libclang==16.0.0
143
+ libfdt==1.7.0
144
+ lit==15.0.7.dev0
145
+ lvis==0.5.3
146
+ lxml==4.9.2
147
+ Mako==1.2.4
148
+ mallard-ducktype==1.0.2
149
+ manjaro-sdk==0.1
150
+ Markdown==3.4.3
151
+ markdown-it-py==3.0.0
152
+ MarkupSafe==2.1.3
153
+ material-color-utilities-python==0.1.5
154
+ matplotlib==3.7.1
155
+ matplotlib-inline==0.1.6
156
+ mdurl==0.1.2
157
+ mediapipe==0.10.1
158
+ meson==1.1.1
159
+ mistune==2.0.5
160
+ ml-dtypes==0.2.0
161
+ mlxtend==0.22.0
162
+ more-itertools==9.1.0
163
+ mpmath==1.3.0
164
+ multidict==6.0.4
165
+ multiprocess==0.70.14
166
+ murmurhash==1.0.9
167
+ music21==9.1.0
168
+ nbclassic==1.0.0
169
+ nbclient==0.8.0
170
+ nbconvert==7.4.0
171
+ nbformat==5.9.0
172
+ nest-asyncio==1.5.6
173
+ netsnmp-python==1.0a1
174
+ networkx==3.1
175
+ nftables==0.1
176
+ nltk==3.8.1
177
+ notebook==6.5.4
178
+ notebook_shim==0.2.3
179
+ npyscreen==4.10.5
180
+ numpy==1.25.1
181
+ nvidia-cublas-cu11==11.10.3.66
182
+ nvidia-cuda-cupti-cu11==11.7.101
183
+ nvidia-cuda-nvrtc-cu11==11.7.99
184
+ nvidia-cuda-runtime-cu11==11.7.99
185
+ nvidia-cudnn-cu11==8.5.0.96
186
+ nvidia-cufft-cu11==10.9.0.58
187
+ nvidia-curand-cu11==10.2.10.91
188
+ nvidia-cusolver-cu11==11.4.0.1
189
+ nvidia-cusparse-cu11==11.7.4.91
190
+ nvidia-nccl-cu11==2.14.3
191
+ nvidia-nvtx-cu11==11.7.91
192
+ oauth2client==4.1.3
193
+ oauthlib==3.2.2
194
+ object-detection @ file:///home/reputation/Documents/DL/TFOD/models/research
195
+ objsize==0.6.1
196
+ opencv-contrib-python==4.8.0.74
197
+ opencv-python==4.8.0.74
198
+ opt-einsum==3.3.0
199
+ optimus-manager==1.5
200
+ ordered-set==4.1.0
201
+ orjson==3.9.1
202
+ overrides==7.3.1
203
+ packaging==23.1
204
+ pacman-mirrors==4.23.2
205
+ pandas==2.0.2
206
+ pandocfilters==1.5.0
207
+ paramiko==2.11.1
208
+ parso==0.8.3
209
+ pathy==0.10.2
210
+ pexpect==4.8.0
211
+ pickleshare==0.7.5
212
+ Pillow==10.0.0
213
+ pipreqs==0.4.13
214
+ platformdirs==3.5.1
215
+ ply==3.11
216
+ portalocker==2.7.0
217
+ preshed==3.0.8
218
+ prometheus-client==0.17.0
219
+ promise==2.3
220
+ prompt-toolkit==3.0.38
221
+ proto-plus==1.22.3
222
+ protobuf==3.20.3
223
+ protobuf-compiler==1.0.20
224
+ psutil==5.9.5
225
+ ptyprocess==0.7.0
226
+ pulsectl==23.5.2
227
+ pure-eval==0.2.2
228
+ pwquality==1.4.5
229
+ py-cpuinfo==9.0.0
230
+ pyaml==23.5.9
231
+ pyarrow==11.0.0
232
+ pyasn1==0.4.8
233
+ pyasn1-modules==0.2.8
234
+ pycairo==1.23.0
235
+ pycocotools==2.0.6
236
+ pycparser==2.21
237
+ pydantic==1.10.9
238
+ pydeck==0.8.1b0
239
+ pydot==1.4.2
240
+ PyDrive2==1.16.1
241
+ pygame==2.5.0
242
+ pyglet==1.5.0
243
+ Pygments==2.15.1
244
+ PyGObject==3.44.1
245
+ PyJWT==2.7.0
246
+ pymongo==4.4.0
247
+ Pympler==1.0.1
248
+ PyNaCl==1.4.0
249
+ pyOpenSSL==23.2.0
250
+ pyparsing==2.4.7
251
+ pyrsistent==0.19.3
252
+ PySide6==6.5.1.1
253
+ PySocks==1.7.1
254
+ python-dateutil==2.8.2
255
+ python-json-logger==2.0.7
256
+ python-slugify==8.0.1
257
+ python-xlib==0.33
258
+ PythonTurtle==0.3.2
259
+ pytz==2023.3
260
+ pytz-deprecation-shim==0.1.0.post0
261
+ pyxdg==0.28
262
+ PyYAML==5.4.1
263
+ pyzmq==25.1.0
264
+ ranger-fm==1.9.3
265
+ regex==2023.6.3
266
+ reportlab==3.6.12
267
+ requests==2.31.0
268
+ requests-file==1.5.1
269
+ requests-oauthlib==1.3.1
270
+ rfc3339-validator==0.1.4
271
+ rfc3986-validator==0.1.1
272
+ rich==13.4.2
273
+ rsa==4.9
274
+ sacrebleu==2.2.0
275
+ safetensors==0.3.1
276
+ scikit-learn==1.2.2
277
+ scipy==1.10.1
278
+ seaborn==0.12.2
279
+ Send2Trash==1.8.2
280
+ sentencepiece==0.1.99
281
+ seqeval==1.2.2
282
+ setproctitle==1.3.2
283
+ shiboken6==6.5.1.1
284
+ shiboken6-generator==6.5.1.1
285
+ six==1.16.0
286
+ smart-open==6.3.0
287
+ smmap==5.0.0
288
+ sniffio==1.3.0
289
+ sounddevice==0.4.6
290
+ soupsieve==2.4.1
291
+ spacy==3.5.4
292
+ spacy-legacy==3.0.12
293
+ spacy-loggers==1.0.4
294
+ srsly==2.4.6
295
+ stable-baselines3 @ git+https://github.com/carlosluis/stable-baselines3@6617e6e73cb3a70f3e88cea780ea12bed95c099e
296
+ stack-data==0.6.2
297
+ streamlit==1.24.0
298
+ svglib==1.5.1
299
+ sympy==1.12
300
+ systemd-python==235
301
+ tabulate==0.9.0
302
+ tenacity==8.2.2
303
+ tensorboard==2.12.3
304
+ tensorboard-data-server==0.7.0
305
+ tensorflow==2.12.0
306
+ tensorflow-addons==0.20.0
307
+ tensorflow-datasets==4.9.2
308
+ tensorflow-estimator==2.12.0
309
+ tensorflow-hub==0.13.0
310
+ tensorflow-io==0.32.0
311
+ tensorflow-io-gcs-filesystem==0.32.0
312
+ tensorflow-metadata==1.13.1
313
+ tensorflow-model-optimization==0.7.5
314
+ tensorflow-text==2.12.1
315
+ termcolor==2.3.0
316
+ terminado==0.17.1
317
+ text-unidecode==1.3
318
+ tf-models-official==2.12.0
319
+ tf-slim==1.1.0
320
+ thinc==8.1.10
321
+ threadpoolctl==3.1.0
322
+ tinycss2==1.2.1
323
+ tk==0.1.0
324
+ tldextract==3.4.4
325
+ tokenizers==0.13.3
326
+ toml==0.10.2
327
+ tomli==2.0.1
328
+ toolz==0.12.0
329
+ torch==2.0.1
330
+ tornado==6.3.2
331
+ tqdm==4.65.0
332
+ traitlets==5.9.0
333
+ transformers==4.30.2
334
+ triton==2.0.0
335
+ trove-classifiers==2023.7.8
336
+ typeguard==2.13.3
337
+ typer==0.9.0
338
+ typing_extensions==4.7.0
339
+ tzdata==2023.3
340
+ tzlocal==4.3.1
341
+ ueberzug==18.2.1
342
+ ufw==0.36.2
343
+ uri-template==1.2.0
344
+ uritemplate==4.1.1
345
+ urllib3==1.26.15
346
+ validate==5.0.8
347
+ validate-pyproject==0.13.post1.dev0+gb752273.d20230520
348
+ validators==0.20.0
349
+ wasabi==1.1.2
350
+ watchdog==3.0.0
351
+ wcwidth==0.2.6
352
+ webcolors==1.13
353
+ webencodings==0.5.1
354
+ websocket-client==1.1.0
355
+ Werkzeug==2.3.6
356
+ widgetsnbextension==4.0.8
357
+ wrapt==1.14.1
358
+ xxhash==3.2.0
359
+ Yapsy==1.12.2
360
+ yarg==0.1.9
361
+ yarl==1.9.2
362
+ zipp==3.15.0
363
+ zstandard==0.21.0
violin.jpg ADDED