基于iOS和百度AI的车牌识别系统设计与实现

2020-11-14 02:01王亚坤郑祥盘
闽江学院学报 2020年5期
关键词:调用百度客户端

王亚坤,郑祥盘,2

(1.福建省先进运动控制重点实验室(闽江学院),福建 福州,350108;2.福建永荣锦江股份有限公司, 福建 福州,350212)

0 引言

随着经济的快速发展和城市化进程的推进,人们生活水平的提高,机动车辆的数量也在快速增长,由此而产生了许多车辆违停事件。目前,规定区域内违停车辆的管理工作大都采用access数据库管理,其中手动录入信息是一项繁重的工作,且人工录入的方法极易出错且效率低下[1-2]。因此,交通管理系统亟待不断引进新的技术,提高交通管理的高效性、实时性和可靠性。在人工智能领域,在图像识别技术已经趋于成熟,百度公司已开放百度AI云服务,用户可将图像发送至百度云服务器,进而获取到由百度云服务器识别到的有效信息,在5G网络下很快即可得到服务器的反馈[3-4]。

针对规定区域内违停车辆管理低效的问题,开发基于iOS智能移动设备、百度AI云服务和移动互联网的违停车辆信息管理系统。系统以iOS系统提供的foundation和 UIKit为开发框架,结合百度AI SDK,利用delegate、单例程序设计模式和移动互联网,实现客户端UI界面的搭建、对图像的获取、传输和识别以及本地化数据管理,并对系统的网络传输、多线程性能、内存等进行优化和系统功能的完善及扩展。用户使用iOS客户端即可获取到违停车辆的图像信息,客户端后台完成图像向服务器的发送以及回执信息的接收工作,并将回执信息交由用户确认,用户确认后将回执的文本信息发送给信息管理员,此时管理员即可完成车辆信息的识别记录工作。此举可大幅地提高工作效率。

1 违停车辆信息管理系统设计

1.1 系统工作流程

管理系统的客户端为iOS平台APP,APP后台自动向服务端提交身份验证申请,成功后等待用户操作,用户操作APP获取到需要识别的图像文件,APP将图像发给服务端[5-6]。管理系统的服务器端为百度AI服务器,开放api供用户访问,服务器接收到用户的连接请求,对用户信息验证后开放数据接口,对接收到的数据进行解析和识别,通过api将识别后的信息返回给客户端。客户端将返回的文本信息呈现给用户处理,并可以在用户允许的情况下将数据本地化存储,提示用户对本地数据进行管理,其系统整个工作流程如图1所示。

图1 系统工作流程图

1.2 系统架构设计

违停车辆管理系统基于iOS平台,采用服务器/客户端架构[7]。服务器利用百度AI服务完成图像的识别功能,客户端实现对用户信息的获取,处理和呈现服务端回执信息以及本地化数据管理的功能,其系统架构如图2所示。

图2 系统架构图

1.3 客户端设计

客户端基于iOS移动平台,结合百度AI文字识别SDK,完成对违停车辆照片的信息获取,并与服务器进行数据交换,向用户呈现和管理本地数据等功能,客户端分为4个模块,其结构如图3所示。

图3 客户端结构图

1)数据源选择模块

用户进入系统点击按钮选择图像识别的类型为车牌识别,系统调用系统照片选择器或者照相机获取将要识别的图像,用户手动调整图像识别的位置,点击确认按钮选择图像。

2)数据收发模块

首先向服务器提交身份验证申请,身份验证成功后开始等待用户选择图像文件,将图像压缩后调用百度AI SDK,通过SDK将图像上传至百度AI云服务器并获得服务器返回的数据,SDK将数据返回给客户端后台,客户端对数据进行解析后呈现给用户检验。

3)页面布局模块

该模块向用户显示功能选择、图像选择、结果显示以及数据列表等UI界面,提示用户进行相关操作。

4)数据存取模块

该模块负责将用户识别后的数据进行存储、查找、修改以及删除等工作,保证数据显示和存取的准确。

2 违停车辆管理系统的实现

系统基于iOS平台,采用xcode开发工具,用户界面基于cocoaTouch中的UIKit搭建,与服务器数据交换采用百度AI SDK提供的AipOcrService 动态类库实现[8]。数据本地化存储采用苹果官方提供的NSUserDefaults方法实现。

2.1 数据收发模块

