美文网首页
讯飞星火大模型的图片理解示例

讯飞星火大模型的图片理解示例

作者: 梅西爱骑车 | 来源:发表于2024-03-09 09:05 被阅读0次

图片理解是指用户输入一张图片和想问的问题,大语言模型从图片中识别出对象、场景等信息回答用户的问题。

它能理解图片的拍摄场景,能够提取出图片中的信息,可以应用于手机拍摄识图、拍照搜题、安全帽识别、火灾/入侵检测、自动驾驶识别、机器人视觉等领域。

一、准备工作

  1. 首先,在讯飞的“图片理解”产品页申请免费试用。页面地址:https://www.xfyun.cn/services/ptow
    免费试用
  2. 其次,创建应用,需要登录讯飞开发平台创建应用,平台地址:https://console.xfyun.cn/app/myapp
    我创建的识图应用名称为“梅西爱识图”。
    创建识图应用

二、开发必备信息

点击应用名称“梅西爱识图”,进入应用详情页,再点击“星火认知大模型-->图片理解”,注意右侧的“服务接口认证信息”的appid、appseceret、apikey等信息,如上信息需要在代码中配置才能调用接口进行图片理解。

同时,注意API地址不是我们通常所见的http接口,是wss开头的WebSockt安全连接,所以需要客户端使用WebSocket协议进行问题提交和监听返回答案进行显示,这是因为大语言模型返回信息比较慢(即推理需要消耗大量GPU资源不是马上就能给用户返回所以信息),需要使用流式输出及时返回答案片段给用户,所以WebSocket比http更适合。 代码中需要配置的信息

三、编写Python代码

客户端通过Python代码实现上传一张图片,然后针对图片进行提问。注意:图片需要base64转码后提交到图片理解接口,不是通常web开发的上传图片二进制信息。

上传的图片是一只小猫,如下图,我会针对此图向大语言模型提问。 大眼萌的照片

3.1 核心代码说明

  1. 我的Python客户端代码使用websocket_client与讯飞服务端通信,而不是http方式。
  2. 从控制台获取appid、appseceret、apikey等信息并替换如下变量值。
    上传的图片名称为“cat_guo.png”与该Python文件同级目录,实际应用情况应该是用户选择一张图片,然后客户端无需上传图片到服务端,本地进行base64转码成字符串,再发送给服务端。
  3. 实际请求地址及图片base64编码方法。
imageunderstanding_url = "wss://spark-api.cn-huabei-1.xf-yun.com/v2.1/image"#云端环境的服务地址
text =[{"role": "user", "content": str(base64.b64encode(imagedata), 'utf-8'), "content_type":"image"}]

3.2 完整代码

import _thread as thread
import base64
import datetime
import hashlib
import hmac
import json
from urllib.parse import urlparse
import ssl
from datetime import datetime
from time import mktime
from urllib.parse import urlencode
from wsgiref.handlers import format_date_time
import websocket  # 使用websocket_client


appid = "c78XXXX2e"    #填写控制台中获取的 APPID 信息
api_secret = "MzVkZWNiNWXXXXXXXXXxZmQ1"   #填写控制台中获取的 APISecret 信息
api_key ="aef3a3ec5XXXXXXXXXXXX74c69ef"    #填写控制台中获取的 APIKey 信息
imagedata = open("cat_guo.png",'rb').read()



imageunderstanding_url = "wss://spark-api.cn-huabei-1.xf-yun.com/v2.1/image"#云端环境的服务地址
text =[{"role": "user", "content": str(base64.b64encode(imagedata), 'utf-8'), "content_type":"image"}]



