火山引擎图像超分使用

官网对超分能力的介绍:https://www.volcengine.com/docs/86081/1660419

快速入门里面对于如何获得key已经有详细介绍了:https://www.volcengine.com/docs/86081/1660009

问题出现在获得这些之后,如何进行后续的相关操作,也就是上传图片,并返回得到处理过后的图片。

文档中心有一个基础的教程https://www.volcengine.com/docs/6444/1390583,我是用的是python的版本

为了传入url,我使用了gitee作为媒介,当然使用github也是一样的,但是我这里github不稳定,就使用git了

接下来遇到的第一个问题是图片解码一直出错,这个我尝试修改了图片的格式也没有解决,后来莫名其妙就自己好了,我都怀疑是不是因为服务开通的时间有延迟?

第二个问题就是官方给的例子,拿到最后的是base64的码流,当然可以使用网页在线转(我一开始就是这么干的),https://www.base64decode.org/

这样到底不方便,后面从网上搜了一段直接能够转化的python代码,和原始的代码拼到一起,就可以直接将处理的图像保存到本地了。

下面直接附上完整代码,当然key已经被我删除了。

python 复制代码
import json
import sys
import os
import base64
import datetime
import hashlib
import hmac
import requests


method = 'POST'
host = 'visual.volcengineapi.com'
region = 'cn-north-1'
endpoint = 'https://visual.volcengineapi.com'
service = 'cv'

def sign(key, msg):
	return hmac.new(key, msg.encode('utf-8'), hashlib.sha256).digest()

def getSignatureKey(key, dateStamp, regionName, serviceName):
	kDate = sign(key.encode('utf-8'), dateStamp)
	kRegion = sign(kDate, regionName)
	kService = sign(kRegion, serviceName)
	kSigning = sign(kService, 'request')
	return kSigning

def formatQuery(parameters):
	request_parameters_init = ''
	for key in sorted(parameters):
		request_parameters_init += key + '=' + parameters[key] + '&'
	request_parameters = request_parameters_init[:-1]
	return request_parameters

def save_base64_image(base64_data, output_path):
# 移除可能的前缀
	if "base64," in base64_data:
		base64_data = base64_data.split("base64,")[1]

	# 解码并保存图片
	with open(output_path, "wb") as f:
		f.write(base64.b64decode(base64_data))

	print(f"图片已保存至 {output_path}")
			
def signV4Request(access_key, secret_key, service, req_query, req_body):
	if access_key is None or secret_key is None:
		print('No access key is available.')
		sys.exit()

	t = datetime.datetime.utcnow()
	current_date = t.strftime('%Y%m%dT%H%M%SZ')
	# current_date = '20210818T095729Z'
	datestamp = t.strftime('%Y%m%d')  # Date w/o time, used in credential scope
	canonical_uri = '/'
	canonical_querystring = req_query
	signed_headers = 'content-type;host;x-content-sha256;x-date'
	payload_hash = hashlib.sha256(req_body.encode('utf-8')).hexdigest()
	content_type = 'application/json'
	canonical_headers = 'content-type:' + content_type + '\n' + 'host:' + host + \
		'\n' + 'x-content-sha256:' + payload_hash + \
		'\n' + 'x-date:' + current_date + '\n'
	canonical_request = method + '\n' + canonical_uri + '\n' + canonical_querystring + \
		'\n' + canonical_headers + '\n' + signed_headers + '\n' + payload_hash
	# print(canonical_request)
	algorithm = 'HMAC-SHA256'
	credential_scope = datestamp + '/' + region + '/' + service + '/' + 'request'
	string_to_sign = algorithm + '\n' + current_date + '\n' + credential_scope + '\n' + hashlib.sha256(
		canonical_request.encode('utf-8')).hexdigest()
	# print(string_to_sign)
	signing_key = getSignatureKey(secret_key, datestamp, region, service)
	# print(signing_key)
	signature = hmac.new(signing_key, (string_to_sign).encode(
		'utf-8'), hashlib.sha256).hexdigest()
	# print(signature)

	authorization_header = algorithm + ' ' + 'Credential=' + access_key + '/' + \
		credential_scope + ', ' + 'SignedHeaders=' + \
		signed_headers + ', ' + 'Signature=' + signature
	# print(authorization_header)
	headers = {'X-Date': current_date,
			   'Authorization': authorization_header,
			   'X-Content-Sha256': payload_hash,
			   'Content-Type': content_type
			   }
	# print(headers)

	# ************* SEND THE REQUEST *************
	request_url = endpoint + '?' + canonical_querystring

	print('\nBEGIN REQUEST++++++++++++++++++++++++++++++++++++')
	print('Request URL = ' + request_url)
	try:
		r = requests.post(request_url, headers=headers, data=req_body)
		# print(r.text.type())
		# print(r.text['binary_data_base64'])
	except Exception as err:
		print(f'error occurred: {err}')
		raise
	else:
		print('\nRESPONSE++++++++++++++++++++++++++++++++++++')
		print(f'Response code: {r.status_code}\n')
		# 使用 replace 方法将 \u0026 替换为 &
		resp_str = r.text.replace("\\u0026", "&")
		print(f'Response body: {resp_str}\n')

		content = resp_str.split('"binary_data_base64":[')[1]
		content = content.split('"]},"message"')[0]
		save_base64_image(content, "fig12.jpg")



