2018-10-31 22:07:15 weixin_43496525 阅读数 592

offer参考
作者:Amber20181008173077
链接:https://www.nowcoder.com/discuss/135497
来源:牛客网

【公司简介】 精微视达医疗科技(武汉)有限公司(简称精微视达)2014年成立于武汉光谷,专注开发光学活检技术, 聚集了光学、精密机械、电子、通信、医学图像处理等前沿行业的顶尖工程技术人员,毕业院校包括清华大学、华中科技大学、电子科技大学、北京科技大学、南京理工大学、苏州大学等,曾经就职机构包括强生、美敦力、华为、中冶南方、大族激光等世界级跨国企业。 精微视达联合权威医疗机构,在国内率先自主研发了首套针对于早期消化道癌症的光学活检系统,目前已进入注册申报环节。 精微视达已经完成A轮融资,累计融资金额数千万元。同时,精微视达也是国家十三五重点研发计划数字诊疗装备专项牵头单位,项目获得数千万中央财政拨款支持。
【招聘岗位】
(一)图像算法工程师
>>岗位职责<<
1.负责公司产品和在研项目图像处理算法设计、实现、验证及优化; 2.跟踪公司产品和在研项目图像处理算法国内外最新发展方向和相应技术; 3.负责项目中算法相关技术文档撰写。 >>任职要求<< 1.图像处理、模式识别、计算机视觉、人工智能等相关专业,硕士以上学历; 2.熟悉图像滤波、轮廓提取、边缘检测、形态学处理、图像分割、图像拼接、图像融合、去噪等各类图像处理理论; 3.掌握模式识别相关基础理论,掌握各种常用模式识别算法的设计和使用方法,并对其中至少一种有一定的使用和深入研究;掌握特征提取相关方法; 4.掌握C/C++,有良好的编程规范,能熟练运用 C/C++进行代码开发; 5.掌握OpenCV库,能熟练应用OpenCV开发各种图像处理算法; 6.熟练应用visual studio、Matlab开发工具; 7.有两年或以上图像处理算法开发经验; 8.具有良好的沟通表达能力和团队合作意识。
(二) C++开发工程师
>>岗位职责<<
1. 从事医疗器械类软件基础与核心开发,完成相应功能和模块开发; 2. Windows/Linux平台应用软件开发、调试、缺陷跟踪和持续改进; 3. 参与产品/项目需求分析、架构设计及详细设计,按照规范格式撰写开发文档。 >>任职要求<< 1. 本科及以上学历,计算机、软件、自动化、生物医学工程等相关专业,热爱医疗行业; 2. 精通C/C++程序开发,具有2年以上Windows/Linux Native程序开发经验,熟练使用VS/eclipse+CDT 等集成开发环境; 3. 熟练掌握至少一种GUI开发库,如Qt/MFC/GTK等,熟悉基本的设计模式; 4. 有良好的交流沟通能力,团队协作能力,良好的文档撰写能力; 5. 有医疗行业从业经验者优先。
薪酬:为一流的学生提供一流的薪酬;只要足够优秀,薪酬不是问题 福利:五险一金+股票期权+年终奖金+绩效奖金+定期体检+交通补贴+餐饮补贴
简历请投递至邮箱hr@biopsee.cn 邮件标题请注明岗位名称,如:XX简历-图像算法工程师

2017-03-02 17:46:40 yanjiangqiao 阅读数 280

作为一个CV与图像处理方向上的新人,为了能够进入正式科研道路上时不被自己的老板嫌弃,我们必须尽力去自学一系列以后可能用到的技能来武装自己。而在本领域现阶段神经网络,机器学习,深度学习充斥在我们的生活之中,不了解一二真的都不太好意思说自己是这行业内的人了……而python编程语言在这一背景下地位水涨船高。其解释性语言的特性以及广泛开源的优点得到了程序猿们乃至一些大牛们的青睐,随之而来的就是方便好用的各种各样的开源工具了。一个像我这样的小白,随便找本书籍学习一二,就可以用现成的开源工具实现一些有趣的机器学习模型*—*因此希望记录下自己一些学习过程中的经验与体会,希望能够与大家一块学习交流。

首先介绍一下最近折腾的几个灰常实用的工具库:

