mj5qL;Hd?_8F*o|j#+Z9-&uAy#&+bsA)A6F
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
literal 0
HcmV?d00001
diff --git a/comprehensive_similarity.png b/comprehensive_similarity.png
new file mode 100644
index 0000000000000000000000000000000000000000..eb65a230c85512b12f44c412c40533271118cc00
GIT binary patch
literal 20688
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
A3jhEB
literal 0
HcmV?d00001
diff --git a/contrast/.idea/contrast_nettest.iml b/contrast/.idea/contrast_nettest.iml
new file mode 100644
index 0000000..8a05c6e
--- /dev/null
+++ b/contrast/.idea/contrast_nettest.iml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/contrast/.idea/inspectionProfiles/Project_Default.xml b/contrast/.idea/inspectionProfiles/Project_Default.xml
new file mode 100644
index 0000000..0d5fe0d
--- /dev/null
+++ b/contrast/.idea/inspectionProfiles/Project_Default.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/contrast/.idea/inspectionProfiles/profiles_settings.xml b/contrast/.idea/inspectionProfiles/profiles_settings.xml
new file mode 100644
index 0000000..105ce2d
--- /dev/null
+++ b/contrast/.idea/inspectionProfiles/profiles_settings.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/contrast/.idea/misc.xml b/contrast/.idea/misc.xml
new file mode 100644
index 0000000..dc9ea49
--- /dev/null
+++ b/contrast/.idea/misc.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/contrast/.idea/modules.xml b/contrast/.idea/modules.xml
new file mode 100644
index 0000000..cda59cb
--- /dev/null
+++ b/contrast/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/contrast/.idea/vcs.xml b/contrast/.idea/vcs.xml
new file mode 100644
index 0000000..6c0b863
--- /dev/null
+++ b/contrast/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/contrast/README.md b/contrast/README.md
new file mode 100644
index 0000000..4dcbad2
--- /dev/null
+++ b/contrast/README.md
@@ -0,0 +1,60 @@
+# Build Your Own Face Recognition Model
+
+训练你自己的人脸识别模型!
+
+人脸识别从原始的 Softmax Embbedding,经过2015年 Facenet 领衔的 triple loss metric learning,然后是 additional margin metric learning。这次的系列博客实现的是2018年提出的 ArcFace 。
+
+
+### 依赖
+```py
+Python >= 3.6
+pytorch >= 1.0
+torchvision
+imutils
+pillow == 6.2.0
+tqdm
+```
+
+### 数据准备
+
++ 下载WebFace(百度一下)以及干净的图片列表([BaiduYun](http://pan.baidu.com/s/1hrKpbm8))用于训练
++ 下载LFW([BaiduYun](https://pan.baidu.com/s/12IKEpvM8-tYgSaUiz_adGA) 提取码 u7z4)以及[测试列表](https://github.com/ronghuaiyang/arcface-pytorch/blob/master/lfw_test_pair.txt)用于测试
++ 删除WebFace中的脏数据,使用`utils.py`
+
+### 配置参数
+
+见`config.py`
+
+### 训练
+
+天然支持单机多GPU训练
+
+```py
+export CUDA_VISIBLE_DEVICES=0,1
+python train.py
+```
+
+### 测试
+
+```py
+python test.py
+```
+
+### 博客
+
+虽然有关人脸识别的介绍已经很多了,但受到许多 [Build-Your-Own-x](https://github.com/danistefanovic/build-your-own-x) 文章的启发,就想写一个 Build Your Own Face Model 的博客,愿于他人有益。
+
++ 001 [数据准备](./blog/data.md)
++ 002 [模型架构](./blog/model.md)
++ 003 [损失函数](./blog/loss.md)
++ 004 [度量函数](./blog/metric.md)
++ 005 [训练](./blog/train.md)
++ 006 [测试](./blog/test.md)
+
+### 致谢
+
+虽然并未注明,但本项目中有一些代码直接复制或者修改自以下仓库,许可证与之相同:
+
++ [insightFace](https://github.com/deepinsight/insightface/tree/master/recognition)
++ [insightFace_Pytorch](https://github.com/TreB1eN/InsightFace_Pytorch)
++ [arcface-pytorch](https://github.com/ronghuaiyang/arcface-pytorch)
diff --git a/contrast/__pycache__/img_data.cpython-310.pyc b/contrast/__pycache__/img_data.cpython-310.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..603a4a3c3d3f499381f1413be6a5d9175d3b14f2
GIT binary patch
literal 48010
zcmdU&%a3HqRmQ8TyKCC^j2YWwgTb(G&>hG7fh-GwKw{&Kcg0Alh#PTR?dccQ-4ZiG
zY+%cO;01VRK(OK=maJGI*0p6dD)aZx_T-rvmx*8R%cgcWk#NiJom(T
zeCIpQ-h1!M2mJY$fBKL5&;NRG@NezT`k!~W^Beqo@sHd*JSYc0Ipp?md3&_Hz4Md9
za+kmNetdk=o^j0mcgp>TN99Z9%iOl#edWjZP7cev<2xrutH;{?
z_W0L$?9S&N`+9p`y<5KV@zLq;l@H1{%eTtU^Vq%e3-w<4_V*6zalQ9v@BH~e`Ni@}
ze{xX1^QT8A_v@GHy+1xYJSe~X!{xsRzw+Q)pZ>$k`r_r{(UXTS7D7w&kr#uvrmC!5
zT)3!&u`voOq*}<2gj^`03{O;@lv-Nd2{U*ZitD_PLuYy|yD${p+2lfU!qy}V>+t%(
zLQ=`N7~ewpkh58c#d4vbc%iXH$SO^jr7oSRgXn@VwF|~%8DbhrYEPH;!yi3=xP#={
zSRp!}opQzJE~#F3Mv2g+;&eAi)qAbXAZxi+@~RR7Hpy8?Ds4iSLlAmMrL(cR&KTjl
z&}TNOcd|Ma24`fGJj_<|I9JJ)o~`75wvx|QTl8$NP&+Znt>|nmRSJbE7cydDv&F)u
z)QLRwf)k<2YO#t|EcN{Fw?2v9vOV8ea&2ZRxEU?W{B}HyhUIUzQx)CevqWV(Eqhys
z6uWAJ>WuR^8nO>KASw2^A~B?X@$}W>#}~ee7tSqDd|vNd)LnLYPz6;{p;TUof`>tt
zE-2h5*LxSOU1%xB(`QBkkE-$4bJ^iIUW0#kD|yYD8*7bLvD3MiP6pQ%Q+9>vIlKPZK>
zID?}Td%H_;U2bo1J-e)G6rqpZP(#LLuDJ_*6dcmN234)qO5Gs$av>{2CzDNlOxekj
zkXy1$L~t$=Th$Ov8oXX8IV#BZ8@?~W)zVncPwvrz%unuJFU)=E$#`MTZ@*pB?+4|^
zxL8UTh<~HUW?hNsMU=sM%$M}J7Z^ZgEr;VUbU7N?^+qV)dpr1In@L$)=R9e!ii=q&
z3KNaNi1+?=46S0E>q(@$UZFQ7{J+4S>j3PAJp7RPiIPH~u$rRlLK#4sXk(Nfin4yVDLco@qxYVo2S^qh
zEJdpdc4q*!LS?q^M3Iro6~LU(@HU&3XD2B5n6sGSj*m{u3!pzkgZrElpz4OP+
z)u_x>Q#Nb?nx3ZExmrUzTEqF}-$qAeesYhA+P}S_PvwmoE{(ACd(_Y?UkAE8XeFWD
z+SBSGi=eMg^@DM(l_^mEdA;5GvT3<3g@g`ccbK6tN7j|-w}g=+>Q#Th{+^D>w&bMo`C|lK;D@@f-?`jGX&w*XT_e8mxg&nITkN8r_d-PPt1w#Ai_6
z1e*s@RJqICXk%xg=4sK1UV4eNxr;*srYXFv
zY#>9zcVn0Op)YQLF=-pKG6li6N(oIt@NH5;Q;^$l``$I
zGnZ*rC7_+XDIvzCRax`a&iTnMRJ>g#0*(+_Je)O+Kg31wk_O7M-1kElMIS`T8McJh
z&AdAEZx=I9L2{b1w}_diA^E80Gu(5v4HkP6dmeYz79AnbDFoph3*YBCfCOMtJAX`Lgcid9DsGu1Q-hiWCcT`Lov_@a)HD969(0Q(>(_fSLn)^
z@1QOFlHBdAE&Gx@%vEybxAAYUT%mi~b2Z;RUlD!H?+V4t?0SaoOIzX?RLpPB_3nPl
zp7vbJZSuEQYzs7CFz3Qn8*L_HRvIqb>52&oz8QdWf`X6U
z?M>C@=?T6WfMt4eZ&ux(p4{V=IX^uaJ*@f3y&2GHdU~>1Y2poXH;QH>@#LIl>VtwW
zQb1(e8C{zfN;#p@-#!%Q48G_ayuu5v=C+WdRes0}l^7JrCMG)obYi4Lra;4R36YD}
zmE|nNwwskErYHCc%D1IMyT={(n4g*
z+>U1DrXYWUlCKDn{_+L{