Haoming02 commited on
Commit
83e4a81
·
verified ·
1 Parent(s): edf12c1
Files changed (4) hide show
  1. .gitattributes +35 -35
  2. README.md +19 -13
  3. app.py +157 -49
  4. requirements.txt +4 -0
.gitattributes CHANGED
@@ -1,35 +1,35 @@
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
+ *.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
README.md CHANGED
@@ -1,13 +1,19 @@
1
- ---
2
- title: Hello World
3
- emoji: 🦀
4
- colorFrom: blue
5
- colorTo: yellow
6
- sdk: gradio
7
- sdk_version: 4.42.0
8
- app_file: app.py
9
- pinned: false
10
- license: cc-by-nc-sa-4.0
11
- ---
12
-
13
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
1
+ ---
2
+ title: Hello World
3
+ emoji: 🚀
4
+ colorFrom: blue
5
+ colorTo: yellow
6
+ sdk: gradio
7
+ sdk_version: 4.42.0
8
+ app_file: app.py
9
+ pinned: false
10
+ license: cc-by-nc-sa-4.0
11
+ ---
12
+
13
+ > Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
14
+
15
+ <!--- Actual README --->
16
+
17
+ # Hello World
18
+
19
+ This is just a project for me to learn how HuggingFace Spaces works, and how to use inference with Spaces via API...
app.py CHANGED
@@ -1,49 +1,157 @@
1
- import gradio as gr
2
-
3
-
4
- def greet(name: str) -> str:
5
-
6
- if not name.strip():
7
- return gr.update()
8
-
9
- return f"Hello, {name.capitalize()}!"
10
-
11
-
12
- with gr.Blocks() as demo:
13
-
14
- gr.Markdown("""<h1 align="center">Hello World</h1>""")
15
- gr.Markdown("""<p align="center">Typing whatever you want to greet below:</p>""")
16
-
17
- with gr.Row():
18
-
19
- user_input = gr.Textbox(
20
- value="",
21
- label="name",
22
- show_label=False,
23
- lines=1,
24
- max_lines=1,
25
- interactive=True,
26
- placeholder="World",
27
- )
28
-
29
- text_output = gr.Textbox(
30
- value="",
31
- label="output",
32
- show_label=False,
33
- lines=1,
34
- max_lines=1,
35
- interactive=False,
36
- )
37
-
38
- btn = gr.Button("Run")
39
- btn.click(
40
- fn=greet,
41
- inputs=[user_input],
42
- outputs=[text_output],
43
- show_progress="hidden",
44
- show_api=True,
45
- api_name="main",
46
- )
47
-
48
-
49
- demo.launch()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # === Included SDK === #
2
+ import gradio as gr
3
+
4
+ # === Installed from requirements.txt === #
5
+ from PIL import Image
6
+ import numpy as np
7
+ import torch
8
+
9
+ # === Python built-in === #
10
+ import sys
11
+ import os
12
+
13
+ # ============================================================ #
14
+ # Q: Why use gr.Blocks instead of gr.Interface? #
15
+ # A: Only Blocks supports Layouts (and I'm more used to this) #
16
+ # ============================================================ #
17
+ with gr.Blocks() as demo:
18
+
19
+ # ======================================== #
20
+ # Markdown is pointless in API usage... XD #
21
+ # ======================================== #
22
+ gr.Markdown("""<h1 align="center">Hello World</h1>""")
23
+ gr.Markdown("""<p align="center">For <b>learning</b> purposes only...</p>""")
24
+
25
+ # ====================================== #
26
+ # function name is overrides by api_name #
27
+ # ====================================== #
28
+ def log() -> str:
29
+ info: list[str] = []
30
+ info.append(f"OS: {os.name}")
31
+ info.append(f"Python: {sys.version.split(' ', 1)[0]}")
32
+ info.append(f"CUDA: {torch.cuda.is_available()}")
33
+
34
+ return "\n".join(info)
35
+
36
+ def proc_image(
37
+ img: np.ndarray, target_w: int, target_h: int
38
+ ) -> list[str, Image.Image]:
39
+
40
+ input_h, input_w, channels = img.shape
41
+
42
+ log = f"Resize a {input_w}x{input_h} image to {target_w}x{target_h}..."
43
+
44
+ image = Image.fromarray(img)
45
+ image = image.resize((target_w, target_h))
46
+
47
+ return [log, image]
48
+
49
+ with gr.Row():
50
+
51
+ with gr.Column():
52
+
53
+ # ============================= #
54
+ # Images take base64 str in API #
55
+ # ============================= #
56
+
57
+ input_image = gr.Image(
58
+ value=None,
59
+ image_mode="RGB",
60
+ sources="upload",
61
+ type="numpy",
62
+ label="Input",
63
+ show_label=True,
64
+ show_download_button=False,
65
+ container=False,
66
+ visible=True,
67
+ interactive=True,
68
+ show_share_button=False,
69
+ show_fullscreen_button=False,
70
+ )
71
+
72
+ with gr.Row():
73
+ target_w = gr.Slider(
74
+ minimum=1,
75
+ maximum=1024,
76
+ step=1,
77
+ value=512,
78
+ label="width",
79
+ show_label=True,
80
+ container=False,
81
+ interactive=True,
82
+ )
83
+
84
+ target_h = gr.Slider(
85
+ minimum=1,
86
+ maximum=1024,
87
+ step=1,
88
+ value=512,
89
+ label="width",
90
+ show_label=True,
91
+ container=False,
92
+ interactive=True,
93
+ )
94
+
95
+ output_image = gr.Image(
96
+ value=None,
97
+ image_mode="RGB",
98
+ sources="upload",
99
+ type="pil",
100
+ label="Output",
101
+ show_label=True,
102
+ show_download_button=False,
103
+ container=False,
104
+ visible=True,
105
+ interactive=False,
106
+ show_share_button=False,
107
+ show_fullscreen_button=False,
108
+ )
109
+
110
+ btn1 = gr.Button("Resize", container=False)
111
+
112
+ with gr.Column():
113
+
114
+ # ============================= #
115
+ # Buttons do not show up in API #
116
+ # ============================= #
117
+
118
+ btn2 = gr.Button("Print Info", container=False)
119
+
120
+ # ==================================== #
121
+ # label is shown in the returns in API #
122
+ # ==================================== #
123
+
124
+ console_logs = gr.Text(
125
+ value="...",
126
+ label="Logs",
127
+ show_label=True,
128
+ lines=1,
129
+ max_lines=8,
130
+ interactive=False,
131
+ container=True,
132
+ )
133
+
134
+ # =================================== #
135
+ # api_name is used as endpoint in API #
136
+ # =================================== #
137
+
138
+ btn1.click(
139
+ fn=proc_image,
140
+ inputs=[input_image, target_w, target_h],
141
+ outputs=[console_logs, output_image],
142
+ show_progress="hidden",
143
+ show_api=True,
144
+ api_name="resizeImage",
145
+ )
146
+
147
+ btn2.click(
148
+ fn=log,
149
+ inputs=None,
150
+ outputs=console_logs,
151
+ show_progress="hidden",
152
+ show_api=True,
153
+ api_name="systemInfo",
154
+ )
155
+
156
+
157
+ demo.launch()
requirements.txt ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ torch~=2.4.0
2
+ Pillow~=10.1.0
3
+ opencv-python~=4.8.0
4
+ numpy