本帖子源于AidLux面向众多开发者的AIGC训练营,目的在于实现使用stablediffusion生成图片传输到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.137.116', 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(1000)
receive1 = sock.recv(1000)
receive2 = sock.recv(1000)
i = 0
if len(receive):
print("图片发送成功")
print("检测类别及其数目:")
print(str(receive, encoding='utf-8'),str(receive1, encoding='utf-8'))
# print(str(receive2, encoding='utf-8'))
之前接受的帧率数据,现在换成image流数据
sock.close()
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.137.116', 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(1000)
receive1 = sock.recv(1000)
receive2 = sock.recv(1000)
i = 0
if len(receive):
print("图片发送成功")
print("检测类别及其数目:")
print(str(receive, encoding='utf-8'),str(receive1, encoding='utf-8'))
# print(str(receive2, encoding='utf-8'))
之前接受的帧率数据,现在换成image流数据
sock.close()
if name == 'main': SendAIGC()if name == 'main': SendAIGC()`