yumaofan / jetson_nano_demo

Some great implement of deep learning algorithm in Nvidia jetson nano platform. Such as face recognition, object detection, etc.
70 stars 38 forks source link

仿射变换 #7

Closed HandsLing closed 4 years ago

HandsLing commented 4 years ago

我看到在MTCNN检测得到脸的坐标和关键点坐标之后,有一个仿射变换得到MobileFacenet输入的图像数据,请问可以直接根据MTCNN检测的脸的坐标来从原图上抠出脸的部分再resize为(112,112),送入MobileFacenet提取特征吗?仿射变换的意义是什么呢?

yumaofan commented 4 years ago

这部分做的是人脸对齐,对齐是识别中必不可少的步骤,通过landmark做仿射变换后,人脸的位置会矫正到统一的位置,这样对比起来的确信度会更高,如果还是不理解,你可以将对齐后的人脸用cv2.imshow显示出来,你试着歪下脑袋,可以看到显示出的人脸仍然是正的,会在上下做黑色填充。

HandsLing commented 4 years ago

我懂你的意思了。但是加了仿射变换之后速度会变慢,而且本身MTCNN的速度也不是很快对吧。我在我本机上面一块1080ti的时间一张图片就要一两百毫秒,还没算仿射变换的时间

yumaofan commented 4 years ago

仿射变换不怎么耗时吧,MTCNN的检测速度是很快的,并且和最小检测大小有关系,你可以试着修改MIN_FACE_SIZE,建议在DBUG的时候打印出每个步骤的时间,来看下哪里耗时多,如果你使用的是我的默认参数,按理在1080ti上不会这么慢的。

yumaofan commented 4 years ago

BTW,目前我的代码里,为了控制显存不会溢出,检测到的人脸是一张一张送去MobileFaceNet中提取feature的,如果你图片中的人脸比较多,挨个提取feature会导致变慢。 如果你的计算资源充足,可以尝试下修改代码,将检测到的人脸一起作为一个Vector送入MobileFacaNet。

HandsLing commented 4 years ago

刚测试了一下,最耗时的还是MTCNN,因为我要检测的脸比较小,我最小的face_size设置成了20。我之前一直用的是DSFD+Facenet,在自己的数据集上也还不错,可是DSFD+MobileFacenet就不行了,之前的DSFD都是没有经过仿射变换的。

yumaofan commented 4 years ago

我用到MobileFaceNset的Model是对齐后训练的

HandsLing commented 4 years ago

那就能理解为什么是这样的结果了,谢谢您的解答

HandsLing commented 4 years ago

你好,我想问一下在仿射变换中,矩阵是怎么确定的呢?

yumaofan commented 4 years ago

请查看 utils/face_preprocess.py 这部分的代码, src是原作者标定的变换后的5个landmark的位置,根据检测到的5个点,计算变换矩阵 M