基于YOLOv8目标检测与chef-transformer(T5)从图像创建食谱

news2024/9/27 11:35:35

前言

在本文中,将演示如何使用从Roboflow获得的开源产品数据来训练我的YOLOv8模型,然后将其与从Hugging Face获得的chef-transformer(T5)模型集成。应用程序的主要目标是将检测到的对象参数化地发送到语言模型,并在NLP和CV之间建立关系。
在这里插入图片描述

YOLOv8 目标检测

YOLOv8是由ultralytics公司在2023年1月10日开源的一款重量级更新版本,作为YOLOv5的继承者,它支持图像分类、物体检测和实例分割等任务。在开源之前,YOLOv8就已经受到了用户的热切期待。作为一个SOTA(State of the Art)模型,YOLOv8在前代YOLO系列的成功基础上,引入了多项创新,旨在进一步提升模型的性能和灵活性。这些创新包括一个全新的骨干网络、一个无Anchor的检测头,以及一个新型的损失函数,使得模型能够在从CPU到GPU的各种硬件平台上流畅运行。

ultralytics公司并没有将这个开源库命名为YOLOv8,而是选择了“ultralytics”这个名称。这样做的原因是,公司希望将这个库定位为一个算法框架,而不仅仅是一个特定的算法。ultralytics的主要特点是其可扩展性,它不仅能够支持YOLO系列模型,还旨在兼容非YOLO模型,并能够广泛应用于分类、分割、姿态估计等多种任务。

环境安装

conda create -n yolov8 python=3.8
activate ylolv8
conda install pytorch==2.0.0 torchvision==0.15.0 torchaudio==2.0.0 pytorch-cuda=11.7 -c pytorch -c nvidia
pip install ultralytics

从Roboflow获取YOLOv8训练数据

Roboflow 是一个资源丰富的平台,拥有超过2亿张图像和20多万个数据集,为训练模型提供了广泛的选择。它能够满足对水果和蔬菜图像数据的需求,以便训练我的模型。此外,Roboflow 提供了 Roboflow Health Check 模块,这是一个功能强大的模块,允许在训练模型之前进行深入分析。这有助于更好地理解所需数据,并确保使用最恰当的数据集。
在这里插入图片描述

导入库并定义需求

import os
import streamlit as st
from ultralytics import YOLO
from IPython.display import display, Image
from langchain import PromptTemplate, HuggingFaceHub, LLMChain

模型推理

使用模型预测测试图像,并将检测到的对象类别存储在变量中。

model = YOLO('C:\\Users\\batuh\\Desktop\\last_pr_best.pt')
results = model.predict(source='test.jpeg', conf=0.50, save = True)
unique_names = set()
names = model.names
for r in results:
    for c in r.boxes.cls:
        unique_names.add(names[int(c)])

print(unique_names)

以这种方式返回唯一类别并将像这样将它们传递给语言模型。

{'Potato', 'Garlic', 'Onion', 'Tomato', 'Green Chili'}

语言模型

pip install transformers

在语言模型中使用检测到的对象

使用Langchain库来训练了超过200万食谱的语言模型。在这里,将的YOLO模型检测到的对象作为文本输入,以便生成菜谱。

template = """Question: {question}: """
prompt = PromptTemplate(template=template, input_variables=["question"])
    
llm_chain = LLMChain(prompt=prompt, 
                     llm=HuggingFaceHub(repo_id="flax-community/t5-recipe-generation", 
                                    model_kwargs={"temperature": 0.3, "max_length": 512}))
    
question = ', '.join(unique_names)
recipe = llm_chain.run(question)

得到了一个不错的炸三角食谱,如下:

'title: samosas ingredients: 1 large potato 1 tbsp minced garlic 1 tbsp minced onion 1 tbsp minced tomato 1 tbsp minced green chili answer the call 1 tbsp do cook. directions: cut the potato into small cubes. add the minced garlic, minced onion, minced tomato, and minced green chili. mix well. heat a griddle or frying pan over medium heat. place the samosas on the griddle and cook until golden brown on both sides.'

