Kit-Hung commited on
Commit
67b9682
·
1 Parent(s): 67b32a2

Add: app files

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .gitattributes +2 -0
  2. app.py +121 -0
  3. demo/__init__.py +8 -0
  4. demo/agent.py +105 -0
  5. demo/bot.png +0 -0
  6. demo/food/14456664_117_IMG_8176.jpeg +3 -0
  7. demo/food/14456664_126_86838F28-912B-42A4-80C1-BD060B649081.jpeg +3 -0
  8. demo/food/14456664_127_1E703639-9169-4EB4-8A5D-3B1E226F639B.jpeg +3 -0
  9. demo/food/14456664_129_IMG_20220605_181308.jpg +3 -0
  10. demo/food/14456664_130_IMG_20220605_180820.jpg +3 -0
  11. demo/food/14456664_133_IMG_20220709_153436.jpg +3 -0
  12. demo/food/14456664_134_IMG_20220709_153652.jpg +3 -0
  13. demo/food/14456664_136_IMG_20220709_233905.jpg +3 -0
  14. demo/food/14456664_137_IMG_20220717_143941.jpg +3 -0
  15. demo/food/14456664_139_IMG_0917-EDIT.jpg +3 -0
  16. demo/food/14456664_141_IMG_1724.jpg +3 -0
  17. demo/food/14456664_147_IMG_20190225_184723.jpg +3 -0
  18. demo/food/14456664_149_IMG_20180812_182400.jpg +3 -0
  19. demo/food/14456664_14_IMG_20220721_150241.jpg +3 -0
  20. demo/food/14456664_150_IMG_20181218_190852.jpg +3 -0
  21. demo/food/14456664_153_IMG_20240411_102841.jpg +3 -0
  22. demo/food/14456664_155_IMG_20240403_094547.jpg +3 -0
  23. demo/food/14456664_158_IMG_20240416_141427.jpg +3 -0
  24. demo/food/14456664_159_IMG_20240416_140243.jpg +3 -0
  25. demo/food/14456664_187_mmexport1713446177339.jpg +3 -0
  26. demo/food/14456664_19_IMG_0395.jpeg +3 -0
  27. demo/food/14456664_201_mmexport1713452408322.jpg +3 -0
  28. demo/food/14456664_217_IMG_3854.jpeg +3 -0
  29. demo/food/14456664_22_IMG_20240404_135935.jpg +3 -0
  30. demo/food/14456664_236_IMG_4742.jpeg +3 -0
  31. demo/food/14456664_238_d370e16ff482d13a0718c6fb4cd7ffbb.jpeg +3 -0
  32. demo/food/14456664_239_mmexport1713518196678.jpg +3 -0
  33. demo/food/14456664_26_IMG_3472.jpeg +3 -0
  34. demo/food/14456664_34_IMG_0400.jpeg +3 -0
  35. demo/food/14456664_36_20240410160819.jpg +3 -0
  36. demo/food/14456664_40_IMG_20170613_190017.jpg +3 -0
  37. demo/food/14456664_41_IMG_20190216_124017.jpeg +3 -0
  38. demo/food/14456664_50_mmexport1712821641752.jpg +3 -0
  39. demo/food/14456664_61_mmexport1550554859117.jpg +3 -0
  40. demo/food/14456664_64_IMG_20240409_181047.jpg +3 -0
  41. demo/food/14456664_68_IMG_0971.jpeg +3 -0
  42. demo/food/14456664_70_IMG_0581.jpeg +3 -0
  43. demo/food/14456664_72_IMG_0618.jpeg +3 -0
  44. demo/food/14456664_80_IMG_6323.jpeg +3 -0
  45. demo/food/14456664_82_MVIMG_20240413_161454.jpeg +3 -0
  46. demo/food/14456664_87_IMG_5316.jpeg +3 -0
  47. demo/food/14456664_88_wx_camera_1712730236546.jpg +3 -0
  48. demo/food/14521898_108_IMG_6205.jpeg +3 -0
  49. demo/food/14521898_109_IMG_5997.jpeg +3 -0
  50. demo/food/14521898_112_IMG_3570.jpeg +3 -0
