前言

1.之前在PC端做过身份证检测识别相关的项目,用的环境是Caffe-SSD训练的VGG16,模型大小大概为90M左右,在PC下,不调用GPU加速的话,处理检测速度并不理想。之后想把这个项目移植到移动端,然后在IPhone XR Max 上做了测试,速度比PC端更慢了,而且体积巨大,根本没有办法应用到项目上。
2.为了能在移动端运行目标检测模型,那只能重新训练,看了一堆资料和测试各种官方Demo,之后选了MobileNetv2-SSDLite,训练框架还是用Caffe。

模型训练

1.关于前期的数据准备与数据样本标注,可以看我之前身份证识别的博客,我训练时还是用VOC2007这种数据格式。
2.MobileNetv2-SSDLite什么训练自己的数据集,可以看这个博客
,博主写得很详细。
3.在训练过程中发现,同样的数据集,同样的迭代次数,caffe-ssd训练出来的模型精度要高出MobileNetv2-SSDLite几个百分点,而且MobileNetv2-SSDLite对特征弱的物体识别很容易出现误检的现象,为了精度能达到可用的级别,唯一的办法是加样本,但身份证这种数据集又比较敏感,很不好收集,想了各种办法,才收集了一万张左右的数据,再写个仿真算法,把数据扩增到十万张左右,迭代20万代左右,精度可以达99.5%。
4.最终的模型大小在14M左右,我放了6个类型在里面,在真机下检测一张图像的速度大概在0.02秒左右,基本上可以达到实时。

应用代码

1.在OpenCV3之后的版本都有dnn这个模块,很好的对接深度学习的模型,我这里用的是OpenCV4.2这个版本,iOS是不支持直接显示OpenCV的Mat这种图像格式的,要把Mat转成UIImage才能在iOS上显示,关于转换的代码可以看我之前的博客。
2.OC是可以直接与C++交互的,所以检测的代码我直接用C++写的。
代码:

