2024-10月的“冷饭热炒“--解读GUI Agent 之computer use?phone use?——多模态大语言模型的进阶之路
GUI Agent 之computer use?phone use?——多模态大语言模型的进阶之路
- 1.最新技术事件浅析
- 三、思考和方案设计
- 工具代码部分
- 1.提示词
- 2.工具类API定义,这里主要看computer tool就够了
- 总结
本文会总结概括这一应用的利弊,然后给出分析和工具代码部分解析,以及优化方案
1.最新技术事件浅析
事件1. 2024年10月 Anthropics放出了最新的claude3.5 sonnect,编码、复杂推理能力大幅提升,确实很强,其中最吸引人眼球的是展示了computer use的demo演示,虽然很初级,但是未来可期的意思。
事件2. 前后时间内,智谱也发布了autoglm系列, 展示了web use和phone use的演示。
“冷饭热炒”——AI Agent(LLM)&&RPA
实际上,从2023年就一直涌现相关开源项目,通过软硬件交互的RPA、自动化执行指令相关技术一直都有,唯一区别:多模态大语言模型能力的进化,帮助了人们可以通过截屏视觉和自然语言交互,来更准确执行软硬件的功能函数指令。
导致一切变化,归因“大模型的能力迭代”
因此不论是哪家的相关技术,本质仍是多模态大语言模型起到决定性作用,这一应用点取决于视觉理解屏幕信息 和 LLM决策能力(Agent——主要是通过工具调用来决定执行那个操作函数,如鼠标左键点击、右键点击),这是一种多模态大模型 通过感知屏幕和用户提问,走出思考,一步步调用预定义好的指令函数来完成回答的一个过程。
快速总结
其实几个核心难点分别在于:大模型思考能力(特别是function call工具调用能力)、截屏视觉分析能力(视觉模型要进行精准的语义分析和像素坐标)、需要适配操作场景中的各种软件APP的交互。
从算法层面来说,其实关键问题仍旧是得有一个强大的LLM能够精准理解和执行,这对模型能力要求很高,目前来看几B参数的模型很难做到,但是如果聚焦场景微调也不是不可行。
因此claude3.5这个demo实际上仍旧是对自己模型能力的一个宣传,在评测报告中其复杂COT能力提高,正是对于GUI-AGENT应用一个关键助力,同理,智谱也如此。
我自费一个api key,用官方docker体验了下,自媒体上面也有很多总体在它沙盒里面感觉还可以,(这里我推荐一个GIT项目——agent.exe,用JS做的DEMO)
试用场景和使用限制:假设在模型能力达标前提下,电脑低风险任务、简单明确的规则场景,具体怎么理解:比如说订票会给你订错、安装软件因为网络、条款等等使用问题,无法识别和进行后续操作,总之BAD CASE超多,但是claude3.5 确实强,后面需要进行每个软件适配。
三、思考和方案设计
不考虑适配问题,我们的核心是AI AGENT(这里的AGENT更简单,加一些提示词规则和工具函数调用配置),那么最终问题还是模型本身——工具调用能力和COT能力。
那么最终落到自研角度,最关键的问题——首先,如何拥有或者训练一个这种类似能力的模型去平替?有感兴趣的朋友可以用一些开源的VL去试试,我简单放了个截图给自己微调的VL-7B模型进行一个试探,就想看看小模型能不能微调来适应这个场景
我们看到一般的视觉语言模型是有基础的视觉定位能力、逻辑思考能力,但是还远未到标准,所以要是想不通过三方实现,训练微调这些函数调用、多模态视觉这个门槛是一定要迈的。
这里我测试了两种DEMO,一种是按照官方DEMO DOCKER沙盒里面的系统进行操作,理论上是最好的。另一种是脱离Docker容器化,那么就是直接在用户系统上进行交互,并且要将代码部分函数操作变成windows的函数,实际上还是很不稳定,比如说输入网址操作时候,你的界面上有多个文本框,就会识别错误,更严重的是帮你执行了比较有风险的操作,所以大家用时候还是要监控下,还有很多AGENT的常规缺陷(在过程中遇到和预期不符的结果进入更多的推理,最终结果仍然无效化),下面展示下官方的例子,理论上也是最好的
1.我输入一个问题,看是否能帮我正确执行?
2.Claude 会逐步分析思考,因为是基于视觉,所以每次第一步都会截图去分析图标语义和像素坐标信息,调用screenshot函数
3.根据截屏图像理解,找到firefox,根据坐标移动mouse_move函数调用
4.进行点击
5.点击火狐后,模型做出了思考,需要继续点进行点击地址栏,再输入网址,继续第一步截屏,需要分析画面 哪个是地址栏
6.因为我搜索过有历史记录,所以模型发现可以偷懒,直接触发,所以他分析了CSDN的坐标位置,调用Mouse_move移动鼠标
7.继续左键点击函数调用,就成功进去了
8.然后就继续思考要执行我的问题关键信息”Mixtrure-of-Depths“的问题,还是每次执行前必须要进行截图
9.根据图像信息理解,定位到搜索框进行输入词语查找,所以继续mouse_move到搜索框坐标那里
10.同理,鼠标点击
11.打印相关信息
12.执行等待返回结果
13.这里貌似漏了个截屏分析,不重要,继续执行鼠标移动到BOX位置
14.左键点击
15.这里应该是截屏分析最终结果
最终就是根据屏幕信息进行总结,但是由于是视觉方案,所以仅针对截图部分进行了理解,模型本身还是赞的!
PS:双屏容易发生错误,因为其程序只针对一个屏幕进行截屏识别;
国内你要用速率受限制的那么开发是不太可能了。
非官方docker的个性化用户界面测试
直接给结论:效果很差,这里说一个主要原因就是:
1.每个人的UI界面不一样,主题颜色、界面复杂度等等,这会导致claude模型出现视觉定位或者目标识别的错误
界面复杂度这个很重要,如果你有大量页面打开,大概率会降低截屏识别的准确性。
2.还有一种是模型的思考和视觉界面操作没有对齐:
比如这种很容易发生理解和执行错误,模型操作到下方Chrome了 ,但是这个时候我已经存在分页了,点击并不会新建,所以这种情况执行会无效化。
3.bad case太多了 在自己电脑上体验下就知道了
三 应用可行性思考
1.通过上述,我们可以得到一个经验性结论:强如claude3.5也会有着很多问题,一方面是模型视觉能力和在个性化用户界面存在理解的准确性GAP,即使Claude思考的基本都是对的,但是视觉能力的差异导致整个操作链路崩溃。
2.操作浏览器和软件都需要经过定制化的适配,因为有很多权限或者证书、网络问题
3.那么这个应用没有价值进行落地嘛?
答:不是,恰恰就是没那么成熟,所以目前业界一线巨头都要去冲这个应用,利用云端大模型这种能力进行任何能联网的操作系统GUI设备的适配,电脑、手机等等,智谱已经释放了手机DEMO,这块应用会蔓延,对于个人来说,我比较关心如何能够保持特定场景准确性?如何使用开源VL模型平替(微调)?
目前针对上述问题1 截屏识别优化,简单分享下我的思路:
1.端到端微调操作系统界面的图标,进行训练,适合大模型算法相关人员,需要继续后训练
2.进行检测器+Caption, 不需要训练大模型,进行小模型堆叠,增强截屏识别的准确性,这点微软已经这么做了,omniparser,简单来说通过YOLO检测器训练了Windows的相关图标,能够准确定位识别;同时需要caption模型这样有助于大模型对图标的理解正确,作为一个视觉增强插件,目前结合我实际体会确实这样能Work,对于GPT4、cladue这种模型,他们的文本推理能力并不差。
这种方案输出:图标类型和坐标,并且进行了丰富语义描述,这样能帮助大模型进行正确的理解,但是如果你这两小模型不行,那么一样会拉垮,所以这种方案输出给的目标是VLM模型还是LLM?我个人觉得仍然要给VLM视觉语言模型,
从实现难度上来看,直接端到端训练是相对比较难的,而第二种方案是风险较小的,但是会增强推理开销。
我们继续思考,那么这套Detect&caption的组合直接给LLM,而不是VLM呢?微软没提这个默认是给各种开源和闭源视觉模型,从综合来看还是扔给VLM,还是缺少完整的图像信息,但是硬给这些文本结构化信息呢?LLM也并不是不行。
工具代码部分
官方代码
其实就是Fuctionc call 冷饭,我们主要看下sys prompt和工具怎么写的
1.提示词
# System prompt adapted for Windows environment
SYSTEM_PROMPT = f"""<SYSTEM_CAPABILITY>
* You are utilizing a Windows {platform.machine()} system with internet access.
* You have access to mouse and keyboard control through PyAutoGUI.
* You can perform clicks, type text, and take screenshots.
* The system maintains exact monitor resolution for perfect accuracy.
* Screenshots are taken at full monitor resolution and compressed only if needed.
* The system properly accounts for Windows DPI scaling and taskbar position.
* When using your computer function calls, they take a while to run and send back to you. Where possible/feasible, try to chain multiple of these calls all into one function calls request.
* The current date is {datetime.today().strftime('%A, %B %d, %Y')}.
</SYSTEM_CAPABILITY><IMPORTANT>
* The system maintains exact screen dimensions - no resolution scaling is performed.
* Screenshots are taken at full monitor resolution to maintain perfect accuracy.
* Only compression is applied if needed to stay under size limits.
* The system handles Windows-specific elements like taskbar and DPI scaling.
* When viewing a page it can be helpful to zoom out so that you can see everything on the page.
</IMPORTANT><COORDINATE_HANDLING>
* Coordinates are maintained at exact screen resolution.
* DPI scaling is properly handled for accurate positioning.
* Taskbar position is accounted for in coordinate calculations.
* The system maintains perfect 1:1 pixel mapping with the screen.
* Coordinate translations preserve exact screen positions.
</COORDINATE_HANDLING>"""
Windows系统信息:You are utilizing a Windows {platform.machine()} system with internet access. 这里使用了platform.machine()来获取Windows系统的机器类型。
鼠标和键盘控制:You have access to mouse and keyboard control through PyAutoGUI. PyAutoGUI是一个跨平台的自动化工具,但在Windows环境下使用时,可以进行鼠标点击、键盘输入等操作。
屏幕分辨率和DPI缩放:The system maintains exact monitor resolution for perfect accuracy. 和 The system properly accounts for Windows DPI scaling and taskbar position. 这些提示说明了系统如何处理Windows特有的DPI缩放和任务栏位置。
截图和压缩:Screenshots are taken at full monitor resolution and compressed only if needed. 说明了截图的处理方式,特别是在Windows环境下如何处理全屏截图和压缩。
2.工具类API定义,这里主要看computer tool就够了
ComputerTool:这个工具可能包含了一些特定于Windows的操作,例如使用PyAutoGUI进行鼠标点击、键盘输入、截图等操作。
这里贴下源码:
简单来说就算计算机工具的各种操作函数和动作描述等。
import subprocess
import platform
import pyautogui
import asyncio
import base64
import os
from enum import StrEnum
from pathlib import Path
from typing import Literal, TypedDict
from uuid import uuid4from anthropic.types.beta import BetaToolComputerUse20241022Paramfrom .base import BaseAnthropicTool, ToolError, ToolResult
from .run import runOUTPUT_DIR = "/tmp/outputs"TYPING_DELAY_MS = 12
TYPING_GROUP_SIZE = 50Action = Literal["key","type","mouse_move","left_click","left_click_drag","right_click","middle_click","double_click","screenshot","cursor_position",
]class Resolution(TypedDict):width: intheight: intMAX_SCALING_TARGETS: dict[str, Resolution] = {"XGA": Resolution(width=1024, height=768), # 4:3"WXGA": Resolution(width=1280, height=800), # 16:10"FWXGA": Resolution(width=1366, height=768), # ~16:9
}class ScalingSource(StrEnum):COMPUTER = "computer"API = "api"class ComputerToolOptions(TypedDict):display_height_px: intdisplay_width_px: intdisplay_number: int | Nonedef chunks(s: str, chunk_size: int) -> list[str]:return [s[i : i + chunk_size] for i in range(0, len(s), chunk_size)]class ComputerTool(BaseAnthropicTool):"""A tool that allows the agent to interact with the screen, keyboard, and mouse of the current computer.Adapted for Windows using 'pyautogui'."""name: Literal["computer"] = "computer"api_type: Literal["computer_20241022"] = "computer_20241022"width: intheight: intdisplay_num: int | None_screenshot_delay = 2.0_scaling_enabled = True@propertydef options(self) -> ComputerToolOptions:width, height = self.scale_coordinates(ScalingSource.COMPUTER, self.width, self.height)return {"display_width_px": width,"display_height_px": height,"display_number": self.display_num,}def to_params(self) -> BetaToolComputerUse20241022Param:return {"name": self.name, "type": self.api_type, **self.options}def __init__(self):super().__init__()# Get screen width and height using Windows commandself.width, self.height = self.get_screen_size()self.display_num = None# Path to cliclickself.cliclick = "cliclick"self.key_conversion = {"Page_Down": "pagedown", "Page_Up": "pageup", "Super_L": "win"}async def __call__(self,*,action: Action,text: str | None = None,coordinate: tuple[int, int] | None = None,**kwargs,):if action in ("mouse_move", "left_click_drag"):if coordinate is None:raise ToolError(f"coordinate is required for {action}")if text is not None:raise ToolError(f"text is not accepted for {action}")if not isinstance(coordinate, (list, tuple)) or len(coordinate) != 2:raise ToolError(f"{coordinate} must be a tuple of length 2")if not all(isinstance(i, int) and i >= 0 for i in coordinate):raise ToolError(f"{coordinate} must be a tuple of non-negative ints")x, y = self.scale_coordinates(ScalingSource.API, coordinate[0], coordinate[1])if action == "mouse_move":pyautogui.moveTo(x, y)return ToolResult(output=f"Moved mouse to ({x}, {y})")elif action == "left_click_drag":current_x, current_y = pyautogui.position()pyautogui.dragTo(x, y, duration=0.5) # Adjust duration as neededreturn ToolResult(output=f"Dragged mouse from ({current_x}, {current_y}) to ({x}, {y})")if action in ("key", "type"):if text is None:raise ToolError(f"text is required for {action}")if coordinate is not None:raise ToolError(f"coordinate is not accepted for {action}")if not isinstance(text, str):raise ToolError(output=f"{text} must be a string")if action == "key":# Handle key combinationskeys = text.split('+')for key in keys:key = self.key_conversion.get(key.strip(), key.strip())pyautogui.keyDown(key) # Press down each keyfor key in reversed(keys):key = self.key_conversion.get(key.strip(), key.strip())pyautogui.keyUp(key) # Release each key in reverse orderreturn ToolResult(output=f"Pressed keys: {text}")elif action == "type":pyautogui.typewrite(text, interval=TYPING_DELAY_MS / 1000) # Convert ms to secondsscreenshot_base64 = (await self.screenshot()).base64_imagereturn ToolResult(output=text, base64_image=screenshot_base64)if action in ("left_click","right_click","double_click","middle_click","screenshot","cursor_position",):if text is not None:raise ToolError(f"text is not accepted for {action}")if coordinate is not None:raise ToolError(f"coordinate is not accepted for {action}")if action == "screenshot":return await self.screenshot()elif action == "cursor_position":x, y = pyautogui.position()x, y = self.scale_coordinates(ScalingSource.COMPUTER, x, y)return ToolResult(output=f"X={x},Y={y}")else:if action == "left_click":pyautogui.click()elif action == "right_click":pyautogui.rightClick()elif action == "middle_click":pyautogui.middleClick()elif action == "double_click":pyautogui.doubleClick()return ToolResult(output=f"Performed {action}")raise ToolError(f"Invalid action: {action}")async def screenshot(self):"""Take a screenshot of the current screen and return a ToolResult with the base64 encoded image."""output_dir = Path(OUTPUT_DIR)output_dir.mkdir(parents=True, exist_ok=True)path = output_dir / f"screenshot_{uuid4().hex}.png"# Take screenshot using pyautoguiscreenshot = pyautogui.screenshot()screenshot.save(str(path))if path.exists():# Return a ToolResult instance instead of a dictionaryreturn ToolResult(base64_image=base64.b64encode(path.read_bytes()).decode())raise ToolError(f"Failed to take screenshot: {path} does not exist.")async def shell(self, command: str, take_screenshot=True) -> ToolResult:"""Run a shell command and return the output, error, and optionally a screenshot."""_, stdout, stderr = await run(command)base64_image = Noneif take_screenshot:# delay to let things settle before taking a screenshotawait asyncio.sleep(self._screenshot_delay)base64_image = (await self.screenshot()).base64_imagereturn ToolResult(output=stdout, error=stderr, base64_image=base64_image)def scale_coordinates(self, source: ScalingSource, x: int, y: int):"""Scale coordinates to a target maximum resolution."""if not self._scaling_enabled:return x, yratio = self.width / self.heighttarget_dimension = Nonefor dimension in MAX_SCALING_TARGETS.values():# allow some error in the aspect ratio - not ratios are exactly 16:9if abs(dimension["width"] / dimension["height"] - ratio) < 0.02:if dimension["width"] < self.width:target_dimension = dimensionbreakif target_dimension is None:return x, y# should be less than 1x_scaling_factor = target_dimension["width"] / self.widthy_scaling_factor = target_dimension["height"] / self.heightif source == ScalingSource.API:if x > self.width or y > self.height:raise ToolError(f"Coordinates {x}, {y} are out of bounds")# scale upreturn round(x / x_scaling_factor), round(y / y_scaling_factor)# scale downreturn round(x * x_scaling_factor), round(y * y_scaling_factor)def get_screen_size(self):if platform.system() == "Windows":# Command to get screen resolution on Windowscmd = "wmic path Win32_VideoController get CurrentHorizontalResolution,CurrentVerticalResolution /format:value"elif platform.system() == "Darwin": # macOScmd = "system_profiler SPDisplaysDataType | grep Resolution"else: # Linux or other OScmd = "xrandr | grep '*' | awk '{print $1}'"try:output = subprocess.check_output(cmd, shell=True).decode()if platform.system() == "Windows":lines = output.strip().split('\n')width = height = Nonefor line in lines:if line.strip(): # Check for non-empty linekey, value = line.split('=')value = value.strip() # Strip whitespace from value# Assign only if value is non-empty and can be converted to intif value and key == 'CurrentHorizontalResolution':width = int(value) if value.isdigit() else Noneelif value and key == 'CurrentVerticalResolution':height = int(value) if value.isdigit() else None# After the loop, check if we have valid width and heightif width is not None and height is not None:print(f"Resolution: {width}x{height}")else:print("Could not retrieve valid resolution values.")elif platform.system() == "Darwin":resolution = output.split()[0]width, height = map(int, resolution.split('x'))else:resolution = output.strip().split()[0]width, height = map(int, resolution.split('x'))return width, heightexcept subprocess.CalledProcessError as e:print(f"Error occurred: {e}")return None, None # Return None or some default valuesdef get_mouse_position(self):# TODO: enhance this funcfrom AppKit import NSEventfrom Quartz import CGEventSourceCreate, kCGEventSourceStateCombinedSessionStateloc = NSEvent.mouseLocation()# Adjust for different coordinate systemreturn int(loc.x), int(self.height - loc.y)def map_keys(self, text: str):"""Map text to cliclick key codes if necessary."""# For simplicity, return text as is# Implement mapping if special keys are neededreturn text
总结
当前对于自己应用难点就是你需要一个类似claude能力极强的模型,并且其functioncall能力也要很强,然后才可以进行自主开发,模型是第一关,后面可以用视觉方案增强也好,再微调也好都可以,更进一步当你的操作系统有N个tools怎么办呢?这里实际上也有两种业内方案,点赞超100 我补更。
相关文章:
2024-10月的“冷饭热炒“--解读GUI Agent 之computer use?phone use?——多模态大语言模型的进阶之路
GUI Agent 之computer use?phone use?——多模态大语言模型的进阶之路 1.最新技术事件浅析三、思考和方案设计工具代码部分1.提示词2.工具类API定义,这里主要看computer tool就够了 总结 本文会总结概括这一应用的利弊,然后给出分析和工具代…...
Me 攒的GPT修改论文提示词
没有会员的GPT They demonstrated that QGAN exhibits an exponential advantage over classical methods when using data consisting of samples of measurements made on high-dimensional spaces. 作为related work 时态对吗? 有需要修改的吗?你可…...
关于在vue2中接受后端返回的二进制流并进行本地下载
后端接口返回: 前端需要在两个地方写代码: 1.封装接口处,responseType: blob 2.接收相应处 download() {if (this.selectionList.length 0) {this.$message.error("请选择要导出的数据!");} else {examineruleExport…...
[BUG]warn(f“Failed to load image Python extension: {e}“)的解决办法
在使用LlaMa-Factory工具包时,安装好环境后,输入llamafactory-cli env查看llama-factory的版本等信息时,bash提醒: /home/ubuntu/anaconda3/envs/Llama-Factory/lib/python3.10/site-packages/torchvision/io/image.py:13: UserW…...
配置MUX VLAN 的实验配置
概念和工作原理: MUX VLAN(Multiplex VLAN)是一种高级的VLAN技术,它通过在交换机上实现二层流量隔离和灵活的网络资源控制,提供了一种更为细致的网络管理方式。 概念与工作原理 基本概念: MUX VLAN通过定义主VLAN&am…...
高考相关 APP 案例分享
文章首发于https://qdgithub.com/article/2032 一、核心内容 (一)高考相关 APP 案例 圈友朱康分享高考相关的 APP。提到猿题库,其主要功能有练习册和猿辅导,都是收费的。猿题库出题给学生练习,将易错的总结起来出练习…...
AI的出现对计算机相关类型的博客或论坛的影响
最近越来越感觉到,AI的出现对计算机相关类型的博客是一种从寄生再到蚕食的过程。 在AI没出现之前,大家遇到问题,那一般都是去百度搜索,然后就能找到大神前辈的解答思路,这些解答思路基本都是写在博客或者论坛里的&…...
[LeetCode] 784. 字母大小写全排序
题目描述: 给定一个字符串 s ,通过将字符串 s 中的每个字母转变大小写,我们可以获得一个新的字符串。 返回 所有可能得到的字符串集合 。以 任意顺序 返回输出。 示例 1: 输入:s "a1b2" 输出࿱…...
大数据Azkaban(二):Azkaban简单介绍
文章目录 Azkaban简单介绍 一、Azkaban特点 二、Azkaban组成结构 三、Azkaban部署模式 1、solo-server ode(独立服务器模式) 2、two server mode(双服务器模式) 3、distributed multiple-executor mode(分布式多…...
Vue3_开启全局websocket
1、封装websocket 新建文件夹"socket.ts",路径:"/utils/socket" export default (onMessage: Function) > {let socketUrl ws://171.29.8.218:8080/ems/ws/screen //socket请求地址let socket: WebSocketlet lockReconnect f…...
PTA 社交集群
当你在社交网络平台注册时,一般总是被要求填写你的个人兴趣爱好,以便找到具有相同兴趣爱好的潜在的朋友。一个“社交集群”是指部分兴趣爱好相同的人的集合。你需要找出所有的社交集群。 输入格式 输入在第一行给出一个正整数 N(≤1000&…...
USB Type-C 受电端取电快充协议芯片,支持PD+QC+FCP+SCP+AFC快充协议
前言 随着科技的飞速发展,电子设备对于快速充电的需求日益增加。为了满足这一需求,市场上涌现出了众多快充技术和产品。其中,XSP08Q诱骗取电芯片以其卓越的性能和广泛的应用场景,成为了快充领域的一颗璀璨明星。本文将对XSP08Q P…...
C++ 模板专题 - 参数约束
一:概述: 除了使用SFINAE对模板参数进行约束之外,还可以使用概念(Concepts)来对模板参数进行约束,确保传入的类似满足特定条件。概念(Concepts)是C20中引入的,概念是用于…...
电商行业 | 用好企业培训工具,打造精英团队!
在竞争激烈的电商行业中,人才是企业最宝贵的资源。如何持续提升员工的专业技能和服务水平,打造一支高效、专业的金牌员工队伍,是每个电商企业面临的重要课题。企业培训工具作为提升员工能力的关键手段,正逐渐成为电商行业不可或缺…...
python进阶集锦
一、迭代器和生成器 区别 关于迭代器和生成器 迭代器与生成器的区别 迭代器(Iterator)和生成器(Generator)是Python中处理序列数据的两种不同概念。迭代器是遵循迭代协议的对象,而生成器是一种特殊类型的迭代器&am…...
8.C++小练习
C小练习 1.练习 1.练习 计算器—加减乘除 函数调用 //简单的计算器 #include <iostream>using namespace std;//封装函数 int add(int a,int b){return a b; }int jian(int a, int b){return a - b; }int cheng(int a,int b){return a * b; }double chu(int a,int b){r…...
实现YOLO V3数据加载器:从文件系统读取图像与标签
引言 在深度学习项目中,数据准备是非常重要的一环。特别是在物体检测任务中,数据的组织和预处理直接影响到模型的训练效果。YOLO V3(You Only Look Once Version 3)作为一种高效的实时物体检测框架,其数据加载器的设计…...
安装pygod
了解pygod。 It is recommended to use pip for installation. Please make sure the latest version is installed, as PyGOD is updated frequently: pip install pygod # normal install pip install --upgrade pygod # or update if needed如果pip不是最新的&…...
探索Python与Excel的无缝对接:xlwings库的神秘面纱
文章目录 探索Python与Excel的无缝对接:xlwings库的神秘面纱1. 背景介绍:为何选择xlwings?2. xlwings是什么?3. 如何安装xlwings?4. 简单的库函数使用方法打开工作簿创建工作簿读取单元格数据写入单元格数据保存并关闭…...
CISE|暴雨受邀出席第二十六届中国国际软件博览会
10月24日至26日,备受瞩目的第二十六届中国国际软件博览会(简称CISE)在国家会展中心(天津)圆满举办。CISE不仅汇聚了来自全国各地的顶尖软件企业和机构,还吸引了众多专家学者和行业精英共襄盛举,…...
OpenEuler22.03-sp2下安装docker-非常实用
1、确定系统版本是openEuler22.03-SP2 [root192 ~]# wget https://download.docker.com/linux/static/stable/x86_64/docker-20.10.23.tgz #或者自己下载之后上传到/root下,测试最好是自己下载到本地再上传到服务器上 下载地址:https://download.dock…...
【学术会议论文投稿】前端框架巅峰对决:React、Vue与Angular的全面解析与实战指南
【JPCS独立出版】第三届能源与动力工程国际学术会议(EPE 2024)_艾思科蓝_学术一站式服务平台 更多学术会议请看:https://ais.cn/u/nuyAF3 引言 在快速发展的前端技术领域,选择合适的框架或库对于项目的成功至关重要。React、Vu…...
[0152].第3节:IDEA中工程与模块
我的后端学习大纲 IDEA大纲 1、Project和Module的概念: 2、Module操作: 2.1.创建Module: 2.2.删除Module: 2.3.导入Module: 1.导入外来模块的代码: 查看Project Structure,选择import module:…...
【modbus协议】libmodbus库移植基于linux平台
文章目录 下载库函数源码编译路径添加libmodbus 源码分析核心数据结构常用接口函数 开发 TCP Server 端开发TCP Client 端 下载库函数源码 编译路径添加 libmodbus 源码分析 核心数据结构 modbus_t结构体: 这是 libmodbus 的核心数据结构,代表一个 Mod…...
SpringBoot+Minio实现多文件下载和批量下载
文章目录 SpringBoot+minio实现多文件下载1、SpringBoot+minio实现多文件打成一个压缩包下载1. 添加依赖2. 配置 MinIO 客户端3. 创建下载和压缩逻辑4. 创建控制器方法来触发下载5. 测试下载功能注意事项2、在minio指定的桶名下面生产一个文件夹1. MinIO 配置2. 编写业务逻辑文…...
3.swoole安装【Docker】
一、拉取最新 swoole 镜像 docker pull phpswoole/swoole二、第一次启动swoole容器 docker run --name swoole phpswoole/swoole 三、 拷贝配置文件 docker cp swoole:/var/www /docker/swoole四、 停止 swoole 容器 dcoker stop swoole五、 删除第一次启动的swoole容器 d…...
React 探秘(三): 时间切片
文章目录 背景时间切片原理requestIderCallback 方法setImmediateMessageChannelsetTimeout React 18 时间切片源码手撸时间切片问题拆解构建任务队列宏任务包装首次开启任务递归任务执行workLoop 开启工作循环demo 模拟 总结 背景 前文学习了 fiber 架构和双缓存技术ÿ…...
OSError: Can‘t load tokenizer for ‘bert-base-uncased‘.
一、具体报错: 报错如下: OSError: Cant load tokenizer for bert-base-uncased. If you were trying to load it from https://huggingface.co/models, make sure you dont have a local directory with the same name. Otherwise, make sure bert-bas…...
中国人寿财险青岛市分公司:专业团队,卓越服务
中国人寿财险青岛市分公司拥有一支专业的团队,为客户提供卓越的保险服务。 公司的保险从业人员都经过严格的专业培训和考核,具备扎实的保险知识和丰富的实践经验。他们以客户为中心,用心倾听客户需求,为客户提供个性化的保险方案…...
【SpringCloud】基础问题
文章目录 spring-cloud-dependencies和spring-cloud-alibaba-dependencies的区别<dependencyManagement>和<dependencies>的区别<dependencyManagement><dependencies> 为什么在主函数上加上SpringBootApplication注解就可以扫描到对象为什么bootstrap…...
摄影师网站制作/seo技术网网
本篇的思维导图: 数据预处理:数据的汇总 数据透视表pivot_table()函数 透视表功能该功能的主要目的就是实现数据的汇总统计。pandas模块中的pivot_table函数就是实现透视表功能的强大函数。 代码 import numpy as...
做网站前应该怎么处理/怎么推广自己的产品
目录 1.事务依赖数据库 2.ACID 3. MySQL 怎么保证原子性的? 4.Spring 支持两种方式的事务管理 5.Spring事务机制(三个抽象定义,传播隔离机制) 6.事务属性详解(重点) 7.Transactional 注解使用详解 8…...
wordpress调用时间/一个品牌的策划方案
一、lseek lseek函数的作用是用来重新定位文件读写的位移。 头文件以及函数声明 #include <sys/types.h> #include <unistd.h> off_t lseek(int fd, off_t offset, int whence); lseek()函数会重新定位被打开文件的位移量,根据参数offset以及whence的组…...
怎么建手机网站/登封seo公司
/**//// <summary> /// 转全角的函数(SBC case) /// </summary> /// <param name"input">任意字符串</param> /// <returns>全角字符串</returns> ///<remarks> ///全角空格为…...
渭南做网站的/网页设计与制作期末作品
北京时间5月5日消息,据国外媒体报道,谷歌联合创始人拉里•佩奇(Larry Page)日前在密歇根大学毕业典礼上做了演讲,他以自己创建谷歌的经历向即将毕业的学生进行勉励。 以下是演讲全文:09级的同学,首先我希望大家站起来&…...
ftp上传后没有网站/cdq百度指数
今天翻资料的时候,无意间发现了一个文件,是刚接触编程的时候用c写的一段程序,我称之为"图形打印机",想着把所有图形都打印出来,后来发现其实每种图形的代码都是一个思路,就不想做重复劳动了。今天…...