.gitattributes CHANGED
@@ -33,3 +33,5 @@ saved_model/**/* 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
 
 
 
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
36
+ *.jpeg filter=lfs diff=lfs merge=lfs -text
37
+ *.jpg filter=lfs diff=lfs merge=lfs -text
app.py ADDED
@@ -0,0 +1,121 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import random
3
+ import numpy as np
4
+ import torch
5
+ import torch.backends.cudnn as cudnn
6
+ import gradio as gr
7
+
8
+ from utils import load_json, init_logger
9
+ from demo import ConversationalAgent, CustomTheme
10
+ from download import download_model
11
+
12
+ FOOD_EXAMPLES = "demo/food_for_demo.json"
13
+ MODEL_PATH = "/home/user/lr35_ep10"
14
+ # MODEL_PATH = "/root/xtuner/work_dirs/internvl_v2_internlm2_2b_lora_finetune_food/lr35_ep10"
15
+ OUTPUT_PATH = "./outputs"
16
+
17
+ def setup_seeds():
18
+ seed = 42
19
+
20
+ random.seed(seed)
21
+ np.random.seed(seed)
22
+ torch.manual_seed(seed)
23
+
24
+ cudnn.benchmark = False
25
+ cudnn.deterministic = True
26
+
27
+
28
+ def main():
29
+ download_model(MODEL_PATH)
30
+ setup_seeds()
31
+ # logging
32
+ init_logger(OUTPUT_PATH)
33
+ # food examples
34
+ food_examples = load_json(FOOD_EXAMPLES)
35
+
36
+ agent = ConversationalAgent(model_path=MODEL_PATH,
37
+ outputs_dir=OUTPUT_PATH)
38
+
39
+ theme = CustomTheme()
40
+
41
+ titles = [
42
+ """<center><B><font face="Comic Sans MS" size=10>书生大模型实战营</font></B></center>""" ## Kalam:wght@700
43
+ """<center><B><font face="Courier" size=5>「进阶岛」InternVL 多模态模型部署微调实践</font></B></center>"""
44
+ ]
45
+
46
+ language = """Language: 中文 and English"""
47
+ with gr.Blocks(theme) as demo_chatbot:
48
+ for title in titles:
49
+ gr.Markdown(title)
50
+ # gr.Markdown(article)
51
+ gr.Markdown(language)
52
+
53
+ with gr.Row():
54
+ with gr.Column(scale=3):
55
+ start_btn = gr.Button("Start Chat", variant="primary", interactive=True)
56
+ clear_btn = gr.Button("Clear Context", interactive=False)
57
+ image = gr.Image(type="pil", interactive=False)
58
+ upload_btn = gr.Button("🖼️ Upload Image", interactive=False)
59
+
60
+ with gr.Accordion("Generation Settings"):
61
+ top_p = gr.Slider(minimum=0, maximum=1, step=0.1,
62
+ value=0.8,
63
+ interactive=True,
64
+ label='top-p value',
65
+ visible=True)
66
+
67
+ temperature = gr.Slider(minimum=0, maximum=1.5, step=0.1,
68
+ value=0.8,
69
+ interactive=True,
70
+ label='temperature',
71
+ visible=True)
72
+
73
+ with gr.Column(scale=7):
74
+ chat_state = gr.State()
75
+ chatbot = gr.Chatbot(label='InternVL2', height=800, avatar_images=((os.path.join(os.path.dirname(__file__), 'demo/user.png')), (os.path.join(os.path.dirname(__file__), "demo/bot.png"))))
76
+ text_input = gr.Textbox(label='User', placeholder="Please click the <Start Chat> button to start chat!", interactive=False)
77
+ gr.Markdown("### 输入示例")
78
+ def on_text_change(text):
79
+ return gr.update(interactive=True)
80
+ text_input.change(fn=on_text_change, inputs=text_input, outputs=text_input)
81
+ gr.Examples(
82
+ examples=[["图片中的食物通常属于哪个菜系?"],
83
+ ["如果让你简单形容一下品尝图片中的食物的滋味,你会描述它"],
84
+ ["去哪个地方游玩时应该品尝当地的特色美食图片中的食物?"],
85
+ ["食用图片中的食物时,一般它上菜或摆盘时的特点是?"]],
86
+ inputs=[text_input]
87
+ )
88
+
89
+ with gr.Row():
90
+ gr.Markdown("### 食物快捷栏")
91
+ with gr.Row():
92
+ example_xinjiang_food = gr.Examples(examples=food_examples["新疆菜"], inputs=image, label="新疆菜")
93
+ example_sichuan_food = gr.Examples(examples=food_examples["川菜(四川,重庆)"], inputs=image, label="川菜(四川,重庆)")
94
+ example_xibei_food = gr.Examples(examples=food_examples["西北菜 (陕西,甘肃等地)"], inputs=image, label="西北菜 (陕西,甘肃等地)")
95
+ with gr.Row():
96
+ example_guizhou_food = gr.Examples(examples=food_examples["黔菜 (贵州)"], inputs=image, label="黔菜 (贵州)")
97
+ example_jiangsu_food = gr.Examples(examples=food_examples["苏菜(江苏)"], inputs=image, label="苏菜(江苏)")
98
+ example_guangdong_food = gr.Examples(examples=food_examples["粤菜(广东等地)"], inputs=image, label="粤菜(广东等地)")
99
+ with gr.Row():
100
+ example_hunan_food = gr.Examples(examples=food_examples["湘菜(湖南)"], inputs=image, label="湘菜(湖南)")
101
+ example_fujian_food = gr.Examples(examples=food_examples["闽菜(福建)"], inputs=image, label="闽菜(福建)")
102
+ example_zhejiang_food = gr.Examples(examples=food_examples["浙菜(浙江)"], inputs=image, label="浙菜(浙江)")
103
+ with gr.Row():
104
+ example_dongbei_food = gr.Examples(examples=food_examples["东北菜 (黑龙江等地)"], inputs=image, label="东北菜 (黑龙江等地)")
105
+
106
+
107
+ start_btn.click(agent.start_chat, [chat_state], [text_input, start_btn, clear_btn, image, upload_btn, chat_state])
108
+ clear_btn.click(agent.restart_chat, [chat_state], [chatbot, text_input, start_btn, clear_btn, image, upload_btn, chat_state], queue=False)
109
+ upload_btn.click(agent.upload_image, [image, chatbot, chat_state], [image, chatbot, chat_state])
110
+ text_input.submit(
111
+ agent.respond,
112
+ inputs=[text_input, image, chatbot, top_p, temperature, chat_state],
113
+ outputs=[text_input, image, chatbot, chat_state]
114
+ )
115
+
116
+ demo_chatbot.launch(share=True, server_name="127.0.0.1", server_port=1096, allowed_paths=['./'])
117
+ demo_chatbot.queue()
118
+
119
+
120
+ if __name__ == "__main__":
121
+ main()
demo/__init__.py ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ from demo.agent import ConversationalAgent
2
+ from demo.theme import CustomTheme
3
+
4
+
5
+ __all__ = [
6
+ "ConversationalAgent",
7
+ "CustomTheme",
8
+ ]
demo/agent.py ADDED
@@ -0,0 +1,105 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import logging
3
+ from datetime import datetime
4
+
5
+ import gradio as gr
6
+ from PIL import Image
7
+
8
+ from lmdeploy import pipeline, TurbomindEngineConfig, GenerationConfig, ChatTemplateConfig
9
+ from lmdeploy.vl import load_image
10
+
11
+ class ConversationalAgent:
12
+ def __init__(self,
13
+ model_path,
14
+ outputs_dir) -> None:
15
+ self.pipe = pipeline(model_path,
16
+ chat_template_config=ChatTemplateConfig(model_name='internvl2-internlm2'),
17
+ backend_config=TurbomindEngineConfig(session_len=8192))
18
+ self.uploaded_images_storage = os.path.join(outputs_dir, "uploaded")
19
+ self.uploaded_images_storage = os.path.abspath(self.uploaded_images_storage)
20
+ os.makedirs(self.uploaded_images_storage, exist_ok=True)
21
+ self.sess = None
22
+
23
+ def start_chat(self, chat_state):
24
+ self.sess = None
25
+ self.context = ""
26
+ self.current_image_id = -1
27
+ self.image_list = []
28
+ self.pixel_values_list = []
29
+ self.seen_image_idx = []
30
+ logging.info("=" * 30 + "Start Chat" + "=" * 30)
31
+
32
+ return (
33
+ #gr.update(interactive=False), # [image] Image
34
+ gr.update(interactive=True, placeholder='input the text.'), # [input_text] Textbox
35
+ gr.update(interactive=False), # [start_btn] Button
36
+ gr.update(interactive=True), # [clear_btn] Button
37
+ gr.update(interactive=True), # [image] Image
38
+ gr.update(interactive=True), # [upload_btn] Button
39
+ chat_state # [chat_state] State
40
+ )
41
+
42
+ def restart_chat(self, chat_state):
43
+ self.sess = None
44
+ self.context = ""
45
+ self.current_image_id = -1
46
+ self.image_list = []
47
+ self.pixel_values_list = []
48
+ self.seen_image_idx = []
49
+
50
+ logging.info("=" * 30 + "End Chat" + "=" * 30)
51
+
52
+ return (
53
+ None, # [chatbot] Chatbot
54
+ #gr.update(value=None, interactive=True), # [image] Image
55
+ gr.update(interactive=False, placeholder="Please click the <Start Chat> button to start chat!"), # [input_text] Textbox
56
+ gr.update(interactive=True), # [start] Button
57
+ gr.update(interactive=False), # [clear] Button
58
+ gr.update(value=None, interactive=False), # [image] Image
59
+ gr.update(interactive=False), # [upload_btn] Button
60
+ chat_state # [chat_state] State
61
+ )
62
+
63
+ def upload_image(self, image: Image.Image, chat_history: gr.Chatbot, chat_state: gr.State):
64
+ logging.info(f"type(image): {type(image)}")
65
+
66
+ self.image_list.append(image)
67
+ save_image_path = os.path.join(self.uploaded_images_storage, "{}.jpg".format(len(os.listdir(self.uploaded_images_storage))))
68
+ image.save(save_image_path)
69
+ logging.info(f"image save path: {save_image_path}")
70
+ chat_history.append((gr.HTML(f'<img src="./file={save_image_path}" style="width: 200px; height: auto; display: inline-block;">'), "Received."))
71
+
72
+ return None, chat_history, chat_state
73
+
74
+ def respond(
75
+ self,
76
+ message,
77
+ image,
78
+ chat_history: gr.Chatbot,
79
+ top_p,
80
+ temperature,
81
+ chat_state,
82
+ ):
83
+ current_time = datetime.now().strftime("%b%d-%H:%M:%S")
84
+ logging.info(f"Time: {current_time}")
85
+ logging.info(f"User: {message}")
86
+ gen_config = GenerationConfig(top_p=top_p, temperature=temperature)
87
+ chat_input = message
88
+ if image is not None:
89
+ save_image_path = os.path.join(self.uploaded_images_storage, "{}.jpg".format(len(os.listdir(self.uploaded_images_storage))))
90
+ image.save(save_image_path)
91
+ logging.info(f"image save path: {save_image_path}")
92
+ chat_input = (message, image)
93
+ if self.sess is None:
94
+ self.sess = self.pipe.chat(chat_input, gen_config=gen_config)
95
+ else:
96
+ self.sess = self.pipe.chat(chat_input, session=self.sess, gen_config=gen_config)
97
+ response = self.sess.response.text
98
+ if image is not None:
99
+ chat_history.append((gr.HTML(f'{message}\n\n<img src="./file={save_image_path}" style="width: 200px; height: auto; display: inline-block;">'), response))
100
+ else:
101
+ chat_history.append((message, response))
102
+
103
+ logging.info(f"generated text = \n{response}")
104
+
105
+ return "", None, chat_history, chat_state
demo/bot.png ADDED
demo/food/14456664_117_IMG_8176.jpeg ADDED

