Android中如何使用GPS

news2024/11/16 3:44:31

目录

GPS简介

GPS的常用API

locationProvider

使用GPS获取位置信息

室内WIFI定位

近距离警报


GPS简介

Gobal Positioning System,全球定位系统,是美国在20世纪70年代研制的一种以人造地球卫星为基础的高精度无线电导航的定位系统,它在全球任何地方以及近地空间都能够提供准确的地理位置、车行速度及精确的时间信息;它是具有在海、陆、空进行全方位实时三维导航与定位功能的新一代卫星导航与定位系统。

中国用的定位系统是北斗卫星导航系统Beidou Navigation Satellite System,简称BDS,BDS、GPS、俄罗斯的GLONASS、欧盟的GALILEO是联合国卫星导航委员会已经认定的供应商。

手机的定位功能应用广泛,本章来学习GPS的应用开发。

GPS的常用API

GPS系统有三部分组成,卫星空间部分、地面监控部分和用户设备部分。

对于Android机来说,是用户设备部分,是GPS定位系统的接收机,也就是说GPS定位需要有硬件支持GPS功能。对于Android开发人员来说,通过LocationManager、LocationProvider、Location这三个API的一些方法就能开发出GPS应用。

程序的LocationManger对象不能直接创建,而是要通过Context.getSystemService方法获取

LocationManager locationManager= (LocationManager) getSystemService(Context.LOCATION_SERVICE);
List<String> allProviders = locationManager.getAllProviders();

通过询问chatGPT,整理出了这样的一个表格,LocationManger的方法以及作用如下:

方法名

返回值

作用

getLastKnownLocation(String provider)

Location

获取指定 provider 的最近一次位置信息

requestLocationUpdates(String provider, long minTime, float minDistance, LocationListener listener)

void

注册位置监听器,以获取 provider 的位置更新。参数 minTime 和 minDistance 分别表示位置更新的最小时间间隔和最小距离间隔

removeUpdates(LocationListener listener)

void

取消位置监听器的注册

isProviderEnabled(String provider)

boolean

判断指定 provider 是否可用

addProximityAlert(double latitude, double longitude, float radius, long expiration, PendingIntent intent)

void

注册一个“地理围栏”,当设备进入指定半径的圆形区域时触发 intent

removeProximityAlert(PendingIntent intent)

void

取消“地理围栏”的注册

使用 LocationManager 时需要申请适当的权限,比如 ACCESS_FINE_LOCATION 或 ACCESS_COARSE_LOCATION 权限。

还有一个API是LocationProvider,他不是Android中的类,而是 Android 系统中的一个抽象类,定义了位置提供者的标准接口,它的实现类用于提供位置信息。LocationProvider 的实现类可以通过系统服务 LocationManager 来获取。当应用程序请求获取位置信息时,LocationManager 会选择合适的位置提供者来获取位置信息,根据不同的需求选择不同的位置提供者。

方法名

返回值

作用

getName()

String

获取位置提供者(locationProvider)的名称

getAccuracy()

int

获取该位置提供者的精度

getPowerRequirement()

int

获取该位置提供者的电量消耗

hasMonetaryCost()

boolean

判断该位置提供者是否需要支付费用

requiresCell()

boolean

判断该位置提供者是否需要使用移动网络

requiresNetwork()

boolean

判断该位置提供者是否需要使用数据网络

requiresSatellite()

boolean

判断该位置提供者是否需要使用卫星

supportsAltitude()

boolean

判断该位置提供者是否支持海拔信息

supportsBearing()

boolean

判断该位置提供者是否支持方向信息

supportsSpeed()

boolean

判断该位置提供者是否支持速度信息

还有一个API是Location,Location 是 Android 中用于表示位置信息的类,它包含了经度、纬度、海拔、速度、方向等位置信息。Location 对象是由 LocationProvider 提供的,LocationManager 负责获取 LocationProvider 提供的位置信息,并将其封装成 Location 对象,然后提供给应用程序使用。方法如下:

方法名

返回值

作用

getLatitude()

double

获取该位置的纬度

getLongitude()

double

获取该位置的经度

getAltitude()

double

获取该位置的海拔

getAccuracy()

float

获取该位置的精度

getBearing()

float

获取该位置的方向

getSpeed()

float

获取该位置的速度

getTime()

long

获取该位置信息的时间戳

hasAccuracy()

boolean

判断该位置信息是否包含精度信息

hasAltitude()

boolean

判断该位置信息是否包含海拔信息

hasBearing()

boolean

判断该位置信息是否包含方向信息

