-
DeepID人脸识别算法之三代
2014-12-23 00:09:48DeepID人脸识别算法之三代 DeepID,目前最强人脸识别算法,已经三代。 如今,深度学习方兴未艾,大数据风起云涌,各个领域都在处于使用深度学习进行强突破的阶段,人脸识别也不例外,香港中文大学的团队使用卷积神经...DeepID人脸识别算法之三代
转载请注明:http://blog.csdn.net/stdcoutzyx/article/details/42091205
DeepID,目前最强人脸识别算法,已经三代。
如今,深度学习方兴未艾,大数据风起云涌,各个领域都在处于使用深度学习进行强突破的阶段,人脸识别也不例外,香港中文大学的团队使用卷积神经网络学习特征,将之用于人脸识别的子领域人脸验证方面,取得了不错的效果。虽然是今年7月份才出的成果,但连发三箭,皆中靶心,使用的卷积神经网络已经改进了三次,破竹之势节节高。故而在这里将DeepID神经网络的三代进化史总结一下,以期相互讨论,互有增益。
在说明具体的结论之前,我先进行总结式的几段文字,然后再做详细的技术说明,以防有些过来寻求科普的人看到一坨坨的公式便拂袖远去,没看到什么干货。
1. 问题引入及算法流程
DeepID所应用的领域是人脸识别的子领域——人脸验证,就是判断两张图片是不是同一个人。人脸验证问题很容易就可以转成人脸识别问题,人脸识别就是多次人脸验证。DeepID达到的效果都是在LFW数据集上,该数据集是wild人脸数据集,即没有经过对其的人脸,背景变化比较大。该数据集太小,很多identities都只有一张人脸,5000个人只有13000张图片。所以DeepID引入了外部数据集CelebFaces和CelebFaces+,每次模型更新都会使用更大的数据集,这在后面介绍DeepID时再细说。
卷积神经网络在DeepID中的作用是是学习特征,即将图片输入进去,学习到一个160维的向量。然后再这个160维向量上,套用各种现成的分类器,即可得到结果。DeepID之所以有效,首先在于卷积神经网络学习到的特征的区分能力比较强,为了得到比较强的结果,DeepID采取了目前最常用的手法——增大数据集,只有大的数据集才能使得卷积神经网络训练的更加的充分。增大数据集有两种手法,第一种手法,就是采集好的数据,即CelebFaces数据集的引入。第二种手法,就是将图片多尺度多通道多区域的切分,分别进行训练,再把得到的向量连接起来,得到最后的向量。DeepID的算法流程如下:
在上述的流程中,DeepID可以换为Hog,LBP等传统特征提取算法。Classifier可以是SVM,Joint Bayes,LR,NN等任意的machine learning分类算法。
在引入外部数据集的情况下,训练流程是这样的。首先,外部数据集4:1进行切分,4那份用来训练DeepID,1那份作为训练DeepID的验证集;然后,1那份用来训练Classifier。这样划分的原因在于两层模型不能使用同一种数据进行训练,容易产生过拟合。
如此,想必大家对DeepID的应用场景已经熟悉了,下面开始讲三代DeepID的进化。
2. DeepID
在这里,我假定大家对卷积神经网络已经有了基本的认识,如果没有的话,出门左转看我这篇blog:卷积神经网络http://blog.csdn.net/stdcoutzyx/article/details/41596663。
2.1 DeepID网络结构
DeepID是第一代,其结构与普通的卷积神经网络差不多。结构图如下:
该结构与普通的卷积神经网络的结构相似,但是在隐含层,也就是倒数第二层,与Convolutional layer 4和Max-pooling layer3相连,鉴于卷积神经网络层数越高视野域越大的特性,这样的连接方式可以既考虑局部的特征,又考虑全局的特征。
2.2 DeepID实验设置
实验中,人脸图片的预处理方式,也就是切分方式的样例如下:
在DeepID的实验过程中,使用的外部数据集为CelebFaces+,有10177人,202599张图片;8700人训练DeepID,1477人训练Joint Bayesian分类器。切分的patch(也就是上图这样的数据)数目为100,使用了五种不同的scale。每张图片最后形成的向量长度为32000,使用PCA降维到150。如此,达到97.20的效果。使用某种Transfer Learning的算法后,达到97.45%的最终效果。
2.3 实验结论
- 使用multi-scale patches的convnet比只使用一个只有整张人脸的patch的效果要好。
- DeepID自身的分类错误率在40%到60%之间震荡,虽然较高,但DeepID是用来学特征的,并不需要要关注自身分类错误率。
- 使用DeepID神经网络的最后一层softmax层作为特征表示,效果很差。
- 随着DeepID的训练集人数的增长,DeepID本身的分类正确率和LFW的验证正确率都在增加。
这就是DeepID第一代。
3 DeepID2
DeepID2相对于DeepID有了较大的提高。其主要原因在于在DeepID的基础上添加了验证信号。具体来说,原本的卷积神经网络最后一层softmax使用的是Logistic Regression作为最终的目标函数,也就是识别信号;但在DeepID2中,目标函数上添加了验证信号,两个信号使用加权的方式进行了组合。
3.1 两种信号及训练过程
识别信号公式如下:
验证信号公式如下:
由于验证信号的计算需要两个样本,所以整个卷积神经网络的训练过程也就发生了变化,之前是将全部数据切分为小的batch来进行训练。现在则是每次迭代时随机抽取两个样本,然后进行训练。训练过程如下:
在训练过程中,lambda是验证信号的加权参数。M参数时动态调整的,调整策略是使最近的训练样本上的验证错误率最低。
3.2 实验设置
首先使用SDM算法对每张人脸检测出21个landmarks,然后根据这些landmarks,再加上位置、尺度、通道、水平翻转等因素,每张人脸形成了400张patch,使用200个CNN对其进行训练,水平翻转形成的patch跟原始图片放在一起进行训练。这样,就形成了400×160维的向量。
这样形成的特征维数太高,所以要进行特征选择,不同于之前的DeepID直接采用PCA的方式,DeepID2先对patch进行选取,使用前向-后向贪心算法选取了25个最有效的patch,这样就只有25×160维向量,然后使用PCA进行降维,降维后为180维,然后再输入到联合贝叶斯模型中进行分类。
DeepID2使用的外部数据集仍然是CelebFaces+,但先把CelebFaces+进行了切分,切分成了CelebFaces+A(8192个人)和CelebFaces+B(1985个人)。首先,训练DeepID2,CelebFaces+A做训练集,此时CelebFaces+B做验证集;其次,CelebFaces+B切分为1485人和500人两个部分,进行特征选择,选择25个patch。最后在CelebFaces+B整个数据集上训练联合贝叶斯模型,然后在LFW上进行测试。在上一段描述的基础上,进行了组合模型的加强,即在选取特征时进行了七次。第一次选效果最好的25个patch,第二次从剩余的patch中再选25个,以此类推。然后将七个联合贝叶斯模型使用SVM进行融合。最终达到了99.15%的结果。
其中,选取的25个patch如下:
3.3 实验结论
- 对lambda进行调整,也即对识别信号和验证信号进行平衡,发现lambda在0.05的时候最好。使用LDA中计算类间方差和类内方差的方法进行计算。得到的结果如下:
可以发现,在lambda=0.05的时候,类间方差几乎不变,类内方差下降了很多。这样就保证了类间区分性,而减少了类内区分性。如果lambda为无穷大,即只有验证信号时,类间方差和类内方差都变得很小,不利于最后的分类。
- DeepID的训练集人数越多,最后的验证率越高。
- 对不同的验证信号,包括L1,L2,cosin等分别进行了实验,发现L2 Norm最好。
4 DeepID2+
DeepID2+有如下贡献,第一点是继续更改了网络结构;第二点是对卷积神经网络进行了大量的分析,发现了几大特征,包括:+ 神经单元的适度稀疏性,该性质甚至可以保证即便经过二值化后,仍然可以达到较好的识别效果;+ 高层的神经单元对人比较敏感,即对同一个人的头像来说,总有一些单元处于一直激活或者一直抑制的状态;+ DeepID2+的输出对遮挡非常鲁棒。
4.1 网络结构变化
相比于DeepID2,DeepID2+做了如下三点修改:
- DeepID层从160维提高到512维。
- 训练集将CelebFaces+和WDRef数据集进行了融合,共有12000人,290000张图片。
- 将DeepID层不仅和第四层和第三层的max-pooling层连接,还连接了第一层和第二层的max-pooling层。
最后的DeepID2+的网络结构如下:
上图中,ve表示监督信号(即验证信号和识别信号的加权和)。FC-n表示第几层的max-pooling。
4.2 实验设置
训练数据共有12000人,290000张图像。其中2000人用于在训练DeepID2+时做验证集,以及训练联合贝叶斯模型。
4.3 实验结论
分别使用FC-n进行实验,比较的算法包括DeepID2+、只有从FC-4反向传播下来进行训练的模型、使用少量数据的、使用小的特征向量的模型。结果如下:
DeepID2选取了25个patch,DeepID2+选取了同样的25个patch,然后抽取的特征分别训练联合贝叶斯模型,得到的结果是DeepID2+平均比DeepID2提高2%。
4.4 适度稀疏与二值化
DeepID2+有一个性质,即对每个人,最后的DeepID层都大概有半数的单元是激活的,半数的单元是抑制的。而不同的人,激活或抑制的单元是不同的。基于此性质。使用阈值对最后输出的512维向量进行了二值化处理,发现效果降低有限。
二值化后会有好处,即通过计算汉明距离就可以进行检索了。然后精度保证的情况下,可以使人脸检索变得速度更快,更接近实用场景。
4.5 特征区分性
存在某个神经单元,只使用普通的阈值法,就能针对某个人得到97%的正确率。不同的神经单元针对不同的人或不同的种族或不同的年龄都有很强的区分性。在这里,对每个单元的激活程度进行由高到低排序,可以得到下图所示:
上图只是其中一张图示,还有针对种族、年龄等的激活分析。此处不赘述。
但值得说的是,这种分析方法对我们很有启发。卷积神经网络的输出的含义是什么,很难解释,通过这种方法,或许可以得到一些结论。
4.6 遮挡鲁棒性
在训练数据中没有遮挡数据的情况下,DeepID2+自动就对遮挡有了很好的鲁棒性。有两种方式对人脸进行多种尺度的遮挡,第一种是从下往上进行遮挡,从10%-70%。第二种是不同大小的黑块随机放,黑块的大小从10×10到70×70。
结论是遮挡在20%以内,块大小在30×#30以下,DeepID2+的输出的向量的验证正确率几乎不变。
5 总结
至此,DeepID的三代进化史就讲完了。简单的说一下我的感受。
首先是卷积神经网络的作用,虽说之前听说过卷积神经网络既可以分类,也可以学习特征,但ImageNet上的卷积神经网络都是分类的,这次终于见到不关注分类错误率而关注特征的卷积神经网络。
其次,卷积神经网络的改进方式,无非如下几种:增大网络深度和宽度,增加数据,将网络隐含层连接到前面几层来,添加其他的信号。
再次,也是最重要的,就是DeepID在发展过程中对输出向量的分析,尤其是DeepID2+,神经网络的各个单元一直是无法解释的,但这次作者不仅试图去发现规律,还基于规律做出了一些改动,比如二值化。
最后,卷积神经网络的鲁棒性真的很厉害。
6 参考文献
- [1] Sun Y, Wang X, Tang X. Deep learning face representation from predicting 10,000 classes[C]//Computer Vision and Pattern Recognition (CVPR), 2014 IEEE Conference on. IEEE, 2014: 1891-1898.
- [2] Sun Y, Chen Y, Wang X, et al. Deep learning face representation by joint identification-verification[C]//Advances in Neural Information Processing Systems. 2014: 1988-1996.
- [3] Sun Y, Wang X, Tang X. Deeply learned face representations are sparse, selective, and robust[J]. arXiv preprint arXiv:1412.1265, 2014.
更多内容欢迎关注微信公众号【雨石记】。
-
Linux根据进程名查看进程id,以及根据进程id查看占用的端口,根据端口号查看占用的进程
2018-08-23 15:27:551. 先根据进程名查看进程id ps aux | grep 进程名(或者ps -ef | grep 进程名) y@ubuntu:~$ ps aux | grep bitcoind y 2708 101 12.1 1611172 488580 ? Ssl Aug22 32:04 bitcoind -daemon -connect=172.16.247.139 ...- 先根据进程名查看进程id
ps aux | grep 进程名(或者ps -ef | grep 进程名)
y@ubuntu:~$ ps aux | grep bitcoind y 2708 101 12.1 1611172 488580 ? Ssl Aug22 32:04 bitcoind -daemon -connect=172.16.247.139 y 3564 0.0 0.0 21536 1092 pts/0 S+ 00:23 0:00 grep --color=auto bitcoind
可以看到,bitcoind进程的pid是2708
2.通过进程id查看占用的端口
netstat -nap | grep 进程id
y@ubuntu:~$ netstat -nap | grep 2708 (Not all processes could be identified, non-owned process info will not be shown, you would have to be root to see it all.) tcp 0 0 127.0.0.1:8332 0.0.0.0:* LISTEN 2708/bitcoind tcp6 0 0 ::1:8332 :::* LISTEN 2708/bitcoind
可以看到,pid=2708的进程占用的端口号是8332
3.通过端口号查看占用的进程id
netstat -nap | grep 端口号
y@ubuntu:~$ netstat -nap | grep 8332 (Not all processes could be identified, non-owned process info will not be shown, you would have to be root to see it all.) tcp 0 0 127.0.0.1:8332 0.0.0.0:* LISTEN 2708/bitcoind tcp6 0 0 ::1:8332 :::* LISTEN 2708/bitcoind
可以看到,占用8332端口的是进程的pid是2708,名称是bitcoind
-
Mybatise中使用foreach批量插入并且返回自增id,解决返回的id重复或者为空的问题
2020-08-07 13:32:59话不多说,直接开整!...因为返回的id会自动注入进去,所以得选实体类来接收自增的id。 @Data public class SignIn implements Serializable { private long id;//注意id为long类型 private String owner;话不多说,直接开整!
业务场景:签到表是个流程,等到审核完成后,需要将其从表数据自动添加至台账表中,方便台账表的导出功能的开发。所以我们得获取到批量插入的从表id,来维护主从表的关联关系。
具体实现- 建立实体类:
因为返回的id会自动注入进去,所以得选实体类来接收自增的id。
@Data public class SignIn implements Serializable { private long id;//注意id为long类型 private String owner; private String modifier; private String last_modified; private String created_at; private String modified_method; private String app_key; private String app_extend_key; private String canjiayixiangxin; private String canjiashijian; private String canjiaren; private String yanlianliushuihao; }
- mapper的编写:
注意点:正常的插入只需要parameterType=“”即可。
我们需要返回id的话得多加以下三个:
useGeneratedKeys=“true” :允许JDBC支持自动生成主键,需要驱动兼容(如果设置为true则这个设置强制使用自动生成主键,尽管一些驱动不能兼容但仍可正常工作)
keyProperty=“id” :取id的key值
keyColumn=“id”:设值id的值
<!--插入数据至台账从表--> <insert id="insertParameter" useGeneratedKeys="true" keyProperty="id" keyColumn="id" > insert into ${tableId}( owner,modifier,last_modified,created_at,modified_method,app_key,app_extend_key, canjiayixiangxin,canjiashijian,canjiaren,yanlianliushuihao) values <foreach collection="list" index="index" item="ids" separator=","> ( #{ids.owner},#{ids.modifier},#{ids.last_modified},#{ids.created_at},# {ids.modified_method},#{ids.app_key},#{ids.app_extend_key}, #{ids.canjiayixiangxin},#{ids.canjiashijian},#{ids.canjiaren},#{ids.yanlianliushuihao} ) </foreach> </insert>
- service层:
前提是已拿到所需要插入的数据集合了。
注意点:网上大把博客都忽略了一个点,大家也会经常遇到一个问题就是,返回的id在集合中会重复,下面会说下为什么出现这样的原因。
原因: 本质上我们批量插入时,是将一个实体类组成的集合执行插入语句,用foreach进行批量插入。
我们将List<Map<String,Object>> 类型转成List<实体类>。使用mapToBean方法来转换。
因为我们是循环转换的,所以每次都得在重新new一个对象,不然id就会被覆盖。
//如果数据为空,结束,不需要再执行下去 if (CollectionUtils.isEmpty(resultList)){ return; } //格式化时间 SimpleDateFormat sdfDay = new SimpleDateFormat("yyy-MM-dd HH:mm:ss"); List<SignIn> signInList = new ArrayList<>(); for (Map map : resultList){ map.put("created_at",sdfDay.format(map.get("created_at"))); map.put("canjiashijian",sdfDay.format(map.get("canjiashijian"))); map.put("last_modified",sdfDay.format(map.get("last_modified"))); map.remove("id"); //转为实体类,这里每次需要重新new一个对象,不然id会被覆盖成最后一个的id SignIn signIn = new SignIn(); signInList.add(BeanUtils.mapToBean(map,signIn)); }
这样即可拿到所有插入的自增id。
下面提供下Map转实体的方法给大家:public class BeanUtils { private BeanUtils() {throw new IllegalStateException(); } /** * map转bean * * @param map * @param bean * @param <T> * @return */ public static <T> T mapToBean(Map<String, Object> map, T bean) { BeanMap beanMap = BeanMap.create(bean); beanMap.putAll(map); return bean; } }
自此全部结束,以上都是个人所言,如有不对,尽请指出,大家一起交流进步。谢谢!
有需要源码的,或者有不理解,欢迎关注微信公众号来讨论,留言会回复的哦~
!
欢迎微信搜索关注:《全员格子》!!! - 建立实体类:
-
Linux id 命令 - 显示用户id和组id信息
2017-05-24 15:10:00Linux id命令用于显示用户的ID,以及所属群组的ID。 id会显示用户以及所属群组的实际与有效ID。若两个ID相同,则仅显示实际ID。若仅指定用户名称,则显示目前用户的ID。 语法 id [-gGnru][--help][--version]...Linux id命令用于显示用户的ID,以及所属群组的ID。
id会显示用户以及所属群组的实际与有效ID。若两个ID相同,则仅显示实际ID。若仅指定用户名称,则显示目前用户的ID。
语法
id [-gGnru][--help][--version][用户名称]
参数说明:
- -g或--group 显示用户所属群组的ID。
- -G或--groups 显示用户所属附加群组的ID。
- -n或--name 显示用户,所属群组或附加群组的名称。
- -r或--real 显示实际ID。
- -u或--user 显示用户ID。
- -help 显示帮助。
- -version 显示版本信息。
实例
显示当前用户信息
# id //显示当前用户ID uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel) context=root:system_r:unconfined_t
显示用户群组的ID
# id -g 0
显示所有群组的ID
# id -g 0 1 2 3 4 5 6 10
显示指定用户信息
# id hnlinux
-
Java.Utils:Twitter 的分布式自增 ID 雪花算法
2020-02-13 18:35:13package com.boob.common.utils; import java.lang.management.ManagementFactory; import java.net.InetAddress; import java.net.NetworkInterface; /** * <p>名称:IdWorker.java<...描述... -
大型互联网公司分布式ID方案总结
2019-09-06 20:43:54ID是数据的唯一标识,传统的做法是利用UUID和数据库的自增ID,在互联网企业中,大部分公司使用的都是Mysql,并且因为需要事务支持,所以通常会使用Innodb存储引擎,UUID太长以及无序,所以并不适合在Innodb中来作为... -
修改用户ID和用户组ID
2018-12-01 15:21:27假定原用户和用户组id如下: 用户 admin 500 组 admin 500 要修改成用户和组id如下: 用户 admin 1000 组 admin 1000 修改用户ID usermod -u 1000 admin 修改组ID groupmod -g 1000 admin 修改文件权限 find / -... -
Mybatis-Plus雪花id的使用以及解析机器 ID 和数据标识 ID
2019-07-05 09:03:50Mybatis-Plus雪花id的使用以及解析机器 ID 和数据标识 ID概述结构源码Mybatis-Plus使用雪花id1.引入Mybatis-Plus依赖2.在application.yml配置文件中增加如下配置项3.原有的mapper接口增加继承BaseMapper接口4.实体类... -
对于CAN ID的理解
2017-09-02 21:25:33本文主要讲的是自己对于CAN ID的理解,希望对需要的人有帮助,本文以通俗的方式来理解,不涉及到具体CAN通信。 在接触CAN之前,应该接触过IIC通信,在IIC通信中,在同一条IIC通信总线上每个device有唯一的ID,后续... -
python3 获取 进程id 线程id
2020-01-21 09:52:531.获取线程id import threading # 1 获取线程ID,NAME t = threading.currentThread() #线程ID print('Thread id : %d' % t.ident) #线程NAME print('Thread name : %s' % t.getName()) 输出: Thread id : ... -
Gene id 转换(四种基因各种id转换方法)
2019-04-17 13:25:44对于这三种方法的使用参数在代码里面写了,你可以看看 先把基因集对应的注释包安装了,并且加载出来 library(org.Hs.eg.db)#这个是属于注释包,每个基因集可能对应的注释包不一样,要从基因集所在的平台找到对应的... -
linux:有效用户id、实际用户id、设置用户id
2019-04-13 22:29:34有效用户id、实际用户id、设置用户id概念更改用户ID以下内容均来自https://www.cnblogs.com/stemon/p/5287631.html的内容实例分析一: 概念 实际用户id(RUID,进程特有的概念): 在开机时,你输入的账号的对应id... -
django模型类中,为什不是user_id而是user?
2018-10-28 18:30:13class UserRole(models.Model): """... user_id = models.ForeignKey('User', on_delete=models.CASCADE, related_name='user_role', verbose_name='用户') role_id = models.For... -
百度地图接口爬取城市数据district_id
2020-12-16 16:48:07有问题可以联系本人QQ:1016401546 通过百度地图接口爬取百度地图城市数据,并存到mysql数据库里面: #!/usr/bin/python # coding=utf-8 import sys,time reload(sys) sys.setdefaultencoding("utf-8") ... -
mysql:Column id cannot be null
2018-07-11 17:03:04由于在项目中更改了数据库的字段,然后再连接测试的时候发现总是说:Column 'id' cannot be null 这个问题,也就是数据库的id不能为空,因为是主键。 二、问题解决 其实很简单,可能是自己改动了数据库,然后主键... -
docker查看完整containerId
2020-11-09 14:51:371、docker查看完整containerId docker ps --no-trunc -
data-id 和 id 的区别 data-id 的样式写法
2018-05-18 14:58:31id是选择器data-id只是行内存放数据的一个标签,跟input里面的value作用是一样的同时在HTML5 中增加了一项新功能是 自定义数据属性 ,也就是 data-* 自定义属性。在HTML5中我们可以使用以 data- 为前缀来设置我们... -
获取Google Advertising ID 和 Android ID
2018-09-18 14:49:24获取GoogleID(GAID): ...String ANDROID_ID = Settings.System.getString(getContentResolver(),Settings.System.ANDROID_ID); Log.d("MainActivity","Android ID: " + ANDR... -
hadoop里nameNode和dateNode的ID不一致解决办法
2020-10-07 23:07:16文章目录前言解决方案第一种:根据日志找到clusterID第二种:删除所有节点里的临时文件总结 前言 namenode启动了,但是datanode没有启动,查看日志文件logs的datanode 查看到warn警告,仔细阅读后发现日志报错... -
mybatis-plus id主键生成的坑
2019-03-26 14:22:10mybatis-plus id主键生成的坑简要说明错误解决方案一1. 修改id字段类型2. 调整数据库id字段类型解决方案二添加注解其他`type`类型介绍 简要说明 由于mybatis-plus会自动插入一个id到实体对象, 不管你封装与否, ... -
支付账户:appid\mch_id(微信支付商户号)\API密钥\Appsecret
2015-12-01 10:36:41支付账户:appid\mch_id(微信支付商户号)\API密钥\Appsecret -
id命令查看用户ID和组ID,su切换当前用户身份详解
2017-11-01 19:12:04id命令查看用户ID和组ID,su切换当前用户身份详解 -
MyBatis Plus 插入自增长id,并获取id值
2019-10-30 11:11:29MyBatis Plus 插入自增长id,并获取id值 1.实体类主键必须用如下声明,insert时才会自动使用自增长id. @TableId(type = IdType.INPUT) private Long id;//主键id’, baseMapper自带的insert方法可能在插入后,拿不... -
如何根据sessionID获取session解决方案
2018-07-18 15:17:40最近在做一个项目的时候,本来是想通过session来存一些数据的,但是,发现当两次访问的方法不同时,后台的session是不一样的,也就是说sessionId,不一致,所以导致的问题就是:当我需要从session取值的时候,总是... -
基因ID
2017-12-16 14:45:52各类基因ID转换基因ID分类 Ensembl的目标是为遗传学家,分子生物学家和其他研究人员研究我们自己的物种和其他脊椎动物和模式生物的基因组而提供集中的资源。Ensembl是几个知名的基因组浏览器之一,用于检索基因组学... -
Mysql根据某层部门ID查询所有下级多层子部门
2020-05-30 17:23:56目录模拟表和数据脚本根据部门ID查询所有子部门 模拟表和数据脚本 复制以下sql语句生成一个叫sys_dept的表和插入若干构造好的有层级关系的数据,直接复制执行就ok DROP TABLE IF EXISTS `sys_dept`; CREATE TABLE `... -
ID卡复制教程(使用T5577卡复制4100卡)
2017-07-16 12:58:141 ID卡的常见类型与区别 国内常见的普通ID卡多为EM 4100 或 EM 4102卡,其特点是不可修改ID号。为了复制普通ID卡,通常采用T5577 或 EM4305卡(俗称ID白卡),其特点是内部EEPROM可读可写,修改卡内EEPROM的内容... -
Android - 动态设置自定义View的id - setId
2016-12-05 14:11:34因为在sdk17(4.2.2)以上可以使用myView.setId(View.generateViewId())才行,为了兼容,里面的id必须使用静态int类型。 解决三种写法: 1、sdk17(4.2.2以上) tv_leftBtn_title.setId(View.genera -
android @id和@+id的区别
2018-05-29 08:40:46今天,简单讲讲android里关于@id和@+id的区别。之前,自己在布局里无论什么情况都使用@+id,可是后来发现有些代码用的是@id,自己不知道这两者之间有什么区别。于是就在网上查找资料,最终是解决了问题。这里记录...
-
Portofino:Portofino 5是下一代开放源代码的Web开发框架Portofino。 其目的是帮助开发人员使用REST API和Angular UI创建现代的响应式企业应用程序-源码
-
Scratch编程等级考试二级真题讲解(电子学会图形化编程)
-
Python数据科学
-
ng-projects:开源Angular项目列表-源码
-
网络游戏开发中的通讯杂谈
-
转行做IT-第9章 常用类-Scanner、Random等
-
pycharm用discover批量执行用例时报empty suite问题
-
内部管理系统Spring boot/Spring MVC/Mybati
-
30个生涯锦囊,带你跳出迷茫,找到适合你的职业方向
-
武器装备自动测试(ATE)系统设计要点
-
知识付费项目的下一个增长点在哪里?和你一起开展副业!
-
雷达侦察装备软件测试方法研究
-
Qt and Qt Charts
-
基于Django的电子商务网站设计--第一章
-
HackChrome:从Chrome获取用户:密码(包括版本<80> 80)-源码
-
linux 环境下搭建 tomcat 服务
-
canvas常用api
-
DDOS防护方法多到让你“头昏眼花”?一文告诉你如何选择适合的防护措施
-
allegro17.4转pads.doc
-
tools.zip putty ftpd32.exe Flash_Tool_5.0.15.exe