Git LFS Details

  • SHA256: f844ef4ef78a325596a63ab702dafa0a67781348de8c12b58b9a9b655953ade1
  • Pointer size: 132 Bytes
  • Size of remote file: 2.64 MB
demo/food/14456664_126_86838F28-912B-42A4-80C1-BD060B649081.jpeg ADDED

Git LFS Details

  • SHA256: 06ebc9fd2df563eff214f4ead5899a63453d58f2e8db601efd0dc7bfce6240c8
  • Pointer size: 131 Bytes
  • Size of remote file: 670 kB
demo/food/14456664_127_1E703639-9169-4EB4-8A5D-3B1E226F639B.jpeg ADDED

Git LFS Details

  • SHA256: ad9fa9010a5731ac6c0870bf2a572c406f0954b7d3bf3b5ca1f63c78863e7762
  • Pointer size: 132 Bytes
  • Size of remote file: 1.9 MB
demo/food/14456664_129_IMG_20220605_181308.jpg ADDED

Git LFS Details

  • SHA256: 3a75dbdbee1d04c2fddc9dfd15aa348e3ab7e5705e5df0d5412e03e7f6c1126f
  • Pointer size: 131 Bytes
  • Size of remote file: 241 kB
demo/food/14456664_130_IMG_20220605_180820.jpg ADDED