hasSpeed()

boolean

判断该位置信息是否包含速度信息

需要注意的是,获取 Location 对象时可能会出现空值,因此在使用 Location 对象前需要先进行非空判断。另外,获取位置信息需要申请适当的权限,比如 ACCESS_FINE_LOCATION 或 ACCESS_COARSE_LOCATION 权限。

上面三个API就是Android GPS定位支持的三个核心API。使用步骤如下:

1 获取系统的LocationManger对象。

2 使用LocationManger,通过指定的locationProvider来获取定位信息,定位信息由Location表示。

3 从Location对象中获取定位信息。

locationProvider

写一个简单的demo来获取当前系统所有的locationProvider

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";

    private ListView listView;
    private LocationManager locationManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        listView = findViewById(R.id.list);
        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

        //获取所有的locationProvider名称
        List<String> allProviders = locationManager.getAllProviders();
        ArrayAdapter adapter=new ArrayAdapter(this, android.R.layout.simple_list_item_1,allProviders);
        listView.setAdapter(adapter);
    }
}

在真机上运行可以看到该系统上有如下四个LocationProvider

移动端通常通过WIFI、GPS、基站这三种方式来定位设备。

以下这四种provider分别来介绍一下

    public static final String NETWORK_PROVIDER = "network";
    public static final String GPS_PROVIDER = "gps";
    public static final String PASSIVE_PROVIDER = "passive";
    public static final String FUSED_PROVIDER = "fused";

NETWORK_PROVIDER:通过移动网络的基站或者 Wi-Fi 来获取地理位置;优点:只要有网络,就可以快速定位,室内室外都可;缺点:精确度不高;

GPS_PROVIDER:通过 GPS 来获取地理位置的经纬度信息;优点:获取地理位置信息精确度高;缺点:只能在户外使用,获取经纬度信息耗时,耗电;

PASSIVE_PROVIDER:被动接收更新地理位置信息,而不用自己请求地理位置信息。

PASSIVE_PROVIDER 返回的位置是通过其他 providers 产生的,可以查询 getProvider() 方法决定位置更新的由来,需要 ACCESS_FINE_LOCATION 权限,但是如果未启用 GPS,则此 provider 可能只返回粗略位置匹配;

FUSED_PROVIDER:已经被废弃了

通过名称获取指定的locationProvider

LocationProvider provider = locationManager.getProvider(LocationManager.GPS_PROVIDER);

使用GPS获取位置信息

代码如下:

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";

    private LocationManager locationManager;
    private TextView showInfo;

    @RequiresApi(api = Build.VERSION_CODES.M)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        showInfo = findViewById(R.id.show_location);
        requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION},0x123);
    }

    private void updateView(Location location) {
        if (location != null) {
            Log.d(TAG, "updateView: 222");
            String res = "实时位置:\n" +
                    "经度:" + location.getLongitude() +
                    "\n纬度:" + location.getLatitude() +
                    "\n高度:" + location.getAltitude() +
                    "\n速度:" + location.getSpeed()
                    + "\n方向:" + location.getBearing();
            showInfo.setText(res);
        } else {
            Log.d(TAG, "updateView: 111");
            showInfo.setText("");
        }
    }
    @SuppressLint("MissingPermission")
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == 0x123 && grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            //创建locationManger对象
            locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
            //获取最新的定位信息
            Location lastKnownLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
            updateView(lastKnownLocation);
            //每隔三秒获取一次GPS信息
            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 3000, 8f, new LocationListener() {
                @Override
                public void onLocationChanged(@NonNull Location location) {
                    updateView(location);
                }
            });
        }
    }
}

这里代码也很简单,我布局文件只写了一个textView来展示经纬度信息,首先在onCreate方法里动态申请权限。在Android6.0以上不仅仅要在声明文件里静态注册,还有动态申请,否则会出现安全异常。然后就是一个更新UI的方法,通过传入的location获取经纬度高度等信息。选择完获取权限后,会执行onRequestPermissionsResult回调函数,然后就是获取定位信息更新UI。

最后需要在声明文件里静态注册权限。

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

我获取到的是北京市内某地区的经纬度,把该程序和地图功能结合,就能反映出该经纬度在地图上的具体位置,即可开发出GPS导航系统。

室内WIFI定位

室内WIFI定位主要根据WIFI路由器所在的位置进行定位,主要应用于室内较小的空间的精准定位。

Android 9 添加了WiFi 室内定义功能(RTT),以下内容来自 developer.android.com

