flask 前后台文件多张图片api;streamlit、gradio多图片页面展示

1、flask 前后台文件多张图片api

send_file 传递zip:
send_file(zip_data, mimetype=‘application/zip’, as_attachment=True, download_name=‘images.zip’)

from flask import Flask, Response, request,send_file
from PIL import Image
import torch
import io
from diffusers import PixArtAlphaPipeline
import zipfile

app = Flask(__name__)



## 初始化模型,第一次调用/image会来执行一次
@app.before_request
def load_model():
    if not hasattr(app, 'pipe'):
        torch.cuda.set_device(0)
        app.pipe = PixArtAlphaPipeline.from_pretrained("/ai/PixArt-XL-2-1024-MS", torch_dtype=torch.float16).to("cuda")
        #app.pipe.enable_model_cpu_offload()

@app.route('/image', methods=['POST'])
def get_image():
    prompt = request.form.get('prompt')
    
    # 生成图像文件并创建PIL.Image.Image对象
    images = app.pipe(prompt, num_inference_steps=10,num_images_per_prompt=4).images
# 在内存中创建一个BytesIO对象
    zip_data = io.BytesIO()

    # 将多张图片保存到BytesIO对象中
    with zipfile.ZipFile(zip_data, mode='w') as zipf:
        for i, image in enumerate(images):
            image_data = io.BytesIO()
            image.save(image_data, format='PNG')
            image_data.seek(0)
            zipf.writestr(f'image_{i+1}.png', image_data.getvalue())

    # 将BytesIO对象的指针重置到开头
    zip_data.seek(0)

    # 返回BytesIO对象作为文件给前端下载
    return send_file(zip_data, mimetype='application/zip', as_attachment=True, download_name='images.zip')





if __name__ == '__main__':
    app.run(host='192.1***', port=7889)



2、streamlit、gradio多图片展示

streamlit

st.columns(2)

import streamlit as st
from PIL import Image
import io
import pandas as pd
import numpy as np
import requests
from zipfile import ZipFile
import json

def translate(content):
    url = 'http://192***:11434/api/chat'
    headers = {'Content-Type': 'application/json'}
    

    pload = {
        "model": "qwen:1.8b-chat",
        "messages": [
            {"role": "system", "content": ""},
            {
                "role": "user",
                "content": f'''你是一个中英文翻译助手;
                后面双引号内中文问题请翻译成英文回复,问题是"{content}"'''
            }
                ],
        "stream": False
    }
    
    response = requests.post(url, headers=headers, json=pload)
    llm_text = json.loads(response.content)["message"]["content"]
    print("AI:",llm_text)
    return llm_text

# translate("大家好")

def get_image(prompt):
    
    # 发起 POST 请求并传递提示信息
    response = requests.post('http://192.1***:7889/image', data={'prompt': prompt})


    images = []
    if response.status_code == 200:
        # 解压缩接收到的ZIP文件
        with ZipFile(io.BytesIO(response.content), 'r') as zip_file:
            # 遍历ZIP文件中的所有文件
            for filename in zip_file.namelist():
                # 检查文件是否为图片文件(这里假设只有PNG格式的图片)
                if filename.endswith('.png'):
                    # 读取图片数据
                    image_data = zip_file.read(filename)
                    # 转换为图像对象
                    image = Image.open(io.BytesIO(image_data))
                    images.append(image)
    

    return images


# 初始化变量
if 'image1' not in st.session_state:
    st.session_state.image1 = None
if 'prompt' not in st.session_state:
    st.session_state.prompt = None
if 'prompt1' not in st.session_state:
    st.session_state.prompt1 = None
 

if __name__ == '__main__':
    st.title('AI文生图')

    # 创建文本输入框
    prompt = st.text_input('请输入提示词')
    # 将 prompt 存储在 st.session_state 中
    st.session_state.prompt1 = prompt    
    st.session_state.prompt = translate(prompt)
    
    # 监听按钮点击事件
    if st.button("生成图像"):
        with st.spinner("正在生成图像..."):
            # 生成图像
            st.session_state.image1 = get_image(st.session_state.prompt)
        st.text(st.session_state.prompt1)

        col1, col2 = st.columns(2)

        # 在第一排展示前两张图像
        with col1:
            st.image(st.session_state.image1[0], use_column_width=True)
            st.image(st.session_state.image1[1], use_column_width=True)

        # 在第二排展示后两张图像
        with col2:
            st.image(st.session_state.image1[2], use_column_width=True)
            st.image(st.session_state.image1[3], use_column_width=True)
            

gradio

