当前位置:   article > 正文

<Python>基于智谱AI图像大模型的图像生成程序(CogView)_智谱的cogview

智谱的cogview

更新日志:
20240123:新增图片分析功能,基于智谱AI的GLM-4V模型(将消耗tokens)。
在这里插入图片描述

前言
本文是基于智谱AI大模型的图像生成模型CogView,使用PyQt5搭建自定义UI界面,CogView接口根据输入的提示词生成图片,然后将图片显示,并且可以保存到本地。
在这里插入图片描述
程序界面大致如上,未做过多美化,目前仅以功能实现。

配置:
平台:windows
工具:visual studio code
语言:python
库:PyQt5、zhipuAI接口

程序主要实现几方面的功能,首先是图片生成,这个是基于智谱AI大模型的,需要调用智谱的APIkey:
在这里插入图片描述
智谱官方提供了示例代码:

from zhipuai import ZhipuAI   
client = ZhipuAI(api_key="") # 请填写您自己的APIKey

response = client.images.generations(
    model="cogview", #填写需要调用的模型名称
    prompt="一只可爱的小猫咪",
)
print(response.data[0].url)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

这段程序可以直接复制使用,需要做的是把其中的api_key参数处填上你自己的实际APIkey。

UI界面的构建使用到PyQt5库,这个比较简单,这里主要说一下多线程。因为大模型生成图片是同步模式,当执行时,UI界面会卡住,所以需要在子线程中去执行“图片生成”,然后将生成的图片URL传回主线程。
这里就涉及到一个线程间数据传递的问题,我也是因为这个,又去专门搜索了PyQt5中线程间数据如何传递,并记录在了一个专门的博文中:
<Python>PyQt5中在两个线程间传递数据实例记录
有兴趣的朋友可以去看看,本文不细说了。
直接看代码:
1、图片生成线程代码:

class Imagegenaratethread(QThread):       
    """图片生成线程"""
    #发送程序执行过程状态
    signal1=pyqtSignal(str)
    #发送生成的图片网址
    signal2=pyqtSignal(str)
    #发送图片生成进度值
    signal3=pyqtSignal(int)
    #发送错误提示
    signal4=pyqtSignal(str)
    
    def __init__(self,prompt:str):
        super().__init__()      
        self.prompt1=prompt    
    def run(self):
        self.img_draw_func(self.prompt1)
        
    def img_draw_func(self,prompt:str):
        self.signal1.emit('线程开始...')
        client = ZhipuAI(api_key="你的APIkey") # 请填写您自己的APIKey
        #去掉提示词中的空格
        prom=prompt.replace(" ","")
        print(prom)
        #判断提示词是否为空
        if prom != '':
            self.signal1.emit('生成中')
            response = client.images.generations(
                model="cogview", #填写需要调用的模型名称
                #prompt="一只可爱的小猫咪",
                prompt=prom,
            )
            url1=response.data[0].url
            self.signal3.emit(100)
            print(url1)
            self.signal1.emit('图像生成完毕')
            self.signal2.emit(url1)
            self.signal1.emit('end')
        else:
            self.signal4.emit('请输入提示词!')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

这是自定义的子线程,共声明了4个信号,分别发送过程状态、图片网址、生成进度值、错误提示4个信息。

在主线程中,我们需要去给子线程一个实例:

def img_draw_func(self):   
        """图片生成"""
        self.btn0.setEnabled(False)
        self.pb1.setValue(0)
        prompt11=self.te0.toPlainText()
        self.thread2=Imagegenaratethread(prompt11)
        self.thread2.signal1.connect(self.mm)
        self.thread2.signal2.connect(self.mm2)
        self.thread2.signal3.connect(self.mm3)
        self.thread2.signal4.connect(self.mm4)
        self.thread2.start()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

我们实例化子线程,然后将子线程的signal1到signal4与主线程的函数连接起来。这样,每个signal发送时,会连接到相应函数,并且会传递参数值。我们就可以在主线程的函数中去处理子线程发送过来的数据了。

例如,我们在子线程生成号图片后,将图片URL发送出来:

self.signal2.emit(url1)
  • 1

这个信号与主线程的mm2函数绑定:

self.thread2.signal2.connect(self.mm2)
  • 1

我们在mm2函数处理图片:

@pyqtSlot(str)
    def mm2(self,dt):     
        """接收线程信息,更新图像路径"""
        #设置标签文本的超链接地址
        links1="<a href={}>{}</a>".format(dt,dt)
        self.lbl_imgurl2.setText(links1)
        self.lbl_imgurl2.adjustSize()
        self.lbl_imgurl2.setToolTip('打开链接(Ctrl+单击)')
        self.img_show_func(dt)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在函数mm2中,我们将子线程传过来的图片网址URL显示在一个标签上,并且给标签设置了超链接,这样我们可以直接点击标签的网址,就可以在浏览器打开生成的图片。
当然,我们还调用一个图片显示函数img_show_func

def img_show_func(self,url:str): 
        """图片显示函数"""
        imgurl=url
        resp=requests.get(imgurl)
        img_data=resp.content
        img=Image.open(BytesIO(img_data))
        w1,h1=img.size
        img2=QImage(img.tobytes
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/100036
推荐阅读
相关标签
  

闽ICP备14008679号