1、向量,矩阵运算的数据库numpy以及更为强大的SciPy

2、用于数据采集,以及预处理和分析的工具包Pandas

3、用于绘制图形的工具包Matplotlib

4、可以直接用于机器学习与实践的,封装了大量机器学习模型的核心程序库Scikit-learn

……作为一个小白暂时就用到了以上这几个,之后如果还有其他的会继续补充,关于这些工具包的简单实用方法均可以在网络上很容易的获得

通常情况下以上工具包需要我们自己去一个一个下载安装,为了简单起见,推荐直接安装Anaconda平台,该平台已经自动安装并支持上述我们提到的所有工具包

该系列以后每一篇都会提到一个学习过程中遇到的问题及个人找到的解决方法,如果有更好的方法,欢迎大家一起来进行交流学习

(备注:本人学习过程中使用的是python2.7版本进行编程,相信大家接触过python编程语言的都知道python2与3版本间编程规则存在差异且彼此不兼容)

本期问题:当我们使用pandas从网上down下相关数据后想进行保存留一个备份,却发现无法使用通常的文件读写方法进行

上述问题出现的原因是因为pandas会将数据转入其独有的dataframe格式(二维数据表格),该格式的数据无法直接保存在通常的文件中显示的,因此需要使用DataFrame格式的对应方法将其转换为csv文件再导出,对应代码如下

# -*- coding: utf-8 -*-
"""
Created on Thu Mar 02 16:44:44 2017

@author: bridge
"""
#analysis titanic with the Decision Tree

#使用pandas下载数据
import pandas as pd
import csv
titanic=pd.read_csv('http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt')
f=file('titanic.csv','wb')
titanic.to_csv(f,encoding='utf-8',index=False)
titanic.head()
关于pandas.DataFrame的其他简单操作,建议参考博客http://blog.csdn.net/maliang_1993/article/details/50907983

以上内容主要参考了《python机器学习及实践——从零开始通往kaggle竞赛之路》一书,刚刚入手开始学习,个人感觉很赞!~


第一次写此类文章,如果有侵犯了其他人的版权问题请谅解,此文章仅用作学习交流,同时也请大家从自己开始做起,培养起版权意识。




2016-05-20 18:04:02 Tencent_Bugly 阅读数 9142

特约供稿人:腾讯公司天天P图项目 乔伟康、梁小龙


小优有话说:
App Crash就像地雷。
你怕它,想当它不存在。无异于让你的用户去探雷,一旦引爆,用户就没了。
你鼓起勇气去扫雷,它却神龙见首不见尾。
你告诫自己一定开发过程中减少crash,少埋点地雷,但总是不得其法。
降低Crash率,需要的是技巧、工具、耐心与时间。
本文由腾讯天天P图测试团队现身说法,为你讲述他们将Crash率直降90%背后的故事,希望能为你“排雷”提供一些思路。
PS:以后每周四记得关注这里哦!小优将为你精选“干货”,让腾讯的开发&测试大牛们陪你一起为提升产品质量!


天天P图作为图像处理类APP,内部集成了很多功能,包括滤镜、人脸检测、美白、磨皮、美妆、拼图、相机等,而且这些功能多是用底层算法依靠GPU实现,如何保证这些功能在众厂商生产的Android手机上正常高效运行,对于测试来说是一项极具挑战的任务。本文主要针对Android天天P图业务介绍我们在降低Crash率方面所做的工作,当然这里也离不开开发同学们的大力支持。

一、Android天天P图业务介绍

1.Android天天P图功能模块数据及潜在测试挑战

Android天天P图内部共9个大模块,共包含近200个子功能,其中各模块内部子功能数目如下表所示:
这里写图片描述
其中:

1)美化照片的滤镜/马赛克,美容美妆的磨皮/美白/上妆等功能均需要用到Native层的算法库,具有爆发底层SIGSEGV、SEGABRT等算法类crash问题的风险,但此类问题很难在单一手机上通过测试数量有限的图片发现,需要考虑如何在有限的机型及时间的情况下,尽可能的暴露此类问题;

2)自拍相机模块由于需要适配各种定制的Android的平台设备,同样存在兼容性Crash的爆发风险,自拍相机的兼容性问题对测试人员来说是一项很具挑战的任务;