gr.Gallery()

import gradio as gr
from PIL import Image
import io
import requests
import zipfile
import numpy as np


def get_images(prompt):
    response = requests.post('http://192****:7889/image', data={'prompt': prompt})
    images = []
    if response.status_code == 200:
        # 解压缩接收到的ZIP文件
        with zipfile.ZipFile(io.BytesIO(response.content), 'r') as zip_file:
            # 遍历ZIP文件中的所有文件
            for filename in zip_file.namelist():
                # 检查文件是否为图片文件(这里假设只有PNG格式的图片)
                if filename.endswith('.png'):
                    # 读取图片数据
                    image_data = zip_file.read(filename)
                    # 转换为图像对象
                    image = Image.open(io.BytesIO(image_data))
                    images.append(image)


    return images

def generate_images(prompt):
    images = get_images(prompt)
    return images

iface = gr.Interface(fn=generate_images, inputs="text", outputs=gr.Gallery(
            label="生成图片",height='auto',columns=2), title="AI文生图")
iface.launch(server_name="192.****2")


在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据库大作业——基于qt开发的图书管理系统 (一)环境的配置与项目需求的分析

前言 博主最近数据库原理结课要做课程设计了,要求开发基于数据库实现的图书管理系统,博主想了想决定做一个基于Qt的图书管理系统,博主在此之前其实也没有用过多少Qt,仅以此专栏记录博主学习与开发的全过程,大家一起学习,一起进步…

使用固定公网地址远程访问开源服务器运维管理面板1Panel管理界面

文章目录 前言1. Linux 安装1Panel2. 安装cpolar内网穿透3. 配置1Panel公网访问地址4. 公网远程访问1Panel管理界面5. 固定1Panel公网地址 前言 1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。高效管理,通过 Web 端轻松管理 Linux 服务器,包括主机监控、…

npm install 会报错npm audit错误,会提示你有多少个漏洞需要结局等

npm install 会报错 npm audit… 错误,会提示你有多少个漏洞需要结局,对应的包版本不应该低于多少等等问题 当使用npm i 命令的时候会出现以下问题 如果是个新手的话,建议直接关闭npm的audit检查。这样可以保证npm的audit不会影响你的初始…

文献速递:深度学习医学影像心脏疾病检测与诊断--从SPECT/CT衰减图中深度学习冠状动脉钙化评分提高了对重大不良心脏事件的预测

Title 题目 Deep Learning Coronary Artery Calcium Scores from SPECT/CT Attenuation Maps Improve Prediction of Major Adverse Cardiac Events 从SPECT/CT衰减图中深度学习冠状动脉钙化评分提高了对重大不良心脏事件的预测 01 文献速递介绍 低剂量非门控CT衰减校正&am…

ASP.NET网络商店销售管理系统的设计与实现

摘 要 随着软件技术的不断进步和发展,信息化的管理方式越来越广泛的应用于各个领域,对于任何网站系统的管理来说开发一套现代化的成员管理软件是十分必要的。通过这样的软件系统,可以做到成员的规范管理和快速查询,从而减少管理…

TPV-W5 24V 48V 系列——正负双输出和单输出,工业级环境温度,用于PCB安装的国际标准结构

TPV-W5系列提供正负双输出和单输出,工业级环境温度,用于PCB安装的国际标准结构。此系列产品小巧,效率高,低输出纹波及能承受3000V以上的耐压,用于需要正负电压或单输出和高隔离电压的场合。封装有SIP和DIP可选。

JAVA基础之线程池原理与源码简读

线程 线程是调度CPU资源的最小单位,线程模型分为KLT和ULT模型,JVM使用的KLT模型java线程与OS线程保持1:1的映射关系,也就是说每一个java线程对应操作系统一个线程。Java线程有以下几种生命状态: NEW:新建状态RUNNABL…

单调栈|503.下一个更大元素II