Android 9 添加了对 IEEE 802.11mc Wi-Fi 协议(也称为 Wi-Fi Round-Trip-Time (RTT))的平台支持,从而让您的应用可以利用室内定位功能。
在运行 Android 9 且具有硬件支持的设备上,应用可以使用 RTT API 来测量与附近支持 RTT 的 Wi-Fi 接入点 (AP) 的距离。 设备必须已启用位置服务并开启 Wi-Fi 扫描(在 Settings > Location 下),同时您的应用必须具有 ACCESS_FINE_LOCATION 权限。

设备无需连接到接入点即可使用 RTT。 为了保护隐私,只有手机可以确定与接入点的距离;接入点无此信息。

如果您的设备测量与 3 个或更多接入点的距离,您可以使用一个多点定位算法来预估与这些测量值最相符的设备位置。 结果通常精准至 1 至 2 米。

室内WIFI定位的管理器是WifiRttManager,获取方式如下,由于在Android9后才增加该功能,所以需要先判断。

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.P) {
    WifiRttManager wifiRttManager= (WifiRttManager) getSystemService(Context.WIFI_RTT_RANGING_SERVICE);
}

获取到wifirttmanger对象后,可以用startRanging开始定位,该方法里有三个参数。

startRanging(@NonNull RangingRequest request, @NonNull Executor executor, @NonNull RangingResultCallback callback)

RangingRequest:该参数代表一个定位请求,该参数管理本次定位是基于哪个WIFI节点进行访问的

Executor:创建一个新的线程来执行WIFI定位,避免阻塞UI线程。

RangingResultCallback:定位成功或失败的时候触发该对象内的特定方法

写一个具体的案例来实现室内WIFI定位,代码如下:

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";
    WifiRttManager mWifiRttManager;

    //定义监听WIFI状态改变的BroadcastReceiver
    public class WIfiChangeReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            if (WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(intent.getAction())) {
                //开始执行wifi定位
                startWifiLoc();
            }
        }

    }


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //定义一个监听网络状态的改变 WIFI状态改变的intentFilter
        IntentFilter wifiFilter = new IntentFilter();
        wifiFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
        wifiFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
        wifiFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
        registerReceiver(new WIfiChangeReceiver(), wifiFilter);
    }

    @SuppressLint("MissingPermission")
    private void startWifiLoc() {
        //获取wifi管理器
        WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
        //判断是否支持室内wifi定位功能
        boolean hasRtt = getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI_RTT);
        Log.d(TAG, "startWifiLoc: 是否具有室内WIFI定位功能:" + hasRtt);
        //Android版本大于9才能使用
        if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
            //获取室内WiFi定位管理器
            mWifiRttManager = (WifiRttManager) getSystemService(Context.WIFI_RTT_RANGING_SERVICE);
            RangingRequest request = new RangingRequest.Builder()
                    .addAccessPoints(wifiManager.getScanResults())//添加WiFi扫描结果
                    .build();//创建RangingRequest对象
            Log.d(TAG, "startWifiLoc: request:"+request);
            //开始请求执行室内WIFI定位
            mWifiRttManager.startRanging(request, Executors.newCachedThreadPool(), new RangingResultCallback() {
                @Override
                public void onRangingFailure(int i) {
                    //WIFI定位出错执行的方法
                    Log.d(TAG, "onRangingFailure:错误码是: "+i);
                }

                @Override
                public void onRangingResults(@NonNull List<RangingResult> list) {
                    //室内WiFi定位返回结果时触发
                    for (RangingResult rr : list){
                        Log.d(TAG, "onRangingResults:与 "+rr.getMacAddress()+" WIFI的距离是:"+rr.getDistanceMm());
                    }
                }
            });
        }
    }

}

运行后报错了

 查询了一下原因是我设备硬件不支持WIFIRTT功能。

总结WIFI定位的步骤:

1 获取WifiRttManger对象

2 通过RangingRequest.Builder来创建对象,创建之前应该先添加WiFi扫描得到WiFi访问点的信息

3 调用WifiRttManger对象的startRanging方法

近距离警报

之前学习的API方法中有一个函数:

addProximityAlert(double latitude, double longitude, float radius, long expiration, PendingIntent intent)

代码:

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";

    private LocationManager locationManager;

    @RequiresApi(api = Build.VERSION_CODES.M)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 0x123);

    }


    @SuppressLint("MissingPermission")
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == 0x123 && grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
            //定义靠近点的经纬度信息
            double lon = 116.00;
            double lat = 46.00;
            float radius = 500F; //定义半径500M
            Intent intent = new Intent(this, ProxAlertReciever.class);
            //将intent封装成pendingIntent
            PendingIntent pendingIntent = PendingIntent.getBroadcast(this, -1, intent, 0);
            //添加临近警告
            locationManager.addProximityAlert(lat, lon, radius, -1, pendingIntent);
        }
    }
}

