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)