力扣题目链接 class Solution { public:vector<int> nextGreaterElements(vector<int>& nums) {// 拼接一个新的numsvector<int> nums1(nums.begin(), nums.end());nums.insert(nums.end(), nums1.begin(), nums1.end());// 用新的nums大小来初始化resu…

我独自升级崛起在哪下载 我独自升级电脑PC端下载教程分享

将于5月8日在全球舞台闪亮登场的动作角色扮演游戏《我独自升级崛起》&#xff0c;灵感源自同名热门动画与网络漫画&#xff0c;承诺为充满激情的游戏玩家群体带来一场集深度探索与广阔体验于一身的奇幻旅程。该游戏以独特的网络武侠世界观为基底&#xff0c;展现了一位普通人踏…

[Java、Android面试]_22_APP启动流程(中频问答)

欢迎查看合集&#xff1a; Java、Android面试高频系列文章合集 本人今年参加了很多面试&#xff0c;也有幸拿到了一些大厂的offer&#xff0c;整理了众多面试资料&#xff0c;后续还会分享众多面试资料。 整理成了面试系列&#xff0c;由于时间有限&#xff0c;每天整理一点&am…

【个人博客搭建】(17)使用FluentValidation 参数校验

FluentValidation 是一个用于 .NET 的开源验证库&#xff0c;它提供了一种流畅的接口和强类型验证规则&#xff0c;使得验证逻辑表达得更加清晰和简洁。&#xff08;Apache-2.0&#xff09; FluentValidation 的主要作用包括&#xff1a; 提高代码可读性&#xff1a;通过使用 F…

Python ArcPy批量将大量栅格文件的投影坐标系转为地理坐标系

本文介绍基于Python语言中的ArcPy模块&#xff0c;批量将多个遥感影像由投影坐标系转为地理坐标系的方法。 在之前的文章中&#xff0c;我们介绍过将单独1景遥感影像的投影坐标系转为地理坐标系的方法&#xff0c;大家可以参考文章投影坐标系转为地理坐标系&#xff1a;GDAL命令…

Voice Conversion、DreamScene、X-SLAM、Panoptic-SLAM、DiffMap、TinySeg

本文首发于公众号&#xff1a;机器感知 Voice Conversion、DreamScene、X-SLAM、Panoptic-SLAM、DiffMap、TinySeg Converting Anyones Voice: End-to-End Expressive Voice Conversion with a Conditional Diffusion Model Expressive voice conversion (VC) conducts speak…

【爬虫】爬取A股数据写入数据库(一)

1. 对东方财富官网的分析 步骤&#xff1a; 通过刷新网页&#xff0c;点击等操作&#xff0c;我们发现https://datacenter-web.eastmoney.com/api/data/v1/get?请求后面带着一些参数即可以获取到相应数据。我们使用python来模拟这个请求即可。 我们以如下选择的页面为切入点…

滑动窗口 | 1652. 拆炸弹 |LeetCode

文章目录 题目介绍暴力(可以过力扣竟然。不愧是简单题)&#xff1a;滑动窗口 祝你天天开心 题目介绍 你有一个炸弹需要拆除&#xff0c;时间紧迫&#xff01;你的情报员会给你一个长度为 n 的 循环 数组 code 以及一个密钥 k 。 为了获得正确的密码&#xff0c;你需要替换掉每…

关系型数据库MySql分库分表带来的问题以及解决方案

水平分表 水平分表是什么&#xff1f; 将一张表横向拆分为多张表&#xff0c;拆分的表&#xff0c;依然在同一个库中。 例如&#xff0c;user表有400w条记录&#xff0c;将user表拆分成4张表&#xff0c;每张表100w条记录。拆分后的表名&#xff0c;分别叫做user_0、user1、u…

内网用户是如何连接上互联网的?详解NAT网络地址转换技术

背景 https://blog.csdn.net/weixin_43972437/article/details/107344633 不知道你有没有过困惑&#xff0c;都说现在 ipv4 地址耗尽了&#xff0c;但是我们为什么还能上网呢&#xff1f;原来这都要归功于 NAT 网络地址转换技术。 比如我们接入了中国移动的宽带&#xff0c;宽…

重学SpringBoot3-SPI机制

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-SPI机制 什么是 SPI&#xff1f;Spring Boot 中的 SPI 机制spring.factories 文件自动配置的实现启动流程中的作用 SPI实际应用步骤 1: 新建模块步骤 2:…

扩展学习|一文读懂知识图谱

一、知识图谱的技术实现流程及相关应用 文献来源&#xff1a;曹倩,赵一鸣.知识图谱的技术实现流程及相关应用[J].情报理论与实践,2015, 38(12):127-132. &#xff08;一&#xff09;知识图谱的特征及功能 知识图谱是为了适应新的网络信息环境而产生的一种语义知识组织和服务的方…

HarmonyOS开发案例:【卡片二级联动】

1 卡片介绍 使用ArkTS语言&#xff0c;实现一个导航与内容二级联动的效果。 2 标题 二级联动&#xff08;ArkTS&#xff09; 3 介绍 介绍了如何基于List组件实现一个导航和内容的二级联动效果。样例主要包含以下功能&#xff1a; 切换左侧导航&#xff0c;右侧滚动到对应…