diff --git a/.gitattributes b/.gitattributes
index a6344aac8c09253b3b630fb776ae94478aa0275b..ff4fb52b945713da7c3ea32d08ad355a44ded8a2 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -33,3 +33,5 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
*.zip filter=lfs diff=lfs merge=lfs -text
*.zst filter=lfs diff=lfs merge=lfs -text
*tfevents* filter=lfs diff=lfs merge=lfs -text
+*.jpeg filter=lfs diff=lfs merge=lfs -text
+*.jpg filter=lfs diff=lfs merge=lfs -text
diff --git a/app.py b/app.py
new file mode 100644
index 0000000000000000000000000000000000000000..3361b114c533459a27b068226a86b46f89fb8d2e
--- /dev/null
+++ b/app.py
@@ -0,0 +1,121 @@
+import os
+import random
+import numpy as np
+import torch
+import torch.backends.cudnn as cudnn
+import gradio as gr
+
+from utils import load_json, init_logger
+from demo import ConversationalAgent, CustomTheme
+from download import download_model
+
+FOOD_EXAMPLES = "demo/food_for_demo.json"
+MODEL_PATH = "/home/user/lr35_ep10"
+# MODEL_PATH = "/root/xtuner/work_dirs/internvl_v2_internlm2_2b_lora_finetune_food/lr35_ep10"
+OUTPUT_PATH = "./outputs"
+
+def setup_seeds():
+ seed = 42
+
+ random.seed(seed)
+ np.random.seed(seed)
+ torch.manual_seed(seed)
+
+ cudnn.benchmark = False
+ cudnn.deterministic = True
+
+
+def main():
+ download_model(MODEL_PATH)
+ setup_seeds()
+ # logging
+ init_logger(OUTPUT_PATH)
+ # food examples
+ food_examples = load_json(FOOD_EXAMPLES)
+
+ agent = ConversationalAgent(model_path=MODEL_PATH,
+ outputs_dir=OUTPUT_PATH)
+
+ theme = CustomTheme()
+
+ titles = [
+ """
书生大模型实战营""" ## Kalam:wght@700
+ """「进阶岛」InternVL 多模态模型部署微调实践"""
+ ]
+
+ language = """Language: 中文 and English"""
+ with gr.Blocks(theme) as demo_chatbot:
+ for title in titles:
+ gr.Markdown(title)
+ # gr.Markdown(article)
+ gr.Markdown(language)
+
+ with gr.Row():
+ with gr.Column(scale=3):
+ start_btn = gr.Button("Start Chat", variant="primary", interactive=True)
+ clear_btn = gr.Button("Clear Context", interactive=False)
+ image = gr.Image(type="pil", interactive=False)
+ upload_btn = gr.Button("🖼️ Upload Image", interactive=False)
+
+ with gr.Accordion("Generation Settings"):
+ top_p = gr.Slider(minimum=0, maximum=1, step=0.1,
+ value=0.8,
+ interactive=True,
+ label='top-p value',
+ visible=True)
+
+ temperature = gr.Slider(minimum=0, maximum=1.5, step=0.1,
+ value=0.8,
+ interactive=True,
+ label='temperature',
+ visible=True)
+
+ with gr.Column(scale=7):
+ chat_state = gr.State()
+ 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"))))
+ text_input = gr.Textbox(label='User', placeholder="Please click the button to start chat!", interactive=False)
+ gr.Markdown("### 输入示例")
+ def on_text_change(text):
+ return gr.update(interactive=True)
+ text_input.change(fn=on_text_change, inputs=text_input, outputs=text_input)
+ gr.Examples(
+ examples=[["图片中的食物通常属于哪个菜系?"],
+ ["如果让你简单形容一下品尝图片中的食物的滋味,你会描述它"],
+ ["去哪个地方游玩时应该品尝当地的特色美食图片中的食物?"],
+ ["食用图片中的食物时,一般它上菜或摆盘时的特点是?"]],
+ inputs=[text_input]
+ )
+
+ with gr.Row():
+ gr.Markdown("### 食物快捷栏")
+ with gr.Row():
+ example_xinjiang_food = gr.Examples(examples=food_examples["新疆菜"], inputs=image, label="新疆菜")
+ example_sichuan_food = gr.Examples(examples=food_examples["川菜(四川,重庆)"], inputs=image, label="川菜(四川,重庆)")
+ example_xibei_food = gr.Examples(examples=food_examples["西北菜 (陕西,甘肃等地)"], inputs=image, label="西北菜 (陕西,甘肃等地)")
+ with gr.Row():
+ example_guizhou_food = gr.Examples(examples=food_examples["黔菜 (贵州)"], inputs=image, label="黔菜 (贵州)")
+ example_jiangsu_food = gr.Examples(examples=food_examples["苏菜(江苏)"], inputs=image, label="苏菜(江苏)")
+ example_guangdong_food = gr.Examples(examples=food_examples["粤菜(广东等地)"], inputs=image, label="粤菜(广东等地)")
+ with gr.Row():
+ example_hunan_food = gr.Examples(examples=food_examples["湘菜(湖南)"], inputs=image, label="湘菜(湖南)")
+ example_fujian_food = gr.Examples(examples=food_examples["闽菜(福建)"], inputs=image, label="闽菜(福建)")
+ example_zhejiang_food = gr.Examples(examples=food_examples["浙菜(浙江)"], inputs=image, label="浙菜(浙江)")
+ with gr.Row():
+ example_dongbei_food = gr.Examples(examples=food_examples["东北菜 (黑龙江等地)"], inputs=image, label="东北菜 (黑龙江等地)")
+
+
+ start_btn.click(agent.start_chat, [chat_state], [text_input, start_btn, clear_btn, image, upload_btn, chat_state])
+ clear_btn.click(agent.restart_chat, [chat_state], [chatbot, text_input, start_btn, clear_btn, image, upload_btn, chat_state], queue=False)
+ upload_btn.click(agent.upload_image, [image, chatbot, chat_state], [image, chatbot, chat_state])
+ text_input.submit(
+ agent.respond,
+ inputs=[text_input, image, chatbot, top_p, temperature, chat_state],
+ outputs=[text_input, image, chatbot, chat_state]
+ )
+
+ demo_chatbot.launch(share=True, server_name="127.0.0.1", server_port=1096, allowed_paths=['./'])
+ demo_chatbot.queue()
+
+
+if __name__ == "__main__":
+ main()
\ No newline at end of file
diff --git a/demo/__init__.py b/demo/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..743e4ac650cd862cafd3e1fa880896933afdb26b
--- /dev/null
+++ b/demo/__init__.py
@@ -0,0 +1,8 @@
+from demo.agent import ConversationalAgent
+from demo.theme import CustomTheme
+
+
+__all__ = [
+ "ConversationalAgent",
+ "CustomTheme",
+]
\ No newline at end of file
diff --git a/demo/agent.py b/demo/agent.py
new file mode 100644
index 0000000000000000000000000000000000000000..2b98b7e9dcbd6e0d2d67cb830031a85ea75c4f89
--- /dev/null
+++ b/demo/agent.py
@@ -0,0 +1,105 @@
+import os
+import logging
+from datetime import datetime
+
+import gradio as gr
+from PIL import Image
+
+from lmdeploy import pipeline, TurbomindEngineConfig, GenerationConfig, ChatTemplateConfig
+from lmdeploy.vl import load_image
+
+class ConversationalAgent:
+ def __init__(self,
+ model_path,
+ outputs_dir) -> None:
+ self.pipe = pipeline(model_path,
+ chat_template_config=ChatTemplateConfig(model_name='internvl2-internlm2'),
+ backend_config=TurbomindEngineConfig(session_len=8192))
+ self.uploaded_images_storage = os.path.join(outputs_dir, "uploaded")
+ self.uploaded_images_storage = os.path.abspath(self.uploaded_images_storage)
+ os.makedirs(self.uploaded_images_storage, exist_ok=True)
+ self.sess = None
+
+ def start_chat(self, chat_state):
+ self.sess = None
+ self.context = ""
+ self.current_image_id = -1
+ self.image_list = []
+ self.pixel_values_list = []
+ self.seen_image_idx = []
+ logging.info("=" * 30 + "Start Chat" + "=" * 30)
+
+ return (
+ #gr.update(interactive=False), # [image] Image
+ gr.update(interactive=True, placeholder='input the text.'), # [input_text] Textbox
+ gr.update(interactive=False), # [start_btn] Button
+ gr.update(interactive=True), # [clear_btn] Button
+ gr.update(interactive=True), # [image] Image
+ gr.update(interactive=True), # [upload_btn] Button
+ chat_state # [chat_state] State
+ )
+
+ def restart_chat(self, chat_state):
+ self.sess = None
+ self.context = ""
+ self.current_image_id = -1
+ self.image_list = []
+ self.pixel_values_list = []
+ self.seen_image_idx = []
+
+ logging.info("=" * 30 + "End Chat" + "=" * 30)
+
+ return (
+ None, # [chatbot] Chatbot
+ #gr.update(value=None, interactive=True), # [image] Image
+ gr.update(interactive=False, placeholder="Please click the button to start chat!"), # [input_text] Textbox
+ gr.update(interactive=True), # [start] Button
+ gr.update(interactive=False), # [clear] Button
+ gr.update(value=None, interactive=False), # [image] Image
+ gr.update(interactive=False), # [upload_btn] Button
+ chat_state # [chat_state] State
+ )
+
+ def upload_image(self, image: Image.Image, chat_history: gr.Chatbot, chat_state: gr.State):
+ logging.info(f"type(image): {type(image)}")
+
+ self.image_list.append(image)
+ save_image_path = os.path.join(self.uploaded_images_storage, "{}.jpg".format(len(os.listdir(self.uploaded_images_storage))))
+ image.save(save_image_path)
+ logging.info(f"image save path: {save_image_path}")
+ chat_history.append((gr.HTML(f'
'), "Received."))
+
+ return None, chat_history, chat_state
+
+ def respond(
+ self,
+ message,
+ image,
+ chat_history: gr.Chatbot,
+ top_p,
+ temperature,
+ chat_state,
+ ):
+ current_time = datetime.now().strftime("%b%d-%H:%M:%S")
+ logging.info(f"Time: {current_time}")
+ logging.info(f"User: {message}")
+ gen_config = GenerationConfig(top_p=top_p, temperature=temperature)
+ chat_input = message
+ if image is not None:
+ save_image_path = os.path.join(self.uploaded_images_storage, "{}.jpg".format(len(os.listdir(self.uploaded_images_storage))))
+ image.save(save_image_path)
+ logging.info(f"image save path: {save_image_path}")
+ chat_input = (message, image)
+ if self.sess is None:
+ self.sess = self.pipe.chat(chat_input, gen_config=gen_config)
+ else:
+ self.sess = self.pipe.chat(chat_input, session=self.sess, gen_config=gen_config)
+ response = self.sess.response.text
+ if image is not None:
+ chat_history.append((gr.HTML(f'{message}\n\n
'), response))
+ else:
+ chat_history.append((message, response))
+
+ logging.info(f"generated text = \n{response}")
+
+ return "", None, chat_history, chat_state
diff --git a/demo/bot.png b/demo/bot.png
new file mode 100644
index 0000000000000000000000000000000000000000..0047bf66e24ff259b7ea02081316c3d881854856
Binary files /dev/null and b/demo/bot.png differ
diff --git a/demo/food/14456664_117_IMG_8176.jpeg b/demo/food/14456664_117_IMG_8176.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..de292c40ad1fe11f1418e5bd2ef861c691f844c6
--- /dev/null
+++ b/demo/food/14456664_117_IMG_8176.jpeg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f844ef4ef78a325596a63ab702dafa0a67781348de8c12b58b9a9b655953ade1
+size 2635383
diff --git a/demo/food/14456664_126_86838F28-912B-42A4-80C1-BD060B649081.jpeg b/demo/food/14456664_126_86838F28-912B-42A4-80C1-BD060B649081.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..e767663ebb58252c8094b62daa37b4d078eaeefb
--- /dev/null
+++ b/demo/food/14456664_126_86838F28-912B-42A4-80C1-BD060B649081.jpeg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:06ebc9fd2df563eff214f4ead5899a63453d58f2e8db601efd0dc7bfce6240c8
+size 669958
diff --git a/demo/food/14456664_127_1E703639-9169-4EB4-8A5D-3B1E226F639B.jpeg b/demo/food/14456664_127_1E703639-9169-4EB4-8A5D-3B1E226F639B.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..ffff39046fbd98dbaa9f09b0088b55986ab3a925
--- /dev/null
+++ b/demo/food/14456664_127_1E703639-9169-4EB4-8A5D-3B1E226F639B.jpeg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ad9fa9010a5731ac6c0870bf2a572c406f0954b7d3bf3b5ca1f63c78863e7762
+size 1895518
diff --git a/demo/food/14456664_129_IMG_20220605_181308.jpg b/demo/food/14456664_129_IMG_20220605_181308.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..d63bc42f9f5053bd2509fad4c78e4fc53d090a6b
--- /dev/null
+++ b/demo/food/14456664_129_IMG_20220605_181308.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3a75dbdbee1d04c2fddc9dfd15aa348e3ab7e5705e5df0d5412e03e7f6c1126f
+size 241274
diff --git a/demo/food/14456664_130_IMG_20220605_180820.jpg b/demo/food/14456664_130_IMG_20220605_180820.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..0c2da82af7a21d54c7941c83b9a7dcb17ae43611
--- /dev/null
+++ b/demo/food/14456664_130_IMG_20220605_180820.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9da741e1ddcf0164d29a8ec3020ddde79a2d569317eccf931d672561de03e6e0
+size 393489
diff --git a/demo/food/14456664_133_IMG_20220709_153436.jpg b/demo/food/14456664_133_IMG_20220709_153436.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..ce9eba404bd35b986916319003d92666b0c968dc
--- /dev/null
+++ b/demo/food/14456664_133_IMG_20220709_153436.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3d0a567a6562627b510c8597054b034399e66ee158652556457679e3a32ab67a
+size 295553
diff --git a/demo/food/14456664_134_IMG_20220709_153652.jpg b/demo/food/14456664_134_IMG_20220709_153652.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..19541292789f4fd00f553a717713d7d704ed8824
--- /dev/null
+++ b/demo/food/14456664_134_IMG_20220709_153652.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e6a33e552f1b4b82820efceca61e6f5fbcf8b6f04b7c4702e2dc2d2104344a94
+size 286970
diff --git a/demo/food/14456664_136_IMG_20220709_233905.jpg b/demo/food/14456664_136_IMG_20220709_233905.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..97afba7ba5de508f689d18d2281940c02a919f87
--- /dev/null
+++ b/demo/food/14456664_136_IMG_20220709_233905.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1c0847da9ff6969504a573d4f2fbebb20806ef142eb5b4f654cdbb0b2f189ad3
+size 299993
diff --git a/demo/food/14456664_137_IMG_20220717_143941.jpg b/demo/food/14456664_137_IMG_20220717_143941.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..4dae20c81520234d7bbc4bfaa7b3f9424087fbed
--- /dev/null
+++ b/demo/food/14456664_137_IMG_20220717_143941.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d39fd75cd973ba049c8e48cb6e8810a29ece1933fc2886e94051795c1ddac039
+size 49369
diff --git a/demo/food/14456664_139_IMG_0917-EDIT.jpg b/demo/food/14456664_139_IMG_0917-EDIT.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..77160393883e0cd0d1100d46b53aa6f93d77de51
--- /dev/null
+++ b/demo/food/14456664_139_IMG_0917-EDIT.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:fa6ff8d6d24295936d79da35567a64e5c529987a5ad3164a5c78773fbed4546e
+size 436309
diff --git a/demo/food/14456664_141_IMG_1724.jpg b/demo/food/14456664_141_IMG_1724.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..306554afe7280885f85a0d2f09a1515a054ec6f1
--- /dev/null
+++ b/demo/food/14456664_141_IMG_1724.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d7acfe317622763de4c6a15eb8eb8ebc52641b112eb9378e5b4cf7bbf00fb78f
+size 392228
diff --git a/demo/food/14456664_147_IMG_20190225_184723.jpg b/demo/food/14456664_147_IMG_20190225_184723.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..4ad3a53aea8c0f2683af67f63563728a48b0f776
--- /dev/null
+++ b/demo/food/14456664_147_IMG_20190225_184723.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:69b3ffae82beddaefaaa20013e0c456a2704d11febd4d181166930fdabb29941
+size 432805
diff --git a/demo/food/14456664_149_IMG_20180812_182400.jpg b/demo/food/14456664_149_IMG_20180812_182400.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..952d28d142a4a4b658bb106841fa9e923d3cdf9d
--- /dev/null
+++ b/demo/food/14456664_149_IMG_20180812_182400.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:10ca4bb4e5f74b1ca9c91b6fa0d0378fee2e401cf1b2edf3549824c46c6946a9
+size 448778
diff --git a/demo/food/14456664_14_IMG_20220721_150241.jpg b/demo/food/14456664_14_IMG_20220721_150241.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..130fc96287eae1a527f11020d826fa1be76f626f
--- /dev/null
+++ b/demo/food/14456664_14_IMG_20220721_150241.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:df1c0a0fa513ed03b735318e47c7393a7761bf46a33ab60b9f9d3898355e71e2
+size 3953392
diff --git a/demo/food/14456664_150_IMG_20181218_190852.jpg b/demo/food/14456664_150_IMG_20181218_190852.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..6ff496adc49b24a322f72e82ec780ff5ab88fa8e
--- /dev/null
+++ b/demo/food/14456664_150_IMG_20181218_190852.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e0c200875162c1bb47cc76cc4df5f4c101deb7828e2522b15d9a97fcc414e52f
+size 133437
diff --git a/demo/food/14456664_153_IMG_20240411_102841.jpg b/demo/food/14456664_153_IMG_20240411_102841.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..3fa1342aa1af42e7985b60de892e134fd242b6b4
--- /dev/null
+++ b/demo/food/14456664_153_IMG_20240411_102841.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2b151c68460ea7bc0fc85d91535a2bc94ed88dcf4d761046d2a37722c5bfa5f5
+size 1933043
diff --git a/demo/food/14456664_155_IMG_20240403_094547.jpg b/demo/food/14456664_155_IMG_20240403_094547.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..fe25a403669ccc6b815a37459f8cc8ddea71e31a
--- /dev/null
+++ b/demo/food/14456664_155_IMG_20240403_094547.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:65b3e7f66dbace96b3f790e17c38abedddfa07bf886e1d5c8159feb30352e5b6
+size 2268286
diff --git a/demo/food/14456664_158_IMG_20240416_141427.jpg b/demo/food/14456664_158_IMG_20240416_141427.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..f0862f000294867e3af304f137601f1c68a42ac6
--- /dev/null
+++ b/demo/food/14456664_158_IMG_20240416_141427.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f622069e0add72f4e778af7c223922a66dc1478ed13a1458dd3455ae3fe04495
+size 2899692
diff --git a/demo/food/14456664_159_IMG_20240416_140243.jpg b/demo/food/14456664_159_IMG_20240416_140243.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..4d4dc6e831fe54d953ffeb3dc20cba2f0a1369c7
--- /dev/null
+++ b/demo/food/14456664_159_IMG_20240416_140243.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ce5bf8987b1bb99fb874a8ba8043952c2a03d6593d28447d44f09d4814402124
+size 2814714
diff --git a/demo/food/14456664_187_mmexport1713446177339.jpg b/demo/food/14456664_187_mmexport1713446177339.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..49532a08feab5ec18378e51b91592f6a0e73bc2d
--- /dev/null
+++ b/demo/food/14456664_187_mmexport1713446177339.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a8fa2b9fe1ef98e53d61be59061e848e7338b09e5d3f8e01fb376b877698461b
+size 1000537
diff --git a/demo/food/14456664_19_IMG_0395.jpeg b/demo/food/14456664_19_IMG_0395.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..4eb48c3f49895c57980e299fe48960cae56bf4a0
--- /dev/null
+++ b/demo/food/14456664_19_IMG_0395.jpeg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d3776a76f3612ab93123499a7fdb8bfabaad2596ee76eca754f4806fd404bc89
+size 3110275
diff --git a/demo/food/14456664_201_mmexport1713452408322.jpg b/demo/food/14456664_201_mmexport1713452408322.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..4fe49e348808bacf5717885ada606be55a10bcad
--- /dev/null
+++ b/demo/food/14456664_201_mmexport1713452408322.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:365ccc24ca44b9d8546d97605761989d2935e67025f373831354a57da1bdcf98
+size 237975
diff --git a/demo/food/14456664_217_IMG_3854.jpeg b/demo/food/14456664_217_IMG_3854.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..e8759885afa1ec305d77db047ebdf26d073f7f8c
--- /dev/null
+++ b/demo/food/14456664_217_IMG_3854.jpeg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d6ee11d0137ab40d9c1bf743535cbd163e00c6de5fd69022febfd55a4abae610
+size 4983580
diff --git a/demo/food/14456664_22_IMG_20240404_135935.jpg b/demo/food/14456664_22_IMG_20240404_135935.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..fdd5d509b54ae4f523ee60e8839112f193d1e881
--- /dev/null
+++ b/demo/food/14456664_22_IMG_20240404_135935.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f4f79f735255036164c0dac6d5cff946ef36a765eeed815992e437a1f48aa12b
+size 3185124
diff --git a/demo/food/14456664_236_IMG_4742.jpeg b/demo/food/14456664_236_IMG_4742.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..91d26386b593e2e1db315740982f373f2bc7f115
--- /dev/null
+++ b/demo/food/14456664_236_IMG_4742.jpeg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a25050eff6c82d7dac7cbd2fb7e37eec886867b512e6ea0390c40cf7ca961338
+size 2396007
diff --git a/demo/food/14456664_238_d370e16ff482d13a0718c6fb4cd7ffbb.jpeg b/demo/food/14456664_238_d370e16ff482d13a0718c6fb4cd7ffbb.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..230f7de5e72cd78b7fc8f2985d3fdc8ac79c5c36
--- /dev/null
+++ b/demo/food/14456664_238_d370e16ff482d13a0718c6fb4cd7ffbb.jpeg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3b8182676f499655879850b38d108ffa81881ae7c878777e96a63f423a72b605
+size 704139
diff --git a/demo/food/14456664_239_mmexport1713518196678.jpg b/demo/food/14456664_239_mmexport1713518196678.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..0a80955cf07421cd493e06ee94433fcabc10b916
--- /dev/null
+++ b/demo/food/14456664_239_mmexport1713518196678.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:32ae6844d6c04457eb7196108cd962fcd35f77db64c92698feb391f28e244b8e
+size 34753
diff --git a/demo/food/14456664_26_IMG_3472.jpeg b/demo/food/14456664_26_IMG_3472.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..d029bdd6042e848cfefd0c008b7a710ea29af681
--- /dev/null
+++ b/demo/food/14456664_26_IMG_3472.jpeg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b5ac1b45da6de71b4bcf695e50f08ccad6721045ddbec5393fe56e081c17814e
+size 310974
diff --git a/demo/food/14456664_34_IMG_0400.jpeg b/demo/food/14456664_34_IMG_0400.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..66a85ec7ba5d783d10bc272be2b173fe09f8a01b
--- /dev/null
+++ b/demo/food/14456664_34_IMG_0400.jpeg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7fd191af0a76621edeb10abe04cc952bb03c761b2abc733e5fe5474639d7b0e2
+size 1810607
diff --git a/demo/food/14456664_36_20240410160819.jpg b/demo/food/14456664_36_20240410160819.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..68eca2075359a690b8b0d1aecf12f015659185c3
--- /dev/null
+++ b/demo/food/14456664_36_20240410160819.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:575aa53664ae110f9e1d9e860f649434740f83ca4cebdfbef2e083ed561c2eaf
+size 412334
diff --git a/demo/food/14456664_40_IMG_20170613_190017.jpg b/demo/food/14456664_40_IMG_20170613_190017.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..31f7238c996ac3605db56700f76688fc93f7bef4
--- /dev/null
+++ b/demo/food/14456664_40_IMG_20170613_190017.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d813465ccf81c04c65d7dbab663b2948ac4298e31bda62d0bd0df5dcb90e539d
+size 3052416
diff --git a/demo/food/14456664_41_IMG_20190216_124017.jpeg b/demo/food/14456664_41_IMG_20190216_124017.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..fafd9646b1951c2027ed9282c184db9cb3c098eb
--- /dev/null
+++ b/demo/food/14456664_41_IMG_20190216_124017.jpeg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7ec209e48887d6964aff74b0b6355f913618294ed14e6c5ca377b6fcfbc2672d
+size 854726
diff --git a/demo/food/14456664_50_mmexport1712821641752.jpg b/demo/food/14456664_50_mmexport1712821641752.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..6ea2867fe6c440ce05b7eaa2f1a195fa28a8e3c2
--- /dev/null
+++ b/demo/food/14456664_50_mmexport1712821641752.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a30c7e646104481d6f4e9fa95ebb9c8921c817aebde6edb810ce6d6759928826
+size 279539
diff --git a/demo/food/14456664_61_mmexport1550554859117.jpg b/demo/food/14456664_61_mmexport1550554859117.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..4a2011c9bc4cc61dcadb87a67eea54877730fe7f
--- /dev/null
+++ b/demo/food/14456664_61_mmexport1550554859117.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d95fbbf0cce24c3a8779a87216e4ece91af058b443129696405e7384705b9037
+size 2249334
diff --git a/demo/food/14456664_64_IMG_20240409_181047.jpg b/demo/food/14456664_64_IMG_20240409_181047.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..90be8705e480b374c0a3d50cc8656e7ab37cd25d
--- /dev/null
+++ b/demo/food/14456664_64_IMG_20240409_181047.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:070c656fa584ccf2331c37fa4e780381bab3b0d808aea54cba406fd66b7735bb
+size 2675554
diff --git a/demo/food/14456664_68_IMG_0971.jpeg b/demo/food/14456664_68_IMG_0971.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..e8e2d2dd8272a24cf577148fc82c3a847db9da50
--- /dev/null
+++ b/demo/food/14456664_68_IMG_0971.jpeg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1ae462fcb5b73a7c228ee775b08fe84827a383e9f663e2c31c1ef4c086a67c03
+size 2790379
diff --git a/demo/food/14456664_70_IMG_0581.jpeg b/demo/food/14456664_70_IMG_0581.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..a128a639b94a209d2f8fd1a1c3d9de518b3fb84d
--- /dev/null
+++ b/demo/food/14456664_70_IMG_0581.jpeg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:05a32a6d8ce58c42a4ba4e852fabc9b326b1b66937ade06ed0251ea6408f4571
+size 1805093
diff --git a/demo/food/14456664_72_IMG_0618.jpeg b/demo/food/14456664_72_IMG_0618.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..4b85d120ff5ef180ad83d46280e7041f85c4234a
--- /dev/null
+++ b/demo/food/14456664_72_IMG_0618.jpeg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:57b49b974c7b966ac2042e4efa506c5b55a9e6038ba7f1bb76434a97b5e06fe7
+size 2483224
diff --git a/demo/food/14456664_80_IMG_6323.jpeg b/demo/food/14456664_80_IMG_6323.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..cf7c31d713b41743d83d941c4ff26b4247821177
--- /dev/null
+++ b/demo/food/14456664_80_IMG_6323.jpeg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7a71fe70bfd223397ab7f0af42159ac501d787d99bbbbf61165b2f11e6f6ba0a
+size 3666529
diff --git a/demo/food/14456664_82_MVIMG_20240413_161454.jpeg b/demo/food/14456664_82_MVIMG_20240413_161454.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..82b7438d47f98de21b3e9fda943bd9ac552fd2f1
--- /dev/null
+++ b/demo/food/14456664_82_MVIMG_20240413_161454.jpeg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7aaa672bd3f064c88077e0a04a4b9d7d6b98e2aaefb57fba546ada09f03dc2bb
+size 802807
diff --git a/demo/food/14456664_87_IMG_5316.jpeg b/demo/food/14456664_87_IMG_5316.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..5524a01ce37ab92d2945066105e71c5aa8895ad3
--- /dev/null
+++ b/demo/food/14456664_87_IMG_5316.jpeg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:beadadd5d26749545b59159f8914f4a6ca9602f9a37c18f9ae6d578c62717eec
+size 3141260
diff --git a/demo/food/14456664_88_wx_camera_1712730236546.jpg b/demo/food/14456664_88_wx_camera_1712730236546.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..aae1d469192ac7282236bf42a3b71591bae53771
--- /dev/null
+++ b/demo/food/14456664_88_wx_camera_1712730236546.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:cdc6b744e764770bff3cf73f7fb9bbe1424f88e59b4e22bb238c8765aec90483
+size 1288147
diff --git a/demo/food/14521898_108_IMG_6205.jpeg b/demo/food/14521898_108_IMG_6205.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..1bf41fee7a750499919128ef899e474d14686f38
--- /dev/null
+++ b/demo/food/14521898_108_IMG_6205.jpeg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:575cc946cb96af9bf5bece1fcda3eaf6a17dab7ba28f127d0573b068cfd4d9c0
+size 2624459
diff --git a/demo/food/14521898_109_IMG_5997.jpeg b/demo/food/14521898_109_IMG_5997.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..b6dbdbc0cf4a10ee5bb59140e3f72d142682b5f8
--- /dev/null
+++ b/demo/food/14521898_109_IMG_5997.jpeg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ba100e072a5fc01aa755087c2f3a5edc6e7e622fc7f6d3ba5b40f92b7e1476f3
+size 3535453
diff --git a/demo/food/14521898_112_IMG_3570.jpeg b/demo/food/14521898_112_IMG_3570.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..f5aa50978211e3c00399b2aaf0d1f32c7d9fddcb
--- /dev/null
+++ b/demo/food/14521898_112_IMG_3570.jpeg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ac8006a805982d44946da2574bdf9fff99fa1d592aa5e6eb86dfd9fd1b68f1a5
+size 2764359
diff --git a/demo/food/14521898_113_IMG_1724.jpeg b/demo/food/14521898_113_IMG_1724.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..744b609feb7161e69cd426bba89f58da1783cea7
--- /dev/null
+++ b/demo/food/14521898_113_IMG_1724.jpeg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2bb4b58786d3728cd1d80771c581fc66a53bfc0467b026aee3e64beed0063e5a
+size 656322
diff --git a/demo/food/14521898_117_IMG_1362.jpeg b/demo/food/14521898_117_IMG_1362.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..98b9674a0f769bd7dadeb5fe4690823f2e846fea
--- /dev/null
+++ b/demo/food/14521898_117_IMG_1362.jpeg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c382431d796f1c21f35ead732e20f54398ad4f7ce218bc2137fbe1450684b9d4
+size 2310789
diff --git a/demo/food/14521898_122_53D0E884-E012-4FFA-8BD7-8F5666A53123.jpeg b/demo/food/14521898_122_53D0E884-E012-4FFA-8BD7-8F5666A53123.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..0db0c40a5f643b0c021e7df4d150be8147aff857
--- /dev/null
+++ b/demo/food/14521898_122_53D0E884-E012-4FFA-8BD7-8F5666A53123.jpeg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5d75a4e7cc4276874b3cf31ad6322e56f58b7cb0a0264eb44440d8e241848052
+size 1506122
diff --git a/demo/food/14521898_12_fb48488412a1846c104b28600f4f1ded.jpeg b/demo/food/14521898_12_fb48488412a1846c104b28600f4f1ded.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..3d259c26e13686bad873a5513c2cb374faa8e3da
--- /dev/null
+++ b/demo/food/14521898_12_fb48488412a1846c104b28600f4f1ded.jpeg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0842b90f28ba12476384307425fa0ccdfc39cc4f95d345e4b1ff48c2cae1a88c
+size 165273
diff --git a/demo/food/14521898_144_IMG_8800.jpeg b/demo/food/14521898_144_IMG_8800.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..0afca15d01662415a2fe62565684f6547aed8f98
--- /dev/null
+++ b/demo/food/14521898_144_IMG_8800.jpeg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:75c9bc5a693419c74183996df82f3185f161becf4190a2c5beb0e4181707f104
+size 1919833
diff --git a/demo/food/14521898_14_IMG_3852.jpeg b/demo/food/14521898_14_IMG_3852.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..e30fa7c33761df4546eb1077f727f0ba019fed87
--- /dev/null
+++ b/demo/food/14521898_14_IMG_3852.jpeg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9fb9d439c333f46cf5c7c3867ff771adce427ca8abd0625287a9edc409cd62aa
+size 4538255
diff --git a/demo/food/14521898_162_IMG_0356.jpeg b/demo/food/14521898_162_IMG_0356.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..ea2f5fd218ee3b4fd9504969463d511c6c11e0ca
--- /dev/null
+++ b/demo/food/14521898_162_IMG_0356.jpeg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8cba6d96455c96da2f10d03f52f23e404262aaa61d136de2d425e687b9e01b91
+size 3334867
diff --git a/demo/food/14521898_168_D4D36C59-2D68-4354-B05C-B3065F6581AA.jpeg b/demo/food/14521898_168_D4D36C59-2D68-4354-B05C-B3065F6581AA.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..f7150719f2e414c025c0cb2a7be8225608fa063e
--- /dev/null
+++ b/demo/food/14521898_168_D4D36C59-2D68-4354-B05C-B3065F6581AA.jpeg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f09fa6ade4b0b77977236a3baf113ef1d5c2d294cf1a43a236fa55ed7f891814
+size 3275533
diff --git a/demo/food/14521898_174_IMG_8019.jpeg b/demo/food/14521898_174_IMG_8019.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..c51d857be8b7c72b60ffee8be64dd90e9476e0ce
--- /dev/null
+++ b/demo/food/14521898_174_IMG_8019.jpeg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d2c1d1a65a4e75ee47f34dfd8660d98a6ab323af9ddd5b9fe0778a391165923b
+size 3196281
diff --git a/demo/food/14521898_183_IMG_20240502_122921.jpg b/demo/food/14521898_183_IMG_20240502_122921.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..4c941b911e1900b4c243102f758b508d7eb102cc
--- /dev/null
+++ b/demo/food/14521898_183_IMG_20240502_122921.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4fde07270ec4b4d1efa77e2810151d3e26adc7c3724c517261566c746e914ac3
+size 3151183
diff --git a/demo/food/14521898_193_IMG_2435.jpeg b/demo/food/14521898_193_IMG_2435.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..0eb35749dbfead7f6f435cc20ad82181eb3744b9
--- /dev/null
+++ b/demo/food/14521898_193_IMG_2435.jpeg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e164ee406704c96747c9237e0f7f21a463c5c461b375deb020cb55b3ecd7678b
+size 412432
diff --git a/demo/food/14521898_209_IMG_3105.jpeg b/demo/food/14521898_209_IMG_3105.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..72ec67bf234abbcd0539d61aa13ef0f51be84140
--- /dev/null
+++ b/demo/food/14521898_209_IMG_3105.jpeg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3ce4a99b2b895aa5a062785498f84cde41008a64c5ad6ac2933c6134e9ef112f
+size 2159154
diff --git a/demo/food/14521898_211_IMG_9139.jpeg b/demo/food/14521898_211_IMG_9139.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..7194b53d26c2345ec1c003dcebe57e575f0996e3
--- /dev/null
+++ b/demo/food/14521898_211_IMG_9139.jpeg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0a2cbfaba62677f81d6d04c5d1e429986a7efcfc68d9603de1ec7c5e76022061
+size 3228111
diff --git a/demo/food/14521898_237_IMG_5909.jpeg b/demo/food/14521898_237_IMG_5909.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..fe7f9ac4621ac8f9c9995ea91ca1a6077d52392b
--- /dev/null
+++ b/demo/food/14521898_237_IMG_5909.jpeg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:63a8ec84b640965f6f69b6e83dd2f8d57f34d2777b9f26d335b7afe4bd4fa1fc
+size 2150570
diff --git a/demo/food/14521898_248_D8768DE2-559E-4850-A95E-07D5539F06C1.jpeg b/demo/food/14521898_248_D8768DE2-559E-4850-A95E-07D5539F06C1.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..d347955ea81a81076b4fde8aaa9ec90a8595f1ad
--- /dev/null
+++ b/demo/food/14521898_248_D8768DE2-559E-4850-A95E-07D5539F06C1.jpeg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b820bef583291479179e58fd0adf09d0c1369cd7de824995696a9886e377ac13
+size 160647
diff --git a/demo/food/14521898_249_0755477B-B9D5-4786-8D86-BFD4AC9478FD.jpeg b/demo/food/14521898_249_0755477B-B9D5-4786-8D86-BFD4AC9478FD.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..bbf024e68e077225869ede8fb5e3e18a4be63271
--- /dev/null
+++ b/demo/food/14521898_249_0755477B-B9D5-4786-8D86-BFD4AC9478FD.jpeg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f66eed8d41033fb4a6f0ea7f9d3799e0a2d5fd93dd89e15a9cb7a318a8bf9fbd
+size 194143
diff --git a/demo/food/14521898_257_79874AA6-4F23-4AD6-96E2-7F64039A81C0.jpeg b/demo/food/14521898_257_79874AA6-4F23-4AD6-96E2-7F64039A81C0.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..497fd3cf5fe1d6ab5d014f6fb4bac9a0ed8e4343
--- /dev/null
+++ b/demo/food/14521898_257_79874AA6-4F23-4AD6-96E2-7F64039A81C0.jpeg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:01d68d9cfd915c5c4d8c366794b1cd63b9097c0a326eb90ea841c97bec6172a3
+size 2787609
diff --git a/demo/food/14521898_261_0E3192C7-1B0D-4C4D-9788-5E7A5E6E92BA.jpeg b/demo/food/14521898_261_0E3192C7-1B0D-4C4D-9788-5E7A5E6E92BA.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..2735f1bf18cc19073dd4fa1f267f1392f023ceda
--- /dev/null
+++ b/demo/food/14521898_261_0E3192C7-1B0D-4C4D-9788-5E7A5E6E92BA.jpeg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:893a879bcd7b569c272020a729c17af77389f80ff4193c259d83e32c422f76c6
+size 3240469
diff --git a/demo/food/14521898_262_75B3AEDF-C705-400B-AE86-3FA7A92B624C.jpeg b/demo/food/14521898_262_75B3AEDF-C705-400B-AE86-3FA7A92B624C.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..a4fc6ff0b10ac581376e83b14af04e3629efa943
--- /dev/null
+++ b/demo/food/14521898_262_75B3AEDF-C705-400B-AE86-3FA7A92B624C.jpeg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:fe339cb0972c21f4e0bf79623f69ad7bdfdc732f0af955e52d5fb38202404be3
+size 3425619
diff --git a/demo/food/14521898_265_1C4A3265-A18E-46C2-A264-4384B85A49C0.jpeg b/demo/food/14521898_265_1C4A3265-A18E-46C2-A264-4384B85A49C0.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..a644bc048d69116d32c552751ddebe588a63e978
--- /dev/null
+++ b/demo/food/14521898_265_1C4A3265-A18E-46C2-A264-4384B85A49C0.jpeg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:214bba49fb123d1d20897ee9e5391b89f633af14e3b5ee84146c1f6644ac1eec
+size 3539520
diff --git a/demo/food/14521898_35_u_23162001_2841880362fm_170s_80187E975C411EC042A.png b/demo/food/14521898_35_u_23162001_2841880362fm_170s_80187E975C411EC042A.png
new file mode 100644
index 0000000000000000000000000000000000000000..a9bd456d7a605366644e9617bc4837ede224c674
Binary files /dev/null and b/demo/food/14521898_35_u_23162001_2841880362fm_170s_80187E975C411EC042A.png differ
diff --git a/demo/food/14521898_44_930F3702-FC28-498F-A5A7-9E01AA5AEA15.jpeg b/demo/food/14521898_44_930F3702-FC28-498F-A5A7-9E01AA5AEA15.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..474561d61c2c035567155801c1d7e125f21b3aa7
--- /dev/null
+++ b/demo/food/14521898_44_930F3702-FC28-498F-A5A7-9E01AA5AEA15.jpeg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:93100efa33f3122c6c419ab1fc89d1da2019f556f91a7285bd0fd0e5752b8fc5
+size 3438029
diff --git a/demo/food/14521898_55_IMG_8533.jpeg b/demo/food/14521898_55_IMG_8533.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..01ac1bd4eefaa026cf0f2cd3b0e2dc164f0b1b69
--- /dev/null
+++ b/demo/food/14521898_55_IMG_8533.jpeg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4a56308a61e73be157a4d5a4c6ebb8b8a2621bf0340a648b626d5a86765fa511
+size 3021757
diff --git a/demo/food/14521898_65_IMG_20240424_121225.jpg b/demo/food/14521898_65_IMG_20240424_121225.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..fea5ceee31c4f933caff3916adfaf9e2c79cbd22
--- /dev/null
+++ b/demo/food/14521898_65_IMG_20240424_121225.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1eaf0a61fc3dc0af6f73885322d220ee483ff9b9f21c3b190f25188ed741a11a
+size 3669645
diff --git a/demo/food/14521898_75_IMG_8637.jpeg b/demo/food/14521898_75_IMG_8637.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..124aec8e25a80d2524da3a4fe3530dffcf58fae3
--- /dev/null
+++ b/demo/food/14521898_75_IMG_8637.jpeg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1c3231243f499daaa33d7978223e1cf1aedd04d6fa4427703cd4b7cbc1568459
+size 3191491
diff --git a/demo/food/14521898_79_IMG_2612.jpeg b/demo/food/14521898_79_IMG_2612.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..0798b01b044c6b9bfc23c68c339d42ae6ffedc40
--- /dev/null
+++ b/demo/food/14521898_79_IMG_2612.jpeg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:bcd4f8782b814f29648572c60079966f9c71bd9524238d1ca5335536f3ec58d1
+size 2298822
diff --git a/demo/food/14521898_80_IMG_2613.jpeg b/demo/food/14521898_80_IMG_2613.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..84eb662889cd1807fb258c60ebdab67417110998
--- /dev/null
+++ b/demo/food/14521898_80_IMG_2613.jpeg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ea8eae0059f847b151cd9fbef328910a8391b5f27b78c8dd362fd915129a6c08
+size 2794108
diff --git a/demo/food/14521898_82_IMG_9847.jpeg b/demo/food/14521898_82_IMG_9847.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..1a12a2bd9b84990e2f1d60d183b3996bbbd2fdb5
--- /dev/null
+++ b/demo/food/14521898_82_IMG_9847.jpeg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:86cd59efee342be115a7347982362d7aa6d4180dc80c5a3e10cd70ce026b2fc0
+size 3177517
diff --git a/demo/food/14521898_93_Image_1713865938858.jpg b/demo/food/14521898_93_Image_1713865938858.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..2dfef6a3daac237e3a1a79073b7a5cab477ee852
--- /dev/null
+++ b/demo/food/14521898_93_Image_1713865938858.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:792ad9f220f52cc1311c8832e3dcb17f934dc3afd784dcd062aee4726a15d651
+size 117484
diff --git a/demo/food/14521898_97_Image_1713865926721.jpg b/demo/food/14521898_97_Image_1713865926721.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..637a30de0a131048df909cb918a628a402395ffa
--- /dev/null
+++ b/demo/food/14521898_97_Image_1713865926721.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:53d2cff386b2a397ae6d041d6f251f172d9c31d7a6618f8b03da66424da4c33e
+size 153310
diff --git a/demo/food_for_demo.json b/demo/food_for_demo.json
new file mode 100644
index 0000000000000000000000000000000000000000..fbe0700703bf12c505d61f070dea629c1b823087
--- /dev/null
+++ b/demo/food_for_demo.json
@@ -0,0 +1,97 @@
+{
+ "新疆菜": [
+ "demo/food/14521898_75_IMG_8637.jpeg",
+ "demo/food/14456664_139_IMG_0917-EDIT.jpg",
+ "demo/food/14456664_80_IMG_6323.jpeg",
+ "demo/food/14456664_217_IMG_3854.jpeg",
+ "demo/food/14521898_14_IMG_3852.jpeg",
+ "demo/food/14456664_136_IMG_20220709_233905.jpg",
+ "demo/food/14456664_137_IMG_20220717_143941.jpg",
+ "demo/food/14456664_141_IMG_1724.jpg",
+ "demo/food/14456664_134_IMG_20220709_153652.jpg",
+ "demo/food/14456664_133_IMG_20220709_153436.jpg"
+ ],
+ "川菜(四川,重庆)": [
+ "demo/food/14521898_113_IMG_1724.jpeg",
+ "demo/food/14521898_193_IMG_2435.jpeg",
+ "demo/food/14521898_44_930F3702-FC28-498F-A5A7-9E01AA5AEA15.jpeg",
+ "demo/food/14521898_80_IMG_2613.jpeg",
+ "demo/food/14456664_68_IMG_0971.jpeg",
+ "demo/food/14521898_174_IMG_8019.jpeg",
+ "demo/food/14456664_88_wx_camera_1712730236546.jpg",
+ "demo/food/14456664_36_20240410160819.jpg",
+ "demo/food/14456664_238_d370e16ff482d13a0718c6fb4cd7ffbb.jpeg",
+ "demo/food/14521898_183_IMG_20240502_122921.jpg",
+ "demo/food/14456664_40_IMG_20170613_190017.jpg",
+ "demo/food/14456664_150_IMG_20181218_190852.jpg",
+ "demo/food/14456664_72_IMG_0618.jpeg",
+ "demo/food/14521898_82_IMG_9847.jpeg"
+ ],
+ "西北菜 (陕西,甘肃等地)": [
+ "demo/food/14456664_82_MVIMG_20240413_161454.jpeg",
+ "demo/food/14521898_261_0E3192C7-1B0D-4C4D-9788-5E7A5E6E92BA.jpeg",
+ "demo/food/14456664_50_mmexport1712821641752.jpg",
+ "demo/food/14456664_126_86838F28-912B-42A4-80C1-BD060B649081.jpeg",
+ "demo/food/14521898_262_75B3AEDF-C705-400B-AE86-3FA7A92B624C.jpeg",
+ "demo/food/14456664_22_IMG_20240404_135935.jpg",
+ "demo/food/14521898_265_1C4A3265-A18E-46C2-A264-4384B85A49C0.jpeg",
+ "demo/food/14456664_127_1E703639-9169-4EB4-8A5D-3B1E226F639B.jpeg"
+ ],
+ "黔菜 (贵州)": [
+ "demo/food/14521898_35_u_23162001_2841880362fm_170s_80187E975C411EC042A.png",
+ "demo/food/14456664_61_mmexport1550554859117.jpg",
+ "demo/food/14456664_201_mmexport1713452408322.jpg",
+ "demo/food/14521898_211_IMG_9139.jpeg",
+ "demo/food/14456664_187_mmexport1713446177339.jpg",
+ "demo/food/14521898_97_Image_1713865926721.jpg",
+ "demo/food/14456664_41_IMG_20190216_124017.jpeg",
+ "demo/food/14521898_93_Image_1713865938858.jpg"
+ ],
+ "苏菜(江苏)": [
+ "demo/food/14456664_64_IMG_20240409_181047.jpg",
+ "demo/food/14456664_149_IMG_20180812_182400.jpg",
+ "demo/food/14521898_65_IMG_20240424_121225.jpg",
+ "demo/food/14456664_236_IMG_4742.jpeg",
+ "demo/food/14521898_55_IMG_8533.jpeg",
+ "demo/food/14521898_109_IMG_5997.jpeg",
+ "demo/food/14521898_79_IMG_2612.jpeg",
+ "demo/food/14456664_34_IMG_0400.jpeg",
+ "demo/food/14521898_248_D8768DE2-559E-4850-A95E-07D5539F06C1.jpeg"
+ ],
+ "粤菜(广东等地)": [
+ "demo/food/14521898_257_79874AA6-4F23-4AD6-96E2-7F64039A81C0.jpeg",
+ "demo/food/14521898_144_IMG_8800.jpeg",
+ "demo/food/14456664_155_IMG_20240403_094547.jpg",
+ "demo/food/14456664_87_IMG_5316.jpeg",
+ "demo/food/14521898_249_0755477B-B9D5-4786-8D86-BFD4AC9478FD.jpeg",
+ "demo/food/14521898_112_IMG_3570.jpeg",
+ "demo/food/14456664_153_IMG_20240411_102841.jpg",
+ "demo/food/14456664_70_IMG_0581.jpeg",
+ "demo/food/14521898_162_IMG_0356.jpeg",
+ "demo/food/14521898_117_IMG_1362.jpeg"
+ ],
+ "湘菜(湖南)": [
+ "demo/food/14521898_12_fb48488412a1846c104b28600f4f1ded.jpeg",
+ "demo/food/14456664_147_IMG_20190225_184723.jpg",
+ "demo/food/14521898_209_IMG_3105.jpeg"
+ ],
+ "闽菜(福建)": [
+ "demo/food/14521898_108_IMG_6205.jpeg",
+ "demo/food/14456664_129_IMG_20220605_181308.jpg",
+ "demo/food/14521898_168_D4D36C59-2D68-4354-B05C-B3065F6581AA.jpeg"
+ ],
+ "浙菜(浙江)": [
+ "demo/food/14456664_159_IMG_20240416_140243.jpg",
+ "demo/food/14456664_239_mmexport1713518196678.jpg",
+ "demo/food/14456664_130_IMG_20220605_180820.jpg",
+ "demo/food/14456664_117_IMG_8176.jpeg",
+ "demo/food/14456664_19_IMG_0395.jpeg",
+ "demo/food/14456664_158_IMG_20240416_141427.jpg",
+ "demo/food/14521898_122_53D0E884-E012-4FFA-8BD7-8F5666A53123.jpeg"
+ ],
+ "东北菜 (黑龙江等地)": [
+ "demo/food/14456664_26_IMG_3472.jpeg",
+ "demo/food/14521898_237_IMG_5909.jpeg",
+ "demo/food/14456664_14_IMG_20220721_150241.jpg"
+ ]
+}
\ No newline at end of file
diff --git a/demo/theme.py b/demo/theme.py
new file mode 100644
index 0000000000000000000000000000000000000000..3530a4b7e9427541e4613d83b16db0bef0414ca3
--- /dev/null
+++ b/demo/theme.py
@@ -0,0 +1,53 @@
+from gradio.themes.base import Base
+from gradio.themes.utils import colors, fonts, sizes
+from typing import Union, Iterable
+
+
+class CustomTheme(Base):
+ def __init__(
+ self,
+ primary_hue: Union[colors.Color, str] = colors.emerald,
+ secondary_hue: Union[colors.Color, str] = colors.blue,
+ neutral_hue: Union[colors.Color, str] = colors.slate,
+ spacing_size: Union[sizes.Size, str] = sizes.spacing_md,
+ radius_size: Union[sizes.Size, str] = sizes.radius_md,
+ text_size: Union[sizes.Size, str] = sizes.text_lg,
+ font: Union[fonts.Font, str, Iterable[Union[fonts.Font, str]]] = (
+ fonts.GoogleFont("Alice"),
+ "ui-sans-serif",
+ "sans-serif",
+ ),
+ font_mono: Union[fonts.Font, str, Iterable[Union[fonts.Font, str]]] = (
+ fonts.GoogleFont("Merriweather"),
+ "ui-monospace",
+ "monospace",
+ ),
+ ):
+ super().__init__(
+ primary_hue=primary_hue,
+ secondary_hue=secondary_hue,
+ neutral_hue=neutral_hue,
+ spacing_size=spacing_size,
+ radius_size=radius_size,
+ text_size=text_size,
+ font=font,
+ font_mono=font_mono,
+ )
+ super().set(
+ body_background_fill="#ECF2F7",
+ body_background_fill_dark="#191919",
+ button_primary_background_fill="linear-gradient(90deg, *primary_300, *secondary_400)",
+ button_primary_background_fill_hover="*primary_700",
+ button_primary_text_color="white",
+ button_primary_background_fill_dark="linear-gradient(90deg, *primary_600, *secondary_800)",
+ slider_color="#4EACEF",
+ slider_color_dark="#4EACEF",
+ block_title_text_weight="600",
+ block_title_text_size="*text_md",
+ block_label_text_weight="600",
+ block_label_text_size="*text_md",
+ block_border_width="1px",
+ block_shadow="#FFFFFF00",
+ button_shadow="*shadow_drop_lg",
+ button_large_padding="*spacing_lg calc(2 * *spacing_lg)",
+ )
\ No newline at end of file
diff --git a/demo/user.png b/demo/user.png
new file mode 100644
index 0000000000000000000000000000000000000000..5dfdd89145ba278a582e454d011b524c2696e0ab
Binary files /dev/null and b/demo/user.png differ
diff --git a/download.py b/download.py
new file mode 100644
index 0000000000000000000000000000000000000000..a02938ebe0f35045a15c2e132319fb20e0b49f00
--- /dev/null
+++ b/download.py
@@ -0,0 +1,9 @@
+from huggingface_hub import hf_hub_download
+import joblib
+
+REPO_ID = "KitHung/InternVL_food_lr35_ep10"
+
+def download_model(model_path):
+ joblib.load(
+ hf_hub_download(repo_id=REPO_ID, filename=model_path)
+ )
\ No newline at end of file
diff --git a/process_food.py b/process_food.py
new file mode 100644
index 0000000000000000000000000000000000000000..6acd53da37f76a7f9f34765d72b80290d2abbbf0
--- /dev/null
+++ b/process_food.py
@@ -0,0 +1,25 @@
+import json
+input_path = "/root/huggingface/FoodieQA/FoodieQA/sivqa_tidy.json" # sivqa_tidy.json所在位置
+output_path = "/root/huggingface/FoodieQA/FoodieQA/sivqa_llava.json" # 输出文件位置
+
+with open(input_path, 'r', encoding='utf-8') as f:
+ foodqa = json.load(f)
+
+llava_format = []
+for data in foodqa:
+ llava_format.append({
+ "image": data['food_meta']['food_file'],
+ "conversations": [
+ {
+ "from": "human",
+ "value": data['question']+"\n"
+ },
+ {
+ "from": "gpt",
+ "value": data['choices'][int(data['answer'])] + ",图中的菜是"+ data['food_meta']['food_name']
+ }
+ ]
+ })
+
+with open(output_path, 'w', encoding='utf-8') as f:
+ json.dump(llava_format, f, indent=4, ensure_ascii=False)
\ No newline at end of file
diff --git a/utils.py b/utils.py
new file mode 100644
index 0000000000000000000000000000000000000000..be4d578eb65559e4d083d351ae24533def9d05af
--- /dev/null
+++ b/utils.py
@@ -0,0 +1,25 @@
+import os
+import json
+import logging
+from datetime import datetime
+
+
+def load_json(file_name: str):
+ if isinstance(file_name, str) and file_name.endswith("json"):
+ with open(file_name, 'r') as file:
+ data = json.load(file)
+ else:
+ raise ValueError("The file path you passed in is not a json file path.")
+
+ return data
+
+def init_logger(outputs_dir):
+ current_time = datetime.now().strftime("%b%d_%H-%M-%S")
+ os.makedirs(os.path.join(outputs_dir, "logs"), exist_ok=True)
+ log_path = os.path.join(outputs_dir, "logs", "{}.txt".format(current_time))
+ logging.basicConfig(
+ level=logging.INFO,
+ format="%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s || %(message)s",
+ handlers=[logging.StreamHandler(), logging.FileHandler(log_path)],
+ )
+
\ No newline at end of file
diff --git a/xtuner_config/internvl_v2_internlm2_2b_lora_finetune_food.py b/xtuner_config/internvl_v2_internlm2_2b_lora_finetune_food.py
new file mode 100644
index 0000000000000000000000000000000000000000..43af705e5baa4af43ca1397b200aab53b6fef986
--- /dev/null
+++ b/xtuner_config/internvl_v2_internlm2_2b_lora_finetune_food.py
@@ -0,0 +1,184 @@
+# Copyright (c) OpenMMLab. All rights reserved.
+from mmengine.hooks import (CheckpointHook, DistSamplerSeedHook, IterTimerHook,
+ LoggerHook, ParamSchedulerHook)
+from mmengine.optim import AmpOptimWrapper, CosineAnnealingLR, LinearLR
+from peft import LoraConfig
+from torch.optim import AdamW
+from transformers import AutoTokenizer
+
+from xtuner.dataset import InternVL_V1_5_Dataset
+from xtuner.dataset.collate_fns import default_collate_fn
+from xtuner.dataset.samplers import LengthGroupedSampler
+from xtuner.engine.hooks import DatasetInfoHook
+from xtuner.engine.runner import TrainLoop
+from xtuner.model import InternVL_V1_5
+from xtuner.utils import PROMPT_TEMPLATE
+
+#######################################################################
+# PART 1 Settings #
+#######################################################################
+# Model
+path = '/root/share/new_models/OpenGVLab/InternVL2-2B'
+
+# Data
+data_root = '/root/share/datasets/FoodieQA/' # your data path
+data_path = data_root + 'sivqa_llava.json'
+image_folder = data_root # your image folder path
+prompt_template = PROMPT_TEMPLATE.internlm2_chat
+max_length = 8192
+
+# Scheduler & Optimizer
+batch_size = 4 # per_device
+accumulative_counts = 2
+dataloader_num_workers = 4
+max_epochs = 10
+optim_type = AdamW
+# official 1024 -> 4e-5
+# lr = 1e-6
+lr = 3e-5
+betas = (0.9, 0.999)
+weight_decay = 0.05
+max_norm = 1 # grad clip
+warmup_ratio = 0.03
+
+# Save
+save_steps = 64
+save_total_limit = -1 # Maximum checkpoints to keep (-1 means unlimited)
+
+#######################################################################
+# PART 2 Model & Tokenizer & Image Processor #
+#######################################################################
+model = dict(
+ type=InternVL_V1_5,
+ model_path=path,
+ freeze_llm=True,
+ freeze_visual_encoder=True,
+ # comment the following lines if you don't want to use Lora in llm
+ llm_lora=dict(
+ type=LoraConfig,
+ r=128,
+ lora_alpha=256,
+ lora_dropout=0.05,
+ target_modules=None,
+ task_type='CAUSAL_LM'),
+ # uncomment the following lines if you don't want to use Lora in visual encoder # noqa
+ # visual_encoder_lora=dict(
+ # type=LoraConfig, r=64, lora_alpha=16, lora_dropout=0.05,
+ # target_modules=['attn.qkv', 'attn.proj', 'mlp.fc1', 'mlp.fc2'])
+)
+
+#######################################################################
+# PART 3 Dataset & Dataloader #
+#######################################################################
+llava_dataset = dict(
+ type=InternVL_V1_5_Dataset,
+ model_path=path,
+ data_paths=data_path,
+ image_folders=image_folder,
+ template=prompt_template,
+ max_length=max_length)
+
+train_dataloader = dict(
+ batch_size=batch_size,
+ num_workers=dataloader_num_workers,
+ dataset=llava_dataset,
+ sampler=dict(
+ type=LengthGroupedSampler,
+ length_property='modality_length',
+ per_device_batch_size=batch_size * accumulative_counts),
+ collate_fn=dict(type=default_collate_fn))
+
+#######################################################################
+# PART 4 Scheduler & Optimizer #
+#######################################################################
+# optimizer
+optim_wrapper = dict(
+ type=AmpOptimWrapper,
+ optimizer=dict(
+ type=optim_type, lr=lr, betas=betas, weight_decay=weight_decay),
+ clip_grad=dict(max_norm=max_norm, error_if_nonfinite=False),
+ accumulative_counts=accumulative_counts,
+ loss_scale='dynamic',
+ dtype='float16')
+
+# learning policy
+# More information: https://github.com/open-mmlab/mmengine/blob/main/docs/en/tutorials/param_scheduler.md # noqa: E501
+param_scheduler = [
+ dict(
+ type=LinearLR,
+ start_factor=1e-5,
+ by_epoch=True,
+ begin=0,
+ end=warmup_ratio * max_epochs,
+ convert_to_iter_based=True),
+ dict(
+ type=CosineAnnealingLR,
+ eta_min=0.0,
+ by_epoch=True,
+ begin=warmup_ratio * max_epochs,
+ end=max_epochs,
+ convert_to_iter_based=True)
+]
+
+# train, val, test setting
+train_cfg = dict(type=TrainLoop, max_epochs=max_epochs)
+
+#######################################################################
+# PART 5 Runtime #
+#######################################################################
+# Log the dialogue periodically during the training process, optional
+tokenizer = dict(
+ type=AutoTokenizer.from_pretrained,
+ pretrained_model_name_or_path=path,
+ trust_remote_code=True)
+
+custom_hooks = [
+ dict(type=DatasetInfoHook, tokenizer=tokenizer),
+]
+
+# configure default hooks
+default_hooks = dict(
+ # record the time of every iteration.
+ timer=dict(type=IterTimerHook),
+ # print log every 10 iterations.
+ logger=dict(type=LoggerHook, log_metric_by_epoch=False, interval=10),
+ # enable the parameter scheduler.
+ param_scheduler=dict(type=ParamSchedulerHook),
+ # save checkpoint per `save_steps`.
+ checkpoint=dict(
+ type=CheckpointHook,
+ save_optimizer=False,
+ by_epoch=False,
+ interval=save_steps,
+ max_keep_ckpts=save_total_limit),
+ # set sampler seed in distributed evrionment.
+ sampler_seed=dict(type=DistSamplerSeedHook),
+)
+
+# configure environment
+env_cfg = dict(
+ # whether to enable cudnn benchmark
+ cudnn_benchmark=False,
+ # set multi process parameters
+ mp_cfg=dict(mp_start_method='fork', opencv_num_threads=0),
+ # set distributed parameters
+ dist_cfg=dict(backend='nccl'),
+)
+
+# set visualizer
+visualizer = None
+
+# set log level
+log_level = 'INFO'
+
+# load from which checkpoint
+load_from = None
+
+# whether to resume training from the loaded checkpoint
+resume = False
+
+# Defaults to use random seed and disable `deterministic`
+randomness = dict(seed=None, deterministic=False)
+
+# set log processor
+log_processor = dict(by_epoch=False)