Git LFS Details

  • SHA256: 9da741e1ddcf0164d29a8ec3020ddde79a2d569317eccf931d672561de03e6e0
  • Pointer size: 131 Bytes
  • Size of remote file: 393 kB
demo/food/14456664_133_IMG_20220709_153436.jpg ADDED

Git LFS Details

  • SHA256: 3d0a567a6562627b510c8597054b034399e66ee158652556457679e3a32ab67a
  • Pointer size: 131 Bytes
  • Size of remote file: 296 kB
demo/food/14456664_134_IMG_20220709_153652.jpg ADDED

Git LFS Details

  • SHA256: e6a33e552f1b4b82820efceca61e6f5fbcf8b6f04b7c4702e2dc2d2104344a94
  • Pointer size: 131 Bytes
  • Size of remote file: 287 kB
demo/food/14456664_136_IMG_20220709_233905.jpg ADDED

Git LFS Details

  • SHA256: 1c0847da9ff6969504a573d4f2fbebb20806ef142eb5b4f654cdbb0b2f189ad3
  • Pointer size: 131 Bytes
  • Size of remote file: 300 kB
demo/food/14456664_137_IMG_20220717_143941.jpg ADDED

Git LFS Details

  • SHA256: d39fd75cd973ba049c8e48cb6e8810a29ece1933fc2886e94051795c1ddac039
  • Pointer size: 130 Bytes
  • Size of remote file: 49.4 kB