3)Android天天P图作为图像处理类软件,美容美妆/故事拼图等模块对内存的要求较为苛刻,需要预防OOM的风险,测试需要知道如何判断鉴别P图内存使用效率及释放时机是否高效合理;

2.Android天天P图各版本Crash率趋势图

面对如上风险,我们再来看一下Android各版本的Crash率情况
优测
从上表可以看出,产品问世初期的两个版本Crash率较高,但在随后的版本中,在不断增加新功能的同时,Android天天P图的Crash率整体呈下降趋势,由最初版本发布的2.2%降低到目前的0.24%。

(小优注:因数据涉及产品隐私,小优打了马赛克,还请各位看官见谅)

二、问题分析与解决策略制定

1.问题分析

1)存量问题分析

Android天天P图接入了RDM(小优注:腾讯内部研发管理工具)异常上报和Bugly异常上报用于观察外网用户遇到的Crash问题,这里先看下版本发布初期上报的主要问题:

下图为V2.0版本上报的TOP10 Crash问题
这里写图片描述
从上图可以可到,Crash主要分如下几类:

–lRuntimeException

–lSIGSEGV/SIGBUS

–lNullPointerException(NPE)

其中RuntimeException需要具体问题具体分析,SIGSEGV/SIGBUS类的问题属于底层算法类问题,NullPointer类的问题为代码保护不规范类问题。

2)新增问题预防

为了降低Crash率,不只是要解决存量遗留的问题,同时需要关注新增问题的预防,保证无突出严重的新增Crash问题。

2.策略制定

1)分层测试

天天P图内部的很多功能使用底层算法库,如人脸识别、五官定位、彩妆上妆等。鉴于图片和环境的多样性,以及在上层无法验证部分异常场景,测试团队将APP Java层和Native层代码分开测试的策略。
这里写图片描述
针对算法层的测试使得测试更具针对性,覆盖的场景更多,同时使用自动化测试工具也使得在图片多样性覆盖上的测试效率更高。下图为部分P图SDK测试图片集。
这里写图片描述
2)存量问题解决

天天P图测试团队持续关注每个版本外发后的异常上报,筛选出其中较严重的10-20个Crash问题,分析提单跟进,在下一版本中进行解决,截止当前版本,测试配合开发共修复超过100个Crash问题,有效保证了Crash率的降低。

以下数据为V3.3版本外发后Crash的分布分析,在V3.4版本针对性解决部分Crash问题后,Crash率降低了1个千分点。
这里写图片描述
从统计数据上看,主要的Crash问题集中在自拍相机模块,测试调整NewMonkey运行参数,针对自拍相机进行集中测试,

3)新增问题预防

由上面的分析,我们确定主要的Crash集中在底层算法、NullPointer和其他Java层异常导致,如何在版本测试初期尽快发现这类问题,我们主要采用Crash问题分析总结反馈补充测试用例、引入改造现有工具等方式完成,具体可参考第三部分;

4)Crash问题分析总结补充测试场景

每一个版本外发后,天天P图测试团队会总结分析前一版本系统测试中及bugly异常上报发现的Crash问题,归类发生场景,分析诱因,最后反补到测试用例中,截止目前,共补充测试用例34条,总结文档11篇。
这里写图片描述

三、解决方案实施

接入和改造的工具发现Crash问题数目一览表
这里写图片描述

1.NewMonkey接入改造:让严重Crash无处藏身

1)引入背景

终端产品需要迭代快,而外发前一个阻碍发布的问题是发现严重的Crash问题,在这个时间修改Bug一是可能会引入其他问题,同时也极有可能导致外发延期,测试团队需要考虑如何避免这种问题,保证产品按时高效发布。

2)NewMonkey接入改造

NewMonkey是社交网络质量部测试开发团队以Android Monkey为基础,订制的一个更高效的自动化稳定性测试工具,相较于Monkey,NewMonkey的测试更具有平均性,能够覆盖APP内更多的Activity。NewMonkey运行于测试开发团队维护的NewMonkey Wall上,接入后测试手机会每天定时拉取最新RDM安装包进行测试,这样能够保证今早发现版本中存在的严重Crash问题。

