Asian Beauty Z-Image Turbo 跨平台部署:基于.NET框架的Windows桌面应用集成

news2026/3/28 16:45:32
Asian Beauty Z-Image Turbo 跨平台部署基于.NET框架的Windows桌面应用集成最近在做一个Windows桌面项目需要集成一个图片生成功能。团队里的小伙伴用Python在服务器上跑了一个Asian Beauty Z-Image Turbo模型效果挺惊艳的但问题来了我们主力开发环境是.NET总不能为了调个模型让整个桌面应用都去学Python吧这其实是个挺典型的场景。很多公司都有专门的AI服务器上面部署着各种强大的模型但业务端应用五花八门有Web的有移动端的也有像我们这样用WPF或WinForms做桌面工具的。怎么让这些“老牌”技术栈的应用也能轻松享受到最新AI模型的能力呢我琢磨了一下最后搞出了一个挺实用的方案用Python FastAPI给模型做个RESTful API包装器然后让C#客户端通过HTTP去调用。这样一来.NET应用就能像调用本地服务一样远程使用GPU服务器上的模型了。整个过程从图片上传、生成进度显示到结果下载都能在熟悉的C#环境里搞定。今天我就把这个方案的思路和具体实现跟大家分享一下。如果你也在为类似的问题头疼希望这篇内容能给你一些启发。1. 为什么需要跨平台集成方案先说说我们当时遇到的几个具体问题。第一是技术栈不统一。服务器团队熟悉Python和深度学习框架他们用起来得心应手。但我们客户端团队主要用C#和.NET对Python那一套不太熟。如果硬要把模型塞进.NET环境光是环境依赖、库版本冲突这些事就够折腾一阵子了。第二是资源利用问题。Asian Beauty Z-Image Turbo这类模型对GPU要求比较高我们不可能给每个开发人员的电脑都配一块高端显卡。更合理的做法是把模型部署在几台集中的GPU服务器上让大家通过网络来共享计算资源。第三是维护和升级的便利性。模型本身会不断迭代更新如果每个客户端都内置一个模型那每次升级都得重新打包、分发、安装运维成本太高。集中部署的话只需要更新服务器端的镜像所有客户端就自动用上新版本了。基于这些考虑我们决定采用“服务化”的思路。把模型能力封装成标准的HTTP API这样任何能发送HTTP请求的客户端不管是.NET、Java还是JavaScript都能方便地调用。这个方案的核心就是在模型和客户端之间搭建一座通用的“桥梁”。2. 整体架构设计思路我们的目标很明确让C#写的Windows桌面应用能无缝调用远程服务器上的Asian Beauty Z-Image Turbo模型。整个架构可以分成三层来看。最底层是模型服务层。这就是Asian Beauty Z-Image Turbo本身它可能运行在Docker容器里或者直接装在服务器的Python环境中。这一层负责接收图片生成请求调用模型进行计算然后返回生成结果。中间层是API包装层。我们用Python的FastAPI框架给模型服务套了一个“外壳”。这个外壳主要做几件事接收HTTP请求、把请求数据转换成模型能理解的格式、调用模型、再把模型输出包装成HTTP响应返回。同时它还能处理一些通用逻辑比如请求验证、日志记录、错误处理等。最上层就是我们的.NET客户端了。它通过HTTP协议与API层通信发送生成请求接收生成结果。为了提升用户体验我们还需要在客户端实现一些功能比如图片上传的进度条、生成任务的进度显示、生成结果的预览和下载等。这个架构的好处是解耦彻底。模型团队可以专心优化模型效果和推理速度不用操心客户端怎么调用。客户端团队也只需要关注HTTP接口的调用逻辑和UI交互不用深入模型细节。两边通过定义清晰的API契约来协作开发效率高后期维护也方便。3. 服务端用FastAPI构建RESTful API服务端的关键是用FastAPI快速搭建一个高性能的Web API。FastAPI的异步特性很适合这种IO密集型的场景而且它能自动生成OpenAPI文档客户端开发的时候参考起来特别方便。首先我们需要安装必要的依赖。pip install fastapi uvicorn python-multipart pillow假设我们的Asian Beauty Z-Image Turbo模型已经封装好了一个生成函数叫generate_image。它接收一些参数比如提示词、图片尺寸等然后返回生成好的图片数据。接下来我们创建一个简单的FastAPI应用暴露一个图片生成的端点。from fastapi import FastAPI, File, UploadFile, HTTPException from fastapi.responses import StreamingResponse from pydantic import BaseModel from typing import Optional import io from PIL import Image import asyncio # 假设这是你的模型生成函数 from your_model_module import generate_image app FastAPI(titleZ-Image Turbo API, version1.0.0) class GenerateRequest(BaseModel): prompt: str negative_prompt: Optional[str] None width: int 512 height: int 512 steps: int 20 guidance_scale: float 7.5 app.post(/generate/from-text) async def generate_from_text(request: GenerateRequest): 根据文本描述生成图片 try: # 调用模型生成图片 # 这里假设generate_image返回PIL Image对象 image generate_image( promptrequest.prompt, negative_promptrequest.negative_prompt, widthrequest.width, heightrequest.height, stepsrequest.steps, guidance_scalerequest.guidance_scale ) # 将图片转换为字节流 img_byte_arr io.BytesIO() image.save(img_byte_arr, formatPNG) img_byte_arr.seek(0) return StreamingResponse(img_byte_arr, media_typeimage/png) except Exception as e: raise HTTPException(status_code500, detailf生成失败: {str(e)}) app.post(/generate/from-image) async def generate_from_image( prompt: str, image: UploadFile File(...), strength: float 0.75 ): 基于上传的图片进行生成或编辑 try: # 读取上传的图片 contents await image.read() input_image Image.open(io.BytesIO(contents)) # 调用模型这里假设模型支持图生图 result_image generate_image( promptprompt, init_imageinput_image, strengthstrength ) # 返回结果 img_byte_arr io.BytesIO() result_image.save(img_byte_arr, formatPNG) img_byte_arr.seek(0) return StreamingResponse(img_byte_arr, media_typeimage/png) except Exception as e: raise HTTPException(status_code500, detailf处理失败: {str(e)}) app.get(/health) async def health_check(): 健康检查端点 return {status: healthy, service: Z-Image Turbo API}这个API提供了两个主要端点一个是用纯文本描述生成图片另一个是基于上传的图片进行生成或编辑。每个端点都定义了清晰的输入参数并返回图片数据流。为了支持生成进度查询我们还可以添加一个任务状态端点。这需要引入后台任务机制但核心思路是一样的客户端提交生成请求后得到一个任务ID然后可以轮询这个ID来获取生成进度。启动服务很简单uvicorn main:app --host 0.0.0.0 --port 8000 --reload服务启动后访问http://localhost:8000/docs就能看到自动生成的API文档这对客户端开发者来说非常友好。4. 客户端.NET桌面应用集成服务端搞定后接下来就是如何在.NET桌面应用里调用这些API了。我们以WPF应用为例但WinForms的思路也差不多。首先我们需要一个HTTP客户端来与服务端通信。.NET 6推荐使用HttpClient但要注意正确管理它的生命周期避免套接字耗尽问题。我通常会创建一个专门的服务类来封装所有API调用逻辑。using System; using System.IO; using System.Net.Http; using System.Net.Http.Headers; using System.Net.Http.Json; using System.Threading; using System.Threading.Tasks; using System.Windows.Media.Imaging; namespace ZImageTurboClient.Services { public class ImageGenerationService { private readonly HttpClient _httpClient; private readonly string _baseUrl; public ImageGenerationService(string baseUrl http://localhost:8000) { _baseUrl baseUrl; _httpClient new HttpClient(); _httpClient.Timeout TimeSpan.FromMinutes(5); // 生成图片可能需要较长时间 } public async TaskBitmapImage GenerateFromTextAsync( string prompt, string negativePrompt null, int width 512, int height 512, int steps 20, float guidanceScale 7.5f, IProgressdouble progress null, CancellationToken cancellationToken default) { try { var requestData new { prompt, negative_prompt negativePrompt, width, height, steps, guidance_scale guidanceScale }; // 这里可以添加进度报告逻辑 // 如果是长时间任务可以考虑使用Server-Sent Events或WebSocket // 这里先用简单的轮询模拟 if (progress ! null) { // 模拟进度更新 for (int i 0; i 100; i 10) { if (cancellationToken.IsCancellationRequested) break; await Task.Delay(100, cancellationToken); progress.Report(i / 100.0); } } var response await _httpClient.PostAsJsonAsync( ${_baseUrl}/generate/from-text, requestData, cancellationToken); response.EnsureSuccessStatusCode(); // 读取图片数据 var imageBytes await response.Content.ReadAsByteArrayAsync(cancellationToken); // 转换为BitmapImage用于WPF显示 return await LoadImageAsync(imageBytes); } catch (Exception ex) { // 这里应该记录日志 throw new ApplicationException(图片生成失败, ex); } } public async TaskBitmapImage GenerateFromImageAsync( string prompt, byte[] imageBytes, float strength 0.75f, IProgressdouble progress null, CancellationToken cancellationToken default) { try { using var content new MultipartFormDataContent(); // 添加文本参数 content.Add(new StringContent(prompt), prompt); content.Add(new StringContent(strength.ToString()), strength); // 添加图片文件 var imageContent new ByteArrayContent(imageBytes); imageContent.Headers.ContentType MediaTypeHeaderValue.Parse(image/png); content.Add(imageContent, image, input.png); // 进度报告 if (progress ! null) { // 实际项目中应该根据服务器返回的进度来更新 // 这里先简单模拟 await Task.Delay(500, cancellationToken); progress.Report(0.3); await Task.Delay(500, cancellationToken); progress.Report(0.6); await Task.Delay(500, cancellationToken); progress.Report(1.0); } var response await _httpClient.PostAsync( ${_baseUrl}/generate/from-image, content, cancellationToken); response.EnsureSuccessStatusCode(); var resultBytes await response.Content.ReadAsByteArrayAsync(cancellationToken); return await LoadImageAsync(resultBytes); } catch (Exception ex) { throw new ApplicationException(图片处理失败, ex); } } private async TaskBitmapImage LoadImageAsync(byte[] imageBytes) { using var stream new MemoryStream(imageBytes); var bitmap new BitmapImage(); bitmap.BeginInit(); bitmap.CacheOption BitmapCacheOption.OnLoad; bitmap.StreamSource stream; bitmap.EndInit(); bitmap.Freeze(); // 跨线程使用需要Freeze return bitmap; } public async Taskbool CheckHealthAsync(CancellationToken cancellationToken default) { try { var response await _httpClient.GetAsync(${_baseUrl}/health, cancellationToken); return response.IsSuccessStatusCode; } catch { return false; } } public void Dispose() { _httpClient?.Dispose(); } } }这个服务类封装了与API服务器的所有交互。它提供了两个主要方法GenerateFromTextAsync用于文生图GenerateFromImageAsync用于图生图。两个方法都支持进度报告和取消操作这对桌面应用来说很重要因为用户可能需要取消长时间运行的任务。5. 实现进度显示与结果处理有了基础的服务类接下来我们看看如何在WPF界面中集成这些功能。一个好的用户体验应该包括直观的参数输入、实时的进度反馈、生成结果的预览和保存。我们先创建一个简单的视图模型用于绑定UI。using System; using System.ComponentModel; using System.IO; using System.Threading; using System.Threading.Tasks; using System.Windows.Input; using System.Windows.Media.Imaging; using Microsoft.Toolkit.Mvvm.ComponentModel; using Microsoft.Toolkit.Mvvm.Input; namespace ZImageTurboClient.ViewModels { public class MainViewModel : ObservableObject { private readonly ImageGenerationService _generationService; private string _prompt a beautiful landscape with mountains and a lake; private string _negativePrompt blurry, low quality, watermark; private int _width 512; private int _height 512; private double _progress; private bool _isGenerating; private BitmapImage _generatedImage; private BitmapImage _inputImage; public string Prompt { get _prompt; set SetProperty(ref _prompt, value); } public string NegativePrompt { get _negativePrompt; set SetProperty(ref _negativePrompt, value); } public int Width { get _width; set SetProperty(ref _width, value); } public int Height { get _height; set SetProperty(ref _height, value); } public double Progress { get _progress; set SetProperty(ref _progress, value); } public bool IsGenerating { get _isGenerating; set SetProperty(ref _isGenerating, value); } public BitmapImage GeneratedImage { get _generatedImage; set SetProperty(ref _generatedImage, value); } public BitmapImage InputImage { get _inputImage; set SetProperty(ref _inputImage, value); } public ICommand GenerateCommand { get; } public ICommand UploadImageCommand { get; } public ICommand SaveImageCommand { get; } private CancellationTokenSource _cancellationTokenSource; public MainViewModel() { _generationService new ImageGenerationService(); GenerateCommand new AsyncRelayCommand(GenerateImageAsync, CanGenerate); UploadImageCommand new RelayCommand(UploadImage); SaveImageCommand new RelayCommand(SaveImage, () GeneratedImage ! null); } private bool CanGenerate() !IsGenerating !string.IsNullOrWhiteSpace(Prompt); private async Task GenerateImageAsync() { if (IsGenerating) return; IsGenerating true; Progress 0; GeneratedImage null; _cancellationTokenSource new CancellationTokenSource(); var progress new Progressdouble(p Progress p); try { BitmapImage result; if (InputImage ! null) { // 图生图模式 var imageBytes await ConvertImageToBytesAsync(InputImage); result await _generationService.GenerateFromImageAsync( Prompt, imageBytes, progress: progress, cancellationToken: _cancellationTokenSource.Token); } else { // 文生图模式 result await _generationService.GenerateFromTextAsync( Prompt, NegativePrompt, Width, Height, progress: progress, cancellationToken: _cancellationTokenSource.Token); } GeneratedImage result; } catch (OperationCanceledException) { // 用户取消了操作 } catch (Exception ex) { // 这里应该显示错误信息给用户 Console.WriteLine($生成失败: {ex.Message}); } finally { IsGenerating false; Progress 0; _cancellationTokenSource?.Dispose(); _cancellationTokenSource null; } } private void UploadImage() { // 使用OpenFileDialog让用户选择图片 var dialog new Microsoft.Win32.OpenFileDialog { Filter Image files (*.png;*.jpg;*.jpeg)|*.png;*.jpg;*.jpeg|All files (*.*)|*.*, Title 选择输入图片 }; if (dialog.ShowDialog() true) { try { var bitmap new BitmapImage(new Uri(dialog.FileName)); InputImage bitmap; } catch (Exception ex) { Console.WriteLine($加载图片失败: {ex.Message}); } } } private void SaveImage() { if (GeneratedImage null) return; var dialog new Microsoft.Win32.SaveFileDialog { Filter PNG Image (*.png)|*.png|JPEG Image (*.jpg)|*.jpg|All files (*.*)|*.*, DefaultExt .png, Title 保存生成的图片 }; if (dialog.ShowDialog() true) { try { var encoder new PngBitmapEncoder(); encoder.Frames.Add(BitmapFrame.Create(GeneratedImage)); using var stream File.Create(dialog.FileName); encoder.Save(stream); } catch (Exception ex) { Console.WriteLine($保存图片失败: {ex.Message}); } } } private async Taskbyte[] ConvertImageToBytesAsync(BitmapImage image) { var encoder new PngBitmapEncoder(); encoder.Frames.Add(BitmapFrame.Create(image)); using var stream new MemoryStream(); encoder.Save(stream); return stream.ToArray(); } public void CancelGeneration() { _cancellationTokenSource?.Cancel(); } } }这个视图模型处理了所有的业务逻辑它管理用户输入、控制生成过程、更新进度、处理取消操作还提供了图片上传和保存功能。对应的XAML界面可以这样设计Window x:ClassZImageTurboClient.MainWindow xmlnshttp://schemas.microsoft.com/winfx/2006/xaml/presentation xmlns:xhttp://schemas.microsoft.com/winfx/2006/xaml TitleZ-Image Turbo Client Height600 Width800 Grid Margin10 Grid.RowDefinitions RowDefinition HeightAuto/ RowDefinition Height*/ RowDefinition HeightAuto/ /Grid.RowDefinitions !-- 参数输入区域 -- GroupBox Grid.Row0 Header生成参数 Margin0,0,0,10 StackPanel TextBlock Text提示词: Margin0,5/ TextBox Text{Binding Prompt, UpdateSourceTriggerPropertyChanged} Height60 TextWrappingWrap AcceptsReturnTrue/ TextBlock Text负面提示词: Margin0,10,0,5/ TextBox Text{Binding NegativePrompt, UpdateSourceTriggerPropertyChanged} Height40 TextWrappingWrap/ Grid Margin0,10 Grid.ColumnDefinitions ColumnDefinition WidthAuto/ ColumnDefinition Width*/ ColumnDefinition WidthAuto/ ColumnDefinition Width*/ /Grid.ColumnDefinitions TextBlock Text宽度: VerticalAlignmentCenter/ Slider Grid.Column1 Minimum256 Maximum1024 Value{Binding Width} TickFrequency64 IsSnapToTickEnabledTrue Margin10,0/ TextBlock Grid.Column2 Text{Binding Width} VerticalAlignmentCenter Margin10,0/ TextBlock Grid.Column2 Text高度: VerticalAlignmentCenter Margin50,0,0,0/ Slider Grid.Column3 Minimum256 Maximum1024 Value{Binding Height} TickFrequency64 IsSnapToTickEnabledTrue Margin10,0/ TextBlock Grid.Column3 Text{Binding Height} VerticalAlignmentCenter Margin10,0/ /Grid StackPanel OrientationHorizontal Margin0,10 Button Content上传参考图片 Command{Binding UploadImageCommand} Margin0,0,10,0 Padding10,5/ Button Content生成图片 Command{Binding GenerateCommand} IsEnabled{Binding IsGenerating, Converter{StaticResource InverseBooleanConverter}} Padding20,5/ Button Content取消 ClickCancelButton_Click IsEnabled{Binding IsGenerating} Margin10,0,0,0 Padding10,5/ /StackPanel !-- 进度条 -- ProgressBar Value{Binding Progress} Height10 Margin0,10 Visibility{Binding IsGenerating, Converter{StaticResource BooleanToVisibilityConverter}}/ /StackPanel /GroupBox !-- 图片显示区域 -- Grid Grid.Row1 Margin0,10 Grid.ColumnDefinitions ColumnDefinition Width*/ ColumnDefinition Width10/ ColumnDefinition Width*/ /Grid.ColumnDefinitions !-- 输入图片预览 -- GroupBox Header输入图片 Image Source{Binding InputImage} StretchUniform/ /GroupBox !-- 生成结果预览 -- GroupBox Grid.Column2 Header生成结果 Grid Image Source{Binding GeneratedImage} StretchUniform/ !-- 保存按钮 -- Button Content保存图片 Command{Binding SaveImageCommand} HorizontalAlignmentRight VerticalAlignmentBottom Margin10 Padding10,5 Background#FF007ACC ForegroundWhite/ /Grid /GroupBox /Grid !-- 状态栏 -- StatusBar Grid.Row2 StatusBarItem TextBlock Run Text状态:/ Run Text{Binding IsGenerating, Converter{StaticResource BooleanToStatusConverter}}/ /TextBlock /StatusBarItem /StatusBar /Grid /Window这个界面提供了完整的用户体验用户可以输入提示词、调整参数、上传参考图片、查看生成进度、预览生成结果还能保存图片到本地。整个界面通过数据绑定与视图模型连接代码清晰维护方便。6. 部署与优化建议把代码跑起来只是第一步要让这个方案真正用在生产环境还需要考虑一些工程化的问题。首先是服务部署。FastAPI应用可以用多种方式部署最简单的就是直接用uvicorn运行。但对于生产环境我建议用Gunicorn配合Uvicorn Worker或者用Docker容器化部署。# Dockerfile示例 FROM python:3.9-slim WORKDIR /app # 安装系统依赖 RUN apt-get update apt-get install -y \ libgl1-mesa-glx \ libglib2.0-0 \ rm -rf /var/lib/apt/lists/* # 复制依赖文件 COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # 复制应用代码 COPY . . # 暴露端口 EXPOSE 8000 # 启动命令 CMD [uvicorn, main:app, --host, 0.0.0.0, --port, 8000]构建和运行容器docker build -t z-image-turbo-api . docker run -p 8000:8000 --gpus all z-image-turbo-api如果服务器有多个GPU还可以考虑用进程管理器如Supervisor或systemd来管理多个服务实例实现简单的负载均衡。其次是性能优化。图片生成通常比较耗时特别是高分辨率或复杂场景。我们可以从几个方面优化异步处理对于长时间任务可以让API立即返回一个任务ID然后客户端轮询任务状态。这样避免HTTP连接超时。结果缓存相同的生成请求可以缓存结果减少重复计算。连接池客户端使用HttpClient时要正确管理连接避免频繁创建销毁。超时设置根据实际生成时间合理设置客户端和服务端的超时时间。然后是错误处理和监控。服务端应该记录详细的日志包括请求参数、处理时间、错误信息等。客户端也要有良好的错误处理机制给用户友好的提示而不是直接抛出异常。# 服务端添加日志和监控 import logging from fastapi import Request import time logging.basicConfig(levellogging.INFO) logger logging.getLogger(__name__) app.middleware(http) async def log_requests(request: Request, call_next): start_time time.time() response await call_next(request) process_time time.time() - start_time logger.info(f{request.method} {request.url.path} - {response.status_code} - {process_time:.2f}s) return response最后是安全性考虑。如果API需要对外开放至少要加上API密钥验证。对于敏感数据还要考虑使用HTTPS加密传输。# 简单的API密钥验证 from fastapi import Depends, HTTPException, Security from fastapi.security import APIKeyHeader API_KEY your-secret-api-key api_key_header APIKeyHeader(nameX-API-Key) async def verify_api_key(api_key: str Security(api_key_header)): if api_key ! API_KEY: raise HTTPException(status_code403, detail无效的API密钥) return api_key app.post(/generate/from-text) async def generate_from_text( request: GenerateRequest, api_key: str Depends(verify_api_key) # 添加依赖 ): # ... 原有代码7. 总结回过头来看这个方案其实解决了一个很实际的问题如何让不同技术栈的应用都能方便地使用AI模型能力。通过RESTful API这个“通用语言”我们把模型服务化让.NET桌面应用也能轻松集成Asian Beauty Z-Image Turbo这样的先进模型。实际用下来这个架构的扩展性也不错。如果以后要支持更多模型只需要在服务端添加新的API端点。客户端也只需要增加对应的调用方法整体结构不用大改。当然这个方案也不是完美的。网络延迟是个问题特别是生成高分辨率图片时传输时间可能比较长。还有服务可用性如果API服务器挂了所有客户端都会受影响。这些都需要在实际项目中根据具体情况来权衡和优化。如果你也在做类似的项目建议先从简单的原型开始验证技术可行性然后再逐步完善功能。比如可以先实现基本的文生图功能跑通整个流程再慢慢添加图生图、进度显示、批量处理这些高级特性。技术总是在不断演进今天觉得不错的方案明天可能就有更好的选择。但核心思路——通过标准化接口来解耦和集成——应该会持续有用。毕竟让合适的技术在合适的地方发挥作用这才是工程实践的要义。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2458553.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…