demo/food/14456664_139_IMG_0917-EDIT.jpg ADDED

Git LFS Details

  • SHA256: fa6ff8d6d24295936d79da35567a64e5c529987a5ad3164a5c78773fbed4546e
  • Pointer size: 131 Bytes
  • Size of remote file: 436 kB
demo/food/14456664_141_IMG_1724.jpg ADDED

Git LFS Details

  • SHA256: d7acfe317622763de4c6a15eb8eb8ebc52641b112eb9378e5b4cf7bbf00fb78f
  • Pointer size: 131 Bytes
  • Size of remote file: 392 kB
demo/food/14456664_147_IMG_20190225_184723.jpg ADDED

Git LFS Details

  • SHA256: 69b3ffae82beddaefaaa20013e0c456a2704d11febd4d181166930fdabb29941
  • Pointer size: 131 Bytes
  • Size of remote file: 433 kB
demo/food/14456664_149_IMG_20180812_182400.jpg ADDED

Git LFS Details

  • SHA256: 10ca4bb4e5f74b1ca9c91b6fa0d0378fee2e401cf1b2edf3549824c46c6946a9
  • Pointer size: 131 Bytes
  • Size of remote file: 449 kB
demo/food/14456664_14_IMG_20220721_150241.jpg ADDED

Git LFS Details

  • SHA256: df1c0a0fa513ed03b735318e47c7393a7761bf46a33ab60b9f9d3898355e71e2
  • Pointer size: 132 Bytes
  • Size of remote file: 3.95 MB
demo/food/14456664_150_IMG_20181218_190852.jpg ADDED

Git LFS Details

  • SHA256: e0c200875162c1bb47cc76cc4df5f4c101deb7828e2522b15d9a97fcc414e52f
  • Pointer size: 131 Bytes
  • Size of remote file: 133 kB
demo/food/14456664_153_IMG_20240411_102841.jpg ADDED

Git LFS Details

  • SHA256: 2b151c68460ea7bc0fc85d91535a2bc94ed88dcf4d761046d2a37722c5bfa5f5
  • Pointer size: 132 Bytes
  • Size of remote file: 1.93 MB
demo/food/14456664_155_IMG_20240403_094547.jpg ADDED