使用Streamlit创建界面

使用Streamlit创建了一个交互式界面,Streamlit是一个开源的Python库,可以轻松创建和共享机器学习和数据科学项目的Web应用程序。

import os
import streamlit as st
from ultralytics import YOLO
from IPython.display import display, Image
from langchain import PromptTemplate, HuggingFaceHub, LLMChain

model_path = 'C:\\Users\\batuh\\Desktop\\last_pr_best.pt'


st.set_page_config(
    page_title="Recipe Generator",  
    page_icon="🍳",     
    layout="wide",      
    initial_sidebar_state="expanded"    
)

st.title("Recipe Generator :female-cook:")
st.subheader("Upload an image to generate a recipe for the detected objects.")
st.markdown(
        f"""
        <style>
            body {{
                background-color: darkgreen;
            }}
        </style>
        """,
        unsafe_allow_html=True,)

def predict_objects_and_generate_recipe(image_path, model_path, define_conf):
    os.environ['HUGGINGFACEHUB_API_TOKEN'] = 'Your-Key'
    
    # YOLO model ile nesneleri tanıma
    model = YOLO(model_path)
    results = model.predict(source=image_path, conf=define_conf, save=True)
    names = model.names
    
    unique_names = set()
    for r in results:
        for c in r.boxes.cls:
            unique_names.add(names[int(c)])
    
    return unique_names

def generate_recipe_using_language_model(unique_names):
    template = """Question: {question}: """
    prompt = PromptTemplate(template=template, input_variables=["question"])
    
    llm_chain = LLMChain(prompt=prompt, 
                         llm=HuggingFaceHub(repo_id="flax-community/t5-recipe-generation", 
                                            model_kwargs={"temperature": 0.3, "max_length": 512}))
    
    question = ', '.join(unique_names)
    recipe = llm_chain.run(question)
    
    return recipe

image_file = st.file_uploader("Upload an image", type=["jpg", "png", "jpeg"])
conf_threshold = st.slider("Confidence Threshold", 0.1, 1.0, 0.25)

if image_file is not None:
    
    temp_dir = 'temp'
    os.makedirs(temp_dir, exist_ok=True)  
    
    image_path = os.path.join(temp_dir, image_file.name)  
    with open(image_path, 'wb') as f:
        f.write(image_file.read())
    
    unique_names = predict_objects_and_generate_recipe(image_path, model_path, conf_threshold)
    recipe = generate_recipe_using_language_model(unique_names)
    
    title = recipe.split('ingredients:')[0]
    ingredients = recipe.split('directions:')[0].split('ingredients:')[1].split('answer the call 1 do cook.')[0].split(' ')
    directions = (recipe.split('directions:')[1].split('add salt and pepper to taste.')[0])

    full_recipe = '{}\n\n\nIngredients :\n{}\nDirections :\n{}'.format(
        title.capitalize().title(),
        '\n'.join(['    {}'.format(ingredient).title() for ingredient in ingredients]),
        '    {}'.format(directions).capitalize()
    )
    
    st.image(image_path)
    
    st.markdown("""
                <style>
                .big-font {
                    font-size:60px !important;
                }
                </style>
                """, unsafe_allow_html=True)
    st.write("Recipe:")
    st.write('<p class="big-font">'+full_recipe+'</p>', unsafe_allow_html=True, fontsize = 100)

借助Streamlit库,可以更改置信度阈值,并创建一个漂亮的界面,将上传图像中检测到的对象与我们的语言模型结合起来。
在这里插入图片描述

备注

原本地址:https://medium.com/@batuhansenerr/yolov8-and-chef-transformer-t5-to-create-recipe-from-image-ae10c0e83656

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2169854.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第05-3节:加载流程原理介绍(Done)

我的后端学习大纲 我的Linux学习大纲 本节目标 1.能够说出交互式Shell与非交互式Shell2.能够说出登录Shell与非登录Shell环境 1.1.Shell工作环境介绍 用户进入linux系统就会初始化Shell环境, 这个环境会加载全局配置文件和用户个人配置文件中环境变量.每个脚本文件都有自己的…

