Mobile-Agent项目部署与学习总结(DataWhale AI夏令营)

news2024/9/24 13:19:10

在这里插入图片描述

前言

你好,我是GISer Liu,一名热爱AI技术的GIS开发者,本文是DataWhale 2024 AI夏令营的最后一期——Mobile-Agent赛道,这是作者的学习文档,这里总结一下,和作者一起学习这个多模态大模型新项目吧😀;


一、准备工作

为了快速实现本次项目准备工作,作者将对应步骤的的流程用图片展示,各位读者只需要按顺序执行即可;

1. API申请

打开阿里云百炼官网,API申请步骤如下:
在这里插入图片描述
复制创建的API KEY;
在这里插入图片描述

这里注意保存获得的API KEY,不要泄露给别人;

我们可以在这里测试一下API接口是否正常:

# Refer to the document for workspace information: https://help.aliyun.com/document_detail/2746874.html    
        
from dashscope import MultiModalConversation
import dashscope
dashscope.api_key = "<your api key>"
def simple_multimodal_conversation_call():
    """Simple single round multimodal conversation call.
    """
    messages = [
        {
            "role": "user",
            "content": [
                {"image": "https://dashscope.oss-cn-beijing.aliyuncs.com/images/dog_and_girl.jpeg"},
                {"text": "这是什么?"}
            ]
        }
    ]
    responses = MultiModalConversation.call(model='qwen-vl-plus',
                                           messages=messages,
                                           stream=True)
    for response in responses:
        print(response)


if __name__ == '__main__':
    simple_multimodal_conversation_call()

作者输出如下:
在这里插入图片描述
没有问题!


2. Android Studio配置

这里需要下载Android Studio应用

这里无需Android 开发,只是需要借用Android Studio提供的Android虚拟机进行代码调试,以及其提供的Android adb的接口来实现屏幕截图和Agent操作执行的功能;

,安装好以后,详细配置过程如下:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

这一步是为了让AI 可以在桌面看到这个日历应用的图标;

3. MobileAgent项目部署与配置
  • clone项目到本地:
git lfs install
git clone https://www.modelscope.cn/datasets/Datawhale/MobileAgent_V2_Demo_qwenVL.git
cd MobileAgent_V2_Demo_qwenVL

在这里插入图片描述

  • 创建环境:
conda create -n moblieagent python=3.9.19
conda activate moblieagent
  • 复制如下命令在终端执行,安装相关依赖

Mac电脑运行这个:

pip install -r mac_requirements.txt

Win电脑运行这个:

pip install -r win_requirements.txt
  • 运行项目
python run.py
  • 效果如下
    result

二、思路分析

1. 项目基础

本项目是一个基于手机操作的自动化助手系统,旨在通过多模态大模型技术来读取手机屏幕内容,识别屏幕元素,并根据用户的指令自动操作手机。整个项目的核心是结合了文本识别、图像识别和LLM技术,使用了多种深度学习模型来实现手机自动化操作的流程。

2. 平台与技术栈
  • 平台:

    • 项目运行在Android设备上,通过ADB(Android Debug Bridge)接口与手机进行交互。
    • 使用了Python编写逻辑代码,并集成了多种AI模型用于图像处理和文本分析。
  • 技术栈:

    • 图像处理与识别:

      • OCR(光学字符识别): 用于从截图中提取文本内容。使用了 damo/cv_resnet18_ocr-detection-line-level_damodamo/cv_convnextTiny_ocr-recognition-document_damo 两个模型。
      • 图标检测: 使用 GroundingDINO 模型来检测屏幕上的图标。
    • 自然语言处理:

      • Qwen-VL 系列模型: 用于自然语言理解和生成,模型的选择可以是本地模型(如 qwen-vl-chat)或通过API访问(如 qwen-vl-plus)。
      • Prompt Engineering: 使用prompt来指导模型生成适合的响应,包括操作指令生成、反思生成、记忆生成和操作流程规划。
    • 设备控制:

      • 使用 get_screenshottapslide 等函数通过ADB接口操作Android设备,如截图、点击、滑动、输入文本等。
  • 集成的模型框架:

    • 使用了 ModelScope 平台的pipeline来下载和调用AI模型。
    • 集成了 dashscope 用于多模态对话。