Git LFS Details

  • SHA256: 65b3e7f66dbace96b3f790e17c38abedddfa07bf886e1d5c8159feb30352e5b6
  • Pointer size: 132 Bytes
  • Size of remote file: 2.27 MB
demo/food/14456664_158_IMG_20240416_141427.jpg ADDED

Git LFS Details

  • SHA256: f622069e0add72f4e778af7c223922a66dc1478ed13a1458dd3455ae3fe04495
  • Pointer size: 132 Bytes
  • Size of remote file: 2.9 MB
demo/food/14456664_159_IMG_20240416_140243.jpg ADDED

Git LFS Details

  • SHA256: ce5bf8987b1bb99fb874a8ba8043952c2a03d6593d28447d44f09d4814402124
  • Pointer size: 132 Bytes
  • Size of remote file: 2.81 MB
demo/food/14456664_187_mmexport1713446177339.jpg ADDED

Git LFS Details

  • SHA256: a8fa2b9fe1ef98e53d61be59061e848e7338b09e5d3f8e01fb376b877698461b
  • Pointer size: 132 Bytes
  • Size of remote file: 1 MB
demo/food/14456664_19_IMG_0395.jpeg ADDED

Git LFS Details

  • SHA256: d3776a76f3612ab93123499a7fdb8bfabaad2596ee76eca754f4806fd404bc89
  • Pointer size: 132 Bytes
  • Size of remote file: 3.11 MB
demo/food/14456664_201_mmexport1713452408322.jpg ADDED

Git LFS Details

  • SHA256: 365ccc24ca44b9d8546d97605761989d2935e67025f373831354a57da1bdcf98
  • Pointer size: 131 Bytes
  • Size of remote file: 238 kB
demo/food/14456664_217_IMG_3854.jpeg ADDED

Git LFS Details

  • SHA256: d6ee11d0137ab40d9c1bf743535cbd163e00c6de5fd69022febfd55a4abae610
  • Pointer size: 132 Bytes
  • Size of remote file: 4.98 MB
demo/food/14456664_22_IMG_20240404_135935.jpg ADDED

Git LFS Details

  • SHA256: f4f79f735255036164c0dac6d5cff946ef36a765eeed815992e437a1f48aa12b
  • Pointer size: 132 Bytes
  • Size of remote file: 3.19 MB
demo/food/14456664_236_IMG_4742.jpeg ADDED

Git LFS Details

  • SHA256: a25050eff6c82d7dac7cbd2fb7e37eec886867b512e6ea0390c40cf7ca961338
  • Pointer size: 132 Bytes
  • Size of remote file: 2.4 MB
demo/food/14456664_238_d370e16ff482d13a0718c6fb4cd7ffbb.jpeg ADDED

Git LFS Details

  • SHA256: 3b8182676f499655879850b38d108ffa81881ae7c878777e96a63f423a72b605
  • Pointer size: 131 Bytes
  • Size of remote file: 704 kB
demo/food/14456664_239_mmexport1713518196678.jpg ADDED

Git LFS Details

  • SHA256: 32ae6844d6c04457eb7196108cd962fcd35f77db64c92698feb391f28e244b8e
  • Pointer size: 130 Bytes
  • Size of remote file: 34.8 kB
demo/food/14456664_26_IMG_3472.jpeg ADDED

Git LFS Details

  • SHA256: b5ac1b45da6de71b4bcf695e50f08ccad6721045ddbec5393fe56e081c17814e
  • Pointer size: 131 Bytes
  • Size of remote file: 311 kB
demo/food/14456664_34_IMG_0400.jpeg ADDED

Git LFS Details

  • SHA256: 7fd191af0a76621edeb10abe04cc952bb03c761b2abc733e5fe5474639d7b0e2
  • Pointer size: 132 Bytes
  • Size of remote file: 1.81 MB
demo/food/14456664_36_20240410160819.jpg ADDED

Git LFS Details

  • SHA256: 575aa53664ae110f9e1d9e860f649434740f83ca4cebdfbef2e083ed561c2eaf
  • Pointer size: 131 Bytes
  • Size of remote file: 412 kB
demo/food/14456664_40_IMG_20170613_190017.jpg ADDED

Git LFS Details

  • SHA256: d813465ccf81c04c65d7dbab663b2948ac4298e31bda62d0bd0df5dcb90e539d
  • Pointer size: 132 Bytes
  • Size of remote file: 3.05 MB
