├── .gitignore ├── LICENSE ├── README.md ├── hist-cos.jpg ├── roc.jpg ├── sphereface_deploy.prototxt ├── sphereface_model.prototxt └── sphereface_solver.prototxt /.gitignore: -------------------------------------------------------------------------------- 1 | # Prerequisites 2 | *.d 3 | 4 | # Compiled Object files 5 | *.slo 6 | *.lo 7 | *.o 8 | *.obj 9 | 10 | # Precompiled Headers 11 | *.gch 12 | *.pch 13 | 14 | # Compiled Dynamic libraries 15 | *.so 16 | *.dylib 17 | *.dll 18 | 19 | # Fortran module files 20 | *.mod 21 | *.smod 22 | 23 | # Compiled Static libraries 24 | *.lai 25 | *.la 26 | *.a 27 | *.lib 28 | 29 | # Executables 30 | *.exe 31 | *.out 32 | *.app 33 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Sphereface-model 2 | This is the pre-trained model of SphereFace : Deep Hypersphere Embedding for Face Recognition. 3 | This model is trained on CASIA-Webface and the accuracy on LFW is **99.18%**. 4 | - Training on Webface with the default setting only got an accuracy of 98.5%, which is much lower than the paper claimed(**~99.26%**). 5 | - Fixed lambda = 5, kept on training, and got an accuracy of 98.8%. 6 | - Decreased the lambda. Final accuracy is 99.18%. 7 | 8 | I think the performance can still be further improved by carefully fine-tuning. Feel free to use this model. 9 | # Experiment Results 10 | Train 22000(lambda=3.6, batch_size=170). 11 | 12 | The distribution of features on LFW: 13 | 14 | ![Feature distribution](https://github.com/goodluckcwl/Sphereface-model/raw/master/hist-cos.jpg) 15 | 16 | The roc curve: 17 | 18 | ![ROC](https://github.com/goodluckcwl/Sphereface-model/raw/master/roc.jpg) 19 | 20 | Accuracy on LFW: 21 | 22 | |Original | With PCA | With mirror trick| With mirror trick and PCA | 23 | |:---------:|:---------:|:---------------:|:-----------------:| 24 | | 98.88% | 99.13% | 98.98% |**99.18%** | 25 | 26 | Here is the model: https://pan.baidu.com/s/1pL0pmll 27 | 28 | **LFW** evaluation code can be found in [https://github.com/happynear/FaceVerification]. 29 | 30 | # Update 31 | - Accuracy on LFW 99.18% 2017.07.31 32 | 33 | ## Reference 34 | https://github.com/wy1iu/sphereface 35 | 36 | https://github.com/happynear/NormFace/blob/master/MirrorFace.md 37 | -------------------------------------------------------------------------------- /hist-cos.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/goodluckcwl/Sphereface-model/5e578e6cf4617637a2983fb1362a6cfbe614587e/hist-cos.jpg -------------------------------------------------------------------------------- /roc.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/goodluckcwl/Sphereface-model/5e578e6cf4617637a2983fb1362a6cfbe614587e/roc.jpg -------------------------------------------------------------------------------- /sphereface_deploy.prototxt: -------------------------------------------------------------------------------- 1 | input: "data" 2 | input_dim: 1 3 | input_dim: 3 4 | input_dim: 112 5 | input_dim: 96 6 | ############## CNN Architecture ############### 7 | layer { 8 | name: "conv1a" 9 | type: "Convolution" 10 | bottom: "data" 11 | top: "conv1a" 12 | param { 13 | lr_mult: 1 14 | decay_mult: 1 15 | } 16 | param { 17 | lr_mult: 2 18 | decay_mult: 0 19 | } 20 | convolution_param { 21 | num_output: 32 22 | kernel_size: 3 23 | stride: 1 24 | weight_filler { 25 | type: "xavier" 26 | } 27 | bias_filler { 28 | type: "constant" 29 | value: 0 30 | } 31 | } 32 | } 33 | layer { 34 | name: "relu1a" 35 | type: "PReLU" 36 | bottom: "conv1a" 37 | top: "conv1a" 38 | } 39 | layer { 40 | name: "conv1b" 41 | type: "Convolution" 42 | bottom: "conv1a" 43 | top: "conv1b" 44 | param { 45 | lr_mult: 1 46 | decay_mult: 1 47 | } 48 | param { 49 | lr_mult: 2 50 | decay_mult: 0 51 | } 52 | convolution_param { 53 | num_output: 64 54 | kernel_size: 3 55 | stride: 1 56 | weight_filler { 57 | type: "xavier" 58 | } 59 | bias_filler { 60 | type: "constant" 61 | value: 0 62 | } 63 | } 64 | } 65 | layer { 66 | name: "relu1b" 67 | type: "PReLU" 68 | bottom: "conv1b" 69 | top: "conv1b" 70 | } 71 | layer { 72 | name: "pool1b" 73 | type: "Pooling" 74 | bottom: "conv1b" 75 | top: "pool1b" 76 | pooling_param { 77 | pool: MAX 78 | kernel_size: 2 79 | stride: 2 80 | } 81 | } 82 | layer { 83 | name: "conv2_1" 84 | type: "Convolution" 85 | bottom: "pool1b" 86 | top: "conv2_1" 87 | param { 88 | lr_mult: 1 89 | decay_mult: 1 90 | } 91 | param { 92 | lr_mult: 0 93 | decay_mult: 0 94 | } 95 | convolution_param { 96 | num_output: 64 97 | kernel_size: 3 98 | stride: 1 99 | pad: 1 100 | weight_filler { 101 | type: "gaussian" 102 | std: 0.01 103 | } 104 | bias_filler { 105 | type: "constant" 106 | value: 0 107 | } 108 | } 109 | } 110 | layer { 111 | name: "relu2_1" 112 | type: "PReLU" 113 | bottom: "conv2_1" 114 | top: "conv2_1" 115 | } 116 | layer { 117 | name: "conv2_2" 118 | type: "Convolution" 119 | bottom: "conv2_1" 120 | top: "conv2_2" 121 | param { 122 | lr_mult: 1 123 | decay_mult: 1 124 | } 125 | param { 126 | lr_mult: 0 127 | decay_mult: 0 128 | } 129 | convolution_param { 130 | num_output: 64 131 | kernel_size: 3 132 | stride: 1 133 | pad: 1 134 | weight_filler { 135 | type: "gaussian" 136 | std: 0.01 137 | } 138 | bias_filler { 139 | type: "constant" 140 | value: 0 141 | } 142 | } 143 | } 144 | layer { 145 | name: "relu2_2" 146 | type: "PReLU" 147 | bottom: "conv2_2" 148 | top: "conv2_2" 149 | } 150 | layer { 151 | name: "res2_2" 152 | type: "Eltwise" 153 | bottom: "pool1b" 154 | bottom: "conv2_2" 155 | top: "res2_2" 156 | eltwise_param { 157 | operation: 1 158 | } 159 | } 160 | layer { 161 | name: "conv2" 162 | type: "Convolution" 163 | bottom: "res2_2" 164 | top: "conv2" 165 | param { 166 | lr_mult: 1 167 | decay_mult: 1 168 | } 169 | param { 170 | lr_mult: 2 171 | decay_mult: 0 172 | } 173 | convolution_param { 174 | num_output: 128 175 | kernel_size: 3 176 | stride: 1 177 | weight_filler { 178 | type: "xavier" 179 | } 180 | bias_filler { 181 | type: "constant" 182 | value: 0 183 | } 184 | } 185 | } 186 | layer { 187 | name: "relu2" 188 | type: "PReLU" 189 | bottom: "conv2" 190 | top: "conv2" 191 | } 192 | layer { 193 | name: "pool2" 194 | type: "Pooling" 195 | bottom: "conv2" 196 | top: "pool2" 197 | pooling_param { 198 | pool: MAX 199 | kernel_size: 2 200 | stride: 2 201 | } 202 | } 203 | layer { 204 | name: "conv3_1" 205 | type: "Convolution" 206 | bottom: "pool2" 207 | top: "conv3_1" 208 | param { 209 | lr_mult: 1 210 | decay_mult: 1 211 | } 212 | param { 213 | lr_mult: 0 214 | decay_mult: 0 215 | } 216 | convolution_param { 217 | num_output: 128 218 | kernel_size: 3 219 | stride: 1 220 | pad: 1 221 | weight_filler { 222 | type: "gaussian" 223 | std: 0.01 224 | } 225 | bias_filler { 226 | type: "constant" 227 | value: 0 228 | } 229 | } 230 | } 231 | layer { 232 | name: "relu3_1" 233 | type: "PReLU" 234 | bottom: "conv3_1" 235 | top: "conv3_1" 236 | } 237 | layer { 238 | name: "conv3_2" 239 | type: "Convolution" 240 | bottom: "conv3_1" 241 | top: "conv3_2" 242 | param { 243 | lr_mult: 1 244 | decay_mult: 1 245 | } 246 | param { 247 | lr_mult: 0 248 | decay_mult: 0 249 | } 250 | convolution_param { 251 | num_output: 128 252 | kernel_size: 3 253 | stride: 1 254 | pad: 1 255 | weight_filler { 256 | type: "gaussian" 257 | std: 0.01 258 | } 259 | bias_filler { 260 | type: "constant" 261 | value: 0 262 | } 263 | } 264 | } 265 | layer { 266 | name: "relu3_2" 267 | type: "PReLU" 268 | bottom: "conv3_2" 269 | top: "conv3_2" 270 | } 271 | layer { 272 | name: "res3_2" 273 | type: "Eltwise" 274 | bottom: "pool2" 275 | bottom: "conv3_2" 276 | top: "res3_2" 277 | eltwise_param { 278 | operation: 1 279 | } 280 | } 281 | layer { 282 | name: "conv3_3" 283 | type: "Convolution" 284 | bottom: "res3_2" 285 | top: "conv3_3" 286 | param { 287 | lr_mult: 1 288 | decay_mult: 1 289 | } 290 | param { 291 | lr_mult: 0 292 | decay_mult: 0 293 | } 294 | convolution_param { 295 | num_output: 128 296 | kernel_size: 3 297 | stride: 1 298 | pad: 1 299 | weight_filler { 300 | type: "gaussian" 301 | std: 0.01 302 | } 303 | bias_filler { 304 | type: "constant" 305 | value: 0 306 | } 307 | } 308 | } 309 | layer { 310 | name: "relu3_3" 311 | type: "PReLU" 312 | bottom: "conv3_3" 313 | top: "conv3_3" 314 | } 315 | layer { 316 | name: "conv3_4" 317 | type: "Convolution" 318 | bottom: "conv3_3" 319 | top: "conv3_4" 320 | param { 321 | lr_mult: 1 322 | decay_mult: 1 323 | } 324 | param { 325 | lr_mult: 0 326 | decay_mult: 0 327 | } 328 | convolution_param { 329 | num_output: 128 330 | kernel_size: 3 331 | stride: 1 332 | pad: 1 333 | weight_filler { 334 | type: "gaussian" 335 | std: 0.01 336 | } 337 | bias_filler { 338 | type: "constant" 339 | value: 0 340 | } 341 | } 342 | } 343 | layer { 344 | name: "relu3_4" 345 | type: "PReLU" 346 | bottom: "conv3_4" 347 | top: "conv3_4" 348 | } 349 | layer { 350 | name: "res3_4" 351 | type: "Eltwise" 352 | bottom: "res3_2" 353 | bottom: "conv3_4" 354 | top: "res3_4" 355 | eltwise_param { 356 | operation: 1 357 | } 358 | } 359 | 360 | layer { 361 | name: "conv3" 362 | type: "Convolution" 363 | bottom: "res3_4" 364 | top: "conv3" 365 | param { 366 | lr_mult: 1 367 | decay_mult: 1 368 | } 369 | param { 370 | lr_mult: 2 371 | decay_mult: 0 372 | } 373 | convolution_param { 374 | num_output: 256 375 | kernel_size: 3 376 | stride: 1 377 | weight_filler { 378 | type: "xavier" 379 | } 380 | bias_filler { 381 | type: "constant" 382 | value: 0 383 | } 384 | } 385 | } 386 | layer { 387 | name: "relu3" 388 | type: "PReLU" 389 | bottom: "conv3" 390 | top: "conv3" 391 | } 392 | layer { 393 | name: "pool3" 394 | type: "Pooling" 395 | bottom: "conv3" 396 | top: "pool3" 397 | pooling_param { 398 | pool: MAX 399 | kernel_size: 2 400 | stride: 2 401 | } 402 | } 403 | layer { 404 | name: "conv4_1" 405 | type: "Convolution" 406 | bottom: "pool3" 407 | top: "conv4_1" 408 | param { 409 | lr_mult: 1 410 | decay_mult: 1 411 | } 412 | param { 413 | lr_mult: 0 414 | decay_mult: 0 415 | } 416 | convolution_param { 417 | num_output: 256 418 | kernel_size: 3 419 | stride: 1 420 | pad: 1 421 | weight_filler { 422 | type: "gaussian" 423 | std: 0.01 424 | } 425 | bias_filler { 426 | type: "constant" 427 | value: 0 428 | } 429 | } 430 | } 431 | layer { 432 | name: "relu4_1" 433 | type: "PReLU" 434 | bottom: "conv4_1" 435 | top: "conv4_1" 436 | } 437 | layer { 438 | name: "conv4_2" 439 | type: "Convolution" 440 | bottom: "conv4_1" 441 | top: "conv4_2" 442 | param { 443 | lr_mult: 1 444 | decay_mult: 1 445 | } 446 | param { 447 | lr_mult: 0 448 | decay_mult: 0 449 | } 450 | convolution_param { 451 | num_output: 256 452 | kernel_size: 3 453 | stride: 1 454 | pad: 1 455 | weight_filler { 456 | type: "gaussian" 457 | std: 0.01 458 | } 459 | bias_filler { 460 | type: "constant" 461 | value: 0 462 | } 463 | } 464 | } 465 | layer { 466 | name: "relu4_2" 467 | type: "PReLU" 468 | bottom: "conv4_2" 469 | top: "conv4_2" 470 | } 471 | layer { 472 | name: "res4_2" 473 | type: "Eltwise" 474 | bottom: "pool3" 475 | bottom: "conv4_2" 476 | top: "res4_2" 477 | eltwise_param { 478 | operation: 1 479 | } 480 | } 481 | layer { 482 | name: "conv4_3" 483 | type: "Convolution" 484 | bottom: "res4_2" 485 | top: "conv4_3" 486 | param { 487 | lr_mult: 1 488 | decay_mult: 1 489 | } 490 | param { 491 | lr_mult: 0 492 | decay_mult: 0 493 | } 494 | convolution_param { 495 | num_output: 256 496 | kernel_size: 3 497 | stride: 1 498 | pad: 1 499 | weight_filler { 500 | type: "gaussian" 501 | std: 0.01 502 | } 503 | bias_filler { 504 | type: "constant" 505 | value: 0 506 | } 507 | } 508 | } 509 | layer { 510 | name: "relu4_3" 511 | type: "PReLU" 512 | bottom: "conv4_3" 513 | top: "conv4_3" 514 | } 515 | layer { 516 | name: "conv4_4" 517 | type: "Convolution" 518 | bottom: "conv4_3" 519 | top: "conv4_4" 520 | param { 521 | lr_mult: 1 522 | decay_mult: 1 523 | } 524 | param { 525 | lr_mult: 0 526 | decay_mult: 0 527 | } 528 | convolution_param { 529 | num_output: 256 530 | kernel_size: 3 531 | stride: 1 532 | pad: 1 533 | weight_filler { 534 | type: "gaussian" 535 | std: 0.01 536 | } 537 | bias_filler { 538 | type: "constant" 539 | value: 0 540 | } 541 | } 542 | } 543 | layer { 544 | name: "relu4_4" 545 | type: "PReLU" 546 | bottom: "conv4_4" 547 | top: "conv4_4" 548 | } 549 | layer { 550 | name: "res4_4" 551 | type: "Eltwise" 552 | bottom: "res4_2" 553 | bottom: "conv4_4" 554 | top: "res4_4" 555 | eltwise_param { 556 | operation: 1 557 | } 558 | } 559 | layer { 560 | name: "conv4_5" 561 | type: "Convolution" 562 | bottom: "res4_4" 563 | top: "conv4_5" 564 | param { 565 | lr_mult: 1 566 | decay_mult: 1 567 | } 568 | param { 569 | lr_mult: 0 570 | decay_mult: 0 571 | } 572 | convolution_param { 573 | num_output: 256 574 | kernel_size: 3 575 | stride: 1 576 | pad: 1 577 | weight_filler { 578 | type: "gaussian" 579 | std: 0.01 580 | } 581 | bias_filler { 582 | type: "constant" 583 | value: 0 584 | } 585 | } 586 | } 587 | layer { 588 | name: "relu4_5" 589 | type: "PReLU" 590 | bottom: "conv4_5" 591 | top: "conv4_5" 592 | } 593 | layer { 594 | name: "conv4_6" 595 | type: "Convolution" 596 | bottom: "conv4_5" 597 | top: "conv4_6" 598 | param { 599 | lr_mult: 1 600 | decay_mult: 1 601 | } 602 | param { 603 | lr_mult: 0 604 | decay_mult: 0 605 | } 606 | convolution_param { 607 | num_output: 256 608 | kernel_size: 3 609 | stride: 1 610 | pad: 1 611 | weight_filler { 612 | type: "gaussian" 613 | std: 0.01 614 | } 615 | bias_filler { 616 | type: "constant" 617 | value: 0 618 | } 619 | } 620 | } 621 | layer { 622 | name: "relu4_6" 623 | type: "PReLU" 624 | bottom: "conv4_6" 625 | top: "conv4_6" 626 | } 627 | layer { 628 | name: "res4_6" 629 | type: "Eltwise" 630 | bottom: "res4_4" 631 | bottom: "conv4_6" 632 | top: "res4_6" 633 | eltwise_param { 634 | operation: 1 635 | } 636 | } 637 | layer { 638 | name: "conv4_7" 639 | type: "Convolution" 640 | bottom: "res4_6" 641 | top: "conv4_7" 642 | param { 643 | lr_mult: 1 644 | decay_mult: 1 645 | } 646 | param { 647 | lr_mult: 0 648 | decay_mult: 0 649 | } 650 | convolution_param { 651 | num_output: 256 652 | kernel_size: 3 653 | stride: 1 654 | pad: 1 655 | weight_filler { 656 | type: "gaussian" 657 | std: 0.01 658 | } 659 | bias_filler { 660 | type: "constant" 661 | value: 0 662 | } 663 | } 664 | } 665 | layer { 666 | name: "relu4_7" 667 | type: "PReLU" 668 | bottom: "conv4_7" 669 | top: "conv4_7" 670 | } 671 | layer { 672 | name: "conv4_8" 673 | type: "Convolution" 674 | bottom: "conv4_7" 675 | top: "conv4_8" 676 | param { 677 | lr_mult: 1 678 | decay_mult: 1 679 | } 680 | param { 681 | lr_mult: 0 682 | decay_mult: 0 683 | } 684 | convolution_param { 685 | num_output: 256 686 | kernel_size: 3 687 | stride: 1 688 | pad: 1 689 | weight_filler { 690 | type: "gaussian" 691 | std: 0.01 692 | } 693 | bias_filler { 694 | type: "constant" 695 | value: 0 696 | } 697 | } 698 | } 699 | layer { 700 | name: "relu4_8" 701 | type: "PReLU" 702 | bottom: "conv4_8" 703 | top: "conv4_8" 704 | } 705 | layer { 706 | name: "res4_8" 707 | type: "Eltwise" 708 | bottom: "res4_6" 709 | bottom: "conv4_8" 710 | top: "res4_8" 711 | eltwise_param { 712 | operation: 1 713 | } 714 | } 715 | layer { 716 | name: "conv4_9" 717 | type: "Convolution" 718 | bottom: "res4_8" 719 | top: "conv4_9" 720 | param { 721 | lr_mult: 1 722 | decay_mult: 1 723 | } 724 | param { 725 | lr_mult: 0 726 | decay_mult: 0 727 | } 728 | convolution_param { 729 | num_output: 256 730 | kernel_size: 3 731 | stride: 1 732 | pad: 1 733 | weight_filler { 734 | type: "gaussian" 735 | std: 0.01 736 | } 737 | bias_filler { 738 | type: "constant" 739 | value: 0 740 | } 741 | } 742 | } 743 | layer { 744 | name: "relu4_9" 745 | type: "PReLU" 746 | bottom: "conv4_9" 747 | top: "conv4_9" 748 | } 749 | layer { 750 | name: "conv4_10" 751 | type: "Convolution" 752 | bottom: "conv4_9" 753 | top: "conv4_10" 754 | param { 755 | lr_mult: 1 756 | decay_mult: 1 757 | } 758 | param { 759 | lr_mult: 0 760 | decay_mult: 0 761 | } 762 | convolution_param { 763 | num_output: 256 764 | kernel_size: 3 765 | stride: 1 766 | pad: 1 767 | weight_filler { 768 | type: "gaussian" 769 | std: 0.01 770 | } 771 | bias_filler { 772 | type: "constant" 773 | value: 0 774 | } 775 | } 776 | } 777 | layer { 778 | name: "relu4_10" 779 | type: "PReLU" 780 | bottom: "conv4_10" 781 | top: "conv4_10" 782 | } 783 | layer { 784 | name: "res4_10" 785 | type: "Eltwise" 786 | bottom: "res4_8" 787 | bottom: "conv4_10" 788 | top: "res4_10" 789 | eltwise_param { 790 | operation: 1 791 | } 792 | } 793 | layer { 794 | name: "conv4" 795 | type: "Convolution" 796 | bottom: "res4_10" 797 | top: "conv4" 798 | param { 799 | lr_mult: 1 800 | decay_mult: 1 801 | } 802 | param { 803 | lr_mult: 2 804 | decay_mult: 0 805 | } 806 | convolution_param { 807 | num_output: 512 808 | kernel_size: 3 809 | stride: 1 810 | weight_filler { 811 | type: "xavier" 812 | } 813 | bias_filler { 814 | type: "constant" 815 | value: 0 816 | } 817 | } 818 | } 819 | layer { 820 | name: "relu4" 821 | type: "PReLU" 822 | bottom: "conv4" 823 | top: "conv4" 824 | } 825 | layer { 826 | name: "pool4" 827 | type: "Pooling" 828 | bottom: "conv4" 829 | top: "pool4" 830 | pooling_param { 831 | pool: MAX 832 | kernel_size: 2 833 | stride: 2 834 | } 835 | } 836 | layer { 837 | name: "conv5_1" 838 | type: "Convolution" 839 | bottom: "pool4" 840 | top: "conv5_1" 841 | param { 842 | lr_mult: 1 843 | decay_mult: 1 844 | } 845 | param { 846 | lr_mult: 0 847 | decay_mult: 0 848 | } 849 | convolution_param { 850 | num_output: 512 851 | kernel_size: 3 852 | stride: 1 853 | pad: 1 854 | weight_filler { 855 | type: "gaussian" 856 | std: 0.01 857 | } 858 | bias_filler { 859 | type: "constant" 860 | value: 0 861 | } 862 | } 863 | } 864 | layer { 865 | name: "relu5_1" 866 | type: "PReLU" 867 | bottom: "conv5_1" 868 | top: "conv5_1" 869 | } 870 | layer { 871 | name: "conv5_2" 872 | type: "Convolution" 873 | bottom: "conv5_1" 874 | top: "conv5_2" 875 | param { 876 | lr_mult: 1 877 | decay_mult: 1 878 | } 879 | param { 880 | lr_mult: 0 881 | decay_mult: 0 882 | } 883 | convolution_param { 884 | num_output: 512 885 | kernel_size: 3 886 | stride: 1 887 | pad: 1 888 | weight_filler { 889 | type: "gaussian" 890 | std: 0.01 891 | } 892 | bias_filler { 893 | type: "constant" 894 | value: 0 895 | } 896 | } 897 | } 898 | layer { 899 | name: "relu5_2" 900 | type: "PReLU" 901 | bottom: "conv5_2" 902 | top: "conv5_2" 903 | } 904 | layer { 905 | name: "res5_2" 906 | type: "Eltwise" 907 | bottom: "pool4" 908 | bottom: "conv5_2" 909 | top: "res5_2" 910 | eltwise_param { 911 | operation: 1 912 | } 913 | } 914 | layer { 915 | name: "conv5_3" 916 | type: "Convolution" 917 | bottom: "res5_2" 918 | top: "conv5_3" 919 | param { 920 | lr_mult: 1 921 | decay_mult: 1 922 | } 923 | param { 924 | lr_mult: 0 925 | decay_mult: 0 926 | } 927 | convolution_param { 928 | num_output: 512 929 | kernel_size: 3 930 | stride: 1 931 | pad: 1 932 | weight_filler { 933 | type: "gaussian" 934 | std: 0.01 935 | } 936 | bias_filler { 937 | type: "constant" 938 | value: 0 939 | } 940 | } 941 | } 942 | layer { 943 | name: "relu5_3" 944 | type: "PReLU" 945 | bottom: "conv5_3" 946 | top: "conv5_3" 947 | } 948 | layer { 949 | name: "conv5_4" 950 | type: "Convolution" 951 | bottom: "conv5_3" 952 | top: "conv5_4" 953 | param { 954 | lr_mult: 1 955 | decay_mult: 1 956 | } 957 | param { 958 | lr_mult: 0 959 | decay_mult: 0 960 | } 961 | convolution_param { 962 | num_output: 512 963 | kernel_size: 3 964 | stride: 1 965 | pad: 1 966 | weight_filler { 967 | type: "gaussian" 968 | std: 0.01 969 | } 970 | bias_filler { 971 | type: "constant" 972 | value: 0 973 | } 974 | } 975 | } 976 | layer { 977 | name: "relu5_4" 978 | type: "PReLU" 979 | bottom: "conv5_4" 980 | top: "conv5_4" 981 | } 982 | layer { 983 | name: "res5_4" 984 | type: "Eltwise" 985 | bottom: "res5_2" 986 | bottom: "conv5_4" 987 | top: "res5_4" 988 | eltwise_param { 989 | operation: 1 990 | } 991 | } 992 | layer { 993 | name: "conv5_5" 994 | type: "Convolution" 995 | bottom: "res5_4" 996 | top: "conv5_5" 997 | param { 998 | lr_mult: 1 999 | decay_mult: 1 1000 | } 1001 | param { 1002 | lr_mult: 0 1003 | decay_mult: 0 1004 | } 1005 | convolution_param { 1006 | num_output: 512 1007 | kernel_size: 3 1008 | stride: 1 1009 | pad: 1 1010 | weight_filler { 1011 | type: "gaussian" 1012 | std: 0.01 1013 | } 1014 | bias_filler { 1015 | type: "constant" 1016 | value: 0 1017 | } 1018 | } 1019 | } 1020 | layer { 1021 | name: "relu5_5" 1022 | type: "PReLU" 1023 | bottom: "conv5_5" 1024 | top: "conv5_5" 1025 | } 1026 | layer { 1027 | name: "conv5_6" 1028 | type: "Convolution" 1029 | bottom: "conv5_5" 1030 | top: "conv5_6" 1031 | param { 1032 | lr_mult: 1 1033 | decay_mult: 1 1034 | } 1035 | param { 1036 | lr_mult: 0 1037 | decay_mult: 0 1038 | } 1039 | convolution_param { 1040 | num_output: 512 1041 | kernel_size: 3 1042 | stride: 1 1043 | pad: 1 1044 | weight_filler { 1045 | type: "gaussian" 1046 | std: 0.01 1047 | } 1048 | bias_filler { 1049 | type: "constant" 1050 | value: 0 1051 | } 1052 | } 1053 | } 1054 | layer { 1055 | name: "relu5_6" 1056 | type: "PReLU" 1057 | bottom: "conv5_6" 1058 | top: "conv5_6" 1059 | } 1060 | layer { 1061 | name: "res5_6" 1062 | type: "Eltwise" 1063 | bottom: "res5_4" 1064 | bottom: "conv5_6" 1065 | top: "res5_6" 1066 | eltwise_param { 1067 | operation: 1 1068 | } 1069 | } 1070 | layer { 1071 | name: "fc5" 1072 | type: "InnerProduct" 1073 | bottom: "res5_6" 1074 | top: "fc5" 1075 | param { 1076 | lr_mult: 1 1077 | decay_mult: 1 1078 | } 1079 | param { 1080 | lr_mult: 2 1081 | decay_mult: 0 1082 | } 1083 | inner_product_param { 1084 | num_output: 512 1085 | weight_filler { 1086 | type: "xavier" 1087 | } 1088 | bias_filler { 1089 | type: "constant" 1090 | value: 0 1091 | } 1092 | } 1093 | } 1094 | -------------------------------------------------------------------------------- /sphereface_model.prototxt: -------------------------------------------------------------------------------- 1 | name: "SphereFaceNet" 2 | layer { 3 | name: "data" 4 | type: "ImageData" 5 | top: "data" 6 | top: "label" 7 | include { 8 | phase: TRAIN 9 | } 10 | transform_param { 11 | mean_value: 127.5 12 | mean_value: 127.5 13 | mean_value: 127.5 14 | scale: 0.0078125 15 | mirror: true 16 | } 17 | image_data_param { 18 | source: "/home/chenweiliang/CASIA-WebFace/CASIA-WebFace-Crop/train.txt" 19 | root_folder: "/home/chenweiliang/CASIA-WebFace/CASIA-WebFace-Crop/" 20 | batch_size: 170 21 | shuffle: true 22 | } 23 | } 24 | 25 | layer { 26 | name: "data" 27 | type: "ImageData" 28 | top: "data" 29 | top: "label" 30 | include { 31 | phase: TEST 32 | } 33 | transform_param { 34 | mean_value: 127.5 35 | mean_value: 127.5 36 | mean_value: 127.5 37 | scale: 0.0078125 38 | mirror: true 39 | } 40 | image_data_param { 41 | source: "/home/chenweiliang/CASIA-WebFace/CASIA-WebFace-Crop/val.txt" 42 | root_folder: "/home/chenweiliang/CASIA-WebFace/CASIA-WebFace-Crop/" 43 | batch_size: 128 44 | shuffle: true 45 | } 46 | } 47 | 48 | ############## CNN Architecture ############### 49 | layer { 50 | name: "conv1a" 51 | type: "Convolution" 52 | bottom: "data" 53 | top: "conv1a" 54 | param { 55 | lr_mult: 1 56 | decay_mult: 1 57 | } 58 | param { 59 | lr_mult: 2 60 | decay_mult: 0 61 | } 62 | convolution_param { 63 | num_output: 32 64 | kernel_size: 3 65 | stride: 1 66 | weight_filler { 67 | type: "xavier" 68 | } 69 | bias_filler { 70 | type: "constant" 71 | value: 0 72 | } 73 | } 74 | } 75 | layer { 76 | name: "relu1a" 77 | type: "PReLU" 78 | bottom: "conv1a" 79 | top: "conv1a" 80 | } 81 | layer { 82 | name: "conv1b" 83 | type: "Convolution" 84 | bottom: "conv1a" 85 | top: "conv1b" 86 | param { 87 | lr_mult: 1 88 | decay_mult: 1 89 | } 90 | param { 91 | lr_mult: 2 92 | decay_mult: 0 93 | } 94 | convolution_param { 95 | num_output: 64 96 | kernel_size: 3 97 | stride: 1 98 | weight_filler { 99 | type: "xavier" 100 | } 101 | bias_filler { 102 | type: "constant" 103 | value: 0 104 | } 105 | } 106 | } 107 | layer { 108 | name: "relu1b" 109 | type: "PReLU" 110 | bottom: "conv1b" 111 | top: "conv1b" 112 | } 113 | layer { 114 | name: "pool1b" 115 | type: "Pooling" 116 | bottom: "conv1b" 117 | top: "pool1b" 118 | pooling_param { 119 | pool: MAX 120 | kernel_size: 2 121 | stride: 2 122 | } 123 | } 124 | layer { 125 | name: "conv2_1" 126 | type: "Convolution" 127 | bottom: "pool1b" 128 | top: "conv2_1" 129 | param { 130 | lr_mult: 1 131 | decay_mult: 1 132 | } 133 | param { 134 | lr_mult: 0 135 | decay_mult: 0 136 | } 137 | convolution_param { 138 | num_output: 64 139 | kernel_size: 3 140 | stride: 1 141 | pad: 1 142 | weight_filler { 143 | type: "gaussian" 144 | std: 0.01 145 | } 146 | bias_filler { 147 | type: "constant" 148 | value: 0 149 | } 150 | } 151 | } 152 | layer { 153 | name: "relu2_1" 154 | type: "PReLU" 155 | bottom: "conv2_1" 156 | top: "conv2_1" 157 | } 158 | layer { 159 | name: "conv2_2" 160 | type: "Convolution" 161 | bottom: "conv2_1" 162 | top: "conv2_2" 163 | param { 164 | lr_mult: 1 165 | decay_mult: 1 166 | } 167 | param { 168 | lr_mult: 0 169 | decay_mult: 0 170 | } 171 | convolution_param { 172 | num_output: 64 173 | kernel_size: 3 174 | stride: 1 175 | pad: 1 176 | weight_filler { 177 | type: "gaussian" 178 | std: 0.01 179 | } 180 | bias_filler { 181 | type: "constant" 182 | value: 0 183 | } 184 | } 185 | } 186 | layer { 187 | name: "relu2_2" 188 | type: "PReLU" 189 | bottom: "conv2_2" 190 | top: "conv2_2" 191 | } 192 | layer { 193 | name: "res2_2" 194 | type: "Eltwise" 195 | bottom: "pool1b" 196 | bottom: "conv2_2" 197 | top: "res2_2" 198 | eltwise_param { 199 | operation: 1 200 | } 201 | } 202 | layer { 203 | name: "conv2" 204 | type: "Convolution" 205 | bottom: "res2_2" 206 | top: "conv2" 207 | param { 208 | lr_mult: 1 209 | decay_mult: 1 210 | } 211 | param { 212 | lr_mult: 2 213 | decay_mult: 0 214 | } 215 | convolution_param { 216 | num_output: 128 217 | kernel_size: 3 218 | stride: 1 219 | weight_filler { 220 | type: "xavier" 221 | } 222 | bias_filler { 223 | type: "constant" 224 | value: 0 225 | } 226 | } 227 | } 228 | layer { 229 | name: "relu2" 230 | type: "PReLU" 231 | bottom: "conv2" 232 | top: "conv2" 233 | } 234 | layer { 235 | name: "pool2" 236 | type: "Pooling" 237 | bottom: "conv2" 238 | top: "pool2" 239 | pooling_param { 240 | pool: MAX 241 | kernel_size: 2 242 | stride: 2 243 | } 244 | } 245 | layer { 246 | name: "conv3_1" 247 | type: "Convolution" 248 | bottom: "pool2" 249 | top: "conv3_1" 250 | param { 251 | lr_mult: 1 252 | decay_mult: 1 253 | } 254 | param { 255 | lr_mult: 0 256 | decay_mult: 0 257 | } 258 | convolution_param { 259 | num_output: 128 260 | kernel_size: 3 261 | stride: 1 262 | pad: 1 263 | weight_filler { 264 | type: "gaussian" 265 | std: 0.01 266 | } 267 | bias_filler { 268 | type: "constant" 269 | value: 0 270 | } 271 | } 272 | } 273 | layer { 274 | name: "relu3_1" 275 | type: "PReLU" 276 | bottom: "conv3_1" 277 | top: "conv3_1" 278 | } 279 | layer { 280 | name: "conv3_2" 281 | type: "Convolution" 282 | bottom: "conv3_1" 283 | top: "conv3_2" 284 | param { 285 | lr_mult: 1 286 | decay_mult: 1 287 | } 288 | param { 289 | lr_mult: 0 290 | decay_mult: 0 291 | } 292 | convolution_param { 293 | num_output: 128 294 | kernel_size: 3 295 | stride: 1 296 | pad: 1 297 | weight_filler { 298 | type: "gaussian" 299 | std: 0.01 300 | } 301 | bias_filler { 302 | type: "constant" 303 | value: 0 304 | } 305 | } 306 | } 307 | layer { 308 | name: "relu3_2" 309 | type: "PReLU" 310 | bottom: "conv3_2" 311 | top: "conv3_2" 312 | } 313 | layer { 314 | name: "res3_2" 315 | type: "Eltwise" 316 | bottom: "pool2" 317 | bottom: "conv3_2" 318 | top: "res3_2" 319 | eltwise_param { 320 | operation: 1 321 | } 322 | } 323 | layer { 324 | name: "conv3_3" 325 | type: "Convolution" 326 | bottom: "res3_2" 327 | top: "conv3_3" 328 | param { 329 | lr_mult: 1 330 | decay_mult: 1 331 | } 332 | param { 333 | lr_mult: 0 334 | decay_mult: 0 335 | } 336 | convolution_param { 337 | num_output: 128 338 | kernel_size: 3 339 | stride: 1 340 | pad: 1 341 | weight_filler { 342 | type: "gaussian" 343 | std: 0.01 344 | } 345 | bias_filler { 346 | type: "constant" 347 | value: 0 348 | } 349 | } 350 | } 351 | layer { 352 | name: "relu3_3" 353 | type: "PReLU" 354 | bottom: "conv3_3" 355 | top: "conv3_3" 356 | } 357 | layer { 358 | name: "conv3_4" 359 | type: "Convolution" 360 | bottom: "conv3_3" 361 | top: "conv3_4" 362 | param { 363 | lr_mult: 1 364 | decay_mult: 1 365 | } 366 | param { 367 | lr_mult: 0 368 | decay_mult: 0 369 | } 370 | convolution_param { 371 | num_output: 128 372 | kernel_size: 3 373 | stride: 1 374 | pad: 1 375 | weight_filler { 376 | type: "gaussian" 377 | std: 0.01 378 | } 379 | bias_filler { 380 | type: "constant" 381 | value: 0 382 | } 383 | } 384 | } 385 | layer { 386 | name: "relu3_4" 387 | type: "PReLU" 388 | bottom: "conv3_4" 389 | top: "conv3_4" 390 | } 391 | layer { 392 | name: "res3_4" 393 | type: "Eltwise" 394 | bottom: "res3_2" 395 | bottom: "conv3_4" 396 | top: "res3_4" 397 | eltwise_param { 398 | operation: 1 399 | } 400 | } 401 | 402 | layer { 403 | name: "conv3" 404 | type: "Convolution" 405 | bottom: "res3_4" 406 | top: "conv3" 407 | param { 408 | lr_mult: 1 409 | decay_mult: 1 410 | } 411 | param { 412 | lr_mult: 2 413 | decay_mult: 0 414 | } 415 | convolution_param { 416 | num_output: 256 417 | kernel_size: 3 418 | stride: 1 419 | weight_filler { 420 | type: "xavier" 421 | } 422 | bias_filler { 423 | type: "constant" 424 | value: 0 425 | } 426 | } 427 | } 428 | layer { 429 | name: "relu3" 430 | type: "PReLU" 431 | bottom: "conv3" 432 | top: "conv3" 433 | } 434 | layer { 435 | name: "pool3" 436 | type: "Pooling" 437 | bottom: "conv3" 438 | top: "pool3" 439 | pooling_param { 440 | pool: MAX 441 | kernel_size: 2 442 | stride: 2 443 | } 444 | } 445 | layer { 446 | name: "conv4_1" 447 | type: "Convolution" 448 | bottom: "pool3" 449 | top: "conv4_1" 450 | param { 451 | lr_mult: 1 452 | decay_mult: 1 453 | } 454 | param { 455 | lr_mult: 0 456 | decay_mult: 0 457 | } 458 | convolution_param { 459 | num_output: 256 460 | kernel_size: 3 461 | stride: 1 462 | pad: 1 463 | weight_filler { 464 | type: "gaussian" 465 | std: 0.01 466 | } 467 | bias_filler { 468 | type: "constant" 469 | value: 0 470 | } 471 | } 472 | } 473 | layer { 474 | name: "relu4_1" 475 | type: "PReLU" 476 | bottom: "conv4_1" 477 | top: "conv4_1" 478 | } 479 | layer { 480 | name: "conv4_2" 481 | type: "Convolution" 482 | bottom: "conv4_1" 483 | top: "conv4_2" 484 | param { 485 | lr_mult: 1 486 | decay_mult: 1 487 | } 488 | param { 489 | lr_mult: 0 490 | decay_mult: 0 491 | } 492 | convolution_param { 493 | num_output: 256 494 | kernel_size: 3 495 | stride: 1 496 | pad: 1 497 | weight_filler { 498 | type: "gaussian" 499 | std: 0.01 500 | } 501 | bias_filler { 502 | type: "constant" 503 | value: 0 504 | } 505 | } 506 | } 507 | layer { 508 | name: "relu4_2" 509 | type: "PReLU" 510 | bottom: "conv4_2" 511 | top: "conv4_2" 512 | } 513 | layer { 514 | name: "res4_2" 515 | type: "Eltwise" 516 | bottom: "pool3" 517 | bottom: "conv4_2" 518 | top: "res4_2" 519 | eltwise_param { 520 | operation: 1 521 | } 522 | } 523 | layer { 524 | name: "conv4_3" 525 | type: "Convolution" 526 | bottom: "res4_2" 527 | top: "conv4_3" 528 | param { 529 | lr_mult: 1 530 | decay_mult: 1 531 | } 532 | param { 533 | lr_mult: 0 534 | decay_mult: 0 535 | } 536 | convolution_param { 537 | num_output: 256 538 | kernel_size: 3 539 | stride: 1 540 | pad: 1 541 | weight_filler { 542 | type: "gaussian" 543 | std: 0.01 544 | } 545 | bias_filler { 546 | type: "constant" 547 | value: 0 548 | } 549 | } 550 | } 551 | layer { 552 | name: "relu4_3" 553 | type: "PReLU" 554 | bottom: "conv4_3" 555 | top: "conv4_3" 556 | } 557 | layer { 558 | name: "conv4_4" 559 | type: "Convolution" 560 | bottom: "conv4_3" 561 | top: "conv4_4" 562 | param { 563 | lr_mult: 1 564 | decay_mult: 1 565 | } 566 | param { 567 | lr_mult: 0 568 | decay_mult: 0 569 | } 570 | convolution_param { 571 | num_output: 256 572 | kernel_size: 3 573 | stride: 1 574 | pad: 1 575 | weight_filler { 576 | type: "gaussian" 577 | std: 0.01 578 | } 579 | bias_filler { 580 | type: "constant" 581 | value: 0 582 | } 583 | } 584 | } 585 | layer { 586 | name: "relu4_4" 587 | type: "PReLU" 588 | bottom: "conv4_4" 589 | top: "conv4_4" 590 | } 591 | layer { 592 | name: "res4_4" 593 | type: "Eltwise" 594 | bottom: "res4_2" 595 | bottom: "conv4_4" 596 | top: "res4_4" 597 | eltwise_param { 598 | operation: 1 599 | } 600 | } 601 | layer { 602 | name: "conv4_5" 603 | type: "Convolution" 604 | bottom: "res4_4" 605 | top: "conv4_5" 606 | param { 607 | lr_mult: 1 608 | decay_mult: 1 609 | } 610 | param { 611 | lr_mult: 0 612 | decay_mult: 0 613 | } 614 | convolution_param { 615 | num_output: 256 616 | kernel_size: 3 617 | stride: 1 618 | pad: 1 619 | weight_filler { 620 | type: "gaussian" 621 | std: 0.01 622 | } 623 | bias_filler { 624 | type: "constant" 625 | value: 0 626 | } 627 | } 628 | } 629 | layer { 630 | name: "relu4_5" 631 | type: "PReLU" 632 | bottom: "conv4_5" 633 | top: "conv4_5" 634 | } 635 | layer { 636 | name: "conv4_6" 637 | type: "Convolution" 638 | bottom: "conv4_5" 639 | top: "conv4_6" 640 | param { 641 | lr_mult: 1 642 | decay_mult: 1 643 | } 644 | param { 645 | lr_mult: 0 646 | decay_mult: 0 647 | } 648 | convolution_param { 649 | num_output: 256 650 | kernel_size: 3 651 | stride: 1 652 | pad: 1 653 | weight_filler { 654 | type: "gaussian" 655 | std: 0.01 656 | } 657 | bias_filler { 658 | type: "constant" 659 | value: 0 660 | } 661 | } 662 | } 663 | layer { 664 | name: "relu4_6" 665 | type: "PReLU" 666 | bottom: "conv4_6" 667 | top: "conv4_6" 668 | } 669 | layer { 670 | name: "res4_6" 671 | type: "Eltwise" 672 | bottom: "res4_4" 673 | bottom: "conv4_6" 674 | top: "res4_6" 675 | eltwise_param { 676 | operation: 1 677 | } 678 | } 679 | layer { 680 | name: "conv4_7" 681 | type: "Convolution" 682 | bottom: "res4_6" 683 | top: "conv4_7" 684 | param { 685 | lr_mult: 1 686 | decay_mult: 1 687 | } 688 | param { 689 | lr_mult: 0 690 | decay_mult: 0 691 | } 692 | convolution_param { 693 | num_output: 256 694 | kernel_size: 3 695 | stride: 1 696 | pad: 1 697 | weight_filler { 698 | type: "gaussian" 699 | std: 0.01 700 | } 701 | bias_filler { 702 | type: "constant" 703 | value: 0 704 | } 705 | } 706 | } 707 | layer { 708 | name: "relu4_7" 709 | type: "PReLU" 710 | bottom: "conv4_7" 711 | top: "conv4_7" 712 | } 713 | layer { 714 | name: "conv4_8" 715 | type: "Convolution" 716 | bottom: "conv4_7" 717 | top: "conv4_8" 718 | param { 719 | lr_mult: 1 720 | decay_mult: 1 721 | } 722 | param { 723 | lr_mult: 0 724 | decay_mult: 0 725 | } 726 | convolution_param { 727 | num_output: 256 728 | kernel_size: 3 729 | stride: 1 730 | pad: 1 731 | weight_filler { 732 | type: "gaussian" 733 | std: 0.01 734 | } 735 | bias_filler { 736 | type: "constant" 737 | value: 0 738 | } 739 | } 740 | } 741 | layer { 742 | name: "relu4_8" 743 | type: "PReLU" 744 | bottom: "conv4_8" 745 | top: "conv4_8" 746 | } 747 | layer { 748 | name: "res4_8" 749 | type: "Eltwise" 750 | bottom: "res4_6" 751 | bottom: "conv4_8" 752 | top: "res4_8" 753 | eltwise_param { 754 | operation: 1 755 | } 756 | } 757 | layer { 758 | name: "conv4_9" 759 | type: "Convolution" 760 | bottom: "res4_8" 761 | top: "conv4_9" 762 | param { 763 | lr_mult: 1 764 | decay_mult: 1 765 | } 766 | param { 767 | lr_mult: 0 768 | decay_mult: 0 769 | } 770 | convolution_param { 771 | num_output: 256 772 | kernel_size: 3 773 | stride: 1 774 | pad: 1 775 | weight_filler { 776 | type: "gaussian" 777 | std: 0.01 778 | } 779 | bias_filler { 780 | type: "constant" 781 | value: 0 782 | } 783 | } 784 | } 785 | layer { 786 | name: "relu4_9" 787 | type: "PReLU" 788 | bottom: "conv4_9" 789 | top: "conv4_9" 790 | } 791 | layer { 792 | name: "conv4_10" 793 | type: "Convolution" 794 | bottom: "conv4_9" 795 | top: "conv4_10" 796 | param { 797 | lr_mult: 1 798 | decay_mult: 1 799 | } 800 | param { 801 | lr_mult: 0 802 | decay_mult: 0 803 | } 804 | convolution_param { 805 | num_output: 256 806 | kernel_size: 3 807 | stride: 1 808 | pad: 1 809 | weight_filler { 810 | type: "gaussian" 811 | std: 0.01 812 | } 813 | bias_filler { 814 | type: "constant" 815 | value: 0 816 | } 817 | } 818 | } 819 | layer { 820 | name: "relu4_10" 821 | type: "PReLU" 822 | bottom: "conv4_10" 823 | top: "conv4_10" 824 | } 825 | layer { 826 | name: "res4_10" 827 | type: "Eltwise" 828 | bottom: "res4_8" 829 | bottom: "conv4_10" 830 | top: "res4_10" 831 | eltwise_param { 832 | operation: 1 833 | } 834 | } 835 | layer { 836 | name: "conv4" 837 | type: "Convolution" 838 | bottom: "res4_10" 839 | top: "conv4" 840 | param { 841 | lr_mult: 1 842 | decay_mult: 1 843 | } 844 | param { 845 | lr_mult: 2 846 | decay_mult: 0 847 | } 848 | convolution_param { 849 | num_output: 512 850 | kernel_size: 3 851 | stride: 1 852 | weight_filler { 853 | type: "xavier" 854 | } 855 | bias_filler { 856 | type: "constant" 857 | value: 0 858 | } 859 | } 860 | } 861 | layer { 862 | name: "relu4" 863 | type: "PReLU" 864 | bottom: "conv4" 865 | top: "conv4" 866 | } 867 | layer { 868 | name: "pool4" 869 | type: "Pooling" 870 | bottom: "conv4" 871 | top: "pool4" 872 | pooling_param { 873 | pool: MAX 874 | kernel_size: 2 875 | stride: 2 876 | } 877 | } 878 | layer { 879 | name: "conv5_1" 880 | type: "Convolution" 881 | bottom: "pool4" 882 | top: "conv5_1" 883 | param { 884 | lr_mult: 1 885 | decay_mult: 1 886 | } 887 | param { 888 | lr_mult: 0 889 | decay_mult: 0 890 | } 891 | convolution_param { 892 | num_output: 512 893 | kernel_size: 3 894 | stride: 1 895 | pad: 1 896 | weight_filler { 897 | type: "gaussian" 898 | std: 0.01 899 | } 900 | bias_filler { 901 | type: "constant" 902 | value: 0 903 | } 904 | } 905 | } 906 | layer { 907 | name: "relu5_1" 908 | type: "PReLU" 909 | bottom: "conv5_1" 910 | top: "conv5_1" 911 | } 912 | layer { 913 | name: "conv5_2" 914 | type: "Convolution" 915 | bottom: "conv5_1" 916 | top: "conv5_2" 917 | param { 918 | lr_mult: 1 919 | decay_mult: 1 920 | } 921 | param { 922 | lr_mult: 0 923 | decay_mult: 0 924 | } 925 | convolution_param { 926 | num_output: 512 927 | kernel_size: 3 928 | stride: 1 929 | pad: 1 930 | weight_filler { 931 | type: "gaussian" 932 | std: 0.01 933 | } 934 | bias_filler { 935 | type: "constant" 936 | value: 0 937 | } 938 | } 939 | } 940 | layer { 941 | name: "relu5_2" 942 | type: "PReLU" 943 | bottom: "conv5_2" 944 | top: "conv5_2" 945 | } 946 | layer { 947 | name: "res5_2" 948 | type: "Eltwise" 949 | bottom: "pool4" 950 | bottom: "conv5_2" 951 | top: "res5_2" 952 | eltwise_param { 953 | operation: 1 954 | } 955 | } 956 | layer { 957 | name: "conv5_3" 958 | type: "Convolution" 959 | bottom: "res5_2" 960 | top: "conv5_3" 961 | param { 962 | lr_mult: 1 963 | decay_mult: 1 964 | } 965 | param { 966 | lr_mult: 0 967 | decay_mult: 0 968 | } 969 | convolution_param { 970 | num_output: 512 971 | kernel_size: 3 972 | stride: 1 973 | pad: 1 974 | weight_filler { 975 | type: "gaussian" 976 | std: 0.01 977 | } 978 | bias_filler { 979 | type: "constant" 980 | value: 0 981 | } 982 | } 983 | } 984 | layer { 985 | name: "relu5_3" 986 | type: "PReLU" 987 | bottom: "conv5_3" 988 | top: "conv5_3" 989 | } 990 | layer { 991 | name: "conv5_4" 992 | type: "Convolution" 993 | bottom: "conv5_3" 994 | top: "conv5_4" 995 | param { 996 | lr_mult: 1 997 | decay_mult: 1 998 | } 999 | param { 1000 | lr_mult: 0 1001 | decay_mult: 0 1002 | } 1003 | convolution_param { 1004 | num_output: 512 1005 | kernel_size: 3 1006 | stride: 1 1007 | pad: 1 1008 | weight_filler { 1009 | type: "gaussian" 1010 | std: 0.01 1011 | } 1012 | bias_filler { 1013 | type: "constant" 1014 | value: 0 1015 | } 1016 | } 1017 | } 1018 | layer { 1019 | name: "relu5_4" 1020 | type: "PReLU" 1021 | bottom: "conv5_4" 1022 | top: "conv5_4" 1023 | } 1024 | layer { 1025 | name: "res5_4" 1026 | type: "Eltwise" 1027 | bottom: "res5_2" 1028 | bottom: "conv5_4" 1029 | top: "res5_4" 1030 | eltwise_param { 1031 | operation: 1 1032 | } 1033 | } 1034 | layer { 1035 | name: "conv5_5" 1036 | type: "Convolution" 1037 | bottom: "res5_4" 1038 | top: "conv5_5" 1039 | param { 1040 | lr_mult: 1 1041 | decay_mult: 1 1042 | } 1043 | param { 1044 | lr_mult: 0 1045 | decay_mult: 0 1046 | } 1047 | convolution_param { 1048 | num_output: 512 1049 | kernel_size: 3 1050 | stride: 1 1051 | pad: 1 1052 | weight_filler { 1053 | type: "gaussian" 1054 | std: 0.01 1055 | } 1056 | bias_filler { 1057 | type: "constant" 1058 | value: 0 1059 | } 1060 | } 1061 | } 1062 | layer { 1063 | name: "relu5_5" 1064 | type: "PReLU" 1065 | bottom: "conv5_5" 1066 | top: "conv5_5" 1067 | } 1068 | layer { 1069 | name: "conv5_6" 1070 | type: "Convolution" 1071 | bottom: "conv5_5" 1072 | top: "conv5_6" 1073 | param { 1074 | lr_mult: 1 1075 | decay_mult: 1 1076 | } 1077 | param { 1078 | lr_mult: 0 1079 | decay_mult: 0 1080 | } 1081 | convolution_param { 1082 | num_output: 512 1083 | kernel_size: 3 1084 | stride: 1 1085 | pad: 1 1086 | weight_filler { 1087 | type: "gaussian" 1088 | std: 0.01 1089 | } 1090 | bias_filler { 1091 | type: "constant" 1092 | value: 0 1093 | } 1094 | } 1095 | } 1096 | layer { 1097 | name: "relu5_6" 1098 | type: "PReLU" 1099 | bottom: "conv5_6" 1100 | top: "conv5_6" 1101 | } 1102 | layer { 1103 | name: "res5_6" 1104 | type: "Eltwise" 1105 | bottom: "res5_4" 1106 | bottom: "conv5_6" 1107 | top: "res5_6" 1108 | eltwise_param { 1109 | operation: 1 1110 | } 1111 | } 1112 | layer { 1113 | name: "fc5" 1114 | type: "InnerProduct" 1115 | bottom: "res5_6" 1116 | top: "fc5" 1117 | param { 1118 | lr_mult: 1 1119 | decay_mult: 1 1120 | } 1121 | param { 1122 | lr_mult: 2 1123 | decay_mult: 0 1124 | } 1125 | inner_product_param { 1126 | num_output: 512 1127 | weight_filler { 1128 | type: "xavier" 1129 | } 1130 | bias_filler { 1131 | type: "constant" 1132 | value: 0 1133 | } 1134 | } 1135 | } 1136 | ############### A-Softmax Loss ############## 1137 | layer { 1138 | name: "fc6" 1139 | type: "MarginInnerProduct" 1140 | bottom: "fc5" 1141 | bottom: "label" 1142 | top: "fc6" 1143 | top: "lambda" 1144 | param { 1145 | lr_mult: 1 1146 | decay_mult: 1 1147 | } 1148 | margin_inner_product_param { 1149 | num_output: 10575 1150 | type: QUADRUPLE 1151 | weight_filler { 1152 | type: "xavier" 1153 | } 1154 | base: 3.6 1155 | gamma: 0.12 1156 | power: 1 1157 | lambda_min: 3.6 1158 | iteration: 0 1159 | } 1160 | } 1161 | layer { 1162 | name: "softmax_loss" 1163 | type: "SoftmaxWithLoss" 1164 | bottom: "fc6" 1165 | bottom: "label" 1166 | top: "softmax_loss" 1167 | } 1168 | layer { 1169 | name: "accuracy" 1170 | type: "Accuracy" 1171 | bottom: "fc6" 1172 | bottom: "label" 1173 | top: "accuracy" 1174 | include { 1175 | phase: TEST 1176 | } 1177 | } 1178 | 1179 | -------------------------------------------------------------------------------- /sphereface_solver.prototxt: -------------------------------------------------------------------------------- 1 | net: "prototxt/sphereface_model.prototxt" 2 | #test_iter: 165 3 | #test_interval: 1000 4 | 5 | base_lr: 0.01 6 | lr_policy: "multistep" 7 | gamma: 0.1 8 | 9 | stepvalue: 20000 10 | stepvalue: 24000 11 | stepvalue: 28000 12 | max_iter: 28000 13 | 14 | display: 100 15 | momentum: 0.9 16 | weight_decay: 0.0005 17 | snapshot: 1000 18 | snapshot_prefix: "model/sphereface" 19 | 20 | solver_mode: GPU 21 | --------------------------------------------------------------------------------