但鉴于天天P图APP内操作的特殊性,天天P图测试团队针对NewMonkey的操作封装了更多适用于天天P图的测试操作,如:涂抹屏幕、滑动滑竿等,同时结合天天P图业务模块使用的分布,通过配置文件修改测试Blacklist文件使得定制后的NewMonkey运行更高效,如下是改造前后NewMonkey发现Crash问题的相关数据:
这里写图片描述
截止目前,本地运行的NewMonkey共在天天P图项目中发现148个Crash问题,有效的保证了外发版本质量。

(小优注:NewMonkey系腾讯内部研发的测试工具,据小优所知暂不支持接入外部app,但需要相关工具介绍文档的童鞋们可以在公众账号留言哦。

插播广告一则:有需求的童鞋可以试试优测的自动化测试,实现原理一致,效果更优哦 [手动骄傲脸])

2.Coverity/CodeDog为代码保驾护航

1)引入背景

正如第二部分问题分析中介绍的V2.0版本外发后的存量问题分析,版本中存在的Crash类问题有一部分为NullPointerException,根据统计数据,Android天天P图各个版本测试中发现的NullPointerException问题大部分都在10个以上,而NPE的问题可以通过代码静态扫描进行预防。

2)Coverity/CodeDog接入与自动提单实现

代码扫描工具很多,天天P图测试团队采用CodeDog和Coverity进行空指针检查。CodeDog是社交网络质量部开发的一款集成工具,工具内部集成了findBugs,Coverity等工具,目前天天P图接入的CodeDog服务包含findBugs、安装包大小检查等,但鉴于资源限制,不包含Coverity,测试团队单独使用了MIG的Coverity进行扫描,由于MIG的Coverity不支持自动提单,测试团队在前人提供的基础提单脚本上进行了优化去重,配合findBugs发现空指针问题。

Coverity共发现96个NPE问题,各个版本发现的空指针数据如下:
这里写图片描述

CodeDog共发现163个NPE问题,各个版本发现的问题数据如下:
这里写图片描述

从数据上看,两个工具各有互补,但观察具体的提单可以发现,两个工具之间有一定交集,即提有重复Bug单,但也存在彼此都未发现的Bug。测试团队对自动提单工具进行了一定优化,减少了重复提单问题。

(小优注:同上,CodeDog系腾讯内部研发的测试工具,需要相关工具介绍文档的童鞋们可以在公众号中留言哦。)

3.LeakCanary 内存泄露检测利器

1)引入背景

天天P图作为图像类处理APP,对内存使用要求很苛刻,大量的图片资源加载导致即便微小的内存泄露也有引发OOM的风险,从异常上报看,版本发布初期OOM问题比较突出。

2)LeakCanary接入

LeakCanary是Square开源发布的一款内存泄露检测工具,接入简单,使用方便,在功能测试中便可以发现APP内隐藏的部分内存泄露问题,开发人员在V2.6版本接入了LeakCanary,目前Canary共发现了27个内存泄露问题。

接入LeakCanary后,Android天天P图的OOM问题呈逐步减少状态,相关数据如下:
这里写图片描述

LeakCanary问题报告详情:
这里写图片描述

4.腾讯优测云测试平台 发现机型兼容性问题

1)引入背景

Android平台测试最复杂的便是机型兼容性测试,Android天天P图外发后有时候会遇到个别机型频繁上报Crash,由于本地机型限制,及考虑到测试周期,测试团队需要一个自动化的机型兼容性测试平台/团队来解决这类Crash问题;

2)引入腾讯优测

腾讯优测是(utest.qq.com)一个自动化测试平台,MIG的产品,主要工作原理是维护大量测试机,进行自动化测试。利用优测的自动化测试Android天天P图共发现64个Crash异常问题,版本外发前进行一次测试,可基本保证外发无严重漏测Crash问题。

除了用线上的免费测试功能,去年开始Android天天P图开始使用优测的vip测试服务,每个版本做top50机型的核心遍历测试和一些专项测试

3)优测云手机

优测线上有一个云手机功能,可以远程操控真机(不是模拟器),用户反馈哪个机型有bug,手里又没有对应机型的话,可以在优测直接在线复现,大部分热门机型都有,对测试同学来说挺实用。
这里写图片描述