class Ws_Param(object):
    # 初始化
    def __init__(self, APPID, APIKey, APISecret, imageunderstanding_url):
        self.APPID = APPID
        self.APIKey = APIKey
        self.APISecret = APISecret
        self.host = urlparse(imageunderstanding_url).netloc
        self.path = urlparse(imageunderstanding_url).path
        self.ImageUnderstanding_url = imageunderstanding_url

    # 生成url
    def create_url(self):
        # 生成RFC1123格式的时间戳
        now = datetime.now()
        date = format_date_time(mktime(now.timetuple()))

        # 拼接字符串
        signature_origin = "host: " + self.host + "\n"
        signature_origin += "date: " + date + "\n"
        signature_origin += "GET " + self.path + " HTTP/1.1"

        # 进行hmac-sha256进行加密
        signature_sha = hmac.new(self.APISecret.encode('utf-8'), signature_origin.encode('utf-8'),
                                 digestmod=hashlib.sha256).digest()

        signature_sha_base64 = base64.b64encode(signature_sha).decode(encoding='utf-8')

        authorization_origin = f'api_key="{self.APIKey}", algorithm="hmac-sha256", headers="host date request-line", signature="{signature_sha_base64}"'

        authorization = base64.b64encode(authorization_origin.encode('utf-8')).decode(encoding='utf-8')

        # 将请求的鉴权参数组合为字典
        v = {
            "authorization": authorization,
            "date": date,
            "host": self.host
        }
        # 拼接鉴权参数,生成url
        url = self.ImageUnderstanding_url + '?' + urlencode(v)
        #print(url)
        # 此处打印出建立连接时候的url,参考本demo的时候可取消上方打印的注释,比对相同参数时生成的url与自己代码生成的url是否一致
        return url


# 收到websocket错误的处理
def on_error(ws, error):
    print("### error:", error)


# 收到websocket关闭的处理
def on_close(ws,one,two):
    print(" ")


# 收到websocket连接建立的处理
def on_open(ws):
    thread.start_new_thread(run, (ws,))


def run(ws, *args):
    data = json.dumps(gen_params(appid=ws.appid, question= ws.question ))
    ws.send(data)


# 收到websocket消息的处理
def on_message(ws, message):
    #print(message)
    data = json.loads(message)
    code = data['header']['code']
    if code != 0:
        print(f'请求错误: {code}, {data}')
        ws.close()
    else:
        choices = data["payload"]["choices"]
        status = choices["status"]
        content = choices["text"][0]["content"]
        print(content,end ="")
        global answer
        answer += content
        # print(1)
        if status == 2:
            ws.close()


def gen_params(appid, question):
    """
    通过appid和用户的提问来生成请参数
    """

    data = {
        "header": {
            "app_id": appid
        },
        "parameter": {
            "chat": {
                "domain": "image",
                "temperature": 0.5,
                "top_k": 4,
                "max_tokens": 2028,
                "auditing": "default"
            }
        },
        "payload": {
            "message": {
                "text": question
            }
        }
}

    return data


def main(appid, api_key, api_secret, imageunderstanding_url,question):

    wsParam = Ws_Param(appid, api_key, api_secret, imageunderstanding_url)
    websocket.enableTrace(False)
    wsUrl = wsParam.create_url()
    ws = websocket.WebSocketApp(wsUrl, on_message=on_message, on_error=on_error, on_close=on_close, on_open=on_open)
    ws.appid = appid
    #ws.imagedata = imagedata
    ws.question = question
    ws.run_forever(sslopt={"cert_reqs": ssl.CERT_NONE})


def getText(role, content):
    jsoncon = {}
    jsoncon["role"] = role
    jsoncon["content"] = content
    text.append(jsoncon)
    return text


def getlength(text):
    length = 0
    for content in text:
        temp = content["content"]
        leng = len(temp)
        length += leng
    return length


def checklen(text):
    #print("text-content-tokens:", getlength(text[1:]))
    while (getlength(text[1:])> 8000):
        del text[1]
    return text

if __name__ == '__main__':

    #text.clear
    while(1):
        Input = input("\n" +"问题:")
        question = checklen(getText("user",Input))
        answer = ""
        print("答案:",end = "")
        main(appid, api_key, api_secret, imageunderstanding_url, question)
        getText("assistant", answer)
        # print(str(text))


四、代码运行效果

在Python文件名或者编辑器右键菜单点击“运行”,可以看到控制台的输出,我们可以提问,大语言模型结合上传的图片进行回答。 运行代码

问答示例:

  1. 比如在控制台输入“图片上有什么?”,大模型回答:“图片上是一只小猫,它有着银灰色的条纹花纹。”
  2. 其实我并不认识这猫是什么品种,然后第二个问题它完美的告诉我“它是一只英国短毛猫。”看来还是洋猫。
  3. 我想模拟统计一张图片有多少人头,问了第三个问题“图片有几只猫?”,大语言模型能准确回答一只。


    image.png

