在华为开发者空间,简单几步带你实现AI风格化编程
摘要:通过调用ModelArts上的动漫头像制作应用,将头像图片转化为动漫风格的头像图片。
一、 案例介绍
二、 领取云主机
三、 实验流程
四、 安装FunctionGraph插件
方式一:在线安装
方式二:本地安装
五、创建函数
<!DOCTYPE html> <html lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>FunctionGraph 动漫头像制作</title> <style> body { font-family: Arial, sans-serif; background: repeating-linear-gradient(45deg, #ddd 0 2px, transparent 2px 4px), repeating-linear-gradient(-45deg, #ddd 0 2px, transparent 2px 4px); text-align: center; } h1 { color: #333; } p.description { color: #666; } #upload-button { padding: 15px 30px; background-color: #007bff; color: white; border: none; border-radius: 5px; cursor: pointer; font-size: 20px; margin-top: 20px; } .image-container { display: flex; margin-top: 50px; justify-content: center; align-items: center; } .image-box { margin: 0 40px; padding: 0; width: 500px; height: 500px; display: flex; flex-direction: row; position: relative; letter-spacing: .3px; padding: 10px; border-radius: 10px; transition: background-color .3s ease-in-out; display: flex; justify-content: center; align-items: center; background-color: white; box-shadow: 0 0 10px rgba(0, 0, 0, 0.3); } #original-image-box, #preview-container { border: 2px dashed #6dcff6; border-radius: 10px; width: 480px; height: 480px; } .but-box { margin: 0px 30px; padding: 0; width: 500px; display: flex; justify-content: center; font-size: 30px; font-weight: 700; } .image-box img { height: 100%; max-width: 100%; } .error-message { color: red; margin-top: 10px; } .size-warning { font-size: 20px; color: orange; margin-top: 10px; } button { padding: 20px 40px; background-color: #4CAF50; color: white; border: none; border-radius: 5px; cursor: pointer; font-size: 20px; } h1 { font-size: 40px; } .triangle-arrow { width: 0; height: 0; border-top: 20px solid transparent; border-bottom: 20px solid transparent; border-left: 30px solid blue; } .loading-mask { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0.1); display: none; justify-content: center; align-items: flex-end; z-index: 999; } .loading-text { font-size: 30px; color: red; } </style> </head> <body> <h1>动漫风格头像制作案例:用户上传自拍照片,调用华为云上算力,一键生成动漫风格人物头像。</h1> <input type="file" id="image-input" style="display: none;"> <button id="upload-button">请上传照片</button> <p class="size-warning">上传小于 6MB 的图片。</p> <p class="error-message" id="size-error"></p> <div class="image-container"> <div class="image-box"> <div id="original-image-box"> </div> </div> <div class="triangle-arrow"></div> <div class="image-box"> <div id="preview-container"> </div> </div> </div> <div class="image-container"> <div class="but-box"> 原图 </div> <div class="but-box"> 效果图 </div> </div> <div class="loading-mask" id="loading-mask"> <p class="loading-text">照片生成中...</p> </div> <script> const uploadButton = document.getElementById('upload-button'); const imageInput = document.getElementById('image-input'); const originalImageBox = document.getElementById('original-image-box'); const imagePreview = document.getElementById("preview-container"); const sizeError = document.getElementById('size-error'); const sizeWarning = document.querySelector('.size-warning'); const loadingMask = document.getElementById('loading-mask'); uploadButton.addEventListener('click', () => { imageInput.click(); }); imageInput.addEventListener('change', () => { const file = imageInput.files[0]; if (file) { if (file.size > 6 * 1024 * 1024) { sizeError.textContent = '图片大小不能超过 6MB。'; sizeWarning.textContent = ''; return; } const img = document.createElement('img'); img.src = URL.createObjectURL(file); originalImageBox.innerHTML = ''; originalImageBox.appendChild(img); if (!file) { console.log("!file ") return; } const formData = new FormData(); formData.append("image", file); loadingMask.style.display = 'flex'; fetch("/carton/upload", { method: "POST", body: formData, }) .then((response) => response.text()) .then((data) => { let parsedObject; try { parsedObject = JSON.parse(data); } catch (error) { console.error('JSON 解析错误:', error); parsedObject = null; // 或者其他默认值,根据你的需求设置 } const animeImgElement = document.createElement('img'); animeImgElement.src = "data:image/png;base64," + parsedObject.results[0]; imagePreview.innerHTML = ''; imagePreview.appendChild(animeImgElement); loadingMask.style.display = 'none'; }) .catch((error) => { loadingMask.style.display = 'none'; console.error(error); alert("处理失败"); }); } }); </script> </body> </html>
from flask import Flask, request, render_template import requests import os MODEL_ART_API = os.getenv('MODEL_ART_API') app = Flask(__name__) @app.route('/') def index(): return render_template('index.html') @app.route('/carton/upload', methods=['POST']) def upload_file(): if 'image' not in request.files: return 'No file uploaded.', 400 file = request.files['image'] if file.filename == '': return 'Filename is empty.', 400 resp = model_art_pic_carton(file) print(resp) return resp.json() def model_art_pic_carton(file): payload = {} files=[ ('images',(file.filename,file,'image/png'))] headers = { 'x-auth-token': get_token_from_fg_header() } response = requests.request("POST", MODEL_ART_API, headers=headers, data=payload, files=files,verify=False) return response # 从FunctionGraph平台发送的请求里获取鉴权token # 需要先配置委托 并且 在高级设置打开传入秘钥开关 def get_token_from_fg_header(): return request.headers.get("X-Cff-Auth-Token") if __name__ == '__main__': app.run(debug=True,port=8000,host="0.0.0.0")
/opt/function/runtime/python3.6/rtsp/python/bin/python3 $RUNTIME_CODE_ROOT/app.py
六、部署函数
七、函数配置委托
八、函数配置触发器
九、函数添加依赖包
十、订阅模型并部署AI应用
十一、制作动漫头像

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
RWKV 社区 10 月动态速览!
欢迎大家收看《RWKV 社区最新动态》,本期内容收录了 RWKV 社区 2024 年 10 月的最新动态。 10 月动态省流版(TL;DR) RWKV 社区活动 10 月 13 日,RWKV 团队在北京大学做了《RWKV 技术产品化与生态及模型架构》主题分享 RWKV 学术研究动态 新论文:VisualRWKV-HD and UHD,VisualRWKV 项目的高分辨率版本 MATCC:基于 RWKV 架构的股价预测框架 Bone:由 RWKV 社区发布的参数高效微调新方法 RWKV 社区项目动态 OccRWKV:基于 RWKV 的 3D 语义占用预测项目,可用于自动驾驶、具身智能等领域 Sudoku-RWKV:一个用于解决数独谜题的专用 RWKV 模型,仅 29M 参数 RWKV 社区活动预告 11 月 2 日(本周六),RWKV 团队会在浙江大学开展《RWKV 技术产品化与生态及模型架构》主题讲座 RWKV 社区活动 此版块包含 RWKV 官方动态 ,以及 RWKV 社区举办或参加的各类活动。 RWKV 进高校第一站:北京大学 应北京大学创新学社的邀请,RWKV 团队于 10 月 ...
- 下一篇
SpringBoot 实战:文件上传之秒传、断点续传、分片上传
文件上传功能几乎是每个 Web 应用不可或缺的一部分。无论是个人博客中的图片上传,还是企业级应用中的文档管理,文件上传都扮演着至关重要的角色。今天,松哥和大家来聊聊文件上传中的几个高级玩法——秒传、断点续传和分片上传。 一 文件上传的常见场景 在日常开发中,文件上传的场景多种多样。比如,在线教育平台上的视频资源上传,社交平台上的图片分享,以及企业内部的知识文档管理等。这些场景对文件上传的要求也各不相同,有的追求速度,有的注重稳定性,还有的需要考虑文件大小和安全性。因此,针对不同需求,我们有了秒传、断点续传和分片上传等解决方案。 二 秒传、断点上传与分片上传 秒传 秒传,顾名思义,就是几乎瞬间完成文件上传的过程。其实现原理是通过计算文件的哈希值(如 MD5 或 SHA-1),然后将这个唯一的标识符发送给服务器。如果服务器上已经存在相同的文件,则直接返回成功信息,避免了重复上传。这种方式不仅节省了带宽,也大大提高了用户体验。 断点续传 断点续传是指在网络不稳定或者用户主动中断上传后,能够从上次中断的地方继续上传,而不需要重新开始整个过程。这对于大文件上传尤为重要,因为它可以有效防止因网络问...
相关文章
文章评论
共有0条评论来说两句吧...