注册一个广播监听变化:

public class ProxAlertReciever extends BroadcastReceiver {
    private static final String TAG = "ProxAlertReciever";

    @Override
    public void onReceive(Context context, Intent intent) {
       boolean isEnter= intent.getBooleanExtra(LocationManager.KEY_PROXIMITY_ENTERING,false);
       if (isEnter){
           //靠近提示
           Log.d(TAG, "onReceive: 快靠近了!!");
       }else {
           Log.d(TAG, "onReceive: 离开了!!");
       }
    }
}

至此 Android中的GPS的就讲完了,想开发出具体的导航系统还要结合地图功能。

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

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

相关文章

【手机摄影】--全集

算了&#xff0c;摄像机太贵了&#xff0c;玩不起&#xff0c;还是看看手机摄影吧。 学习链接 &#xff1a;https://www.bilibili.com/video/BV14e411T7md 1. 认识手机摄影 1.1 局限性 手机的摄像头能够满足大部分场景&#xff0c;但以下场景会受到掣肘&#xff0c;最好还是用…

面试这么简单,阿里原来这么容易就能进去…...

最近和阿里的一个老朋友闲聊&#xff0c;感触颇深&#xff0c;据他说公司近期招聘的测试工程师&#xff0c;大多数候选人都有一个“通病”&#xff1a;在工作2-3年的时候遇到瓶颈&#xff0c;而且是一道很难跨越的坎。 为什么会遇到这种情况&#xff1f;因为大部分测试工程师在…

项目管理基础(第五版)读书笔记

项目管理基础&#xff08;第五版&#xff09;读书笔记 章节概要前言第一章&#xff1a;项目管理概述 日期&#xff1a;2023年3月23日 章节概要 前言 项目管理协会 Project Management Institute。简称PMI。项目管理知识体系指南 Project Management Body Of Knowledge。简称P…

4.QT应用程序主窗口

本章代码见文末链接 主窗口框架 新建Qt Wisgets项目mymainwindow&#xff0c;类名默认MainWindow&#xff0c;基类默认QMainWindow 更改文字如图&#xff0c;如果中文无法直接输入&#xff0c;可以试试复制粘贴 “动作编辑器”中&#xff08;默认在右下角&#xff09;&…

关于IRIG-B码对时的理解和分析

一、IRIG-B是什么&#xff1f; IRIG-B&#xff08;简称B码&#xff09;是一种应用于靶场的串行时间交换码。由美国靶场司令部委员会下属“靶场仪器组”提出的一种时间信息编码标准&#xff08;IRIG是英文InterRange Instrumentation Group的缩写。它是美国靶场司令委员会的下属…

一百零八、Kettle采集Kafka数据到HDFS(踩坑,亲测有效)

Kafka到HDFS&#xff0c;除了用Kafka API和flume之外&#xff0c;还可以用kettle&#xff0c;最大优点是不用写代码&#xff01; 版本&#xff1a;Kettle版本&#xff1a;8.2、Hadoop版本&#xff1a;3.1.3 前提&#xff1a; 详情请看鄙人的一百零一、Kettle8.2.0连接Hive…

pip安装配置清华镜像源scrapy框架,并进行框架的案例演示

文章目录 运行cmd终端后直接输入安装成功scrapy框架安装成功 为什么使用此命令安装scrapy框架成功后创建scrapy项目建议在pycharm终端创建项目打开项目 用scrapy框架实现案例——从新浪网爬取热点并把数据输入到excel表中编辑setting.py文件创建脚本、写入脚本在终端运行脚本文…

长三角生物医药产业加速跑,飞桨螺旋桨为创新药企、医药技术伙伴装上AI大模型引擎...

生物医药是国家“十四五”规划中明确的战略性新兴产业之一。长三角地区是中国生物医药产业的排头兵&#xff0c;也是《“十四五”生物经济发展规划》的“生物经济先导区”之一。据《上海市生物医药产业投资指南》显示&#xff0c;2022 年上海市生物医药产业在 I 类国产创新药数…

新手如何学习挖漏洞?【网络安全】