3. 主要流程分析
  1. 初始化

    • 配置设定: 设置ADB路径,指令内容,模型类型,API密钥等基本配置。
    • 模型加载: 根据配置加载OCR模型、图标检测模型、以及Qwen-VL模型(可以是本地或API调用)。
  2. 获取屏幕信息

    • 截图: 使用ADB获取当前手机屏幕截图并保存。
    • OCR识别: 通过OCR模型检测截图中的文本块及其坐标位置。
    • 图标检测: 通过GroundingDINO模型检测截图中的图标位置,并将图标裁剪出来进行进一步识别。
    • 结果合并: 将文本块和图标识别结果整理成统一格式的 perception_infos 列表,每个元素包含检测到的内容(文本或图标描述)及其屏幕坐标。
  3. 处理用户指令

    • 生成操作指令: 通过调用Qwen-VL模型,根据 perception_infos 生成操作指令(如点击、滑动、输入等)。
    • 执行操作: 根据生成的操作指令通过ADB接口对手机进行相应的操作。
  4. 反思与记忆

    • 反思: 项目支持通过对比前后两次截图的差异,生成反思Prompt,分析当前操作是否正确或需要修正。
    • 记忆: 项目可以将重要的信息保存到记忆中,以便后续操作中更好地理解和处理。
  5. 迭代循环

    • 重复操作: 以上过程在一个循环中不断重复,直到完成所有指令或满足停止条件。

三、 代码分析

  • 项目的主要目的是通过调用多模态大模型和图像处理技术,实现对移动设备的屏幕内容的读取、分析和操作
  • 项目通过 Android 设备桥(ADB)与设备通信,获取屏幕截图,然后利用各种模型进行图像识别、文字识别、操作决策,最终执行用户指令

项目由多个模块组成,每个模块都承担特定的功能。以下是模块划分和相应的代码分析:

1. 环境设置与初始化
  • 功能:设置ADB路径、用户指令、选择模型和API的调用方式等配置。
  • 代码
     # Your ADB path
     adb_path = "C:/Users/<username>/AppData/Local/Android/Sdk/platform-tools/adb.exe"

     # Your instruction
     instruction = "Read the Screen, tell me what day it is today. Then open Play Store."

     # Choose between "api" and "local". api: use the qwen api. local: use the local qwen checkpoint
     caption_call_method = "api"

     # Choose between "qwen-vl-plus" and "qwen-vl-max" if use api method. Choose between "qwen-vl-chat" and "qwen-vl-chat-int4" if use local method.
     caption_model = "qwen-vl-plus"

     # If you choose the api caption call method, input your Qwen api here
     qwen_api = "<your api key>"

     # Other settings...
  • 思路:在开始前,项目通过设置 ADB 路径、用户指令、API调用方式以及模型选择来初始化项目运行的基础环境。
2. 聊天历史初始化
  • 功能:初始化不同对话历史(如操作历史、反思历史、记忆历史)用于后续交互。

  • 代码

    def init_action_chat():
        operation_history = []
        sysetm_prompt = "You are a helpful AI mobile phone operating assistant. You need to help me operate the phone to complete the user's instruction."
        operation_history.append({'role': 'system', 'content': [{'text': sysetm_prompt}]})
        return operation_history
    
  • 思路:不同的聊天初始化函数用于分别构建操作对话历史、反思对话历史、记忆对话历史等,这样在不同阶段可以复用这些历史对话记录来生成决策。