四、总结

图片理解,也称为图像理解,是计算机视觉领域的基础任务,它涉及到让计算机能够像人类一样识别和解释图像内容,他跟大语言模型进行了结合,也就是常说的多模态。以下是图片理解能做的事情:

  1. 对象识别:识别图像中的特定对象,如人脸、车辆、动植物等。
  2. 场景理解:理解图像中的场景,包括场景的布局、物体之间的关系以及场景所发生的行为或事件。
  3. 图像描述:生成描述图像内容的文本,这涉及到将视觉信息转换为语言描述,是跨模态理解的一种形式。
  4. 图像分割:将图像分割成多个部分或区域,每个部分代表不同的物体或场景元素。
  5. 图像分类:将图像分类到预定义的类别中,例如将动物图片分类为猫、狗等。
  6. 遥感分析:在遥感领域,图像理解用于分析卫星或航空图像,以监测环境变化、城市规划、灾害评估等。
  7. 医学诊断:在生物医学领域,图像理解技术帮助医生分析医疗影像,如X光片、MRI扫描等,以诊断疾病。
  8. 安全监控:在安全监控领域,图像理解可以用于人流统计、异常行为检测、车辆追踪等。
  9. 自动驾驶:自动驾驶汽车利用图像理解技术来识别道路、障碍物、交通标志和其他车辆,以实现安全导航。
  10. 工业自动化:在工业生产中,图像理解用于质量控制、自动装配线、缺陷检测等。
  11. 农业:在农业领域,通过图像理解技术可以监测作物生长情况、病虫害识别和精准施肥。
  12. 零售:在零售业,图像理解可以帮助商家通过分析顾客行为、货架布局优化和库存管理来提升销售效率。比如现在超市最新的电子秤,摄像头自动识别是什么商品,不再人工输入商品编号

综上所述,图片理解的应用广泛,涵盖了从基础的对象识别到复杂的场景理解和跨模态交互等多个方面。随着深度学习技术的发展,图片理解的准确性和应用范围正在不断扩大,为各行各业带来了革命性的变化。

相关文章

  • 04.CSS文本

    字体颜色 运行图片 对齐方式 示例图片 下划线 示例图片 大小写 示例图片 首行缩进 示例图片 字间距 示例图片

  • 论文阅读_中文NLP_ELECTRA

    介绍:ELECTRA由Manning联合谷歌发布,后来哈工大讯飞联合实验室训练了相应的中文模型。精减后的模型效果和...

  • Fluttify一周一插件 之 讯飞语音合成 Flutter插件

    [图片上传失败...(image-2e0a59-1600661451880)] 讯飞 TTS语音合成 Flutte...

  • 飞讯

  • 讯飞👍

    最近一直忙于孩子,很少编辑文字。理由自然是编辑文字需要时间。就这样一天两天三天过去了,我逐渐把写作的事给忘了。 今...

  • peewee 关于一些示例笔记

    模型 图片表: 商品图片表集: 商品款式表 商品表: 添加测试数据: 示例需求: 1:查询所有的商品列表下的对应的...

  • 10.CSS定位

    显示形式 示例图片 显示图层 示例图片 相对定位 运行图片 绝对定位 示例图片 固定定位 示例图片 浮动定位 图1...

  • SpringMVC调用讯飞语音合成WebApi示例

    最近讯飞开放了语音合成的WebAPI,相对于之前SDK的方式方便了很多,下面使用SpringMVC写了一个示例,调...

  • 数据仓库中星型模型和雪花模型

    参考:理解数据仓库中星型模型和雪花模型 在数据仓库的建设中,一般都会围绕着星型模型和雪花模型来设计表关系或者结构 ...

  • 声音复刻技术

    你好,讯飞听见APP和讯飞语记APP、录音宝APP都是科大讯飞旗下的产品。 其中讯飞听见APP和录音宝APP是讯飞...

网友评论

      本文标题:讯飞星火大模型的图片理解示例

      本文链接:https://www.haomeiwen.com/subject/eguyzdtx.html