AIGC与AidLux互联应用——AidLux端AIGC测评

本文介绍了AIGC(人工智能生成内容)如何结合StableDiffusion模型进行图像和文本生成,以及利用AidliteGPU工具进行模型推理和内容创作。通过示例代码展示了如何加载与运行模型,进行图片处理和传输。此外,还提及了PC与AidLux设备之间的通讯实现。
摘要由CSDN通过智能技术生成

AIGC的基本概念

AI生成内容(AIGC,人工智能生成内容)是一种新型的内容创作方式,它继承了专业生产内容(PGC,Professional-generated Content)和用户生成内容(UGC,User-generated Content)的优点,并充分发挥技术优势,打造了全新的数字内容生成与交互形态。随着科技的不断发展,AI写作、AI配乐、AI视频生成、AI语音合成以及最近非常热门的AI绘画等技术在创作领域引起了广泛讨论。
AIGC技术的核心思想是利用人工智能算法生成具有一定创意和质量的内容。通过训练模型和大量数据的学习,AIGC可以根据输入的条件或指导,生成与之相关的内容。例如,通过输入关键词、描述或样本,AIGC可以生成与之相匹配的文章、图像、音频等。

利用Stable Diffudion模型生成图片

AIGC评测系统搭建

注意:

此项目涉及到利用Stable Diffudion模型进行推理实现图片——>图片,文本——>图片两点,对硬件设备要求较高。
本人设备配置如下图:
在这里插入图片描述

测评

利用推理代码加载模型和图片进行推理
主要代码如下

# aidlux相关
from cvs import *
import aidlite_gpu
from utils import detect_postprocess, preprocess_img, draw_detect_res
#, extract_detect_res

import time
import cv2

# AidLite初始化:调用AidLite进行AI模型的加载与推理,需导入aidlite
aidlite = aidlite_gpu.aidlite()
# Aidlite模型路径
model_path = '/home/AIGC/models/yolov5n-fp16.tflite'
# 定义输入输出shape
in_shape = [1 * 640 * 640 * 3 * 4]
out_shape = [1 * 25200 * 85 * 4]
# 加载Aidlite检测模型:支持tflite, tnn, mnn, ms, nb格式的模型加载
aidlite.ANNModel(model_path, in_shape, out_shape, 4, 0)

# 读取图片进行推理
# 设置测试集路径
source = "/home/AIGC/images/AIGC"
images_list = os.listdir(source)
print(images_list)
frame_id = 0
# 读取数据集
for image_name in images_list:
    frame_id += 1
    print("frame_id:", frame_id)
    image_path = os.path.join(source, image_name)
    frame = cvs.imread(image_path)

    # 预处理
    img = preprocess_img(frame, target_shape=(640, 640), div_num=255, means=None, stds=None)
    # 数据转换:因为setTensor_Fp32()需要的是float32类型的数据,所以送入的input的数据需为float32,大多数的开发者都会忘记将图像的数据类型转换为float32
    aidlite.setInput_Float32(img, 640, 640)
    # 模型推理API
    aidlite.invoke()
    # 读取返回的结果
    pred = aidlite.getOutput_Float32(0)
    # 数据维度转换
    pred = pred.reshape(1, 25200, 85)[0]
    # 模型推理后处理
    pred = detect_postprocess(pred, frame.shape, [640, 640, 3], conf_thres=0.25, iou_thres=0.45)
    # 绘制推理结果
    res_img = draw_detect_res(frame, pred)
    cvs.imshow(res_img)

    # 测试结果展示停顿
    time.sleep(5)
测评图片

在这里插入图片描述
在这里插入图片描述

Aidlux与PC通讯

在这里插入图片描述

PC端连接aidlux端代码
import socket
import cv2
import numpy as np
import time
import sys

### 本代码主要是客户端代码,aidlux上的Socket_fuwuduan.py是匹配的服务端代码,当服务端代码启动时,由本代码读取一张图片,推送过去

def recvall(sock, count):
    buf = b''  # buf是一个byte类型
    while count:
        newbuf = sock.recv(count)
        if not newbuf: return None
        buf += newbuf
        count -= len(newbuf)
    return buf