bool idDetection(cv::Mat &cv_src, cv::Mat &cv_dst, std::string &model_path, std::string &proto_path, std::vector<std::string> &label)
{if (cv_src.empty()){return false;}cv_dst = cv_src.clone();cv::Size reso(300, 300);cv::dnn::Net net = cv::dnn::readNet(model_path,proto_path);if (net.empty()){return false;}cv::Mat blob = cv::dnn::blobFromImage(cv_src, 1.0, reso, cv::Scalar(0, 0, 0), true, false);net.setInput(blob);cv::Mat out = net.forward();cv::Mat detectionMat(out.size[2], out.size[3], CV_32F, out.ptr<float>());float confThreshold = 0.25f;float nmsThreshold = 0.5f;std::vector<int> classIds;std::vector<float> confidences;std::vector<cv::Rect> boxes;for (int i = 0; i < detectionMat.rows; i++){float confidence = detectionMat.at<float>(i, 2);if (confidence > confThreshold){size_t objectClass = (size_t)(detectionMat.at<float>(i, 1));int left = static_cast<int>(detectionMat.at<float>(i, 3) * cv_src.cols);int top = static_cast<int>(detectionMat.at<float>(i, 4) * cv_src.rows);int right = static_cast<int>(detectionMat.at<float>(i, 5) * cv_src.cols);int bottom = static_cast<int>(detectionMat.at<float>(i, 6) * cv_src.rows);int width = right - left + 1;int height = bottom - top + 1;classIds.push_back(objectClass);boxes.push_back(cv::Rect(left, top, width, height));confidences.push_back(confidence);}}std::vector<int> indices;cv::dnn::NMSBoxes(boxes, confidences, confThreshold, nmsThreshold, indices);std::vector<int> id;for (size_t i = 0; i < indices.size(); ++i){int idx = indices[i];cv::Rect box = boxes[idx];rectangle(cv_dst, filter_ida.at(i).tl(), filter_ida.at(i).br(), cv::Scalar(0, 0, 255), 2, 8, 0);//id.push_back(classIds[idx]);}
}

3.在Xcode里面,把要与C++交互的源码文件.m更改成.mm,定义一个点击事件,然后添加代码:

-(void)idDetectioBtn
{NSString* const model_file_name = @"inference";NSString* const model_file_type = @"caffemodel";NSString* const proto_file_name = @"inference";NSString* const proto_file_type = @"prototxt";NSString* model_path = [[NSBundle mainBundle] pathForResource:model_file_name ofType:model_file_type];NSString* prototxt_path = [[NSBundle mainBundle] pathForResource:proto_file_name ofType:proto_file_type];std::string str_proto = [prototxt_path UTF8String];std::string str_model = [model_path UTF8String];cv::Mat cv_src,cv_dst;UIImageToMat(self.ui_selected_image, cv_src);std::vector<std::string> id_label;idDetection(cv_src, cv_dst, str_model, str_proto, id_label);UIImage *ui_image = MatToUIImage(cv_dst);self.ui_show_view.image = ui_image;
}

4.运行效果


注:
对图像处理有兴趣的可以可以加

身份证识别——iOS端实现身份证检测相关推荐

  1. 【身份证识别】形态学二代身份证号码识别系统【含GUI源码 948期】

    一.代码运行视频(哔哩哔哩) [身份证识别]形态学二代身份证号码识别系统[含GUI源码 948期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] 蔡利梅.MA ...

  2. 【身份证识别】BP神经网络身份证号码识别【含Matlab源码 1344期】

    ⛄一.身份证号码识别简介(附课题作业报告) 1 引言 当今是一个信息高度发达的时代,对于每个公民而言身份证那一连串的数字体现了个人信息的唯一性,出于保障公民合法权益和社会治安的考虑,越来越多的行业都开 ...

  3. 【身份证识别】形态学二代身份证号码识别系统【含GUI Matlab源码 948期】

    ⛄一.身份证号码识别简介 1 引言 作为居民身份的象征,身份证是居民身份的唯一标识,它已成为生活中必不可少的证件.在火车站.酒吧等公共场所,流动人口大人员复杂,警察需要对公民的身份证进行核对,排除可疑 ...

  4. python 身份证识别仪_Card-Ocr:身份证识别 OCR

    Card-Ocr 身份证识别OCR, 从身份证图片中自动提取身份证号. 测试图片来自百度搜索的样例图片. 找到的图片比较少,目前都能正确识别. 可用的数据集个人很难找到. 依赖 opencv pyte ...

  5. 身份证识别web端调用

    webservice 身份证OCR识别即服务器版OCR识别软件,该软件可部署在客户私有服务器中(私有本地服务器或云服务器均可),APP和业务系统可通过webservice接口调用该识别服务,设备端只负 ...

  6. js如何实现扫描身份证识别_js完美实现身份证校验

    注意: 1.只针对18为身份证号码进行校验,现在15位的应该很少了, 2.不区分xX大小写, 3.出生年份1900-2099,每月的天数也进行相关验证(考虑的闰月的情况), 4.校验规则详见,这个写的 ...

  7. js如何实现扫描身份证识别_javascript实现根据身份证号读取相关信息

    公民身份号码由六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码组成. 地址码 前两位表示省,中间两位表示市,后两位表示县 顺序码 表示同一地址码所标识的区域范围内,对同年.月.日出生 ...

  8. js如何实现扫描身份证识别_百度AI身份证识别demo,使用js提交图片数据

    百度AI-身份证识别 var obj ={}; $(document).ready(function() { getBaiduToken(); $("#image").change ...

  9. 身份证识别在移动端和服务器端的应用与特点

    身份证识别可以集成在APP中,也可以集成在服务器中,利用移动端摄像头拍摄或扫描证件并识别信息.完成信息录入. 而在服务器端身份证识别主要是两方面的应用:私有云端的身份证识别与公有云端的身份证识别. 一 ...

最新文章

  1. 中科院博士因论文致谢走红后,回到母校演讲再刷屏!网友:是对寒门学子最好的激励...
  2. 使用 cglib_CGLib 动态代理 原理解析
  3. 补码(为什么按位取反再加一):告诉你一个其实很简单的问题
  4. 文献记录(part12)--Biclustering of human cancer microarray data using co-similarity based co-clustering
  5. how is metadata got - DB table iwfndi_med_srh and IWFNDCL_MGW_REQUEST_MANAG
  6. 20155235 《网络攻防》 实验八 Web基础
  7. 剑指offer之先序非递归打印二叉树
  8. 看张子阳的书真是收获很多,也醒悟了很多(一)
  9. linux安装两个jdk_jdk在linux上安装过程
  10. 21个强大漂亮Ajax/CSS表格设计
  11. linux版udp发包工具,packet sender下载-Packet Sender(UDP/TCP网络测试工具)下载 v7.0.5官方版--pc6下载站...
  12. linux查询文件夹大小
  13. NIOS ii 实战篇 --- 按键控制LED
  14. 初学者学习JS很吃力怎么办?到底该如何学习JS?
  15. Calendar(日历)
  16. 前端js通过图片路径,展示图片
  17. pdf文件太大怎么变小,如何压缩pdf大小
  18. steam 无法连接远程计算机,steam联机连不上 steam联不上网
  19. 梦幻新开服务器维护,梦幻西游12月新开服务器
  20. React Hook的用法: State + Effect(一)

热门文章

  1. 【opencv】5.cv::findContours和cv::drawContours()
  2. Spring事务传播行为详解
  3. spring框架学习(三)junit单元测试
  4. SQL 经典回顾:JOIN 表连接操作不完全指南
  5. JavaScript 内置对象(二):Date 对象(构造函数、属性和方法)
  6. 反向传播神经网络 BPNN
  7. 《大话数据结构》简体中文版勘误
  8. 神经网络 Stanford UFLDL
  9. springBoot ajax 报错 Circular view path [xx: would dispatch...
  10. FTServer 1.1 发布,多语言全文搜索服务器