STM32嵌入式编程学习到提高:【4】UART串口打印

------------------------------------------------------------------------------------------------------------------------- 工程文件&#xff1a;放在百度云盘里&#xff0c;需要的自行下载&#xff01;&#xff01;&#xff01; 链接: https://pan.baidu.com/s/14gRne…

2万字长文助你快速入门AIGC:包含底层原理、应用场景、热门工具、行业现状…

最近大家热议的ChatGPT和AI绘画工具的底层技术原理是什么&#xff1f;是如何发展到现在的&#xff1f;有哪些应用场景、热门工具&#xff1f;AIGC产业上下游有哪些公司&#xff1f;作为普通用户&#xff0c;我们还能接触哪些应用AI技术打造的商业解决方案&#xff1f;…… 我们…

RK 方案VOP 显示接口的链接关系以及DTS如何配置

这图显示各vp 支持情况 如下图VP0 支持DSI0 DSI1 EDP LVDS HDMI 显示接口&#xff0c;如果我们一方案需要点MIPI 屏 和HDMI out, 如果VP0 链接MIPI DSI0 那么VP0 就不能再选择了&#xff0c;只能VP1 链接HDMI out 了。因为VP2不至此HDMI&#xff0c;所有就只有选择VP1 链接HDMI…

随记——机器学习

前言 本来有个500块钱的单子&#xff0c;用机器学习做一个不知道什么鸟的识别&#xff0c;正好有数据集&#xff0c;跑个小项目&#xff0c;过一下机器学习图像识别的流程&#xff0c;用很短的时间记录下来..... 一、数据预处理 将数据集分为训练集和测试集&#xff0c;直接…

【HarmonyOS】SaveButton保存图片

SaveButton组件把图片显示到相册中的方法demo&#xff0c;支持组件截图、url网络图片、base64格式图片。注意事项&#xff1a; 1、不支持自定义SaveButton样式。 2、下载按钮被遮挡一部分&#xff0c;也无法保存到相册。 import photoAccessHelper from ohos.file.photoAcces…

使用 pypdf 给 PDF 添加目录书签