在用户启动客户端之后,数据收发模块调用[AipOcrService shardService] [AuthWithAK:ak andSK:sk]方法向百度云服务端发送身份验证信息,身份验证成功后等待系统UI界面加载完成和用户的点击事件的发生;如果验证失败,则向界面显示模块发送失败原因,由界面显示模块提示用户错误信息以进行进一步操作。服务端身份信息验证流程如图4所示。

图4 客户端身份信息验证流程图

数据收发模块与服务器的网络连接采用NSConnection方式,数据采用json数据格式进行封装,网络请求结束后采用Objective-C 语言提供的block回调方法向系统发送通知和数据[9]。数据收发模块的所有操作均采用苹果官方提供的GCD多线程管理方法,与其他模块异步并行执行数据收发操作,不会因耗时操作而影响其他模块的正常运行,节约系统资源,提升用户体验。

2.2 数据源选择模块

数据源选择模块主要执行用户图像的选择操作,以获取到要识别的图像数据;并将图像数据发送给数据收发模块和系统。

用户在UI界面点击按钮后,数据源选择模块调用官方提供的UIImagePickerController类进行实例化对象,该对象可自动化地完成图像数据的获取工作,然后采用用户手动框选的方式选择最终的图像识别区域(图5),确认完成后,向系统返回UIimage类型的图像数据供系统其他操作。

图5 框选识别

2.3 界面显示模块

用户界面显示模块在系统启动时向用户展示功能选择区,获取到用户点击操作后调用其他模块进行下一步操作。界面显示模块主要包括初始的功能选择界面、识别结果界面、数据管理界面。功能选择界面采用UIKit框架内的集合视图呈现,如图6所示。

图6 功能选择界面

每一个cell分别为不同功能的入口,用户点击后调用相关模块进行下一步操作,如图7所示。

图7 选择图片获取方式

识别结果界面采用UIview搭建,包括使用UIimageview显示原始图像,使用uitextfield向用户展示识别出的文本信息[10]。Uitextfield是一种可编辑的文本框,用户可对识别有误的文本进行编辑与修改,如图8所示。

图8 结果详情界面

用户点击确认后调用数据存储模块将数据进行本地化存储;历史数据界面采用UItableview搭建,每个cell单元展示原始缩略图以及识别结果概述和时间等信息。用户点解cell则会调用识别结果界面进行详情显示与修改;用户左滑cell操作则调用trailingSwipeActionsConfiguration函数对某条数据进行删除操作,如图9所示。

图9 本地数据展示

2.4 数据存取模块

数据存取模块负责本地数据的增删改查等操作,数据存取模块采用苹果官方提供的NSUserDefaults方法进行数据操作。该方法采用键-值方法对数据进行操作,只限定几种特定数据类型的存储[11]。现将自定义数据类型采用nsdata转换为二进制数据,再将单独的二进制文件用 NSUserDefaults 允许的nsarray类型进行保存,读取文件时再将二进制文件转换为自定义数据类型即可操作。

2.5 系统优化设计

2.5.1 网络传输性能优化

系统工作时,数据收发模块需要将图像文件发送至云端服务器,当图像文件比较大时会增加数据传送的所需要的时间。现将UIimage数据转换为nsstring类型数据,对数据进行迭代压缩,当文件所占用内存空间小于设定大小时终止迭代,开始数据发送。实验表明,采用图像压缩的方式可以大大缩短数据传输所用的时间。

2.5.2 多线程方法性能优化

iOS系统UI界面的刷新只能在主线程中进行,网络数据请求属于耗时操作,如运行在主线程中,在等待数据请求时会阻塞主线程的运行,进而造成UI界面卡顿,影响用户体验。先使用GCD线程管理方式为网络请求开启异步子线程,请求完成时调用 [[NSOperationQueuemainQueue] addOperation WithBlock:_blockBody]方法回到主线程调用UI控件进行界面刷新。

数据存取模块在存取数据时同样是耗时操作,先同样采用多线程方法进行,以防止主线程被阻塞而造成的UI界面卡顿,进而提升用户体验,系统多线程结构图如图10所示。

图10 线程结构图

2.5.3 MVC、单例、代理设计模式性能优化

客户端设计时采用模型(Model)、视图(view)、控制器(controller)方法,控制器作为模型和视图的媒介,保证数据的更新和视图刷新的有序进行,有效消除模型和视图之间的耦合性[12]。单例设计模式可以保证程序在运行时某个类只存在一个实例化对象,避免应用程序各个模块层级结构的混乱,保证程序的有序运行。代理模式可以在某个视图控制器中调用任何一个继承其协议的类的方法,可实现面向对象编程的逆向调用函数,大大简化了编程的步骤。