3. 图像处理与信息提取
  • 功能:截取手机屏幕、进行OCR识别、图标检测、坐标处理等。

  • 代码

    def get_perception_infos(adb_path, screenshot_file):
        get_screenshot(adb_path)
        
        width, height = Image.open(screenshot_file).size
        
        text, coordinates = ocr(screenshot_file, ocr_detection, ocr_recognition)
        text, coordinates = merge_text_blocks(text, coordinates)
        
        center_list = [[(coordinate[0]+coordinate[2])/2, (coordinate[1]+coordinate[3])/2] for coordinate in coordinates]
        draw_coordinates_on_image(screenshot_file, center_list)
        
        perception_infos = []
        for i in range(len(coordinates)):
            perception_info = {"text": "text: " + text[i], "coordinates": coordinates[i]}
            perception_infos.append(perception_info)
        
        # Detect icons...
        # Add icon descriptions to perception_infos...
        
        return perception_infos, width, height
    
  • 思路:该模块负责从手机截图中提取有用的信息,包括文本和图标,并将这些信息转化为后续操作的输入。

4. 深度学习模型加载与推理
  • 功能:加载和初始化所需的深度学习模型,处理用户的指令。

  • 代码

    device = "cpu"
    torch.manual_seed(1234)
    if caption_call_method == "local":
        # Load local models...
    elif caption_call_method == "api":
        # Use API for models...
    
  • 思路:根据用户选择,项目会加载本地或API提供的模型来进行图像描述、文本识别、图标检测等任务。通过选择不同模型和API,可以适应不同的应用场景和硬件环境。

5. 操作与执行
  • 功能:根据模型输出的操作指令,执行相应的手机操作(点击、滑动、返回等)。

  • 代码

    if "Open app" in action:
        # Open a specific app...
    elif "Tap" in action:
        # Tap on a specific coordinate...
    elif "Swipe" in action:
        # Swipe from one coordinate to another...
    elif "Type" in action:
        # Type text...
    elif "Back" in action:
        back(adb_path)
    elif "Home" in action:
        home(adb_path)
    elif "Stop" in action:
        break
    
  • 思路:这一部分是项目的核心逻辑,它根据分析得到的操作指令执行相应的手机操作,来完成用户的任务指令。

6. 反思与记忆模块
  • 功能:通过反思上一次的操作结果来调整下一步操作的策略,并将有价值的信息存储在记忆中。

  • 代码

    if reflection_switch:
        prompt_reflect = get_reflect_prompt(...)
        chat_reflect = init_reflect_chat()
        chat_reflect = add_response_two_image("user", prompt_reflect, chat_reflect, [last_screenshot_file, screenshot_file])
    
        output_reflect = call_with_local_file(chat_action, api_key=qwen_api, model='qwen-vl-plus')
        reflect = output_reflect.split("### Answer ###")[-1].replace("\n", " ").strip()
        chat_reflect = add_response("system", output_reflect, chat_reflect)
        
        if 'A' in reflect:
            thought_history.append(thought)
            summary_history.append(summary)
            action_history.append(action)
        # Other conditions...
    
  • 思路:通过反思模块,系统会基于之前的操作结果来判断是否需要调整策略,并将重要的信息存储到内存模块中,以便在后续操作中参考。

7. 主循环与终止条件
  • 功能:主循环执行多轮操作,并根据一定条件终止循环。

  • 代码

    while True:
        iter += 1
        # First iteration...
        # Action decision...
        # Memory update...
        # Reflection...
        if "Stop" in action:
            break
        time.sleep(5)
    
  • 思路:项目在一个循环中进行,直到任务完成或达到终止条件。每次循环都会根据新的屏幕截图和用户指令更新操作,并在适当的时候进行反思和策略调整。

8. 总结功能
  • 功能:对项目进行总结,提取核心内容,确保项目达成目标。

  • 代码

    completed_requirements = output_planning.split("### Completed contents ###")[-1].replace("\n", " ").strip()
    
  • 思路:这一部分通过对完成任务的总结,验证项目的执行效果,确保达到用户的预期目标。


项目详细代码参考下面的链接;

参考链接

  • 阿里百炼
  • 代码文件
  • 体验链接

thank_watch