5.Crash问题分析-测试场景补充

借助工具和功能测试发现的Crash问题只是第一步,我们需要从发现的Crash问题中寻找共性及复现场景,进而补充到功能测试用例中,避免此类问题再度发生。

Android天天P图经过近几个版本Crash分析积累,共补充测试用例34条,总结相关文档11篇。

1)举例1-Activity与Animation使用注意事项

问题描述:

天天P图分享界面有一个保存动画,如果在动画未完成时返回主界面,天天P图发生闪退;

问题分析:

为验证Activity的生命周期是否影响Animation的播放,在这里做了一个Demo,Demo里包含两个Activity: Main Activity与Animation Activity。其中Animation Activity由Main Activity呼起,在Animation Activity中点击Button播放动画,通过log形式输出各个阶段的时间戳。部分代码如下:
这里写图片描述
测试步骤如下:

1)在Main Activity中启动Animation Activity;

2)在Animation Activity中点击Button启动动画;

3)在动画播放期间点击返回按钮返回至Main Activity;

测试结果:

15:47:32.863: V/com.tencent.test(21258):Animation Start

15:47:40.822:V/com.tencent.test(21258):Animation Activity Destroyed.

15:48:02.858:V/com.tencent.test(21258):Animation End

程序代码中设置动画时间为30s,从log可看出实际Animation start与Animation End时间间隔为30s。

测试用例补充:

在动画未完成的时候,返回上一级或进入下一级

2)举例2-Activity数据状态恢复

问题描述:

在使用P图美化完自己的照片后进入分享页面,此时可供用户选择的有如下三种操作

1)一直点返回键直至退出程序;

2)点击右上角按钮回到主页面使用其他功能;

3)使用Home键将进程切换到后台;

问题发生在使用第三种操作,在切换到后台很长一段时间后,再次启动桌面APP时,Android会呈现APP上次退出的Activity界面,也即分享界面,此时,若点击左上角返回按钮,P图并没有返回上一个Activity,而是发生了crash。

问题分析:

首先对比操作1和操作3,两者的不同之处在于操作1是直接退出APP,而操作3是先将APP置于后台一段时间后再尝试退出。所以问题的关键在于APP在被置于后台时,Android对我们的APP做了什么。

Android为提升用户体验,系统通过ActivityManager为每一个APP都维护了一个Activity栈,APP第一次被启动时,Main Activity被压入栈(如P图的主界面),当用户点击使用魔法抠图功能时,图库预览Activity被压入栈,此时若使用返回键,栈顶部的Activity将被弹出并销毁,返回主界面Activity,如下图。在本案例中,我们是在点击返回按钮回到上一层Activity时Crash的,所以首先怀疑的是在构建上一层Activity时失败。这里写图片描述

从Activity生命周期以及其基本状态图可知,当APP被切换到后台时,Activity变为Stopped状态,但当用户在后续操作中启动多个占内存较多的APP时,P图会被系统默默杀掉,流程图如下。
这里写图片描述
这里需要注意的是,Android在后台杀死进程和调用任务管理器杀死进程有很大不同:

l调用任务管理器杀死进程:系统中有关APP上次启动的全部状态被清除,包括Activity栈信息,再次启动APP时进入APP主Activity;

l系统在后台杀死进程:Android首先调用onSaveInstanceState()保存Activity的一些状态信息,再次启动APP时返回到上次切换APP前的Activity;

进程在后台被杀死的场景可以通过使用DDMS中的stop按钮模拟。当使用P图美化完照片进入分享界面后,使用Home切换APP至后台,启动DDMS,选中P图进程使用stop按钮,此时由ActivityManager维护的该APP的Activity栈信息将被全部清空。在此时,若使用返回键,Android将重新调用前一Activity的onCreate()创建该Activity,但在这里必须传递给该函数一个Bundle信息,用来恢复Activity显示内容。而开发在此处未使用Bundle信息来恢复前一Activity,这在大多数情况下都是可以正常工作的,因为多数情况下该Activity可以在栈中被找到,尤其是在内存较大的手机,但当Activity栈被清空时,问题便显现出来。所以问题的根源最终被定位为Activity的onCreate()函数实现。

