来源:http://worthpen.top/#/home/blog?blog=pot-blog2.md
安卓端街景分割APP,之前参加比赛开发的程序,还未申请为软著,现在共享一下。该作品的主要功能为对街道出行过程中的用户提供街景分割功能并在危险情况下进行警报,次要功能为应用更新和建议反馈,具有云端服务器设计。完整项目代码及其资源文件见文末。
使用过程中,需要对场景进行光学图像采集并分析。以此为中心,该作品的总体系统框图如图1所示。图中方块表示页面,梯形表示后端处理算法,圆柱形表示云端数据库。箭头表示页面转跳、算法调用、数据库数据传输关系。需要注意的是,用户反馈数据库的箭头表示由本地上传至云端。
图1作品系统框图
该页面如下图所示,主要功能为选择不同的出行方式。该页面同时还具有应用更新和建议反馈功能,其按键位于该页面的右上角和侧边栏。
图3 模式选择页面
该页面如下图所示,主要功能为选择需要识别的类型和所使用的识别方法。该页面同时还具有应用更新和建议反馈功能,其按键位于该页面的右上角。
图4分割算法配置页面
该页面如下图所示,主要功能为展示前方的街景和分割结果。该页面同时还具有应用更新和建议反馈功能,其按键位于该页面的右上角。图中的校徽位置即为识别结果的展示位置,白色方框为前方的街景采样显示位置。最上方的颜色卡片时为了提醒不同颜色代表的不同类别。
同时,为了实现街景分割和报警功能,该作品的主要功能的算法功能模块分为:
1、街景分割算法;
2、预测报警算法。
该章节将分节介绍关键算法、不同的页面设计、服务器数据库设计等。
该项目使用了开源语义分割模型HRNet。该模型基于Pytorch开发,为了实现轻量化部署,将基于Pytorch下的模型进行了转换。首先调用Pytorch的to_onnx方法将ckpt模型转化为onnx(Open Neural Network Exchange)模型,onnx模型为一个用于表示深度学习模型的标准,可使模型在不同框架之间进行转移。随后,基于onnx_tf.backend将onnx模型转化为tensorflow模型。最后,将tensorflow模型转化为tensorflow lite模型,实现模型的轻量化部署。
数据集使用了Cityspaces,这是一个大规模的城市街景图的数据集,带有语义分割信息,是为了在自动驾驶或城市场景规划等研究领域中的场景理解而提出的。提供了19个类别物体(分别为空、天空、建筑、道路、人行道、栅栏、植被、杆、车、信号标志、行人、骑自行车的人等)细粒度的像素级别的标注。包含从渲染的视频流中提取出的训练图像,该数据集也以其多变性而著称,包括场景(城镇、城市、高速公路等)、物体、季节、天气等。该数据集的样例如图8所示。
图8 Cityspaces数据集实例图
预警算法主要基于分割后的物体所占面积进行判断,算法流程如图9所示。需要注意的是,考虑到不同的物体具有不同的大小,因此设置对于不同类别具有不同的警告比例,当物体面积占总面积的百分比达到警告比例时,则进行报警。
图9 预警算法流程图
该作品界面基于Flutter框架开发,具有跨平台特性,目前调试主要在Android平台,后续会扩展至IOS、Windows等平台。应用程序的第一个界面如图2所示,为启动页面,作用是对产品的名称及功能进行简要的描述。由启动页面自动转跳至如图3所示的第二个界面后,可以看到主界面上显示的是两个模式的选择,分别是步行模式和驾驶模式。这两个模式的区别主要是:步行模式适合于街上的行人,可以在步行状态下以较低的功耗进行街上物体的识别工作;驾驶模式则适用于高速移动的场景,不仅仅是驾车,在骑自行车和电动车这种场合也是可以使用的。在该页面的侧边有着一个菜单栏,其如图10所示,其中包括了反馈系统和检查更新,反馈系统可以上传意见和使用体验,在未来我们会增加更多的功能,比如错误的截屏反馈,能够更好的帮助我们优化算法,提高识别的准确率。
图10 反馈系统和检查更新页面
点击相应的模式后进入如图4的分割算法配置页面,可以看到若干选项,这些选项主要针对日常行人在街道上常见的障碍物的顺序进行排列,在勾选后面的选项后,框内显示的颜色即为识别出相应物体后填充的颜色。选择完成后点击开始则可以进行识别模式进行自动识别,并对危险情况进行提醒。
在配置完成分割算法后,点击“开始”按钮,进入如图5所示的街景采样和结果展示页面,并启动街景分割系统。
3、服务器及数据库设计
该作品基于BaaS技术设计了其云端服务器。目前针对建议反馈功能开发了对象-关系数据库,其数据库架构如表1所示。
objectID(String) | content(String) | createdAt(Date) | updateAt(Date) |
---|---|---|---|
ec4ca67f9c | 应该具有更新功能 | 2022-03-03 22:40:18 | 2022-03-03 22:40:18 |
…… | …… | …… | …… |
该数据库的使用基于Dart语言的开源库data_plugin,该开源库在使用前需要创建数据类,除了包含每条数据的字段作为成员变量外,还需要进行Json格式数据的转化,实现toJson方法和fromJson的工厂模式创建对象。在使用data_plugin前,执行initEncryptionMasterKey来初始化数据库连接,上传过程中建立所上传数据的对象,调用save方法即可实现数据的上传。
此外,该作品还开发应用内更新功能,该功能本地依赖于flutter框架的flutter_xupdate开源库,云端依赖于阿里云的对象存储。首先需要调用flutter_xupdate的init方法进行初始化,再通过checkUpdate方法并输入阿里云的对象存储的网址,即可实现对更新数据的读取,通过更新数据判断是否更新和安装包的地址,确定后根据安装报的地址下载并安装更新。云端的更新数据的格式为:
{
“Code”: 0, //0代表请求成功,非0代表失败
“Msg”: “123”, //请求出错的信息
“UpdateStatus”: 1, //0代表不更新,1代表有版本更新,不需要强制更新,2代表有版本更新,需要强制更新
“VersionCode”: 2,
“VersionName”: “0.2”,
“ModifyContent”: “版本更新的消息测试”,
“DownloadUrl”: “XX”,
“ApkMd5”: “…” //md5值没有的话,就无法保证apk是否完整,每次都会重新下载。应当使用md5加密。
}
该实验运行在安卓平台,采用的处理器为天玑820。测试目的是验证部署后算法的准确度不变及位于不同运算平台的运行速度。在手机端进行测试的结果如图12所示。
图12 手机端测试结果
完整项目分为多个文件,且包含资源文件,无法放在文章中。完整项目代码及其资源文件在公众号(沸腾的火锅资源号)中自取。