如果觉得我的文章对您有帮助,三连+关注便是对我创作的最大鼓励!或者一个star🌟也可以😂.

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

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

相关文章

开放式耳机对耳朵的伤害会减小吗?亲测好用的四款蓝牙耳机

开放式耳机对耳朵的伤害相对较小。 首先&#xff0c;开放式耳机不入耳&#xff0c;不会直接堵塞耳道&#xff0c;减少了对耳道的挤压和摩擦&#xff0c;降低了因长期佩戴入耳式耳机可能导致的耳道发炎、疼痛等问题。 其次&#xff0c;由于耳朵没有被完全封闭&#xff0c;耳部能…

【C/C++】结构体指针赋值的方法

在C语言中&#xff0c;结构体指针赋值有两种方法&#xff1a; 1.使用"->"操作符&#xff1a;通过结构体指针访问结构体成员并赋值。例如&#xff1a; struct Student {int id;char name[20]; };int main() {struct Student s1;struct Student *ptr_s1 &s1;…

设计模式学习[4]---依赖倒置原则+里氏代换原则

文章目录 前言1. 依赖倒置原则1.1 原理阐述1.2 举例 2.里氏代换原则2.1 原理阐述2.2 举例说明 总结 前言 在给发新功能模块之前&#xff0c;都先要画UML类图进行需求分析。对每一个类的作用&#xff0c;类与类之间的关系做一个详细的阐述。确定好基本的框架之后&#xff0c;才…

Lumos学习王佩丰Excel第十四讲:日期函数