def SendAIGC():
    # 建立sock连接
    # address要连接的aidlux服务器IP地址和端口号
    address = ('192.168.2.13', 9023)
    try:
        # 建立socket对象
        # socket.AF_INET:服务器之间网络通信
        # socket.SOCK_STREAM:流式socket , for TCP
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        # 开启连接
        sock.connect(address)
    except socket.error as msg:
        print(msg)
        sys.exit(1)

    ###########传送AIGC图片#################
    ## 如果本地没有GPU
    if 1:
        frame = cv2.imread("car.png")
        # # 压缩参数,后面cv2.imencode将会用到,对于jpeg来说,15代表图像质量,越高代表图像质量越好为 0-100,默认95
        encode_param = [int(cv2.IMWRITE_JPEG_QUALITY), 95]
        # cv2.imencode将图片格式转换(编码)成流数据,赋值到内存缓存中;主要用于图像数据格式的压缩,方便网络传输
        # '.jpg'表示将图片按照jpg格式编码。
        result, imgencode = cv2.imencode('.jpg', frame, encode_param)
        # 建立矩阵
        data = np.array(imgencode)
        # 将numpy矩阵转换成字符形式,以便在网络中传输
        stringData = data.tostring()

        # 先发送要发送的数据的长度
        # ljust() 方法返回一个原字符串左对齐,并使用空格填充至指定长度的新字符串
        sock.send(str.encode(str(len(stringData)).ljust(16)))
        # 发送数据
        sock.send(stringData)
    ### 如果本地有GPU
    if 0:
        ### 本地生成AIGC图片 ###
        ## 添加AIGC代码 ##
        #####################
        frame = cv2.imread("car.png")
        # # 压缩参数,后面cv2.imencode将会用到,对于jpeg来说,15代表图像质量,越高代表图像质量越好为 0-100,默认95
        encode_param = [int(cv2.IMWRITE_JPEG_QUALITY), 95]
        # cv2.imencode将图片格式转换(编码)成流数据,赋值到内存缓存中;主要用于图像数据格式的压缩,方便网络传输
        # '.jpg'表示将图片按照jpg格式编码。
        result, imgencode = cv2.imencode('.jpg', frame, encode_param)
        # 建立矩阵
        data = np.array(imgencode)
        # 将numpy矩阵转换成字符形式,以便在网络中传输
        stringData = data.tostring()

        # 先发送要发送的数据的长度
        # ljust() 方法返回一个原字符串左对齐,并使用空格填充至指定长度的新字符串
        sock.send(str.encode(str(len(stringData)).ljust(16)))
        # 发送数据
        sock.send(stringData)

    # 读取服务器返回值
    receive = sock.recv(16)
    if len(receive):
         print("图片发送成功")
         print(str(receive, encoding='utf-8'))  ### 之前接受的帧率数据,现在换成image流数据
    sock.close()

if __name__ == '__main__':
    SendAIGC()
aidlux端连接PC端代码
import socket
import time
import cv2
import numpy
import copy

def ReceiveVideo():
    # IP地址'0.0.0.0'为等待客户端连接
    address = ('192.168.2.13', 9023)
    # 建立socket对象,参数意义见https://blog.csdn.net/rebelqsp/article/details/22109925
    # socket.AF_INET:服务器之间网络通信
    # socket.SOCK_STREAM:流式socket , for TCP
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 将套接字绑定到地址, 在AF_INET下,以元组(host,port)的形式表示地址.
    s.bind(address)
    # 开始监听TCP传入连接。参数指定在拒绝连接之前,操作系统可以挂起的最大连接数量。该值至少为1,大部分应用程序设为5就可以了。
    s.listen(5)

    def recvall(sock, count):
        buf = b''  # buf是一个byte类型
        while count:
            # 接受TCP套接字的数据。数据以字符串形式返回,count指定要接收的最大数据量.
            newbuf = sock.recv(count)
            if not newbuf: return None
            buf += newbuf
            count -= len(newbuf)
        return buf

    # 接受TCP连接并返回(conn,address),其中conn是  新的套接字对象,可以用来接收和发送数据。addr是连接客户端的地址。
    # 没有连接则等待有连接
    conn, addr = s.accept()
    print('connect from PC:' + str(addr))
    if 1:
        start = time.time()  # 用于计算帧率信息
        length = recvall(conn, 16)  # 获得图片文件的长度,16代表获取长度
        stringData = recvall(conn, int(length))  # 根据获得的文件长度,获取图片文件
        data = numpy.frombuffer(stringData, numpy.uint8)  # 将获取到的字符流数据转换成1维数组
        decimg = cv2.imdecode(data, cv2.IMREAD_COLOR)  # 将数组解码成图像
        cv2.imwrite("car.jpg",decimg)
        print("save image ")
        # cv2.imshow('SERVER', decimg)  # 显示图像
        # cv2.waitKey(2000)
        #
        # # 进行下一步处理
        # # 。
        # # 。
        # # 。
        #
        # # 将帧率信息回传,主要目的是测试可以双向通信
        end = time.time()
        seconds = end - start
        fps = 1 / seconds
        ##返回已处理图像到客户端
        conn.send(bytes(str(int(fps)), encoding='utf-8'))
        # image = copy.deepcopy(decimg)
        # encode_param = [int(cv2.IMWRITE_JPEG_QUALITY), 100]
        # result, imgencode = cv2.imencode('.jpg', image, encode_param)
        # # 建立矩阵
        # data = numpy.array(imgencode)
        # # 将numpy矩阵转换成字符形式,以便在网络中传输
        # img_Data = data.tostring()

        # # 先发送要发送的数据的长度
        # # ljust() 方法返回一个原字符串左对齐,并使用空格填充至指定长度的新字符串
        # conn.send(str.encode(str(len(img_Data)).ljust(16)))
        # # # print(img_Data)
        # # # 发送数据
        # conn.send(img_Data)

        # if cv2.waitKey(10) & 0xff == 27:
        #     break
    s.close()
    # cv2.destroyAllWindows()