""" dir.txt的形式 第1章 计算机系统基础知识 1 1.1 嵌入式计算机系统概述 1 1.2 数据表示 4 1.2.1 进位计数制及转换 4 1.2.2 数值型数据的表示 6 第2章 嵌入式系统硬件基础知识 56 2.1 数字电路基础 56 2.1.1 信号特征 56 2.1.2 组合逻辑电路和时序逻辑电路 5…

为什么现在的网站设计大多都非常简洁,越来越扁平化

网站设计趋向简洁和扁平化&#xff0c;反映了现代设计理念的转变和技术的进步。以下是对这一现象的具体分析&#xff1a; 用户体验优先&#xff1a;用户更倾向于简单直接的界面&#xff0c;这有助于快速找到所需信息。扁平化设计通过减少视觉干扰&#xff0c;使得内容更加突出…

哪些因素会影响六西格玛效果的显现时间?

在探讨哪些因素会影响六西格玛效果的显现时间时&#xff0c;我们不得不深入剖析六西格玛管理方法的本质及其在企业中的实施过程。六西格玛作为一种旨在通过减少缺陷和变异来提高产品和服务质量的策略&#xff0c;其成功实施并非一蹴而就&#xff0c;而是受到多种复杂因素的共同…

Llama 系列简介与 Llama3 预训练模型推理

1. Llama 系列简介 1.1 Llama1 由 Meta AI 发布&#xff0c;包含 7B、13B、33B 和 65B 四种参数规模的开源基座语言模型 数据集&#xff1a;模型训练数据集使用的都是开源的数据集&#xff0c;总共 1.4T token 模型结构&#xff1a;原始的 Transformer 由编码器&#xff08…

Git 与远程分支

90.远程仓库和分支 我们经常需要对远程仓库里的分支进行更新。 ‍ 当从远程库 clone 时&#xff0c;默认情况下&#xff0c;只会拉取 master ​分支&#xff0c;并且会将本地的 master 分支和远程的 master 分支关联起来&#xff1a; $ git branch * master‍ ‍ 推送本地…

什么是分布式缓存,它是如何工作的?

嗨&#xff0c;你好啊&#xff0c;我是猿java 在日常开发中&#xff0c;我们经常会使用到缓存&#xff0c;当数据集较小时&#xff0c;通常将所有缓存数据保存在一台服务器上就足够了&#xff0c;但是当数据集较大时&#xff0c;我们需要将缓存数据分布在多个服务器上&#xf…

无线领夹麦克风怎么挑选?选购麦克风需要注意的五大选购陷阱!

无线领夹麦克风只所以成为现在自媒体行业的主流拾音设备&#xff0c;很大程度取决于它的轻巧的设计以及便携性。相较于传统的手持麦克风&#xff0c;领夹麦在使用时无需手持&#xff0c;直接佩戴在衣领上即可使用&#xff0c;腾出的双手可以更好的投入到录制当中&#xff0c;在…

Python与SQL Server数据库结合导出Excel并做部分修改

Python与SQL Server数据库结合导出Excel并做部分修改 需求&#xff1a;在数据库中提取需要的字段内容&#xff1b;并根据字段内容来提取与拆分数据做为新的列最后导出到Excel文件 # -*- coding: utf-8 -*- import pandas as pd import re import pymssql import timestart_ti…

Activiti的Web在线工作流设计器的几种搭建方式

说明 Activiti Activiti是一个使用Java开发的工作流流程管理(BPM)平台&#xff0c;可以帮助开发者和企业自动化管理业务流程。它提供了一整套工具&#xff0c;用于定义、执行、监控和优化业务流程。Activiti支持BPMN 2.0标准&#xff0c;具有强大的扩展能力和易用性&#xff…

Git GUI操作流程

1&#xff0c;点击运行 Gt GUI 2&#xff0c;界面如下 3&#xff0c;点击Creat new Repository或者在菜单栏点击Repository--new 4,点击Browse选择目录&#xff0c;点击create&#xff0c;创建本地git仓库 5&#xff0c;对应盘里生成一个.git文件&#xff0c;用于版本管理 6&am…

2024最新测评:低代码平台在企业复杂应用场景的适用性如何?

低代码平台种类多&#xff0c;不好一概而论。但最近有做部分低代码平台的测评&#xff0c;供大家参考。 一个月前接到老板紧急任务&#xff1a;调研有没有一款低代码平台能开发我司的软件场景。我司是一家快速发展中的制造业企业&#xff0c;业务遍布全国&#xff0c;需要一个…

DAY81服务攻防-开发框架安全SpringBootStruts2LaravelThinkPHPCVE 复现

知识点&#xff1a; 1、PHP-框架安全-Thinkphp&Laravel 2、J2EE-框架安全-SpringBoot&Struts2 常见语言开发框架&#xff1a; PHP&#xff1a;Thinkphp Laravel YII CodeIgniter CakePHP Zend等 JAVA&#xff1a;Spring MyBatis Hibernate Struts2 Springboot等 P…

Elasticsearch讲解

1.Elasticsearch基本知识 1.基本认识和安装 Elasticsearch是由elastic公司开发的一套搜索引擎技术&#xff0c;它是elastic技术栈中的一部分。完整的技术栈包括&#xff1a; Elasticsearch&#xff1a;用于数据存储、计算和搜索 Logstash/Beats&#xff1a;用于数据收集 Kib…

Dos.ORM简单说明

1 下载Dos.Tools-master 地址&#xff1a;Dos.Tool: 实体生成工具&#xff0c;成熟轻量级ORM、上手简单、性能高、功能强大&#xff01; 2 Dos.ORM仅支持DbFirst模式&#xff0c;即必须先有数据库&#xff0c;这里以Sql Server为例 3 新建项目&#xff0c;添加引用Dos.ORM.dll&…