media-tagging 1.2.0.dev2__tar.gz → 1.2.0.dev4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/PKG-INFO +3 -5
- {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/__init__.py +4 -2
- {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/media_tagging_service.py +28 -6
- {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/tagging_result.py +12 -4
- {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging.egg-info/PKG-INFO +3 -5
- {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging.egg-info/requires.txt +2 -5
- {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/pyproject.toml +2 -5
- {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/LICENSE.txt +0 -0
- {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/README.md +0 -0
- {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/entrypoints/__init__.py +0 -0
- {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/entrypoints/cli.py +0 -0
- {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/entrypoints/server.py +0 -0
- {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/entrypoints/utils.py +0 -0
- {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/exceptions.py +0 -0
- {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/loaders/__init__.py +0 -0
- {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/loaders/base.py +0 -0
- {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/loaders/entrypoints/__init__.py +0 -0
- {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/loaders/entrypoints/cli.py +0 -0
- {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/loaders/file.py +0 -0
- {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/loaders/media_loader_service.py +0 -0
- {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/media.py +0 -0
- {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/repositories.py +0 -0
- {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/taggers/__init__.py +0 -0
- {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/taggers/base.py +0 -0
- {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/taggers/google_cloud/__init__.py +0 -0
- {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/taggers/google_cloud/tagger.py +0 -0
- {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/taggers/google_cloud/tagging_strategies.py +0 -0
- {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/taggers/llm/__init__.py +0 -0
- {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/taggers/llm/gemini/__init__.py +0 -0
- {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/taggers/llm/gemini/tagger.py +0 -0
- {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/taggers/llm/gemini/tagging_strategies.py +0 -0
- {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/taggers/llm/prompts/__init__.py +0 -0
- {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/taggers/llm/prompts/description.txt +0 -0
- {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/taggers/llm/prompts/system.txt +0 -0
- {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/taggers/llm/prompts/tag.txt +0 -0
- {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/taggers/llm/utils.py +0 -0
- {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/tools.py +0 -0
- {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging.egg-info/SOURCES.txt +0 -0
- {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging.egg-info/dependency_links.txt +0 -0
- {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging.egg-info/entry_points.txt +0 -0
- {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging.egg-info/top_level.txt +0 -0
- {media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: media-tagging
|
|
3
|
-
Version: 1.2.0.
|
|
3
|
+
Version: 1.2.0.dev4
|
|
4
4
|
Summary: Performs tagging of image and videos based on various taggers
|
|
5
5
|
Author-email: "Google Inc. (gTech gPS CSE team)" <no-reply@google.com>
|
|
6
6
|
License: Apache 2.0
|
|
@@ -23,20 +23,18 @@ Requires-Dist: pandas
|
|
|
23
23
|
Requires-Dist: pydantic
|
|
24
24
|
Requires-Dist: SQLalchemy>=2.0.0
|
|
25
25
|
Requires-Dist: tenacity
|
|
26
|
-
Requires-Dist:
|
|
26
|
+
Requires-Dist: google-genai==1.13.0
|
|
27
27
|
Provides-Extra: google-cloud-vision
|
|
28
28
|
Requires-Dist: google-cloud-vision==3.9.0; extra == "google-cloud-vision"
|
|
29
29
|
Provides-Extra: google-cloud-videointelligence
|
|
30
30
|
Requires-Dist: google-cloud-videointelligence==2.15.0; extra == "google-cloud-videointelligence"
|
|
31
31
|
Provides-Extra: google-cloud
|
|
32
32
|
Requires-Dist: media-tagging[google-cloud-videointelligence,google-cloud-vision]; extra == "google-cloud"
|
|
33
|
-
Provides-Extra: gemini
|
|
34
|
-
Requires-Dist: google-genai==1.13.0; extra == "gemini"
|
|
35
33
|
Provides-Extra: server
|
|
36
34
|
Requires-Dist: fastapi==0.111.0; extra == "server"
|
|
37
35
|
Requires-Dist: pydantic-settings; extra == "server"
|
|
38
36
|
Provides-Extra: all
|
|
39
|
-
Requires-Dist: media-tagging[
|
|
37
|
+
Requires-Dist: media-tagging[google-cloud,server]; extra == "all"
|
|
40
38
|
Dynamic: license-file
|
|
41
39
|
|
|
42
40
|
# Media Tagger
|
|
@@ -14,15 +14,17 @@
|
|
|
14
14
|
|
|
15
15
|
# pylint: disable=C0330, g-bad-import-order, g-multiple-import
|
|
16
16
|
|
|
17
|
-
"""
|
|
17
|
+
"""Media tagging perform tagging and description operation of various media."""
|
|
18
18
|
|
|
19
19
|
from media_tagging.media_tagging_service import (
|
|
20
20
|
MediaTaggingRequest,
|
|
21
|
+
MediaTaggingResponse,
|
|
21
22
|
MediaTaggingService,
|
|
22
23
|
)
|
|
23
24
|
|
|
24
25
|
__all__ = [
|
|
25
26
|
'MediaTaggingService',
|
|
26
27
|
'MediaTaggingRequest',
|
|
28
|
+
'MediaTaggingResponse',
|
|
27
29
|
]
|
|
28
|
-
__version__ = '1.2.0.
|
|
30
|
+
__version__ = '1.2.0.dev4'
|
{media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/media_tagging_service.py
RENAMED
|
@@ -34,6 +34,16 @@ logger = logging.getLogger('media-tagger')
|
|
|
34
34
|
|
|
35
35
|
|
|
36
36
|
class MediaTaggingRequest(pydantic.BaseModel):
|
|
37
|
+
"""Contains parameters to perform media tagging.
|
|
38
|
+
|
|
39
|
+
Attributes:
|
|
40
|
+
tagger_type: Tagger to be used.
|
|
41
|
+
media_type: Type of media to tag.
|
|
42
|
+
media_paths: Paths or URLs where media are located.
|
|
43
|
+
tagging_options: Tagging specific parameters.
|
|
44
|
+
parallel_threshold: Maximum number of parallel tagging operations.
|
|
45
|
+
"""
|
|
46
|
+
|
|
37
47
|
model_config = pydantic.ConfigDict(extra='ignore')
|
|
38
48
|
|
|
39
49
|
tagger_type: Literal['google-cloud', 'gemini']
|
|
@@ -79,6 +89,16 @@ class MediaFetchingRequest(pydantic.BaseModel):
|
|
|
79
89
|
tagger_type: str = 'loader'
|
|
80
90
|
|
|
81
91
|
|
|
92
|
+
class MediaTaggingResponse(pydantic.BaseModel):
|
|
93
|
+
results: list[tagging_result.TaggingResult]
|
|
94
|
+
|
|
95
|
+
def to_garf_report(self):
|
|
96
|
+
return tagging_result.to_garf_report(self.results)
|
|
97
|
+
|
|
98
|
+
def to_pandas(self):
|
|
99
|
+
return tagging_result.to_pandas(self.results)
|
|
100
|
+
|
|
101
|
+
|
|
82
102
|
def discover_taggers(
|
|
83
103
|
existing_taggers: Sequence[str],
|
|
84
104
|
) -> dict[str, base_tagger.BaseTagger]:
|
|
@@ -129,7 +149,7 @@ class MediaTaggingService:
|
|
|
129
149
|
def tag_media(
|
|
130
150
|
self,
|
|
131
151
|
tagging_request: MediaTaggingRequest,
|
|
132
|
-
) ->
|
|
152
|
+
) -> MediaTaggingResponse:
|
|
133
153
|
"""Tags media based on requested tagger.
|
|
134
154
|
|
|
135
155
|
Args:
|
|
@@ -143,7 +163,7 @@ class MediaTaggingService:
|
|
|
143
163
|
def describe_media(
|
|
144
164
|
self,
|
|
145
165
|
tagging_request: MediaTaggingRequest,
|
|
146
|
-
) ->
|
|
166
|
+
) -> MediaTaggingResponse:
|
|
147
167
|
"""Tags media based on requested tagger.
|
|
148
168
|
|
|
149
169
|
Args:
|
|
@@ -158,7 +178,7 @@ class MediaTaggingService:
|
|
|
158
178
|
self,
|
|
159
179
|
action: Literal['tag', 'describe'],
|
|
160
180
|
tagging_request: MediaTaggingRequest,
|
|
161
|
-
) ->
|
|
181
|
+
) -> MediaTaggingResponse:
|
|
162
182
|
"""Gets media information based on tagger and output type.
|
|
163
183
|
|
|
164
184
|
Args:
|
|
@@ -198,10 +218,10 @@ class MediaTaggingService:
|
|
|
198
218
|
):
|
|
199
219
|
untagged_media.add(media_path)
|
|
200
220
|
if not untagged_media:
|
|
201
|
-
return tagged_media
|
|
221
|
+
return MediaTaggingResponse(results=tagged_media)
|
|
202
222
|
|
|
203
223
|
if not tagging_request.parallel_threshold:
|
|
204
|
-
|
|
224
|
+
results = (
|
|
205
225
|
self._process_media_sequentially(
|
|
206
226
|
action,
|
|
207
227
|
concrete_tagger,
|
|
@@ -211,6 +231,7 @@ class MediaTaggingService:
|
|
|
211
231
|
)
|
|
212
232
|
+ tagged_media
|
|
213
233
|
)
|
|
234
|
+
return MediaTaggingResponse(results=results)
|
|
214
235
|
with futures.ThreadPoolExecutor(
|
|
215
236
|
max_workers=tagging_request.parallel_threshold
|
|
216
237
|
) as executor:
|
|
@@ -231,7 +252,8 @@ class MediaTaggingService:
|
|
|
231
252
|
for future in futures.as_completed(future_to_media_path)
|
|
232
253
|
]
|
|
233
254
|
)
|
|
234
|
-
|
|
255
|
+
results = list(untagged_media) + tagged_media
|
|
256
|
+
return MediaTaggingResponse(results=results)
|
|
235
257
|
|
|
236
258
|
def _process_media_sequentially(
|
|
237
259
|
self,
|
|
@@ -22,8 +22,9 @@ import json
|
|
|
22
22
|
from collections.abc import Sequence
|
|
23
23
|
from typing import Any, Literal
|
|
24
24
|
|
|
25
|
-
import
|
|
25
|
+
import pandas as pd
|
|
26
26
|
import pydantic
|
|
27
|
+
from garf_core import report
|
|
27
28
|
|
|
28
29
|
from media_tagging import exceptions
|
|
29
30
|
|
|
@@ -149,9 +150,9 @@ class TaggingResultsFileInput:
|
|
|
149
150
|
score_name: str
|
|
150
151
|
|
|
151
152
|
|
|
152
|
-
def
|
|
153
|
+
def to_garf_report(
|
|
153
154
|
tagging_results: Sequence[TaggingResult],
|
|
154
|
-
) ->
|
|
155
|
+
) -> report.GarfReport:
|
|
155
156
|
"""Converts results of tagging to GarfReport for further writing."""
|
|
156
157
|
results = []
|
|
157
158
|
column_names = [
|
|
@@ -173,4 +174,11 @@ def convert_tagging_results_to_garf_report(
|
|
|
173
174
|
else:
|
|
174
175
|
parsed_result.append({tag.name: tag.score for tag in result.content})
|
|
175
176
|
results.append(parsed_result)
|
|
176
|
-
return
|
|
177
|
+
return report.GarfReport(results=results, column_names=column_names)
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
def to_pandas(
|
|
181
|
+
tagging_results: Sequence[TaggingResult],
|
|
182
|
+
) -> pd.DataFrame:
|
|
183
|
+
"""Converts results of tagging to pandas DataFrame."""
|
|
184
|
+
return to_garf_report(tagging_results).to_pandas()
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: media-tagging
|
|
3
|
-
Version: 1.2.0.
|
|
3
|
+
Version: 1.2.0.dev4
|
|
4
4
|
Summary: Performs tagging of image and videos based on various taggers
|
|
5
5
|
Author-email: "Google Inc. (gTech gPS CSE team)" <no-reply@google.com>
|
|
6
6
|
License: Apache 2.0
|
|
@@ -23,20 +23,18 @@ Requires-Dist: pandas
|
|
|
23
23
|
Requires-Dist: pydantic
|
|
24
24
|
Requires-Dist: SQLalchemy>=2.0.0
|
|
25
25
|
Requires-Dist: tenacity
|
|
26
|
-
Requires-Dist:
|
|
26
|
+
Requires-Dist: google-genai==1.13.0
|
|
27
27
|
Provides-Extra: google-cloud-vision
|
|
28
28
|
Requires-Dist: google-cloud-vision==3.9.0; extra == "google-cloud-vision"
|
|
29
29
|
Provides-Extra: google-cloud-videointelligence
|
|
30
30
|
Requires-Dist: google-cloud-videointelligence==2.15.0; extra == "google-cloud-videointelligence"
|
|
31
31
|
Provides-Extra: google-cloud
|
|
32
32
|
Requires-Dist: media-tagging[google-cloud-videointelligence,google-cloud-vision]; extra == "google-cloud"
|
|
33
|
-
Provides-Extra: gemini
|
|
34
|
-
Requires-Dist: google-genai==1.13.0; extra == "gemini"
|
|
35
33
|
Provides-Extra: server
|
|
36
34
|
Requires-Dist: fastapi==0.111.0; extra == "server"
|
|
37
35
|
Requires-Dist: pydantic-settings; extra == "server"
|
|
38
36
|
Provides-Extra: all
|
|
39
|
-
Requires-Dist: media-tagging[
|
|
37
|
+
Requires-Dist: media-tagging[google-cloud,server]; extra == "all"
|
|
40
38
|
Dynamic: license-file
|
|
41
39
|
|
|
42
40
|
# Media Tagger
|
|
@@ -6,13 +6,10 @@ pandas
|
|
|
6
6
|
pydantic
|
|
7
7
|
SQLalchemy>=2.0.0
|
|
8
8
|
tenacity
|
|
9
|
-
|
|
9
|
+
google-genai==1.13.0
|
|
10
10
|
|
|
11
11
|
[all]
|
|
12
|
-
media-tagging[
|
|
13
|
-
|
|
14
|
-
[gemini]
|
|
15
|
-
google-genai==1.13.0
|
|
12
|
+
media-tagging[google-cloud,server]
|
|
16
13
|
|
|
17
14
|
[google-cloud]
|
|
18
15
|
media-tagging[google-cloud-videointelligence,google-cloud-vision]
|
|
@@ -13,7 +13,7 @@ dependencies = [
|
|
|
13
13
|
"pydantic",
|
|
14
14
|
"SQLalchemy>=2.0.0",
|
|
15
15
|
"tenacity",
|
|
16
|
-
"
|
|
16
|
+
"google-genai==1.13.0",
|
|
17
17
|
]
|
|
18
18
|
authors = [
|
|
19
19
|
{name = "Google Inc. (gTech gPS CSE team)", email = "no-reply@google.com"},
|
|
@@ -48,15 +48,12 @@ google-cloud-videointelligence=[
|
|
|
48
48
|
google-cloud=[
|
|
49
49
|
"media-tagging[google-cloud-vision,google-cloud-videointelligence]",
|
|
50
50
|
]
|
|
51
|
-
gemini=[
|
|
52
|
-
"google-genai==1.13.0",
|
|
53
|
-
]
|
|
54
51
|
server = [
|
|
55
52
|
"fastapi==0.111.0",
|
|
56
53
|
"pydantic-settings",
|
|
57
54
|
]
|
|
58
55
|
all = [
|
|
59
|
-
"media-tagging[google-cloud,
|
|
56
|
+
"media-tagging[google-cloud,server]"
|
|
60
57
|
]
|
|
61
58
|
|
|
62
59
|
[project.entry-points.creative_assistant]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/loaders/entrypoints/__init__.py
RENAMED
|
File without changes
|
{media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/loaders/entrypoints/cli.py
RENAMED
|
File without changes
|
|
File without changes
|
{media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/loaders/media_loader_service.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/taggers/google_cloud/__init__.py
RENAMED
|
File without changes
|
{media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/taggers/google_cloud/tagger.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/taggers/llm/gemini/__init__.py
RENAMED
|
File without changes
|
{media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/taggers/llm/gemini/tagger.py
RENAMED
|
File without changes
|
|
File without changes
|
{media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/taggers/llm/prompts/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/taggers/llm/prompts/system.txt
RENAMED
|
File without changes
|
{media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging/taggers/llm/prompts/tag.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
{media_tagging-1.2.0.dev2 → media_tagging-1.2.0.dev4}/media_tagging.egg-info/entry_points.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|