Cristiants commited on
Commit
f9c5997
1 Parent(s): ca57f3c

Upload 7 files

Browse files
Files changed (7) hide show
  1. .funcignore +8 -0
  2. .gitattributes +4 -35
  3. .gitignore +135 -0
  4. function_app.py +93 -0
  5. host.json +15 -0
  6. local.settings.json +8 -0
  7. requirements.txt +23 -0
.funcignore ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ .git*
2
+ .vscode
3
+ __azurite_db*__.json
4
+ __blobstorage__
5
+ __queuestorage__
6
+ local.settings.json
7
+ test
8
+ .venv
.gitattributes CHANGED
@@ -1,35 +1,4 @@
1
- *.7z filter=lfs diff=lfs merge=lfs -text
2
- *.arrow filter=lfs diff=lfs merge=lfs -text
3
- *.bin filter=lfs diff=lfs merge=lfs -text
4
- *.bz2 filter=lfs diff=lfs merge=lfs -text
5
- *.ckpt filter=lfs diff=lfs merge=lfs -text
6
- *.ftz filter=lfs diff=lfs merge=lfs -text
7
- *.gz filter=lfs diff=lfs merge=lfs -text
8
- *.h5 filter=lfs diff=lfs merge=lfs -text
9
- *.joblib filter=lfs diff=lfs merge=lfs -text
10
- *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
- *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
- *.model filter=lfs diff=lfs merge=lfs -text
13
- *.msgpack filter=lfs diff=lfs merge=lfs -text
14
- *.npy filter=lfs diff=lfs merge=lfs -text
15
- *.npz filter=lfs diff=lfs merge=lfs -text
16
- *.onnx filter=lfs diff=lfs merge=lfs -text
17
- *.ot filter=lfs diff=lfs merge=lfs -text
18
- *.parquet filter=lfs diff=lfs merge=lfs -text
19
- *.pb filter=lfs diff=lfs merge=lfs -text
20
- *.pickle filter=lfs diff=lfs merge=lfs -text
21
- *.pkl filter=lfs diff=lfs merge=lfs -text
22
- *.pt filter=lfs diff=lfs merge=lfs -text
23
- *.pth filter=lfs diff=lfs merge=lfs -text
24
- *.rar filter=lfs diff=lfs merge=lfs -text
25
- *.safetensors filter=lfs diff=lfs merge=lfs -text
26
- saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
- *.tar.* filter=lfs diff=lfs merge=lfs -text
28
- *.tar filter=lfs diff=lfs merge=lfs -text
29
- *.tflite filter=lfs diff=lfs merge=lfs -text
30
- *.tgz filter=lfs diff=lfs merge=lfs -text
31
- *.wasm filter=lfs diff=lfs merge=lfs -text
32
- *.xz filter=lfs diff=lfs merge=lfs -text
33
- *.zip filter=lfs diff=lfs merge=lfs -text
34
- *.zst filter=lfs diff=lfs merge=lfs -text
35
- *tfevents* filter=lfs diff=lfs merge=lfs -text
 