2.5.4 内存性能优化

系统运行过程中,一些类的对象需要反复调用,在对象的实例化方法中应先判断对象是否已经存在,如果已经存在,则应避免重复创建对象从而造成内存泄露。在编程时应尽量采用ARC自动引用计数方法,由系统来负责对象内存的销毁,此方法可以有效避免因对象未正常释放而发生的内存泄露现象。

3 系统功能扩展与完善

3.1 系统功能扩展

在系统实际的使用场景中,用户往往需要多种文字识别类型,例如将纸质文档转换为电子文档以使用计算机处理数据文件等,因此本系统还提供了通用文字识别、证件识别、银行卡识别、驾驶证识别、票据识别等多种类型的文字识别服务,用户可根据使用场景的不同在主功能入口选择相应的不同的识别类型。不同的文字识别类型在编程时调用方法略有不同,使用时均采用百度AI SDK 中的[AipOcrService shardService]单例对象分别调用以下方法即可实现,具体方法如表 1 所示。客户端的扩展服务在系统内部的实现原理与车牌识别大致相同,只需在[AipOcrService shardService]单例对象选择对应识别类型后传入相应的图像文件即可。

表1 功能及调用方法

3.2 系统功能的完善

由于系统功能较多,一般用户不会使用系统的全部功能,而且功能入口过多也给用户查找相应按钮带来不便,因此系统设计了长按拖动cell单元对按钮排序和删除操作,删除的功能按钮放入更多视图中备用。其实现原理是调用UIKit提供的手势识别类UIGestureRecognizer及其子类加以实现,首先在系统启动后使用UICollectionView集合视图对功能入口进行排列,当用户单击cell时进入相应功能,当用户长按某个cell单元时,调用UIGestureRecognizer的对象方法提取用户手指坐标位置,并使相应cell单元跟随手指所在坐标进行变换,当用户停止长按时,将cell单元的坐标调整为距离最近的单元格坐标,如图11所示。使用此方法可以使用户在查找和选择功能时更加方便快捷。

图11 cell单元长按效果

系统在识别完成后会向用户展示结果详情页,识别结果在结果详情页内的富文本框内以可编辑文本的方式展示,用户可在该页将识别结果与原图进行对照,对识别错误的地方加以修改,除此之外,考虑到用户经常需要将文本长按复制到粘贴板,系统在用户点击保存按钮时便自动在后台创建iOS系统剪切板对象UIPasteboard,并向该对象传递识别结果的字符串,可实现识别结果的一键复制到粘贴板,以供用户其他用途。

4 实验验证

通过使用本文所述系统进行违停车辆信息的录入工作,以验证本方法对园区违停车辆管理工作的效率是否有提升。

实验地点为福建锦江科技园区,实验设备为iPhone 8。实验的主要过程如下:

1)使用APP监测拍照进入园区内停车图像信息;

2)使用APP对图像信息进行识别;

3)将识别到的信息发送给数据管理员进行信息录入;

4)记录上述过程所用的时间;

5)同时使用传统手动抄录方式进行信息录入,并记录该过程所消耗的时间;

6)将得到的数据绘制成表格,对比数据得到结论。

以上实验过程重复5次。

实验数据如表2所示。

表2 实验数据

从表2的数据可直观分析得到,使用本文所述方法可以使得园区违停车辆管理工作的效率提升。

5 结论

1)针对手动录入车牌信息效率低下的问题,设计了基于iOS平台和百度AI云服务的车牌AI云识别系统,实现了车牌信息的自动化识别提取与信息管理的功能,大大提高了管理工作的效率。

2)针对系统开发过程中代码编写工作量大,开发周期过长的问题,在构建系统时,巧妙地利用苹果公司官方提供的foundation和UIKit开发框架,简化了客户端数据操作和界面搭建时的工作,利用百度AI官方sdk简化了网络传输中的编程工作,此方法很大程度上减少了代码量,缩短了开发周期。

猜你喜欢
调用百度客户端
Robust adaptive UKF based on SVR for inertial based integrated navigation
核电项目物项调用管理的应用研究
如何看待传统媒体新闻客户端的“断舍离”?
县级台在突发事件报道中如何应用手机客户端
孵化垂直频道:新闻客户端新策略
大枢纽 云平台 客户端——中央人民广播电台的探索之路
百度年度热搜榜
基于系统调用的恶意软件检测技术研究
百度医生
百度“放卫星”,有没有可能?