测试用例补充:

在用户可能直接切换至后台的场景,使用DDMS或Android Studio里的模拟系统杀死进程工具杀掉进程,再次启动APP后使用返回键等操作。

1)举例3-IndexOutOfBounds类问题分析

问题描述:

在使用动效拍最后一个滤镜后,点击切换模式选择,发生闪退。

问题分析:

回想Crash发生时的具体场景,Crash多发生在选择一个滤镜后,再点击模式切换按钮。再参考堆栈信息头部的相关信息,Crash的主要诱因在于索引position位置在39的元素时出错,从这里可以得到一个重要信息:一个包含至少三十个元素的ViewHolder在进行索引时出错,再查看自拍相机里所有的子功能,只有滤镜选择功能模块的元素有42个,因此,将定位范围缩小到滤镜选择子功能。

结合初步缩小的定位范围,查看本版本与之相关的新需求,与之相关的只有在模式切换时需要隐藏滤镜子模块中的两个子Icon,到这里很自然的会想到,由于隐藏两个子Icon导致Index索引发生变更,导致末尾的两个Index失效,这里剩下的就是验证了。

由第一部分得出的推断,是当切换到动效拍模式后,滤镜模块中的子Icon隐藏后会引发Crash,因此,首先我们会选择滤镜模块中位于第39位的滤镜素材,然后切换动效拍模式。为了触发滤镜的索引,需要再次点击模式切换按钮(使用滤镜),此时APP发生Crash,log日志与上报一致,问题得以重现。

测试用例补充:

当ViewHolder内部数据数目发生变化时,应该关注Index更新的问题,针对边界值素材及相关功能进行测试;

三、总结与规划

一切测试工作的开展源于对服务业务的理解,以及对当前业务痛点的把握,分析问题,制定方案,通过接入或开发改造工具帮我们提高效率,解决问题。问题的解决并不是最终的目的,我们需要从问题的解决归纳总结出测试的疏漏点,指导我们继续下一次的测试工作开展。(写得太好了,小优忍不住点个赞!)

Android天天P图业务之后的稳定性测试工作开展依然会立于当前业务痛点,通过解决留存问题,接入和改造成熟的测试工具来预防新问题,不断提高产品质量。

更多精彩内容欢迎关注腾讯优测的微信公众账号:
这里写图片描述

2019-10-16 16:12:50 alice_tl 阅读数 1639

人脸识别产品已广泛应用于金融、司法、军队、公安、边检、政府、航天、电力、工厂、教育、医疗及众多企事业单位等领域。业内针对人脸识别服务提供的科技公司非常多,简单列举下集中几家知名科技公司。

 

商汤科技

  • 核心业务:智慧金融、智慧商业、智慧安防、互联网+
  • 技术特点:人脸技术、智能监控、图像识别、文字识别、图像及视频编辑、深度学习框架
  • 官网:https://www.sensetime.com/

 

旷视科技

  • 核心业务:FaceID 在线身份验证服务、Face++ 人工智能开放平台、智能地产解决方案、智能安防解决方案
  • 技术特点:动态人脸识别、在线/离线活体检测、超大人像库实时检索、证件识别、行人检测、轨迹分析
  • 官网:https://megvii.com/

 

广州云从科技

  • 核心业务:快速部署平台、智能硬件、智能系统
  • 技术特点:人脸信息检测、特征提取融合、质量属性分析、人脸相似度比对、特征相似度对比、ocr识别成功案例:中国农业银行、乐视车联、广东省公安厅、广电运通、西北星、御银股份、北京西站、黑龙江垦区、山东城商行联盟等
  • 官网:http://www.cloudwalk.cn/

上海依图科技

  • 核心业务:智能安防平台、城市数据大脑、智慧医疗健康、智能硬件设备
  • 技术特点:计算机视觉、自然语言理解、知识推理、智能硬件、机器人技术
  • 官网:http://www.yitutech.com/

 

百度

  • 核心业务:使用场景:人脸识别闸机、公益平台、智慧药房。
  • 官网:https://www.baidu.com/

 

阿里

  • 核心业务:深度学习、海量人脸标注数据,提供稳定、可靠的大流量服务
  • 使用场景:
  • 官网:http://www.alibaba.com/

 

