需要任意两张同一个人的照片能够准确分辨出是不是同一个人,尽量简化识别过程,不需要知道是谁,也最好不用建立索引文件。
现在这个版本的insughtface很奇怪,不知道为什么自己建立索引的时候需要每个人2张照片以上才能识别成功,不然就会报一个莫名其妙的错误。
首先上项目地址:
https://github.com/littletomatodonkey/insight-face-paddlehttps://github.com/littletomatodonkey/insight-face-paddle 按照里面的要求装一些依赖就好了
然后测试一下官方自带的数据:
# 建立索引
insightfacepaddle --build_index ./demo/friends/index.bin --img_dir ./demo/friends/gallery --label ./demo/friends/gallery/label.txt
# 检测人脸
insightfacepaddle --det --input ./demo/friends/query/friends1.jpg --output ./output
# 检测+识别
insightfacepaddle --det --rec --index ./demo/friends/index.bin --input ./demo/friends/query/friends2.jpg --output ./output
如果这个能跑通的话至少说明环境没问题了。
注意项目目录里面有一个 insightface_paddle.py 文件,绝大部分的逻辑都在这个里面,我们的修改也主要在这个里面进行。
首先找到InsightFace类,
在里面加一个函数:
# 人脸比对
def build_embedding(self,pic_1,pic_2):
img_1 = cv2.imread(pic_1)
img_2 = cv2.imread(pic_2)
box_list_1, np_feature_1 = self.predict_np_img(img_1)
box_list_2, np_feature_2 = self.predict_np_img(img_2)
# print("Embedding1",np_feature_1[0],"Embedding2",np_feature_2[0])
similarity = np.abs(cosine_similarity(np_feature_1[0], np_feature_2[0]).squeeze())
print(similarity)
然后这个代码很简单,难点就在看懂源代码是怎么一步一步建立索引、完成识别的过程,然后抽取出来我们需要的部分。
思路也很简单,需要它的rec权重得到人脸embedding,然后看看他是怎么确定哪个人是谁的,把余弦函数抄过来就行可。
调用部分:
import insightface_paddle as face
import logging
logging.basicConfig(level=logging.INFO)
parser = face.parser()
args = parser.parse_args()
args.det = True
args.rec = True
args.index = "/home/nvidia/insight-face-paddle-main/demo/img/index.bin"
# args.output = "/home/nvidia/insight-face-paddle-main/output"
# input_path = "/home/nvidia/me"
predictor = face.InsightFace(args)
# res = predictor.predict(input_path, print_info=False)
predictor.build_embedding("morning_10_45.jpg","morning_10_47.jpg")
至于那个index.bin索引文件其实并没有用到,但还是需要把它放进去,不然需要改的东西就破坏了源代码的结构,可能会引发什么异常错误。随便拿一个,可以用上面跑官方示例的时候做出来那个index。
-------------------------------------------------------------------------------------
PaddleFace
+----------------+------------------------------------------------------------------+
| Param | Value |
+----------------+------------------------------------------------------------------+
| det_model | BlazeFace |
| rec_model | MobileFace |
| use_gpu | True |
| enable_mkldnn | False |
| cpu_threads | 1 |
| input | None |
| output | ./output/ |
| det | True |
| det_thresh | 0.8 |
| rec | True |
| index | /home/nvidia/insight-face-paddle-main/demo/predixr_img/index.bin |
| cdd_num | 5 |
| rec_thresh | 0.45 |
| max_batch_size | 1 |
| build_index | None |
| img_dir | None |
| label | None |
+----------------+------------------------------------------------------------------+
Powered by PaddlePaddle!
-------------------------------------------------------------------------------------
0.7750918
最后就可以打印出相似度了。
顺便说一句,原始的阈值是0.45,意味着0.45以下的绝对不是同一个人,0.45以上要看具体使用场景自己调节。
还有就是默认的rec权重是MobileFace,可以自己换成精度更加的ArcFace
下载地址:
https://paddle-model-ecology.bj.bcebos.com/model/insight-face/arcface_iresnet50_v1.0_infer.tarhttps://paddle-model-ecology.bj.bcebos.com/model/insight-face/arcface_iresnet50_v1.0_infer.tar 然后把它放在~/.insightface/ppmodels/ArcFace/下面 要新建一个文件夹叫ArcFace
记得--rec_model那块默认值也改为ArcFace"
-------------------------------------------------------------------------------------
PaddleFace
+----------------+------------------------------------------------------------------+
| Param | Value |
+----------------+------------------------------------------------------------------+
| det_model | BlazeFace |
| rec_model | ArcFace |
| use_gpu | True |
| enable_mkldnn | False |
| cpu_threads | 1 |
| input | None |
| output | ./output/ |
| det | True |
| det_thresh | 0.8 |
| rec | True |
| index | /home/nvidia/insight-face-paddle-main/demo/predixr_img/index.bin |
| cdd_num | 5 |
| rec_thresh | 0.45 |
| max_batch_size | 1 |
| build_index | None |
| img_dir | None |
| label | None |
+----------------+------------------------------------------------------------------+
Powered by PaddlePaddle!
-------------------------------------------------------------------------------------
0.86437297
可见效果好了一点