Facenet没有使用Softmax作为损失函数,而是先接了一个l2 嵌入(Embedding)层。
所谓嵌入,可以理解为一种映射关系,即将特征从原来的特征空间中映射到一个新的特征空间,新的特征就可以称为原来特征的一种嵌入。
网络会直接学习特征间的可分性:同一类的特征之间的距离要尽可能的小,而不同类之间的特征距离要尽可能的大。
Triplet Loss
选择最佳的三元组
意思就是说通过学习,使得类间的距离要大于类内的距离。
搭建实验平台
人脸数据收集系统,使用opencv调用摄像头检测到人脸就截图保存,这个检测用mtcnn和传统的检测(检测器)方法进行比较
比较性能指标:
检测速度 ,支持多少fps
误检测率,
分析:
人脸裁剪和模型顺训练模型,facenet模型和其他方法(如SVM,egentface)对测试人脸的识别率比较
分析:
应用实际场景
数据处理做好
要用到的相关方法也要整理好。
人脸识别算法总结:
人脸对齐:能够将人脸图片进行裁剪成指定大小,对人脸进行预处理
最近心态不太好,写论文到现在还没有完成,归根到底还是心态的问题,以及没有掌握正确的学习方法。现在对近段时间以来的学习状态做出一下总结以及对以后的警示:
以实际需求为导向,解决实际问题为根本,抓住问题的根源。
不要左顾右盼,瞻前顾后,丢了时间,也没了精力
不懂就要问题,指导搞懂为止,不要一笔带过,不要急躁,不要放弃,好好的深入琢磨,终会搞懂问题的本质,以及找到解决之道。
现在的主要任务是写论文,而论文的必要条件是做好实验,能够得出实验结论。所以:
把实验平台搭建好,
数据处理做好
要用到的相关方法也要整理好。
最近在运行代码的时候出现了这个错误——AttributeError: module ‘scipy.misc’ has no attribute ‘imread’。
解决:命令如下:将scipy降级:
pip install scipy==1.2.1
facenet-pytorch
—data
—dependencies 依赖
—examples 使用示例代码
—models 训练好的模型
—tests 测试代码 ,迭代性能等
—mydemo 我自己的代码
datasets.ImageFolder() 这里要使用绝对路径,使用相对路径会报错!
MTCNN( ) 用于处理人脸对齐的,传入的参数详解:
1 | image_size:输出的(对齐后的)图片的大小 |
RuntimeError: Calculated padded input size per channel: (2 x 2). Kernel size: (3 x 3). Kernel size can’t be greater than actual input size
点进 出错的源码:
是出现在Conv2d这个类里面一个conv2d_forward函数里面
然后查看这个类的注释:
1 | Applies a 2D convolution over an input signal composed of several input |
1 | where :math:`\star` is the valid 2D `cross-correlation`_ operator, |
然后我就将
1 | mtcnn = MTCNN( |
中的 image_size=64 修改成 image_size=96 ,结果运行很顺畅,没有任何问题。最终经过的多次测试, image_size的值最小为 75 都是没有问题的,只要小于这个值就会报错。说明,说明核的单位大小是25
1 | """Inception Resnet V1 model with optional loading of pretrained weights. |
Inception Resnet V1模型,可以选择加载预训练的权重。可以基于对VGGFace2或CASIA-Webface数据集的预训练来加载模型参数。如果需要,可以在模型实例化时自动下载预训练的state_dict,并将其缓存在火炬缓存中。使用缓存而不是重新下载关键字参数:pretrained {str}-可选的pretraining数据集“ vggface2”或“ casia-webface”(默认值:{None})对{bool}进行分类–模型是否应输出分类概率或特征嵌入(默认值:{False})num_classes {int}-输出类数。如果设置了“ pretrained”,并且num_classes不等于用于预训练模型的数,则最终的线性层将被随机初始化。 (默认:{None})dropout_prob {float}-退出概率。(默认:{0.6})
1 | datasets.ImageFolder() |
arr.push() 返回值 为push后的长度
css:translate 转换
transform:rotate(7deg);
transform: scaleY(0.5);
promise.all,race等用法
promise.all( iterablse) 方法返回一个 promise实例,此实例在iterable参数内所有的promise都完成 或者参数中不包含promise时回调完成;如果有一个失败,此实例回调失败,此实例回调失败(reject),失败原因的是第一个失败 promise
的结果
promise.race(iterable) 该方法返回一个promise实例,一旦迭代器中某个promise解决或者拒绝,返回的promise就会解决或者拒绝。
promise.allSettled() 方法返回一个promise,该方法在所有给定的promise已被解析或者拒绝后解析,并且每个对象都描述每个promise的结果。
故:因为空数组 [ ], 是不能返回 Promise的reject的,所以
Promise.all([]).then(resolve,reject ); //结果执行的resolve 函数
Promise.race([]).then(resolve,reject); // 结果执行的是resolve函数。
生产者与消费者
关系图: 生产者 --> 缓冲区 --> 消费者;
由于node使用单线程的方式实现,所以,在此使用定时器timer代替线程thread来实现生产者消费者模型。
优点:
解耦
支持并发
支持忙闲不均
关联到业务对象
完整性
独立性
颗粒型
模板字符串函数
1 | let x = 'Hi', y = 'Kevin'; |
计算机网络:
轮询?
websocket
es6 发布订阅模式
缓存雪崩
并发与并行
RSA加密算法
graph LR; 前端面试导图--> 第一部分 -->fdf 第一部分-->1.1小节 第一部分-->1.2小节 思维导图--> 第二部分 第二部分-->2.2小节 思维导图--> 第三部分 第三部分--> 3.1小节 思维导图--> 若干