if __name__ == "__main__":
	# 请求凭证,从访问控制申请
	
	# import base64
	# import requests

	# url = "https://gitee.com/bq2w/pic_paper/raw/master/fig4.jpg"
	# response = requests.get(url)
	# image_base64 = base64.b64encode(response.content).decode("utf-8")
	
	access_key = ''  #your key
	secret_key = ''

	# 请求Query,按照接口文档中填入即可
	query_params = {
		'Action': 'CVProcess',
		'Version': '2022-08-31',
	}
	formatted_query = formatQuery(query_params)

	# 请求Body,按照接口文档中填入即可
	body_params = {
		#"req_key": "lens_vida_nnsr",
		"req_key": "lens_nnsr2_pic_common",
		"image_urls": [
			"https://gitexx.png",
		],
		"model_quality": "MQ",
		"aigc_meta": {
			"producer_id": "1",
		}
	}
	formatted_body = json.dumps(body_params)
	
	signV4Request(access_key, secret_key, service,
				  formatted_query, formatted_body)

别的服务,没有开通,也没有试过,但是就体验来说,怎么说呢,可能自然风景还行,如果是科研照片,还是不太行

相关推荐
hahaha60161 天前
HLS高层次综合设计技巧--C++类和模板
图像处理·人工智能·算法·计算机视觉
AndrewHZ2 天前
图像处理入门021 | 直方图:图像像素分布的可视化 —— cv2.calcHist 与 4 类典型分布
图像处理·opencv·直方图·直方图均衡化·cdf·灰度直方图·多通道直方图
AndrewHZ3 天前
图像处理入门020 | 图像二值化:阈值分割基础 —— cv2.threshold 五种类型与自适应阈值铺垫
图像处理·opencv·文档扫描·阈值分割·图像二值化·trackbar·自适应阈值
笑霸final3 天前
不用上传服务器!用 Vue3 + ONNX Runtime Web 在浏览器本地实现智能抠图
运维·前端·图像处理·ai·onnx·canva可画·web性能优化
A hao4 天前
户外LED广告牌需要什么防护等级IP级别?
大数据·网络·图像处理·人工智能·网络协议·tcp/ip·广告
一只嵌入式爱好者4 天前
深入理解ISP
图像处理·isp
sali-tec4 天前
C# 基于OpenCv的视觉工作流-章106-差值追踪
图像处理·人工智能·opencv·算法·计算机视觉
阿图灵5 天前
OpenCV 绘图五件套:画圆、文本、线段、矩形与椭圆
图像处理·人工智能·python·opencv·计算机视觉·绘图
成都佳洋光电科技有限公司5 天前
一文了解机器视觉成像
图像处理·人工智能·工业相机·工业镜头·短波红外
星月夜语5 天前
2026 TPAMI | StarIR:空间-频域融合的高效图像复原
图像处理·深度学习·计算机视觉