腾讯

  • 核心业务:人像比对、政务、快递、证券
  • 官网:http://www.qq.com/

 

合肥科大讯飞

  • 核心业务:语音引擎、教育产品、手机应用、互动音乐
  • 技术特点:语音识别及合成技术、自然语言处理技术、语音评测技术、声纹识别技术、手写识别技术
  • 官网:http://www.iflytek.com/

 

  • 格灵深瞳

  • 发布面向公安,交通行业的深瞳人眼摄像机FOVEACAM,可以在远距离内识别人脸。
  • 官网:http://www.deepglint.com/

 

中科奥森

  • DeepEyes 双目深度学习人脸识别防伪技术。
  • 官网:http://www.authenmetric.com/

1

2017-04-06 17:04:13 Dream__TT 阅读数 3437
OpenCV中KMeans算法介绍与应用              
OpenCV学堂

CVSCHOOL

OpenCV学习教程分享、源码讨论、图像处理与计算视觉算法介绍,行业知识介绍,行业大牛经验分析,人才交流,学习交流。是学习图像处理、计算视觉的最好园地。我们都爱OpenCV

一:KMeans算法介绍

KMeans算法MacQueen在1967年提出的,是最简单与最常见数据分类方法之一并且最为一种常见数据分析技术在机器学习、数据挖掘、模式识别、图像分析等领域都用应用。如果从分类角度看KMeans属于硬分类即需要人为指定分类数目,而MeanSift分类方法则可以根据收敛条件自动决定分类数目。从学习方法上来说KMeans属于非监督学习方法即整个学习过程中不需要人为干预的学习方法,自动完成整个数据集合分类。对于给定的数据集合DS (Data Set)与输入的分类数目K,KMeans的整个工作原理可以描述如下:

  1. 根据输入的分类数目K定义K个分类,每个分类选择一个中心点

  2. 对DS中每个数据点做如下操作

    • 计算它与K个中心点之间的距离

    • 把数据点指定属于K个中心点中距离最近的中心点所属的分类

  3. 对K个分类中每个数据点计算平均值得到新的K个中心点

  4. 比较新K个中心点之间与第一步中已经存在的K个中心差值

    • 当两者之间的差值没有变化或者小于指定阈值,结束分类

    • 当两者之间的差值或者条件不满足时候,用新计算的中心点值做为K个分类的新中心点,继续执行2~4步。直到条件满足退出。

从数学的角度来说KMeans就是要找到K个分类而且他们的中心点到各个分类中各个数据的之间差值平方和最小化,而实现这个过程就是要通过上述2~4步不断的迭代执行,直到收敛为止。公式表示如下:

以上是KMeans算法的基本思想,想要实现或者应用该算法有三个注意点值得关注

  1. 初始的K个分类中每个分类的中心点选择,多数的算法实现都是支持随机选择与人工指定两种方式,OpenCV中的KMeans实现同样支持者两种方式。

  2. 多维数据支持,多数时候我们要分类的特征对象的描述数据不止一个数据特征,而是一个特征向量来表示,OpenCV中通过Mat对象构建实现对多维数据KMeans分类支持。

  3. 收敛条件 - 一般情况下在达到指定的迭代次数或者两次RSS差值小于给定阈值的情况下,结束执行分类处理,输出最终分类结果。

下图是一个例子,黑色的点代表数据点,十字表示中心点位置,初始输入的分类数目K=2时,KMeans各步执行结果:

二:OpenCV中KMeans相关函数说明

KMeans是OpenCV核心模块的一个API函数

各个参数的详细解释如下:

参数名称 解释
data 表示输入的数据集合,可以一维或者多维数据,类型是Mat类型,比如Mat points(count, 2, CV_32F)表示数据集合是二维,浮点数数据集
K 表示分类的数目,最常见的是K=2表示二分类
bestLabels 表示计算之后各个数据点的最终的分类索引,是一个INT类型的Mat对象
criteria 表示算法终止的条件,达到最大循环数目或者指定的精度阈值算法就停止继续分类迭代计算
attempts 表示为了获得最佳的分类效果,算法要不同的初始分类尝试次数
flags 表示表示选择初始中心点选择方法用哪一种KMEANSRANDOMCENTERS 表示随机选择中心点。KMEANSPPCENTERS 基于中心化算法选择。KMEANSUSEINITIAL_LABELS第一次分类中心点用输入的中心点
centers 表示输出的每个分类的中心点数据