if __name__ == '__main__':
    ReceiveVideo()


在这里插入图片描述
在这里插入图片描述

结果视频

AidLux

### 回答1: M-LVDS(多点低压差分信号)是一种用于高速(多点)数据传输的接口技术。它是LVDS(低压差分信号)接口的一种升级版本,广泛应用于各种领域,包括工业自动化、通信设备、计算机和汽车电子等。 M-LVDS接口具有以下特点: 1. 高速传输:M-LVDS可以实现高达500Mbps的数据传输速度,适用于需要快速传输大量数据的应用场景。 2. 多点连接:与传统的LVDS接口不同,M-LVDS接口可以同时连接多个设备,实现设备之间的多点通信。 3. 低电压和低功耗:M-LVDS采用低压差分信号传输,电压波动小,功耗相对较低,能够降低系统的能耗。 4. 抗干扰性强:M-LVDS接口在高速传输环境下具有较强的抗干扰能力,能够有效地抵御噪声和干扰对数据传输的影响。 M-LVDS接口在实际应用中具有广泛的用途。例如,在工业自动化领域,M-LVDS接口可以用于传输高速数据,实现设备之间的快速通信;在通信设备中,M-LVDS接口可以用于传输高质量音频和视频信号;在计算机领域,M-LVDS接口可以用于连接显示器和其他外部设备,实现高清视频传输;在汽车电子领域,M-LVDS接口可以用于车载音频和视频娱乐系统,提供高品质的娱乐体验。 总而言之,M-LVDS接口是一种多点互联的高速数据传输技术,具有高速传输、多点连接、低电压和低功耗、抗干扰性强等特点,在各个领域都有着广泛的应用前景。 ### 回答2: M-LVDS (Multi-point Low Voltage Differential Signaling) 是一种用于多点互联应用的数据传输接口。它采用差分信号传输方式,能够在长距离传输数据,并且保持较低的功耗和噪声。M-LVDS广泛应用于工业控制系统、汽车电子、通信设备等领域。 M-LVDS的优势在于其可靠性和高速传输能力。它采用差分信号传输,可以抵抗电磁干扰和噪声,从而提供更可靠的数据传输。此外,M-LVDS的传输速率可以达到几百兆比特每秒,可以满足许多高速数据传输需求。 此外,M-LVDS还具有低功耗的特点。由于使用低压差分信号传输,M-LVDS比传统的单信号传输接口功耗更低。这对于一些需要长距离传输数据并要求低功耗的应用来说非常重要。 M-LVDS适用于多种多点互联应用。例如,在工业控制系统中,传感器和执行器通常需要长距离传输数据,而M-LVDS可以提供可靠的数据传输和较低的功耗。在汽车电子中,M-LVDS也能够满足高速数据传输的需求,例如在车载娱乐系统中传输音频和视频信号。此外,M-LVDS还可用于通信设备中,如以太网交换机和光纤通信设备等。 总之,M-LVDS是一种适用于多点互联应用的数据传输接口,具有可靠的传输性能、高速传输能力和低功耗特点。它在工业控制、汽车电子、通信设备等领域有广泛的应用前景。 ### 回答3: 多点互联应用是指将多个设备通过网络连接起来,实现数据的传输与共享。而M-LVDS(Multipoint Low-Voltage Differential Signaling)是一种多点互联应用中常用的传输技术,它适用于远距离、高速的数据传输。 M-LVDS是一种差分信号传输技术,它通过同时传输高电平和低电平的差值来表示数字信号。相比于单传输技术,差分传输具有更好的抗干扰能力和抗噪声能力,能够在长距离传输中保持信号的稳定性。 M-LVDS的工作电压通常为2.5V或3.3V,可以在1Mbps到200Mbps的速率下工作。它支持多点连接,一个主设备可以同时与多个从设备进行数据通信。这使得M-LVDS适用于需要高速传输和多点连接的应用场景,比如工业自动化控制系统、汽车电子设备等。 M-LVDS的连接方式通常采用星型拓扑结构,主设备作为总线的中心节点,从设备通过独立的线路与主设备连接。M-LVDS总线可以实现全双工通信,使得主设备和从设备可以同时发送和接收数据。 总之,M-LVDS是一种多点互联应用中常用的传输技术,它通过差分信号传输实现高速、远距离的数据传输,具有良好的抗干扰能力和抗噪声能力。它适用于需要高速传输和多点连接的应用场景,可以广泛应用于工业自动化控制系统、汽车电子设备等领域。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值