一、认识时间和日期 1、回顾日期格式 日期可以由数字表示。 2、时间格式 时间由小数表示。 3、基本的时间与日期运算 二、日期函数 1、Year、Month、Day函数 2、Date函数 DATE(year,month,day&#xff09;&#xff1a;year为必需参数&#xff0c;可以包含1到4个数字。Day函…

LeetCode 热题 100 回顾

目录 一、哈希部分 1.两数之和 &#xff08;简单&#xff09; 2.字母异位词分组 &#xff08;中等&#xff09; 3.最长连续序列 &#xff08;中等&#xff09; 二、双指针部分 4.移动零 &#xff08;简单&#xff09; 5.盛最多水的容器 &#xff08;中等&#xff09; 6…

文心一言 VS 讯飞星火 VS chatgpt (332)-- 算法导论23.1 1题

一、设(u,v)是连通图G中的一条权重最小的边&#xff0c;证明&#xff1a;边(u,v)为图G的某棵最小生成树中的一条边。如果要写代码&#xff0c;请用go语言。 文心一言&#xff1a; 为了证明边(u,v)是图G的某棵最小生成树中的一条边&#xff0c;我们可以使用反证法结合最小生成…

09 复合查询

前面的查询都是对一张表进行查询&#xff0c;但这远远不够 基本查询回顾 查询工资高于500或岗位为MANAGER的雇员&#xff0c;同时还要满足他们的姓名首字母为大写的J select * from EMP where (sal>500 or job‘MANAGER’) and ename like ‘J%’; 按照部门号升序而雇员的…

免费用的写作神器:一键自动生成文章,提升内容创作效率!

传统的写作过程往往耗时耗力&#xff0c;从构思、调研到撰写、修改&#xff0c;每一步都需要创作者亲力亲为。免费写作神器的出现&#xff0c;犹如一场及时雨&#xff0c;为创作者提供了强大的支持。它利用先进的算法和自然语言处理技术&#xff0c;能够在短时间内生成高质量的…

了解Redis数据持久化(中)

3.5写时复制 Redis在使用RDB方式进行持久化时&#xff0c;会用到写时复制机制。写时复制的效果: bgsave子进程相当于复制了原始数据&#xff0c;而主线程仍然可以修改原来的数据。 对Redis来说&#xff0c;主线程fork出bgsave子进程后&#xff0c;bgsave子进程实际是复制了主线…

初识C语言指针(5)

目录 1. 回调函数 2. qsort函数 2.1 qsort函数的基本参数 2.2 qsort函数的使用 2.3 qsort排序结构体类型数据 结语 1. 回调函数 什么是回调函数呢&#xff1f;回调函数就是⼀个通过函数指针调⽤的函数。 如果你把函数的指针&#xff08;地址&#xff09;作为参数传递给另…

超分CAMixerSR 使用笔记

目录 超分CAMixerSR 笔记 自己改进的图例示例: 修改目录: 设置预训练模型: 超分CAMixerSR 笔记 自己改进的图例示例: 修改目录: codes/basicsr改为codes/basicsr_m 设置预训练模型: path:pretrain_network_g: F:\project\chaofen\CAMixerSR-main\pretrained_mode…

解决html中文乱码问题

在head上面添加 <% page contentType"text/html;charsetUTF-8" language"java" %>

【Three.js基础学习】19.Custom models with Blender

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 前言 blender模型资源:【blender】一个汉堡包-CSDN博客 一、代码 import ./style.css import * as THREE from three import { OrbitControls } from three/examples/jsm/co…

集成mybatis-plus框架

文章目录 1.新建一个sun_frame数据库并创建user表2.新建一个sun-common-mybatisplus模块1.maven项目2.添加依赖 3.sun-user集成mybatis-plus1.配置application.yml2.修改架构&#xff0c;由sun-user模块引入需要的公共模块3.代码目录结构4.mapper&#xff1a;po查&#xff0c;p…

SQLSugar进阶使用:高级查询与性能优化

文章目录 前言一、高级查询1.查所有2.查询总数3.按条件查询4.动态OR查询5.查前几条6.设置新表名7.分页查询8.排序 OrderBy9.联表查询10.动态表达式11.原生 Sql 操作 &#xff0c;Sql和存储过程 二、性能优化1.二级缓存2.批量操作3.异步操作4.分表组件&#xff0c;自动分表5.查询…

了解Redis数据持久化(上)

Redis常用作缓存&#xff0c;提高读取相应性能。Redis如果宕机可以从后端数据库里恢复数据&#xff0c;但是会出现的问题&#xff1a; 数据是从慢速数据库里获取数据&#xff0c;速度比不上从Redis缓存中获取。频繁访问数据库会给数据库造成压力。 处理宕机的方法就是&#xf…

Go 调用Rust函数

Go 调用Rust函数 在golang 中,go可以引用c代码&#xff0c;和c共舞&#xff0c;也就是cgo.在一些包里就能看到cgo的身影&#xff0c;gopcap(引用了libpcap),go-sqlite(引用了libsqlite).毕竟c是"万物之主"嘛.本文利用cgo实现go调rust函数 这是一个rust demo用于生成…

【Docker】Docker学习03 | Docker的volume

本文首发于 ❄️慕雪的寒舍 1. 引入 在docker的基本知识讲解中&#xff0c;提到了docker镜像是由一层一层文件系统构成的。这一系列文件系统是一系列的只读层。当我们创建一个容器的时候&#xff0c;Docker会读取镜像&#xff08;只读&#xff09;&#xff0c;并在镜像的顶部再…

SpringBoot集成google登陆快速入门Demo

1.为何要使用 Google 账号登录 借助“使用 Google 账号登录”功能&#xff0c;您可通过安全性备受信赖的 Google 账号&#xff0c;轻松快捷地在网上登录和注册网站与应用。该功能可消除您对密码的依赖&#xff0c;从而降低使用密码带来的困扰和安全风险。 2.环境准备 登录 G…

【IEEE出版】第八届电气、机械与计算机工程国际学术会议(ICEMCE 2024,10月25-27)

由西京学院主办&#xff0c;AEIC学术交流中心协办&#xff0c;中国科学技术大学、深圳大学、浙江工业大学等校联合支持的第八届电气、机械与计算机工程国际学术会议&#xff08;ICEMCE 2024&#xff09;将于2024年10月25日至27日在西安举办。 本次会议主要围绕“电气”、"…