1
+ *.safetensors filter=lfs diff=lfs merge=lfs -text
2
+ *.pth filter=lfs diff=lfs merge=lfs -text
3
+ *.bin filter=lfs diff=lfs merge=lfs -text
4
+ *.onnx filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.gitignore ADDED
@@ -0,0 +1,135 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Byte-compiled / optimized / DLL files
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+
6
+ # C extensions
7
+ *.so
8
+
9
+ # Distribution / packaging
10
+ .Python
11
+ build/
12
+ develop-eggs/
13
+ dist/
14
+ downloads/
15
+ eggs/
16
+ .eggs/
17
+ lib/
18
+ lib64/
19
+ parts/
20
+ sdist/
21
+ var/
22
+ wheels/
23
+ pip-wheel-metadata/
24
+ share/python-wheels/
25
+ *.egg-info/
26
+ .installed.cfg
27
+ *.egg
28
+ MANIFEST
29
+
30
+ # PyInstaller
31
+ # Usually these files are written by a python script from a template
32
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
33
+ *.manifest
34
+ *.spec
35
+
36
+ # Installer logs
37
+ pip-log.txt
38
+ pip-delete-this-directory.txt
39
+
40
+ # Unit test / coverage reports
41
+ htmlcov/
42
+ .tox/
43
+ .nox/
44
+ .coverage
45
+ .coverage.*
46
+ .cache
47
+ nosetests.xml
48
+ coverage.xml
49
+ *.cover
50
+ .hypothesis/
51
+ .pytest_cache/
52
+
53
+ # Translations
54
+ *.mo
55
+ *.pot
56
+
57
+ # Django stuff:
58
+ *.log
59
+ local_settings.py
60
+ db.sqlite3
61
+
62
+ # Flask stuff:
63
+ instance/
64
+ .webassets-cache
65
+
66
+ # Scrapy stuff:
67
+ .scrapy
68
+
69
+ # Sphinx documentation
70
+ docs/_build/
71
+
72
+ # PyBuilder
73
+ target/
74
+
75
+ # Jupyter Notebook
76
+ .ipynb_checkpoints
77
+
78
+ # IPython
79
+ profile_default/
80
+ ipython_config.py
81
+
82
+ # pyenv
83
+ .python-version
84
+
85
+ # pipenv
86
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
87
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
88
+ # having no cross-platform support, pipenv may install dependencies that don’t work, or not
89
+ # install all needed dependencies.
90
+ #Pipfile.lock
91
+
92
+ # celery beat schedule file
93
+ celerybeat-schedule
94
+
95
+ # SageMath parsed files
96
+ *.sage.py
97
+
98
+ # Environments
99
+ .env
100
+ .venv
101
+ env/
102
+ venv/
103
+ ENV/
104
+ env.bak/
105
+ venv.bak/
106
+
107
+ # Spyder project settings
108
+ .spyderproject
109
+ .spyproject
110
+
111
+ # Rope project settings
112
+ .ropeproject
113
+
114
+ # mkdocs documentation
115
+ /site
116
+
117
+ # mypy
118
+ .mypy_cache/
119
+ .dmypy.json
120
+ dmypy.json
121
+
122
+ # Pyre type checker
123
+ .pyre/
124
+
125
+ # Azure Functions artifacts
126
+ bin
127
+ obj
128
+ appsettings.json
129
+ local.settings.json
130
+
131
+ # Azurite artifacts
132
+ __blobstorage__
133
+ __queuestorage__
134
+ __azurite_db*__.json
135
+ .python_packages
function_app.py ADDED
@@ -0,0 +1,93 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import logging
2
+ import azure.functions as func
3
+ from PIL import Image
4
+ import io
5
+ import torch
6
+ import sys
7
+ from pathlib import Path
8
+
9
+ # Añadir el directorio de los módulos al sys.path
10
+ module_path = Path(__file__).parent / 'RMBG'
11
+ sys.path.append(str(module_path))
12
+
13
+ from briarmbg import BriaRMBG
14
+ from utilities import preprocess_image, postprocess_image
15
+ import numpy as np
16
+
17
+ app = func.FunctionApp(http_auth_level=func.AuthLevel.ANONYMOUS)
18
+
19
+ # Función para redimensionar la imagen manteniendo la relación de aspecto
20
+ def resize_image(image, target_width=1440, target_height=1440):
21
+ original_width, original_height = image.size
22
+
23
+ # Calcular la relación de aspecto original
24
+ aspect_ratio = original_width / original_height
25
+
26
+ # Calcular las nuevas dimensiones manteniendo la relación de aspecto
27
+ if aspect_ratio > 1: # Imagen horizontal
28
+ new_width = target_width
29
+ new_height = int(target_width / aspect_ratio)
30
+ else: # Imagen vertical
31
+ new_height = target_height
32
+ new_width = int(target_height * aspect_ratio)
33
+
34
+ # Redimensionar la imagen
35
+ resized_img = image.resize((new_width, new_height), Image.LANCZOS)
36
+
37
+ return resized_img
38
+
39
+ # Cargar el modelo una vez para reutilizarlo en futuras invocaciones
40
+ net = BriaRMBG()
41
+ device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
42
+ net = BriaRMBG.from_pretrained("briaai/RMBG-1.4")
43
+ net.to(device)
44
+ net.eval()
45
+
46
+ @app.route(route="processimage")
47
+ def process_image(req: func.HttpRequest) -> func.HttpResponse:
48
+ logging.info('Python HTTP trigger function processed a request.')
49
+
50
+ try:
51
+ # Leer la imagen de entrada desde la solicitud
52
+ image_data = req.get_body()
53
+ input_image = Image.open(io.BytesIO(image_data))
54
+
55
+ # Redimensionar la imagen
56
+ resized_image = resize_image(input_image)
57
+
58
+ # Preparar la imagen redimensionada para el modelo
59
+ model_input_size = [1024, 1024]
60
+ image = preprocess_image(np.array(resized_image), model_input_size).to(device)
61
+
62
+ # Inferencia
63
+ result = net(image)
64
+
65
+ # Post-procesamiento
66
+ result_image = postprocess_image(result[0][0], input_image.size)
67
+
68
+ # Guardar el resultado
69
+ pil_im = Image.fromarray(result_image)
70
+
71
+ # Crear una nueva imagen en blanco
72
+ white_bg = Image.new("RGBA", (1440, 2560), (255, 255, 255, 255))
73
+
74
+ # Redimensionar la máscara para que coincida con las dimensiones de la imagen redimensionada
75
+ mask_resized = pil_im.resize(resized_image.size, Image.LANCZOS)
76
+
77
+ # Calcular la posición para centrar la imagen en el fondo blanco
78
+ x_offset = (white_bg.width - resized_image.width) // 2
79
+ y_offset = white_bg.height - resized_image.height - 100
80
+
81
+ # Pegar la imagen sin fondo en el fondo blanco
82
+ white_bg.paste(resized_image, (x_offset, y_offset), mask=mask_resized)
83
+
84
+ # Convertir la imagen resultante a bytes para la respuesta HTTP
85
+ output_buffer = io.BytesIO()
86
+ white_bg.save(output_buffer, format="PNG")
87
+ output_buffer.seek(0)
88
+
89
+ return func.HttpResponse(output_buffer.read(), mimetype="image/png")
90
+
91
+ except Exception as e:
92
+ logging.error(f"Error processing the image: {e}")
93
+ return func.HttpResponse(f"Error processing the image: {e}", status_code=500)
host.json ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "version": "2.0",
3
+ "logging": {
4
+ "applicationInsights": {
5
+ "samplingSettings": {
6
+ "isEnabled": true,
7
+ "excludedTypes": "Request"
8
+ }
9
+ }
10
+ },
11
+ "extensionBundle": {
12
+ "id": "Microsoft.Azure.Functions.ExtensionBundle",
13
+ "version": "[4.*, 5.0.0)"
14
+ }
15
+ }
local.settings.json ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "IsEncrypted": false,
3
+ "Values": {
4
+ "AzureWebJobsStorage": "",
5
+ "FUNCTIONS_WORKER_RUNTIME": "python",
6
+ "AzureWebJobsFeatureFlags": "EnableWorkerIndexing"
7
+ }
8
+ }
requirements.txt ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # DO NOT include azure-functions-worker in this file
2
+ # The Python Worker is managed by Azure Functions platform
3
+ # Manually managing azure-functions-worker may cause unexpected issues
4
+
5
+ azure-functions
6
+ azure-keyvault
7
+ azure-identity
8
+ confluent-kafka
9
+ fastavro
10
+ Pillow
11
+ bs4
12
+ msal
13
+ azure-storage-blob
14
+ snowflake-connector-python
15
+ pandas
16
+ torch
17
+ torchvision
18
+ pillow
19
+ numpy
20
+ typing
21
+ scikit-image
22
+ huggingface_hub
23
+ transformers