三:应用案例-利用KMeans实现图像分割

KMeans在图像处理中经典应用场景就是根据用户输入的分类数目实现图像自动区域分割,本例就是基于OpenCV KMeans函数实现图像的自动分割, 对彩色图像来说,每个像素点都有RGB三个分量,整个图像可以看成是一个3维数据集合,只要把这个三维数据集作为输入参数传给KMeans函数即可,算法执行完毕之后,根据分类标记的索引设置不同的颜色即可。所以演示程序的实现步骤如下:

  1. 将输入图像转换为数据集合

  2. 使用KMeans算法对数据实现分类

  3. 根据每个数据点的分类索引,对图像重新填充颜色,显示分割后图像


运行效果如下:

完整的代码实现如下:

  1. #include <opencv2/opencv.hpp>

  2. #include <iostream>

  3. using namespace cv;

  4. using namespace std;

  5. int main(int argc, char** argv) {

  6.    Mat src = imread("D:/vcprojects/images/toux.jpg");

  7.    imshow("input", src);

  8.    int width = src.cols;

  9.    int height = src.rows;

  10.    int dims = src.channels();

  11.    // 初始化定义

  12.    int sampleCount = width*height;

  13.    int clusterCount = 4;

  14.    Mat points(sampleCount, dims, CV_32F, Scalar(10));

  15.    Mat labels;

  16.    Mat centers(clusterCount, 1, points.type());

  17.    // 图像RGB到数据集转换

  18.    int index = 0;

  19.    for (int row = 0; row < height; row++) {

  20.        for (int col = 0; col < width; col++) {

  21.            index = row*width + col;

  22.            Vec3b rgb = src.at<Vec3b>(row, col);

  23.            points.at<float>(index, 0) = static_cast<int>(rgb[0]);

  24.            points.at<float>(index, 1) = static_cast<int>(rgb[1]);

  25.            points.at<float>(index, 2) = static_cast<int>(rgb[2]);

  26.        }

  27.    }

  28.    // 运行K-Means数据分类

  29.    TermCriteria criteria = TermCriteria(CV_TERMCRIT_EPS + CV_TERMCRIT_ITER, 10, 1.0);

  30.    kmeans(points, clusterCount, labels, criteria, 3, KMEANS_PP_CENTERS, centers);

  31.    // 显示图像分割结果

  32.    Mat result = Mat::zeros(src.size(), CV_8UC3);

  33.    for (int row = 0; row < height; row++) {

  34.        for (int col = 0; col < width; col++) {

  35.            index = row*width + col;

  36.            int label = labels.at<int>(index, 0);

  37.            if (label == 1) {

  38.                result.at<Vec3b>(row, col)[0] = 255;

  39.                result.at<Vec3b>(row, col)[1] = 0;

  40.                result.at<Vec3b>(row, col)[2] = 0;

  41.            }

  42.            else if (label == 2) {

  43.                result.at<Vec3b>(row, col)[0] = 0;

  44.                result.at<Vec3b>(row, col)[1] = 255;

  45.                result.at<Vec3b>(row, col)[2] = 0;

  46.            }

  47.            else if (label == 3) {

  48.                result.at<Vec3b>(row, col)[0] = 0;

  49.                result.at<Vec3b>(row, col)[1] = 0;

  50.                result.at<Vec3b>(row, col)[2] = 255;

  51.            }

  52.            else if (label == 0) {

  53.                result.at<Vec3b>(row, col)[0] = 0;

  54.                result.at<Vec3b>(row, col)[1] = 255;

  55.                result.at<Vec3b>(row, col)[2] = 255;

  56.            }

  57.        }

  58.    }

  59.    imshow("kmeans-demo", result);

  60.    //imwrite("D:/vcprojects/images/cvtest.png", result);

  61.    waitKey(0);

  62.    return 0;

  63. }

IT的一些常识

阅读数 2

没有更多推荐了,返回首页