demo/food/14456664_41_IMG_20190216_124017.jpeg ADDED

Git LFS Details

  • SHA256: 7ec209e48887d6964aff74b0b6355f913618294ed14e6c5ca377b6fcfbc2672d
  • Pointer size: 131 Bytes
  • Size of remote file: 855 kB
demo/food/14456664_50_mmexport1712821641752.jpg ADDED

Git LFS Details

  • SHA256: a30c7e646104481d6f4e9fa95ebb9c8921c817aebde6edb810ce6d6759928826
  • Pointer size: 131 Bytes
  • Size of remote file: 280 kB
demo/food/14456664_61_mmexport1550554859117.jpg ADDED

Git LFS Details

  • SHA256: d95fbbf0cce24c3a8779a87216e4ece91af058b443129696405e7384705b9037
  • Pointer size: 132 Bytes
  • Size of remote file: 2.25 MB
demo/food/14456664_64_IMG_20240409_181047.jpg ADDED

Git LFS Details

  • SHA256: 070c656fa584ccf2331c37fa4e780381bab3b0d808aea54cba406fd66b7735bb
  • Pointer size: 132 Bytes
  • Size of remote file: 2.68 MB
demo/food/14456664_68_IMG_0971.jpeg ADDED

Git LFS Details

  • SHA256: 1ae462fcb5b73a7c228ee775b08fe84827a383e9f663e2c31c1ef4c086a67c03
  • Pointer size: 132 Bytes
  • Size of remote file: 2.79 MB
demo/food/14456664_70_IMG_0581.jpeg ADDED

Git LFS Details

  • SHA256: 05a32a6d8ce58c42a4ba4e852fabc9b326b1b66937ade06ed0251ea6408f4571
  • Pointer size: 132 Bytes
  • Size of remote file: 1.81 MB
demo/food/14456664_72_IMG_0618.jpeg ADDED

Git LFS Details

  • SHA256: 57b49b974c7b966ac2042e4efa506c5b55a9e6038ba7f1bb76434a97b5e06fe7
  • Pointer size: 132 Bytes
  • Size of remote file: 2.48 MB
demo/food/14456664_80_IMG_6323.jpeg ADDED

Git LFS Details

  • SHA256: 7a71fe70bfd223397ab7f0af42159ac501d787d99bbbbf61165b2f11e6f6ba0a
  • Pointer size: 132 Bytes
  • Size of remote file: 3.67 MB
demo/food/14456664_82_MVIMG_20240413_161454.jpeg ADDED

Git LFS Details

  • SHA256: 7aaa672bd3f064c88077e0a04a4b9d7d6b98e2aaefb57fba546ada09f03dc2bb
  • Pointer size: 131 Bytes
  • Size of remote file: 803 kB
demo/food/14456664_87_IMG_5316.jpeg ADDED

Git LFS Details

  • SHA256: beadadd5d26749545b59159f8914f4a6ca9602f9a37c18f9ae6d578c62717eec
  • Pointer size: 132 Bytes
  • Size of remote file: 3.14 MB
demo/food/14456664_88_wx_camera_1712730236546.jpg ADDED

Git LFS Details

  • SHA256: cdc6b744e764770bff3cf73f7fb9bbe1424f88e59b4e22bb238c8765aec90483
  • Pointer size: 132 Bytes
  • Size of remote file: 1.29 MB
demo/food/14521898_108_IMG_6205.jpeg ADDED

Git LFS Details

  • SHA256: 575cc946cb96af9bf5bece1fcda3eaf6a17dab7ba28f127d0573b068cfd4d9c0
  • Pointer size: 132 Bytes
  • Size of remote file: 2.62 MB
demo/food/14521898_109_IMG_5997.jpeg ADDED

Git LFS Details

  • SHA256: ba100e072a5fc01aa755087c2f3a5edc6e7e622fc7f6d3ba5b40f92b7e1476f3
  • Pointer size: 132 Bytes
  • Size of remote file: 3.54 MB
demo/food/14521898_112_IMG_3570.jpeg ADDED

Git LFS Details

  • SHA256: ac8006a805982d44946da2574bdf9fff99fa1d592aa5e6eb86dfd9fd1b68f1a5
  • Pointer size: 132 Bytes
  • Size of remote file: 2.76 MB