新手如何学习挖漏洞&#xff1f;看这篇就够了 前言 有不少阅读过我文章的伙伴都知道&#xff0c;我从事网络安全行业已经好几年&#xff0c;积累了丰富的经验和技能。在这段时间里&#xff0c;我参与了多个实际项目的规划和实施&#xff0c;成功防范了各种网络攻击和漏洞利用&…

Cron表达式X分钟执行一次的设计缺陷。SQL JOIN的设计缺陷。在线Cron表达式网站的缺陷。Spring 定时任务的年问题。

Cron Cron表达式 定时任务计划任务 Chronological英 /ˌkrɒnəˈlɒdʒɪk(ə)l/adj. 按发生时间顺序排列的&#xff1b;&#xff08;年龄&#xff09;按时间计算的1. 月 周设计精妙吗&#xff1f; 学习 0/5 * * * * ? * 秒 分 时 日 月 周 年1. 年一般省略。为&#xf…

Live800:服务经济时代,企业如何满足客户需求?

在互联网与市场经济的催化下&#xff0c;我们正在从产品经济时代过渡到服务经济时代。在产品经济时代&#xff0c;企业关注的核心是质量和成本&#xff1b;而在服务经济时代&#xff0c;如何面向客户&#xff0c;满足客户需求则成为企业建立核心竞争力的关键。 具体来说&#x…

【精选】关于洪涝灾害智慧水利和人工智能大模型的解决方案2023版

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用&#xff0c;如有侵权请联系删除 智慧水利平台 实现“全局一盘棋”的智慧水利综合管理&#xff0c;通过“一图、一库、一平台”结合水利大数据、数字孪生与人工智能&#xff0c;为水利工作提供有力的管理抓手&…

SingleR --细胞注释

文章目录 briefExample使用内置的 references使用其他注释好的数据集作为 reference singleR还提供了注释诊断的方法 brief Example The celldex package provides access to several reference datasets (mostly derived from bulk RNA-seq or microarray data)。 The Human…

《狂飙》原著来了,邀你重新见证

2023年的开篇十分精彩且丰富&#xff0c;经历过生活的不幸&#xff0c;新的一年万物复兴&#xff0c;每个人心底那颗躁动的心又重新释放&#xff0c;希望新的开始不负所望&#xff0c;年末复盘时所得皆所愿&#xff01; 开篇 开年影视第一炮&#xff0c;炸出了所有人被压抑的内…

AIGC技术发展和应用方向

AIGC&#xff08;Artificial Intelligence Generated Content&#xff09;是指通过人工智能技术生成的各种文本、图像、音频和视频等多媒体内容。AIGC技术是机器学习和自然语言处理等技术的结合&#xff0c;通过对海量数据的学习和分析&#xff0c;可以让计算机模拟人类的创造力…

Spring Boot 单体应用一键升级成 Spring Cloud Alibaba

作者&#xff1a;十眠 背景 随着 Apache Dubbo、Nacos 以及 Spring Cloud 等服务框架的流行&#xff0c;越来越多的企业开始采用微服务架构来构建其应用程序。微服务架构使企业能够将其应用程序拆分成多个小型服务&#xff0c;这些服务可以独立部署和扩展。这种架构模式也使企…

怎么给pdf文件添加水印

怎么给pdf文件添加水印&#xff1f;PDF文件的应用比较广泛&#xff0c;大家喜欢将各种办公资料和文档转换成PDF格式&#xff0c;为什么呢&#xff1f;因为pdf文件具有比较强的稳定性而且不利于编辑修改&#xff0c;所以更利于保存和转发。有时候我们会在工作中花费大量时间制作…

第1天学习Docker——Docker简介

一、Docker是什么&#xff1f; Docker 是一个开源的应用容器引擎&#xff0c;基于 Golang 语言开发&#xff0c;可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的 Linux 服务器。容器是一个沙箱机制&#xff0c;相互之间不会…

神经网络语言模型(NNLM)

神经网络语言模型【NNLM】 1 为什么使用神经网络模型&#xff1f;2 什么是神经网络模型&#xff1f;3. 代码实现3.1 语料库预处理代码3.2 词向量创建3.3 NNLM模型类3.4 完整代码 1 为什么使用神经网络模型&#xff1f; 解决独热编码无法解决词之间相似性问题 使用神经网络语言…

带稀缺注释的动物姿态估计CVPR2023

由于缺乏标记数据&#xff0c;动物姿态估计是一项重要但未被充分探索的任务。作者用稀缺的注释&#xff08;scarce annotation&#xff09;来处理动物姿态估计&#xff0c;其中只有一小部分标记数据和大部分未标记图像可用。并且&#xff0c;作者提出了ScarceNet&#xff0c;这…