├── util ├── __init__.py ├── cosine_lr_scheduler.py ├── verification.py └── utils.py ├── images ├── table1.png ├── table2.png ├── table3.png ├── train.png └── face_quality.jpg ├── .gitignore ├── test_faces ├── 13-Adam_Ant_2.jpg ├── 16-Adam_Ant_1.jpg ├── 2-Elijah_Wood_1.jpg ├── 21-Bob_Hope_3.jpg ├── 226-Art_Howe_2.jpg ├── 238-Andy_Dick_1.jpg ├── 28-Don_King_3.jpg ├── 299-Ben_Cohen_2.jpg ├── 3-Emelie_Loit_2.jpg ├── 32-Abdullah_2.jpg ├── 4-Emelie_Loit_2.jpg ├── 44-Doc_Rivers_3.jpg ├── 5-Emelie_Loit_2.jpg ├── 55-Eric_Lloyd_1.jpg ├── 6-Celine_Dion_1.jpg ├── 64-Iban_Mayo_3.jpg ├── 68-Gore_Vidal_2.jpg ├── 8-Guy_Ritchie_3.jpg ├── 89-Andy_Hebb_1.jpg ├── 9-Guy_Ritchie_3.jpg ├── 95-Dan_Dickau_1.jpg ├── 10-Brent_Coles_2.jpg ├── 107-Alfred_Ford_3.jpg ├── 109-Ed_Sullivan_1.jpg ├── 11-Brent_Coles_2.jpg ├── 110-Alexa_Vega_3.jpg ├── 111-Dusty_Baker_1.jpg ├── 113-Aidan_Quinn_3.jpg ├── 116-Daryl_Smith_1.jpg ├── 124-Aaron_Pena_2.jpg ├── 125-Aaron_Pena_2.jpg ├── 128-Amy_Cotton_2.jpg ├── 135-Andy_Bryant_3.jpg ├── 153-Herb_Sendek_3.jpg ├── 154-David_Bowie_1.jpg ├── 156-Ismail_Khan_1.jpg ├── 157-Ian_Huntley_2.jpg ├── 161-Dan_Morales_3.jpg ├── 165-Hu_Maoyuan_3.jpg ├── 167-Greg_Kinsey_2.jpg ├── 173-Elmar_Brok_3.jpg ├── 174-Elmar_Brok_3.jpg ├── 186-Dick_Armey_2.jpg ├── 187-Andy_Garcia_3.jpg ├── 188-Alex_Wallau_2.jpg ├── 190-Garry_McCoy_1.jpg ├── 208-Eric_Taino_3.jpg ├── 210-Carlos_Mesa_1.jpg ├── 212-Fruit_Chan_3.jpg ├── 218-Bob_Geldof_1.jpg ├── 220-Chan_Gailey_2.jpg ├── 234-Eve_Ensler_1.jpg ├── 24-Celso_Lafer_2.jpg ├── 240-James_Brown_3.jpg ├── 242-Aaron_Guiel_1.jpg ├── 250-Butch_Davis_3.jpg ├── 251-Bob_Melvin_2.jpg ├── 254-Don_Boudria_1.jpg ├── 26-Holly_Hunter_3.jpg ├── 260-Danny_Ainge_2.jpg ├── 262-Bonnie_Hunt_2.jpg ├── 263-Ian_Gillan_2.jpg ├── 278-Brian_Kerr_3.jpg ├── 282-Hee-Won_Han_1.jpg ├── 304-Bryan_Adams_3.jpg ├── 305-Bryan_Adams_3.jpg ├── 309-Gary_Condit_3.jpg ├── 313-Hugh_Grant_2.jpg ├── 315-Celine_Dion_2.jpg ├── 316-Frank_Hsieh_2.jpg ├── 317-Frank_Hsieh_2.jpg ├── 320-Imran_Khan_2.jpg ├── 35-Gideon_Yago_2.jpg ├── 43-Hugo_Chavez_3.jpg ├── 45-Aaron_Tippin_2.jpg ├── 47-Douglas_Paal_3.jpg ├── 49-Harry_Kalas_2.jpg ├── 70-Hugh_Hefner_2.jpg ├── 71-Gene_Sauers_1.jpg ├── 73-Fatmir_Limaj_1.jpg ├── 74-Fatmir_Limaj_1.jpg ├── 76-Bryan_Thomas_2.jpg ├── 80-Bela_Karolyi_3.jpg ├── 81-Claire_Danes_3.jpg ├── 90-Edward_Burns_3.jpg ├── 91-Eli_Stutsman_2.jpg ├── 92-James_Gibson_1.jpg ├── 1-Harry_Belafonte_1.jpg ├── 101-Jack_Osbourne_2.jpg ├── 102-Daniel_Bruehl_2.jpg ├── 103-Clint_Howard_3.jpg ├── 104-James_Franco_2.jpg ├── 105-Bill_Herrion_1.jpg ├── 106-Arturo_Gatti_2.jpg ├── 112-Claudio_Abbado_3.jpg ├── 115-Elizabeth_Pena_2.jpg ├── 118-Ahmed_Qureia_1.jpg ├── 119-Ahmed_Qureia_1.jpg ├── 12-Corinne_Coman_1.jpg ├── 121-David_Canary_3.jpg ├── 122-David_Canary_3.jpg ├── 129-Jamling_Norgay_1.jpg ├── 130-David_Arquette_3.jpg ├── 131-David_Arquette_3.jpg ├── 133-Azmi_Bishara_3.jpg ├── 134-Azmi_Bishara_3.jpg ├── 136-Earl_Scruggs_3.jpg ├── 137-Grady_Little_2.jpg ├── 14-Claudio_Lopez_1.jpg ├── 140-Holly_Hunter_1.jpg ├── 144-Dan_Duquette_3.jpg ├── 145-Edward_Seaga_1.jpg ├── 147-Eddie_Murray_3.jpg ├── 148-Chung_Mong-hun_3.jpg ├── 149-Chuck_Finley_1.jpg ├── 150-Bertie_Ahern_3.jpg ├── 151-Geoffrey_Rush_1.jpg ├── 155-Eladio_Larez_3.jpg ├── 158-Daja_Bedanova_2.jpg ├── 160-Dennis_Johnson_1.jpg ├── 168-Hisao_Oguchi_3.jpg ├── 17-Brendan_Gaughan_2.jpg ├── 170-Bobby_Jackson_2.jpg ├── 171-Albaro_Recoba_1.jpg ├── 175-Diana_Taylor_2.jpg ├── 176-Diana_Taylor_2.jpg ├── 179-Ari_Fleischer_1.jpg ├── 18-David_Shayler_3.jpg ├── 183-Andre_Bucher_1.jpg ├── 185-Buford_Blount_2.jpg ├── 189-Carla_Tricoli_2.jpg ├── 191-Bill_Sizemore_2.jpg ├── 192-Aron_Ralston_3.jpg ├── 193-Brook_Robinson_1.jpg ├── 194-Brook_Robinson_1.jpg ├── 195-Brian_Mulroney_2.jpg ├── 196-Dave_Wannstedt_2.jpg ├── 197-Eli_Stutsman_3.jpg ├── 198-Bill_Mauldin_1.jpg ├── 202-Gerard_Butler_2.jpg ├── 203-Dolly_Parton_1.jpg ├── 204-Baz_Luhrmann_3.jpg ├── 205-Baz_Luhrmann_3.jpg ├── 206-Abel_Aguilar_2.jpg ├── 209-Hipolito_Mejia_1.jpg ├── 213-James_Spalding_2.jpg ├── 215-Abel_Pacheco_2.jpg ├── 216-Carolina_Barco_2.jpg ├── 217-Carolina_Barco_2.jpg ├── 219-Akbar_Al_Baker_3.jpg ├── 221-Daisy_Fuentes_2.jpg ├── 223-Alan_Mulally_3.jpg ├── 224-Itzhak_Perlman_1.jpg ├── 227-Claire_Tomalin_3.jpg ├── 228-Herb_Dhaliwal_2.jpg ├── 230-Aitor_Gonzalez_3.jpg ├── 231-Aitor_Gonzalez_3.jpg ├── 232-Aitor_Gonzalez_3.jpg ├── 233-Aitor_Gonzalez_3.jpg ├── 236-Geoffrey_Rush_2.jpg ├── 237-Amram_Mitzna_3.jpg ├── 245-Heath_Ledger_1.jpg ├── 246-Heath_Ledger_1.jpg ├── 247-Gil_de_Ferran_1.jpg ├── 256-Bobby_Kielty_3.jpg ├── 257-Angela_Merkel_1.jpg ├── 258-Angela_Merkel_1.jpg ├── 261-Frank_Pallone_1.jpg ├── 266-Coleen_Rowley_3.jpg ├── 269-Donny_Osmond_3.jpg ├── 271-Gary_Gitnick_3.jpg ├── 273-Craig_Wilson_1.jpg ├── 277-Amanda_Bynes_2.jpg ├── 281-Gloria_Allred_3.jpg ├── 283-Bijan_Darvish_1.jpg ├── 285-Darrell_Issa_1.jpg ├── 286-Freddy_Garcia_1.jpg ├── 287-James_Lockhart_2.jpg ├── 288-Eric_Lindros_2.jpg ├── 29-Elizabeth_Smart_1.jpg ├── 292-Dave_McNally_1.jpg ├── 298-Colin_Prescot_1.jpg ├── 30-Elizabeth_Smart_1.jpg ├── 301-Horst_Koehler_2.jpg ├── 302-Hermann_Maier_1.jpg ├── 303-Hermann_Maier_1.jpg ├── 306-Francis_Crick_2.jpg ├── 31-Barry_Williams_3.jpg ├── 310-Agbani_Darego_2.jpg ├── 311-Chris_Pronger_2.jpg ├── 312-James_Murdoch_2.jpg ├── 319-Dragan_Covic_3.jpg ├── 322-Daniel_Zelman_2.jpg ├── 323-Daniel_Zelman_2.jpg ├── 36-Dominik_Hrbaty_3.jpg ├── 40-Jack_Nicholson_2.jpg ├── 41-David_McCallum_1.jpg ├── 42-David_McCallum_1.jpg ├── 46-Gloria_Gaynor_3.jpg ├── 48-James_Traficant_1.jpg ├── 53-Chris_Cornell_1.jpg ├── 54-Allan_Houston_1.jpg ├── 57-Edgar_Savisaar_1.jpg ├── 58-Edgar_Savisaar_1.jpg ├── 59-Debra_Messing_1.jpg ├── 62-Alejandro_Avila_3.jpg ├── 63-Dianne_Reeves_1.jpg ├── 67-Ivan_Helguera_3.jpg ├── 7-James_Wolfensohn_2.jpg ├── 77-Charley_Armey_3.jpg ├── 82-Ester_Canadas_1.jpg ├── 83-Fernando_Alonso_1.jpg ├── 84-Evan_Marriott_3.jpg ├── 86-Carlos_Bianchi_2.jpg ├── 88-Carmen_Electra_1.jpg ├── 93-Daniel_Scioli_1.jpg ├── 94-Islam_Karimov_1.jpg ├── 96-Charles_Bronson_1.jpg ├── 100-David_McCullough_3.jpg ├── 108-Franco_Frattini_2.jpg ├── 117-Connie_Freydell_2.jpg ├── 123-Dennis_Erickson_2.jpg ├── 127-Hamid_Reza_Asefi_1.jpg ├── 132-Barbara_Walters_3.jpg ├── 138-Bertrand_Bonello_2.jpg ├── 139-Elizabeth_Hurley_1.jpg ├── 141-Emyr_Jones_Parry_1.jpg ├── 142-Alejandro_Toledo_3.jpg ├── 146-Dennis_Erickson_3.jpg ├── 159-Cecile_de_France_1.jpg ├── 163-Felipe_De_Borbon_3.jpg ├── 177-Jackie_Sherrill_2.jpg ├── 178-Christian_Wulff_2.jpg ├── 182-Flavia_Pennetta_3.jpg ├── 199-David_McCullough_1.jpg ├── 201-Irina_Yatchenko_2.jpg ├── 207-David_Coulthard_1.jpg ├── 211-Antonio_Bernardo_2.jpg ├── 214-Bill_Richardson_3.jpg ├── 222-Denise_van_Outen_1.jpg ├── 23-Andrew_Firestone_1.jpg ├── 235-Gisele_Bundchen_1.jpg ├── 241-Enrique_Bolanos_1.jpg ├── 243-Anderson_Varejao_3.jpg ├── 249-Aretha_Franklin_1.jpg ├── 25-Dominique_Perben_1.jpg ├── 252-Daniel_Day-Lewis_1.jpg ├── 255-Albert_Montanes_3.jpg ├── 264-Abbas_Kiarostami_3.jpg ├── 265-James_Brazelton_2.jpg ├── 27-Filippo_Volandri_2.jpg ├── 272-Barbara_De_Brun_1.jpg ├── 274-Glafcos_Clerides_2.jpg ├── 279-Gustavo_Cisneros_1.jpg ├── 284-Gillian_Anderson_3.jpg ├── 289-Anna_Chicherova_2.jpg ├── 293-Elena_Dementieva_2.jpg ├── 296-Floyd_Mayweather_2.jpg ├── 318-Brennon_Leighton_1.jpg ├── 321-Douglas_Gansler_3.jpg ├── 34-Barbra_Streisand_3.jpg ├── 39-Brian_Scalabrine_2.jpg ├── 50-Gwendal_Peizerat_2.jpg ├── 51-Charles_Grassley_2.jpg ├── 52-Clifford_Etienne_3.jpg ├── 56-Evander_Holyfield_3.jpg ├── 60-Arsinee_Khanjian_2.jpg ├── 61-Denzel_Washington_3.jpg ├── 66-Alexandre_Daigle_3.jpg ├── 69-Daniele_Nardello_3.jpg ├── 72-Alanis_Morissette_1.jpg ├── 78-David_Collenette_1.jpg ├── 79-Andrei_Nikolishin_2.jpg ├── 85-Emanuel_Ginobili_1.jpg ├── 87-Carlos_Iturgaitz_2.jpg ├── 97-Elsa_Zylberstein_3.jpg ├── 98-Elsa_Zylberstein_3.jpg ├── 114-Christian_Lacroix_1.jpg ├── 120-Gerard_de_Cortanze_2.jpg ├── 152-Alastair_Campbell_3.jpg ├── 162-Anastasia_Kelesidou_1.jpg ├── 166-Bernard_Giraudeau_3.jpg ├── 180-Guenter_Verheugen_1.jpg ├── 181-Claudette_Robinson_2.jpg ├── 184-Donatella_Versace_1.jpg ├── 200-Fernando_Gonzalez_3.jpg ├── 22-Gholamreza_Aghazadeh_3.jpg ├── 225-David_Westerfield_3.jpg ├── 239-Andrei_Nikolishin_1.jpg ├── 244-Cristina_Saralegui_2.jpg ├── 248-Christopher_Reeve_1.jpg ├── 253-Franz_Muentefering_3.jpg ├── 259-Christian_Lacroix_3.jpg ├── 267-Dionigi_Tettamanzi_3.jpg ├── 268-Eduard_Shevardnadze_1.jpg ├── 270-Andres_DAlessandro_3.jpg ├── 276-Ahmet_Necdet_Sezer_1.jpg ├── 280-Coretta_Scott_King_3.jpg ├── 291-Franz_Muentefering_1.jpg ├── 297-Andrei_Mikhnevich_2.jpg ├── 314-Christy_Turlington_3.jpg ├── 33-Isabella_Rossellini_2.jpg ├── 65-Eric_Christian_Olsen_1.jpg ├── 143-Christian_Von_Wernich_1.jpg ├── 169-Catherine_Zeta_Jones_1.jpg ├── 19-Dominique_de_Villepin_2.jpg ├── 20-Dominique_de_Villepin_2.jpg ├── 229-Hussam_Mohammed_Amin_1.jpg ├── 275-Dominik_Garcia-Lorido_2.jpg ├── 294-Eric_Christian_Olsen_2.jpg ├── 295-Emilio_Azcarraga_Jean_1.jpg ├── 300-Carlo_Azeglio_Ciampi_3.jpg ├── 307-Alan_Tang_Kwong-wing_2.jpg ├── 75-Dominik_Garcia-Lorido_1.jpg ├── 126-Abdul_Majeed_Shobokshi_1.jpg ├── 164-George_Maxwell_Richards_3.jpg ├── 99-Gonzalo_Sanchez_de_Lozada_3.jpg ├── 172-Andres_Manuel_Lopez_Obrador_3.jpg ├── 290-Alejandro_Gonzalez_Inarritu_2.jpg └── 308-Alejandro_Gonzalez_Inarritu_1.jpg ├── models ├── focal.py ├── metrics.py └── model_resnet.py ├── config.py ├── dataset ├── generate_file_list.py └── dataset.py ├── README.md ├── test_quality.py ├── train_quality.py └── train_feature.py /util/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /images/table1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/images/table1.png -------------------------------------------------------------------------------- /images/table2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/images/table2.png -------------------------------------------------------------------------------- /images/table3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/images/table3.png -------------------------------------------------------------------------------- /images/train.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/images/train.png -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | __pycache__ 2 | face_train_ms1mv2.txt 3 | output 4 | ._* 5 | *.pth 6 | quality_result -------------------------------------------------------------------------------- /images/face_quality.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/images/face_quality.jpg -------------------------------------------------------------------------------- /test_faces/13-Adam_Ant_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/13-Adam_Ant_2.jpg -------------------------------------------------------------------------------- /test_faces/16-Adam_Ant_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/16-Adam_Ant_1.jpg -------------------------------------------------------------------------------- /test_faces/2-Elijah_Wood_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/2-Elijah_Wood_1.jpg -------------------------------------------------------------------------------- /test_faces/21-Bob_Hope_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/21-Bob_Hope_3.jpg -------------------------------------------------------------------------------- /test_faces/226-Art_Howe_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/226-Art_Howe_2.jpg -------------------------------------------------------------------------------- /test_faces/238-Andy_Dick_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/238-Andy_Dick_1.jpg -------------------------------------------------------------------------------- /test_faces/28-Don_King_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/28-Don_King_3.jpg -------------------------------------------------------------------------------- /test_faces/299-Ben_Cohen_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/299-Ben_Cohen_2.jpg -------------------------------------------------------------------------------- /test_faces/3-Emelie_Loit_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/3-Emelie_Loit_2.jpg -------------------------------------------------------------------------------- /test_faces/32-Abdullah_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/32-Abdullah_2.jpg -------------------------------------------------------------------------------- /test_faces/4-Emelie_Loit_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/4-Emelie_Loit_2.jpg -------------------------------------------------------------------------------- /test_faces/44-Doc_Rivers_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/44-Doc_Rivers_3.jpg -------------------------------------------------------------------------------- /test_faces/5-Emelie_Loit_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/5-Emelie_Loit_2.jpg -------------------------------------------------------------------------------- /test_faces/55-Eric_Lloyd_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/55-Eric_Lloyd_1.jpg -------------------------------------------------------------------------------- /test_faces/6-Celine_Dion_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/6-Celine_Dion_1.jpg -------------------------------------------------------------------------------- /test_faces/64-Iban_Mayo_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/64-Iban_Mayo_3.jpg -------------------------------------------------------------------------------- /test_faces/68-Gore_Vidal_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/68-Gore_Vidal_2.jpg -------------------------------------------------------------------------------- /test_faces/8-Guy_Ritchie_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/8-Guy_Ritchie_3.jpg -------------------------------------------------------------------------------- /test_faces/89-Andy_Hebb_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/89-Andy_Hebb_1.jpg -------------------------------------------------------------------------------- /test_faces/9-Guy_Ritchie_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/9-Guy_Ritchie_3.jpg -------------------------------------------------------------------------------- /test_faces/95-Dan_Dickau_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/95-Dan_Dickau_1.jpg -------------------------------------------------------------------------------- /test_faces/10-Brent_Coles_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/10-Brent_Coles_2.jpg -------------------------------------------------------------------------------- /test_faces/107-Alfred_Ford_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/107-Alfred_Ford_3.jpg -------------------------------------------------------------------------------- /test_faces/109-Ed_Sullivan_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/109-Ed_Sullivan_1.jpg -------------------------------------------------------------------------------- /test_faces/11-Brent_Coles_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/11-Brent_Coles_2.jpg -------------------------------------------------------------------------------- /test_faces/110-Alexa_Vega_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/110-Alexa_Vega_3.jpg -------------------------------------------------------------------------------- /test_faces/111-Dusty_Baker_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/111-Dusty_Baker_1.jpg -------------------------------------------------------------------------------- /test_faces/113-Aidan_Quinn_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/113-Aidan_Quinn_3.jpg -------------------------------------------------------------------------------- /test_faces/116-Daryl_Smith_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/116-Daryl_Smith_1.jpg -------------------------------------------------------------------------------- /test_faces/124-Aaron_Pena_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/124-Aaron_Pena_2.jpg -------------------------------------------------------------------------------- /test_faces/125-Aaron_Pena_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/125-Aaron_Pena_2.jpg -------------------------------------------------------------------------------- /test_faces/128-Amy_Cotton_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/128-Amy_Cotton_2.jpg -------------------------------------------------------------------------------- /test_faces/135-Andy_Bryant_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/135-Andy_Bryant_3.jpg -------------------------------------------------------------------------------- /test_faces/153-Herb_Sendek_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/153-Herb_Sendek_3.jpg -------------------------------------------------------------------------------- /test_faces/154-David_Bowie_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/154-David_Bowie_1.jpg -------------------------------------------------------------------------------- /test_faces/156-Ismail_Khan_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/156-Ismail_Khan_1.jpg -------------------------------------------------------------------------------- /test_faces/157-Ian_Huntley_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/157-Ian_Huntley_2.jpg -------------------------------------------------------------------------------- /test_faces/161-Dan_Morales_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/161-Dan_Morales_3.jpg -------------------------------------------------------------------------------- /test_faces/165-Hu_Maoyuan_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/165-Hu_Maoyuan_3.jpg -------------------------------------------------------------------------------- /test_faces/167-Greg_Kinsey_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/167-Greg_Kinsey_2.jpg -------------------------------------------------------------------------------- /test_faces/173-Elmar_Brok_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/173-Elmar_Brok_3.jpg -------------------------------------------------------------------------------- /test_faces/174-Elmar_Brok_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/174-Elmar_Brok_3.jpg -------------------------------------------------------------------------------- /test_faces/186-Dick_Armey_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/186-Dick_Armey_2.jpg -------------------------------------------------------------------------------- /test_faces/187-Andy_Garcia_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/187-Andy_Garcia_3.jpg -------------------------------------------------------------------------------- /test_faces/188-Alex_Wallau_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/188-Alex_Wallau_2.jpg -------------------------------------------------------------------------------- /test_faces/190-Garry_McCoy_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/190-Garry_McCoy_1.jpg -------------------------------------------------------------------------------- /test_faces/208-Eric_Taino_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/208-Eric_Taino_3.jpg -------------------------------------------------------------------------------- /test_faces/210-Carlos_Mesa_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/210-Carlos_Mesa_1.jpg -------------------------------------------------------------------------------- /test_faces/212-Fruit_Chan_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/212-Fruit_Chan_3.jpg -------------------------------------------------------------------------------- /test_faces/218-Bob_Geldof_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/218-Bob_Geldof_1.jpg -------------------------------------------------------------------------------- /test_faces/220-Chan_Gailey_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/220-Chan_Gailey_2.jpg -------------------------------------------------------------------------------- /test_faces/234-Eve_Ensler_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/234-Eve_Ensler_1.jpg -------------------------------------------------------------------------------- /test_faces/24-Celso_Lafer_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/24-Celso_Lafer_2.jpg -------------------------------------------------------------------------------- /test_faces/240-James_Brown_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/240-James_Brown_3.jpg -------------------------------------------------------------------------------- /test_faces/242-Aaron_Guiel_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/242-Aaron_Guiel_1.jpg -------------------------------------------------------------------------------- /test_faces/250-Butch_Davis_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/250-Butch_Davis_3.jpg -------------------------------------------------------------------------------- /test_faces/251-Bob_Melvin_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/251-Bob_Melvin_2.jpg -------------------------------------------------------------------------------- /test_faces/254-Don_Boudria_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/254-Don_Boudria_1.jpg -------------------------------------------------------------------------------- /test_faces/26-Holly_Hunter_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/26-Holly_Hunter_3.jpg -------------------------------------------------------------------------------- /test_faces/260-Danny_Ainge_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/260-Danny_Ainge_2.jpg -------------------------------------------------------------------------------- /test_faces/262-Bonnie_Hunt_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/262-Bonnie_Hunt_2.jpg -------------------------------------------------------------------------------- /test_faces/263-Ian_Gillan_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/263-Ian_Gillan_2.jpg -------------------------------------------------------------------------------- /test_faces/278-Brian_Kerr_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/278-Brian_Kerr_3.jpg -------------------------------------------------------------------------------- /test_faces/282-Hee-Won_Han_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/282-Hee-Won_Han_1.jpg -------------------------------------------------------------------------------- /test_faces/304-Bryan_Adams_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/304-Bryan_Adams_3.jpg -------------------------------------------------------------------------------- /test_faces/305-Bryan_Adams_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/305-Bryan_Adams_3.jpg -------------------------------------------------------------------------------- /test_faces/309-Gary_Condit_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/309-Gary_Condit_3.jpg -------------------------------------------------------------------------------- /test_faces/313-Hugh_Grant_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/313-Hugh_Grant_2.jpg -------------------------------------------------------------------------------- /test_faces/315-Celine_Dion_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/315-Celine_Dion_2.jpg -------------------------------------------------------------------------------- /test_faces/316-Frank_Hsieh_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/316-Frank_Hsieh_2.jpg -------------------------------------------------------------------------------- /test_faces/317-Frank_Hsieh_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/317-Frank_Hsieh_2.jpg -------------------------------------------------------------------------------- /test_faces/320-Imran_Khan_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/320-Imran_Khan_2.jpg -------------------------------------------------------------------------------- /test_faces/35-Gideon_Yago_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/35-Gideon_Yago_2.jpg -------------------------------------------------------------------------------- /test_faces/43-Hugo_Chavez_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/43-Hugo_Chavez_3.jpg -------------------------------------------------------------------------------- /test_faces/45-Aaron_Tippin_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/45-Aaron_Tippin_2.jpg -------------------------------------------------------------------------------- /test_faces/47-Douglas_Paal_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/47-Douglas_Paal_3.jpg -------------------------------------------------------------------------------- /test_faces/49-Harry_Kalas_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/49-Harry_Kalas_2.jpg -------------------------------------------------------------------------------- /test_faces/70-Hugh_Hefner_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/70-Hugh_Hefner_2.jpg -------------------------------------------------------------------------------- /test_faces/71-Gene_Sauers_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/71-Gene_Sauers_1.jpg -------------------------------------------------------------------------------- /test_faces/73-Fatmir_Limaj_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/73-Fatmir_Limaj_1.jpg -------------------------------------------------------------------------------- /test_faces/74-Fatmir_Limaj_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/74-Fatmir_Limaj_1.jpg -------------------------------------------------------------------------------- /test_faces/76-Bryan_Thomas_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/76-Bryan_Thomas_2.jpg -------------------------------------------------------------------------------- /test_faces/80-Bela_Karolyi_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/80-Bela_Karolyi_3.jpg -------------------------------------------------------------------------------- /test_faces/81-Claire_Danes_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/81-Claire_Danes_3.jpg -------------------------------------------------------------------------------- /test_faces/90-Edward_Burns_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/90-Edward_Burns_3.jpg -------------------------------------------------------------------------------- /test_faces/91-Eli_Stutsman_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/91-Eli_Stutsman_2.jpg -------------------------------------------------------------------------------- /test_faces/92-James_Gibson_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/92-James_Gibson_1.jpg -------------------------------------------------------------------------------- /test_faces/1-Harry_Belafonte_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/1-Harry_Belafonte_1.jpg -------------------------------------------------------------------------------- /test_faces/101-Jack_Osbourne_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/101-Jack_Osbourne_2.jpg -------------------------------------------------------------------------------- /test_faces/102-Daniel_Bruehl_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/102-Daniel_Bruehl_2.jpg -------------------------------------------------------------------------------- /test_faces/103-Clint_Howard_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/103-Clint_Howard_3.jpg -------------------------------------------------------------------------------- /test_faces/104-James_Franco_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/104-James_Franco_2.jpg -------------------------------------------------------------------------------- /test_faces/105-Bill_Herrion_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/105-Bill_Herrion_1.jpg -------------------------------------------------------------------------------- /test_faces/106-Arturo_Gatti_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/106-Arturo_Gatti_2.jpg -------------------------------------------------------------------------------- /test_faces/112-Claudio_Abbado_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/112-Claudio_Abbado_3.jpg -------------------------------------------------------------------------------- /test_faces/115-Elizabeth_Pena_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/115-Elizabeth_Pena_2.jpg -------------------------------------------------------------------------------- /test_faces/118-Ahmed_Qureia_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/118-Ahmed_Qureia_1.jpg -------------------------------------------------------------------------------- /test_faces/119-Ahmed_Qureia_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/119-Ahmed_Qureia_1.jpg -------------------------------------------------------------------------------- /test_faces/12-Corinne_Coman_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/12-Corinne_Coman_1.jpg -------------------------------------------------------------------------------- /test_faces/121-David_Canary_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/121-David_Canary_3.jpg -------------------------------------------------------------------------------- /test_faces/122-David_Canary_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/122-David_Canary_3.jpg -------------------------------------------------------------------------------- /test_faces/129-Jamling_Norgay_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/129-Jamling_Norgay_1.jpg -------------------------------------------------------------------------------- /test_faces/130-David_Arquette_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/130-David_Arquette_3.jpg -------------------------------------------------------------------------------- /test_faces/131-David_Arquette_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/131-David_Arquette_3.jpg -------------------------------------------------------------------------------- /test_faces/133-Azmi_Bishara_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/133-Azmi_Bishara_3.jpg -------------------------------------------------------------------------------- /test_faces/134-Azmi_Bishara_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/134-Azmi_Bishara_3.jpg -------------------------------------------------------------------------------- /test_faces/136-Earl_Scruggs_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/136-Earl_Scruggs_3.jpg -------------------------------------------------------------------------------- /test_faces/137-Grady_Little_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/137-Grady_Little_2.jpg -------------------------------------------------------------------------------- /test_faces/14-Claudio_Lopez_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/14-Claudio_Lopez_1.jpg -------------------------------------------------------------------------------- /test_faces/140-Holly_Hunter_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/140-Holly_Hunter_1.jpg -------------------------------------------------------------------------------- /test_faces/144-Dan_Duquette_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/144-Dan_Duquette_3.jpg -------------------------------------------------------------------------------- /test_faces/145-Edward_Seaga_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/145-Edward_Seaga_1.jpg -------------------------------------------------------------------------------- /test_faces/147-Eddie_Murray_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/147-Eddie_Murray_3.jpg -------------------------------------------------------------------------------- /test_faces/148-Chung_Mong-hun_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/148-Chung_Mong-hun_3.jpg -------------------------------------------------------------------------------- /test_faces/149-Chuck_Finley_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/149-Chuck_Finley_1.jpg -------------------------------------------------------------------------------- /test_faces/150-Bertie_Ahern_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/150-Bertie_Ahern_3.jpg -------------------------------------------------------------------------------- /test_faces/151-Geoffrey_Rush_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/151-Geoffrey_Rush_1.jpg -------------------------------------------------------------------------------- /test_faces/155-Eladio_Larez_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/155-Eladio_Larez_3.jpg -------------------------------------------------------------------------------- /test_faces/158-Daja_Bedanova_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/158-Daja_Bedanova_2.jpg -------------------------------------------------------------------------------- /test_faces/160-Dennis_Johnson_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/160-Dennis_Johnson_1.jpg -------------------------------------------------------------------------------- /test_faces/168-Hisao_Oguchi_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/168-Hisao_Oguchi_3.jpg -------------------------------------------------------------------------------- /test_faces/17-Brendan_Gaughan_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/17-Brendan_Gaughan_2.jpg -------------------------------------------------------------------------------- /test_faces/170-Bobby_Jackson_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/170-Bobby_Jackson_2.jpg -------------------------------------------------------------------------------- /test_faces/171-Albaro_Recoba_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/171-Albaro_Recoba_1.jpg -------------------------------------------------------------------------------- /test_faces/175-Diana_Taylor_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/175-Diana_Taylor_2.jpg -------------------------------------------------------------------------------- /test_faces/176-Diana_Taylor_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/176-Diana_Taylor_2.jpg -------------------------------------------------------------------------------- /test_faces/179-Ari_Fleischer_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/179-Ari_Fleischer_1.jpg -------------------------------------------------------------------------------- /test_faces/18-David_Shayler_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/18-David_Shayler_3.jpg -------------------------------------------------------------------------------- /test_faces/183-Andre_Bucher_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/183-Andre_Bucher_1.jpg -------------------------------------------------------------------------------- /test_faces/185-Buford_Blount_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/185-Buford_Blount_2.jpg -------------------------------------------------------------------------------- /test_faces/189-Carla_Tricoli_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/189-Carla_Tricoli_2.jpg -------------------------------------------------------------------------------- /test_faces/191-Bill_Sizemore_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/191-Bill_Sizemore_2.jpg -------------------------------------------------------------------------------- /test_faces/192-Aron_Ralston_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/192-Aron_Ralston_3.jpg -------------------------------------------------------------------------------- /test_faces/193-Brook_Robinson_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/193-Brook_Robinson_1.jpg -------------------------------------------------------------------------------- /test_faces/194-Brook_Robinson_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/194-Brook_Robinson_1.jpg -------------------------------------------------------------------------------- /test_faces/195-Brian_Mulroney_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/195-Brian_Mulroney_2.jpg -------------------------------------------------------------------------------- /test_faces/196-Dave_Wannstedt_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/196-Dave_Wannstedt_2.jpg -------------------------------------------------------------------------------- /test_faces/197-Eli_Stutsman_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/197-Eli_Stutsman_3.jpg -------------------------------------------------------------------------------- /test_faces/198-Bill_Mauldin_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/198-Bill_Mauldin_1.jpg -------------------------------------------------------------------------------- /test_faces/202-Gerard_Butler_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/202-Gerard_Butler_2.jpg -------------------------------------------------------------------------------- /test_faces/203-Dolly_Parton_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/203-Dolly_Parton_1.jpg -------------------------------------------------------------------------------- /test_faces/204-Baz_Luhrmann_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/204-Baz_Luhrmann_3.jpg -------------------------------------------------------------------------------- /test_faces/205-Baz_Luhrmann_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/205-Baz_Luhrmann_3.jpg -------------------------------------------------------------------------------- /test_faces/206-Abel_Aguilar_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/206-Abel_Aguilar_2.jpg -------------------------------------------------------------------------------- /test_faces/209-Hipolito_Mejia_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/209-Hipolito_Mejia_1.jpg -------------------------------------------------------------------------------- /test_faces/213-James_Spalding_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/213-James_Spalding_2.jpg -------------------------------------------------------------------------------- /test_faces/215-Abel_Pacheco_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/215-Abel_Pacheco_2.jpg -------------------------------------------------------------------------------- /test_faces/216-Carolina_Barco_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/216-Carolina_Barco_2.jpg -------------------------------------------------------------------------------- /test_faces/217-Carolina_Barco_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/217-Carolina_Barco_2.jpg -------------------------------------------------------------------------------- /test_faces/219-Akbar_Al_Baker_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/219-Akbar_Al_Baker_3.jpg -------------------------------------------------------------------------------- /test_faces/221-Daisy_Fuentes_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/221-Daisy_Fuentes_2.jpg -------------------------------------------------------------------------------- /test_faces/223-Alan_Mulally_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/223-Alan_Mulally_3.jpg -------------------------------------------------------------------------------- /test_faces/224-Itzhak_Perlman_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/224-Itzhak_Perlman_1.jpg -------------------------------------------------------------------------------- /test_faces/227-Claire_Tomalin_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/227-Claire_Tomalin_3.jpg -------------------------------------------------------------------------------- /test_faces/228-Herb_Dhaliwal_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/228-Herb_Dhaliwal_2.jpg -------------------------------------------------------------------------------- /test_faces/230-Aitor_Gonzalez_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/230-Aitor_Gonzalez_3.jpg -------------------------------------------------------------------------------- /test_faces/231-Aitor_Gonzalez_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/231-Aitor_Gonzalez_3.jpg -------------------------------------------------------------------------------- /test_faces/232-Aitor_Gonzalez_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/232-Aitor_Gonzalez_3.jpg -------------------------------------------------------------------------------- /test_faces/233-Aitor_Gonzalez_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/233-Aitor_Gonzalez_3.jpg -------------------------------------------------------------------------------- /test_faces/236-Geoffrey_Rush_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/236-Geoffrey_Rush_2.jpg -------------------------------------------------------------------------------- /test_faces/237-Amram_Mitzna_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/237-Amram_Mitzna_3.jpg -------------------------------------------------------------------------------- /test_faces/245-Heath_Ledger_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/245-Heath_Ledger_1.jpg -------------------------------------------------------------------------------- /test_faces/246-Heath_Ledger_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/246-Heath_Ledger_1.jpg -------------------------------------------------------------------------------- /test_faces/247-Gil_de_Ferran_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/247-Gil_de_Ferran_1.jpg -------------------------------------------------------------------------------- /test_faces/256-Bobby_Kielty_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/256-Bobby_Kielty_3.jpg -------------------------------------------------------------------------------- /test_faces/257-Angela_Merkel_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/257-Angela_Merkel_1.jpg -------------------------------------------------------------------------------- /test_faces/258-Angela_Merkel_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/258-Angela_Merkel_1.jpg -------------------------------------------------------------------------------- /test_faces/261-Frank_Pallone_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/261-Frank_Pallone_1.jpg -------------------------------------------------------------------------------- /test_faces/266-Coleen_Rowley_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/266-Coleen_Rowley_3.jpg -------------------------------------------------------------------------------- /test_faces/269-Donny_Osmond_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/269-Donny_Osmond_3.jpg -------------------------------------------------------------------------------- /test_faces/271-Gary_Gitnick_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/271-Gary_Gitnick_3.jpg -------------------------------------------------------------------------------- /test_faces/273-Craig_Wilson_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/273-Craig_Wilson_1.jpg -------------------------------------------------------------------------------- /test_faces/277-Amanda_Bynes_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/277-Amanda_Bynes_2.jpg -------------------------------------------------------------------------------- /test_faces/281-Gloria_Allred_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/281-Gloria_Allred_3.jpg -------------------------------------------------------------------------------- /test_faces/283-Bijan_Darvish_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/283-Bijan_Darvish_1.jpg -------------------------------------------------------------------------------- /test_faces/285-Darrell_Issa_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/285-Darrell_Issa_1.jpg -------------------------------------------------------------------------------- /test_faces/286-Freddy_Garcia_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/286-Freddy_Garcia_1.jpg -------------------------------------------------------------------------------- /test_faces/287-James_Lockhart_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/287-James_Lockhart_2.jpg -------------------------------------------------------------------------------- /test_faces/288-Eric_Lindros_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/288-Eric_Lindros_2.jpg -------------------------------------------------------------------------------- /test_faces/29-Elizabeth_Smart_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/29-Elizabeth_Smart_1.jpg -------------------------------------------------------------------------------- /test_faces/292-Dave_McNally_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/292-Dave_McNally_1.jpg -------------------------------------------------------------------------------- /test_faces/298-Colin_Prescot_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/298-Colin_Prescot_1.jpg -------------------------------------------------------------------------------- /test_faces/30-Elizabeth_Smart_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/30-Elizabeth_Smart_1.jpg -------------------------------------------------------------------------------- /test_faces/301-Horst_Koehler_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/301-Horst_Koehler_2.jpg -------------------------------------------------------------------------------- /test_faces/302-Hermann_Maier_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/302-Hermann_Maier_1.jpg -------------------------------------------------------------------------------- /test_faces/303-Hermann_Maier_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/303-Hermann_Maier_1.jpg -------------------------------------------------------------------------------- /test_faces/306-Francis_Crick_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/306-Francis_Crick_2.jpg -------------------------------------------------------------------------------- /test_faces/31-Barry_Williams_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/31-Barry_Williams_3.jpg -------------------------------------------------------------------------------- /test_faces/310-Agbani_Darego_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/310-Agbani_Darego_2.jpg -------------------------------------------------------------------------------- /test_faces/311-Chris_Pronger_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/311-Chris_Pronger_2.jpg -------------------------------------------------------------------------------- /test_faces/312-James_Murdoch_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/312-James_Murdoch_2.jpg -------------------------------------------------------------------------------- /test_faces/319-Dragan_Covic_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/319-Dragan_Covic_3.jpg -------------------------------------------------------------------------------- /test_faces/322-Daniel_Zelman_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/322-Daniel_Zelman_2.jpg -------------------------------------------------------------------------------- /test_faces/323-Daniel_Zelman_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/323-Daniel_Zelman_2.jpg -------------------------------------------------------------------------------- /test_faces/36-Dominik_Hrbaty_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/36-Dominik_Hrbaty_3.jpg -------------------------------------------------------------------------------- /test_faces/40-Jack_Nicholson_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/40-Jack_Nicholson_2.jpg -------------------------------------------------------------------------------- /test_faces/41-David_McCallum_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/41-David_McCallum_1.jpg -------------------------------------------------------------------------------- /test_faces/42-David_McCallum_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/42-David_McCallum_1.jpg -------------------------------------------------------------------------------- /test_faces/46-Gloria_Gaynor_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/46-Gloria_Gaynor_3.jpg -------------------------------------------------------------------------------- /test_faces/48-James_Traficant_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/48-James_Traficant_1.jpg -------------------------------------------------------------------------------- /test_faces/53-Chris_Cornell_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/53-Chris_Cornell_1.jpg -------------------------------------------------------------------------------- /test_faces/54-Allan_Houston_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/54-Allan_Houston_1.jpg -------------------------------------------------------------------------------- /test_faces/57-Edgar_Savisaar_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/57-Edgar_Savisaar_1.jpg -------------------------------------------------------------------------------- /test_faces/58-Edgar_Savisaar_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/58-Edgar_Savisaar_1.jpg -------------------------------------------------------------------------------- /test_faces/59-Debra_Messing_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/59-Debra_Messing_1.jpg -------------------------------------------------------------------------------- /test_faces/62-Alejandro_Avila_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/62-Alejandro_Avila_3.jpg -------------------------------------------------------------------------------- /test_faces/63-Dianne_Reeves_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/63-Dianne_Reeves_1.jpg -------------------------------------------------------------------------------- /test_faces/67-Ivan_Helguera_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/67-Ivan_Helguera_3.jpg -------------------------------------------------------------------------------- /test_faces/7-James_Wolfensohn_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/7-James_Wolfensohn_2.jpg -------------------------------------------------------------------------------- /test_faces/77-Charley_Armey_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/77-Charley_Armey_3.jpg -------------------------------------------------------------------------------- /test_faces/82-Ester_Canadas_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/82-Ester_Canadas_1.jpg -------------------------------------------------------------------------------- /test_faces/83-Fernando_Alonso_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/83-Fernando_Alonso_1.jpg -------------------------------------------------------------------------------- /test_faces/84-Evan_Marriott_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/84-Evan_Marriott_3.jpg -------------------------------------------------------------------------------- /test_faces/86-Carlos_Bianchi_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/86-Carlos_Bianchi_2.jpg -------------------------------------------------------------------------------- /test_faces/88-Carmen_Electra_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/88-Carmen_Electra_1.jpg -------------------------------------------------------------------------------- /test_faces/93-Daniel_Scioli_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/93-Daniel_Scioli_1.jpg -------------------------------------------------------------------------------- /test_faces/94-Islam_Karimov_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/94-Islam_Karimov_1.jpg -------------------------------------------------------------------------------- /test_faces/96-Charles_Bronson_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/96-Charles_Bronson_1.jpg -------------------------------------------------------------------------------- /test_faces/100-David_McCullough_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/100-David_McCullough_3.jpg -------------------------------------------------------------------------------- /test_faces/108-Franco_Frattini_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/108-Franco_Frattini_2.jpg -------------------------------------------------------------------------------- /test_faces/117-Connie_Freydell_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/117-Connie_Freydell_2.jpg -------------------------------------------------------------------------------- /test_faces/123-Dennis_Erickson_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/123-Dennis_Erickson_2.jpg -------------------------------------------------------------------------------- /test_faces/127-Hamid_Reza_Asefi_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/127-Hamid_Reza_Asefi_1.jpg -------------------------------------------------------------------------------- /test_faces/132-Barbara_Walters_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/132-Barbara_Walters_3.jpg -------------------------------------------------------------------------------- /test_faces/138-Bertrand_Bonello_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/138-Bertrand_Bonello_2.jpg -------------------------------------------------------------------------------- /test_faces/139-Elizabeth_Hurley_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/139-Elizabeth_Hurley_1.jpg -------------------------------------------------------------------------------- /test_faces/141-Emyr_Jones_Parry_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/141-Emyr_Jones_Parry_1.jpg -------------------------------------------------------------------------------- /test_faces/142-Alejandro_Toledo_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/142-Alejandro_Toledo_3.jpg -------------------------------------------------------------------------------- /test_faces/146-Dennis_Erickson_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/146-Dennis_Erickson_3.jpg -------------------------------------------------------------------------------- /test_faces/159-Cecile_de_France_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/159-Cecile_de_France_1.jpg -------------------------------------------------------------------------------- /test_faces/163-Felipe_De_Borbon_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/163-Felipe_De_Borbon_3.jpg -------------------------------------------------------------------------------- /test_faces/177-Jackie_Sherrill_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/177-Jackie_Sherrill_2.jpg -------------------------------------------------------------------------------- /test_faces/178-Christian_Wulff_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/178-Christian_Wulff_2.jpg -------------------------------------------------------------------------------- /test_faces/182-Flavia_Pennetta_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/182-Flavia_Pennetta_3.jpg -------------------------------------------------------------------------------- /test_faces/199-David_McCullough_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/199-David_McCullough_1.jpg -------------------------------------------------------------------------------- /test_faces/201-Irina_Yatchenko_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/201-Irina_Yatchenko_2.jpg -------------------------------------------------------------------------------- /test_faces/207-David_Coulthard_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/207-David_Coulthard_1.jpg -------------------------------------------------------------------------------- /test_faces/211-Antonio_Bernardo_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/211-Antonio_Bernardo_2.jpg -------------------------------------------------------------------------------- /test_faces/214-Bill_Richardson_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/214-Bill_Richardson_3.jpg -------------------------------------------------------------------------------- /test_faces/222-Denise_van_Outen_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/222-Denise_van_Outen_1.jpg -------------------------------------------------------------------------------- /test_faces/23-Andrew_Firestone_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/23-Andrew_Firestone_1.jpg -------------------------------------------------------------------------------- /test_faces/235-Gisele_Bundchen_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/235-Gisele_Bundchen_1.jpg -------------------------------------------------------------------------------- /test_faces/241-Enrique_Bolanos_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/241-Enrique_Bolanos_1.jpg -------------------------------------------------------------------------------- /test_faces/243-Anderson_Varejao_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/243-Anderson_Varejao_3.jpg -------------------------------------------------------------------------------- /test_faces/249-Aretha_Franklin_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/249-Aretha_Franklin_1.jpg -------------------------------------------------------------------------------- /test_faces/25-Dominique_Perben_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/25-Dominique_Perben_1.jpg -------------------------------------------------------------------------------- /test_faces/252-Daniel_Day-Lewis_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/252-Daniel_Day-Lewis_1.jpg -------------------------------------------------------------------------------- /test_faces/255-Albert_Montanes_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/255-Albert_Montanes_3.jpg -------------------------------------------------------------------------------- /test_faces/264-Abbas_Kiarostami_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/264-Abbas_Kiarostami_3.jpg -------------------------------------------------------------------------------- /test_faces/265-James_Brazelton_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/265-James_Brazelton_2.jpg -------------------------------------------------------------------------------- /test_faces/27-Filippo_Volandri_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/27-Filippo_Volandri_2.jpg -------------------------------------------------------------------------------- /test_faces/272-Barbara_De_Brun_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/272-Barbara_De_Brun_1.jpg -------------------------------------------------------------------------------- /test_faces/274-Glafcos_Clerides_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/274-Glafcos_Clerides_2.jpg -------------------------------------------------------------------------------- /test_faces/279-Gustavo_Cisneros_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/279-Gustavo_Cisneros_1.jpg -------------------------------------------------------------------------------- /test_faces/284-Gillian_Anderson_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/284-Gillian_Anderson_3.jpg -------------------------------------------------------------------------------- /test_faces/289-Anna_Chicherova_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/289-Anna_Chicherova_2.jpg -------------------------------------------------------------------------------- /test_faces/293-Elena_Dementieva_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/293-Elena_Dementieva_2.jpg -------------------------------------------------------------------------------- /test_faces/296-Floyd_Mayweather_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/296-Floyd_Mayweather_2.jpg -------------------------------------------------------------------------------- /test_faces/318-Brennon_Leighton_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/318-Brennon_Leighton_1.jpg -------------------------------------------------------------------------------- /test_faces/321-Douglas_Gansler_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/321-Douglas_Gansler_3.jpg -------------------------------------------------------------------------------- /test_faces/34-Barbra_Streisand_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/34-Barbra_Streisand_3.jpg -------------------------------------------------------------------------------- /test_faces/39-Brian_Scalabrine_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/39-Brian_Scalabrine_2.jpg -------------------------------------------------------------------------------- /test_faces/50-Gwendal_Peizerat_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/50-Gwendal_Peizerat_2.jpg -------------------------------------------------------------------------------- /test_faces/51-Charles_Grassley_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/51-Charles_Grassley_2.jpg -------------------------------------------------------------------------------- /test_faces/52-Clifford_Etienne_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/52-Clifford_Etienne_3.jpg -------------------------------------------------------------------------------- /test_faces/56-Evander_Holyfield_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/56-Evander_Holyfield_3.jpg -------------------------------------------------------------------------------- /test_faces/60-Arsinee_Khanjian_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/60-Arsinee_Khanjian_2.jpg -------------------------------------------------------------------------------- /test_faces/61-Denzel_Washington_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/61-Denzel_Washington_3.jpg -------------------------------------------------------------------------------- /test_faces/66-Alexandre_Daigle_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/66-Alexandre_Daigle_3.jpg -------------------------------------------------------------------------------- /test_faces/69-Daniele_Nardello_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/69-Daniele_Nardello_3.jpg -------------------------------------------------------------------------------- /test_faces/72-Alanis_Morissette_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/72-Alanis_Morissette_1.jpg -------------------------------------------------------------------------------- /test_faces/78-David_Collenette_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/78-David_Collenette_1.jpg -------------------------------------------------------------------------------- /test_faces/79-Andrei_Nikolishin_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/79-Andrei_Nikolishin_2.jpg -------------------------------------------------------------------------------- /test_faces/85-Emanuel_Ginobili_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/85-Emanuel_Ginobili_1.jpg -------------------------------------------------------------------------------- /test_faces/87-Carlos_Iturgaitz_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/87-Carlos_Iturgaitz_2.jpg -------------------------------------------------------------------------------- /test_faces/97-Elsa_Zylberstein_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/97-Elsa_Zylberstein_3.jpg -------------------------------------------------------------------------------- /test_faces/98-Elsa_Zylberstein_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/98-Elsa_Zylberstein_3.jpg -------------------------------------------------------------------------------- /test_faces/114-Christian_Lacroix_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/114-Christian_Lacroix_1.jpg -------------------------------------------------------------------------------- /test_faces/120-Gerard_de_Cortanze_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/120-Gerard_de_Cortanze_2.jpg -------------------------------------------------------------------------------- /test_faces/152-Alastair_Campbell_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/152-Alastair_Campbell_3.jpg -------------------------------------------------------------------------------- /test_faces/162-Anastasia_Kelesidou_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/162-Anastasia_Kelesidou_1.jpg -------------------------------------------------------------------------------- /test_faces/166-Bernard_Giraudeau_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/166-Bernard_Giraudeau_3.jpg -------------------------------------------------------------------------------- /test_faces/180-Guenter_Verheugen_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/180-Guenter_Verheugen_1.jpg -------------------------------------------------------------------------------- /test_faces/181-Claudette_Robinson_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/181-Claudette_Robinson_2.jpg -------------------------------------------------------------------------------- /test_faces/184-Donatella_Versace_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/184-Donatella_Versace_1.jpg -------------------------------------------------------------------------------- /test_faces/200-Fernando_Gonzalez_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/200-Fernando_Gonzalez_3.jpg -------------------------------------------------------------------------------- /test_faces/22-Gholamreza_Aghazadeh_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/22-Gholamreza_Aghazadeh_3.jpg -------------------------------------------------------------------------------- /test_faces/225-David_Westerfield_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/225-David_Westerfield_3.jpg -------------------------------------------------------------------------------- /test_faces/239-Andrei_Nikolishin_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/239-Andrei_Nikolishin_1.jpg -------------------------------------------------------------------------------- /test_faces/244-Cristina_Saralegui_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/244-Cristina_Saralegui_2.jpg -------------------------------------------------------------------------------- /test_faces/248-Christopher_Reeve_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/248-Christopher_Reeve_1.jpg -------------------------------------------------------------------------------- /test_faces/253-Franz_Muentefering_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/253-Franz_Muentefering_3.jpg -------------------------------------------------------------------------------- /test_faces/259-Christian_Lacroix_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/259-Christian_Lacroix_3.jpg -------------------------------------------------------------------------------- /test_faces/267-Dionigi_Tettamanzi_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/267-Dionigi_Tettamanzi_3.jpg -------------------------------------------------------------------------------- /test_faces/268-Eduard_Shevardnadze_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/268-Eduard_Shevardnadze_1.jpg -------------------------------------------------------------------------------- /test_faces/270-Andres_DAlessandro_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/270-Andres_DAlessandro_3.jpg -------------------------------------------------------------------------------- /test_faces/276-Ahmet_Necdet_Sezer_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/276-Ahmet_Necdet_Sezer_1.jpg -------------------------------------------------------------------------------- /test_faces/280-Coretta_Scott_King_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/280-Coretta_Scott_King_3.jpg -------------------------------------------------------------------------------- /test_faces/291-Franz_Muentefering_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/291-Franz_Muentefering_1.jpg -------------------------------------------------------------------------------- /test_faces/297-Andrei_Mikhnevich_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/297-Andrei_Mikhnevich_2.jpg -------------------------------------------------------------------------------- /test_faces/314-Christy_Turlington_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/314-Christy_Turlington_3.jpg -------------------------------------------------------------------------------- /test_faces/33-Isabella_Rossellini_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/33-Isabella_Rossellini_2.jpg -------------------------------------------------------------------------------- /test_faces/65-Eric_Christian_Olsen_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/65-Eric_Christian_Olsen_1.jpg -------------------------------------------------------------------------------- /test_faces/143-Christian_Von_Wernich_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/143-Christian_Von_Wernich_1.jpg -------------------------------------------------------------------------------- /test_faces/169-Catherine_Zeta_Jones_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/169-Catherine_Zeta_Jones_1.jpg -------------------------------------------------------------------------------- /test_faces/19-Dominique_de_Villepin_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/19-Dominique_de_Villepin_2.jpg -------------------------------------------------------------------------------- /test_faces/20-Dominique_de_Villepin_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/20-Dominique_de_Villepin_2.jpg -------------------------------------------------------------------------------- /test_faces/229-Hussam_Mohammed_Amin_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/229-Hussam_Mohammed_Amin_1.jpg -------------------------------------------------------------------------------- /test_faces/275-Dominik_Garcia-Lorido_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/275-Dominik_Garcia-Lorido_2.jpg -------------------------------------------------------------------------------- /test_faces/294-Eric_Christian_Olsen_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/294-Eric_Christian_Olsen_2.jpg -------------------------------------------------------------------------------- /test_faces/295-Emilio_Azcarraga_Jean_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/295-Emilio_Azcarraga_Jean_1.jpg -------------------------------------------------------------------------------- /test_faces/300-Carlo_Azeglio_Ciampi_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/300-Carlo_Azeglio_Ciampi_3.jpg -------------------------------------------------------------------------------- /test_faces/307-Alan_Tang_Kwong-wing_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/307-Alan_Tang_Kwong-wing_2.jpg -------------------------------------------------------------------------------- /test_faces/75-Dominik_Garcia-Lorido_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/75-Dominik_Garcia-Lorido_1.jpg -------------------------------------------------------------------------------- /test_faces/126-Abdul_Majeed_Shobokshi_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/126-Abdul_Majeed_Shobokshi_1.jpg -------------------------------------------------------------------------------- /test_faces/164-George_Maxwell_Richards_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/164-George_Maxwell_Richards_3.jpg -------------------------------------------------------------------------------- /test_faces/99-Gonzalo_Sanchez_de_Lozada_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/99-Gonzalo_Sanchez_de_Lozada_3.jpg -------------------------------------------------------------------------------- /test_faces/172-Andres_Manuel_Lopez_Obrador_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/172-Andres_Manuel_Lopez_Obrador_3.jpg -------------------------------------------------------------------------------- /test_faces/290-Alejandro_Gonzalez_Inarritu_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/290-Alejandro_Gonzalez_Inarritu_2.jpg -------------------------------------------------------------------------------- /test_faces/308-Alejandro_Gonzalez_Inarritu_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepcam-cn/FaceQuality/HEAD/test_faces/308-Alejandro_Gonzalez_Inarritu_1.jpg -------------------------------------------------------------------------------- /models/focal.py: -------------------------------------------------------------------------------- 1 | import torch 2 | import torch.nn as nn 3 | 4 | 5 | # Support: ['FocalLoss'] 6 | 7 | 8 | class FocalLoss(nn.Module): 9 | def __init__(self, gamma = 2, eps = 1e-7): 10 | super(FocalLoss, self).__init__() 11 | self.gamma = gamma 12 | self.eps = eps 13 | self.ce = nn.CrossEntropyLoss(reduction='none') 14 | 15 | def forward(self, input, target): 16 | logp = self.ce(input, target) 17 | p = torch.exp(-logp) 18 | loss = (1 - p) ** self.gamma * logp 19 | return loss.mean() 20 | -------------------------------------------------------------------------------- /config.py: -------------------------------------------------------------------------------- 1 | import torch 2 | import os 3 | 4 | class Config: 5 | MODEL_ROOT = 'output/deepcam_model' 6 | LOG_ROOT = 'output/deepcam_log' 7 | BACKBONE_RESUME_ROOT = './backbone_resume.pth' 8 | HEAD_RESUME_ROOT = './head_resume.pth' 9 | TRAIN_FILES = './dataset/face_train_ms1mv2.txt' 10 | 11 | RGB_MEAN = [0.5, 0.5, 0.5] 12 | RGB_STD = [0.5, 0.5, 0.5] 13 | EMBEDDING_SIZE = 512 14 | BATCH_SIZE = 5000 15 | DROP_LAST = True 16 | BACKBONE_LR = 0.05 17 | QUALITY_LR = 0.01 18 | NUM_EPOCH = 90 19 | WEIGHT_DECAY = 5e-4 20 | MOMENTUM = 0.9 21 | 22 | HEAD_GPUS = [0] 23 | BACKBONE_GPUS = [1, 2, 3] 24 | 25 | PRETRAINED_BACKBONE = 'pretrained_backbone_resume.pth' 26 | PRETRAINED_QUALITY = 'pretrained_qulity_resume.pth' 27 | 28 | NUM_EPOCH_WARM_UP = 1 29 | FIXED_BACKBONE_FEATURE = False 30 | 31 | config = Config() 32 | -------------------------------------------------------------------------------- /dataset/generate_file_list.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | DATA_DIR = '/m2-data/rushuai.liu/faceQuality' 4 | train_data_dirs=[ 5 | 'ms1mv2', 6 | ] 7 | 8 | out_file = open('face_train_ms1mv2.txt', 'w') 9 | 10 | person_count = 0 11 | 12 | for root_dir in train_data_dirs: 13 | root_dir = os.path.join(DATA_DIR, root_dir) 14 | if not os.path.isdir(root_dir): 15 | continue 16 | for person_dir in os.listdir(root_dir): 17 | person_dir = os.path.join(root_dir, person_dir) 18 | count = 0 19 | for filename in os.listdir(person_dir): 20 | filename = os.path.join(person_dir, filename) 21 | if filename.endswith(('.png','jpg','.bmp')) and os.path.isfile(filename): 22 | count+=1 23 | print(os.path.abspath(filename)+';'+str(person_count), file=out_file) 24 | 25 | if count > 0: 26 | person_count+=1 27 | 28 | 29 | out_file.close() 30 | -------------------------------------------------------------------------------- /dataset/dataset.py: -------------------------------------------------------------------------------- 1 | from torch.utils import data 2 | from PIL import Image 3 | import random 4 | import os 5 | import os.path 6 | import sys 7 | 8 | import cv2 9 | import numpy as np 10 | 11 | def random_compress(img): 12 | rand_num = random.randint(40, 90) 13 | img_encode = cv2.imencode('.jpg', img, [int(cv2.IMWRITE_JPEG_QUALITY),rand_num]) 14 | data_encode = np.array(img_encode[1]) 15 | str_encode = data_encode.tostring() 16 | nparr = np.fromstring(str_encode, np.uint8) 17 | img_decode = cv2.imdecode(nparr, cv2.IMREAD_COLOR) 18 | return img_decode 19 | 20 | def pil_loader(path): 21 | with open(path, 'rb') as f: 22 | img = Image.open(f) 23 | return img.convert('RGB') 24 | 25 | 26 | def cv2_loader(path): 27 | img1 = cv2.imread(path) 28 | if np.random.random() < 0.5: 29 | size = np.random.choice([60, 80, 100]) 30 | img1 = cv2.resize(img1, (size, size)) 31 | img2 = cv2.cvtColor(img1,cv2.COLOR_BGR2RGB) 32 | img = Image.fromarray(img2) 33 | return img 34 | 35 | class ImageFolder(data.Dataset): 36 | def __init__(self, trainList, transform=None, loader=None): 37 | super(ImageFolder, self).__init__() 38 | self.transform = transform 39 | if loader is None: 40 | self.loader = cv2_loader 41 | else: 42 | self.loader = loader 43 | with open(trainList) as f: 44 | self.samples = f.readlines() 45 | self.classes = int(self.samples[-1].split(';')[1]) + 1 46 | 47 | def __getitem__(self, index): 48 | path, target = self.samples[index].split(';') 49 | target = int(target) 50 | sample = self.loader(path) 51 | if self.transform is not None: 52 | sample = self.transform(sample) 53 | 54 | return sample, target 55 | 56 | def __len__(self): 57 | return len(self.samples) 58 | 59 | -------------------------------------------------------------------------------- /models/metrics.py: -------------------------------------------------------------------------------- 1 | from __future__ import print_function 2 | from __future__ import division 3 | import torch 4 | import torch.nn as nn 5 | import torch.nn.functional as F 6 | from torch.nn import Parameter 7 | import math 8 | 9 | class TeacherLoss(nn.Module): 10 | def __init__(self): 11 | super(TeacherLoss, self).__init__() 12 | self.mse = nn.MSELoss(reduction='none') 13 | 14 | def forward(self, confidence, feature, teacher_feature, gaussian=False): 15 | loss = self.mse(F.normalize(feature), F.normalize(teacher_feature)) 16 | if gaussian: 17 | loss = loss * confidence 18 | loss = loss.sum() / feature.size(0) 19 | return loss 20 | 21 | class GaussianFace(nn.Module): 22 | def __init__(self, in_features, out_features, s = 64, m = 0.5): 23 | super(GaussianFace, self).__init__() 24 | self.in_features = in_features 25 | self.out_features = out_features 26 | self.s = s 27 | self.weight = Parameter(torch.FloatTensor(out_features, in_features)) 28 | nn.init.kaiming_uniform_(self.weight, a=math.sqrt(5)) 29 | 30 | self.cos_m = math.cos(m) 31 | self.sin_m = math.sin(m) 32 | self.th = math.cos(math.pi - m) 33 | self.mm = math.sin(math.pi - m) * m 34 | 35 | def forward(self, confidence, input, label, gaussian=True): 36 | weight = F.normalize(self.weight) 37 | cosine = F.linear(F.normalize(input), weight) 38 | sine = torch.sqrt(1.0 - torch.pow(cosine, 2)) 39 | phi = cosine * self.cos_m - sine * self.sin_m 40 | phi = phi.half() 41 | phi = torch.where(cosine > self.th, phi, cosine - self.mm) 42 | one_hot = torch.zeros_like(cosine) 43 | one_hot.scatter_(1, label.view(-1, 1).long(), 1) 44 | output = torch.where(one_hot==0, cosine, phi) 45 | if gaussian: 46 | confidence = torch.clamp(confidence - 0.2, 0, 1) * 1.2 47 | output = output * self.s * confidence 48 | else: 49 | output = output * self.s 50 | return output 51 | -------------------------------------------------------------------------------- /util/cosine_lr_scheduler.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | 3 | 4 | class CosineDecayLR(object): 5 | def __init__(self, optimizer, T_max, lr_init, lr_min=0., warmup=0): 6 | """ 7 | a cosine decay scheduler about steps, not epochs. 8 | :param optimizer: ex. optim.SGD 9 | :param T_max: max steps, and steps=epochs * batches 10 | :param lr_max: lr_max is init lr. 11 | :param warmup: in the training begin, the lr is smoothly increase from 0 to lr_init, which means "warmup", 12 | this means warmup steps, if 0 that means don't use lr warmup. 13 | """ 14 | super(CosineDecayLR, self).__init__() 15 | self.__optimizer = optimizer 16 | self.__T_max = T_max 17 | self.__lr_min = lr_min 18 | self.__lr_max = lr_init 19 | self.__warmup = warmup 20 | 21 | 22 | def step(self, t): 23 | if self.__warmup and t < self.__warmup: 24 | lr = self.__lr_max / self.__warmup * t 25 | else: 26 | T_max = self.__T_max - self.__warmup 27 | t = t - self.__warmup 28 | if t <= T_max / 2: 29 | lr = self.__lr_min + 0.5 * (self.__lr_max - self.__lr_min) * (1 + np.cos(t * 7 / 4 /T_max * np.pi)) 30 | elif t <= T_max / 3 * 2: 31 | lr = self.__lr_min + 0.5 * (self.__lr_max - self.__lr_min) * (1 + np.cos((7 / 8 + (t - T_max / 2)/ T_max / 8) * np.pi)) 32 | else: 33 | lr = self.__lr_min + 0.5 * (self.__lr_max - self.__lr_min) * (1 + np.cos((43 / 48 + (t - T_max * 2 / 3)/T_max * 15 / 48) * np.pi)) 34 | for param_group in self.__optimizer.param_groups: 35 | param_group["lr"] = lr 36 | 37 | 38 | if __name__ == '__main__': 39 | import matplotlib.pyplot as plt 40 | import torch.optim as optim 41 | from torchvision import models 42 | 43 | net = models.resnet18(pretrained=False) 44 | optimizer = optim.SGD(net.parameters(), 1e-1, 0.9, weight_decay=0.0005) 45 | scheduler = CosineDecayLR(optimizer, 50*2068, 1e-1, 1e-6, 2*2068) 46 | 47 | # Plot lr schedule 48 | y = [] 49 | for t in range(50): 50 | for i in range(2068): 51 | scheduler.step(2068*t+i) 52 | y.append(optimizer.param_groups[0]['lr']) 53 | 54 | plt.figure() 55 | plt.plot(y, label='LambdaLR') 56 | plt.xlabel('steps') 57 | plt.ylabel('LR') 58 | plt.tight_layout() 59 | plt.savefig("lr.png", dpi=300) 60 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # EQFace: A Simple Explicit Quality Network for Face Recognition 2 | ### The first face recognition network that generates explicit face quality online. It enables a lot of applications where face quality is used. 3 | 4 | ![Face Quality Result](images/face_quality.jpg) 5 | 6 | ## License 7 | The code of EQFace is released under the MIT License. There is no limitation for both academic and commercial usage. 8 | 9 | ## Requirements 10 | - Pytorch 1.8.1 11 | 12 | ## Training Data 13 | 14 | 1. Download [MS1Mv2](https://github.com/deepinsight/insightface/wiki/Dataset-Zoo) 15 | 2. Extract image files by [rec2image.py](https://github.com/deepinsight/insightface/blob/master/recognition/common/rec2image.py) 16 | 3. Generate the training file list 17 | ``` 18 | cd dataset 19 | python generate_file_list.py 20 | ``` 21 | 22 | ## Test 23 | 1. Download pretrained [model](https://drive.google.com/drive/folders/1YtSxo5-NuzDY1baV7wQkUxN3ysvwW6Wp?usp=sharing) 24 | 2. run test_quality.py 25 | ``` 26 | python test_quality.py --backbone backbone.pth --quality quality.path --file test_faces 27 | ``` 28 | ## Training 29 | ![Training pipeline](images/train.png) 30 | 1. Step 1: set config.py, then run **python train_feature.py** 31 | ```json 32 | ... 33 | BACKBONE_RESUME_ROOT = '' 34 | HEAD_RESUME_ROOT = '' 35 | TRAIN_FILES = './dataset/face_train_ms1mv2.txt' 36 | BACKBONE_LR = 0.05 37 | PRETRAINED_BACKBONE = '' 38 | PRETRAINED_QUALITY = '' 39 | ... 40 | ``` 41 | 2. Step 2: set config.py, then run **python train_quality.py** 42 | ```json 43 | ... 44 | BACKBONE_RESUME_ROOT = './backbone_resume.pth' 45 | HEAD_RESUME_ROOT = './head_resume.pth' 46 | TRAIN_FILES = './dataset/face_train_ms1mv2.txt' 47 | BACKBONE_LR = 0.05 48 | PRETRAINED_BACKBONE = '' 49 | PRETRAINED_QUALITY = '' 50 | ... 51 | ``` 52 | 3. Step 3: set config.py, then run **python train_feature.py** 53 | ```json 54 | ... 55 | BACKBONE_RESUME_ROOT = '' 56 | HEAD_RESUME_ROOT = '' 57 | TRAIN_FILES = './dataset/face_train_ms1mv2.txt' 58 | BACKBONE_LR = 0.05 59 | PRETRAINED_BACKBONE = '' 60 | PRETRAINED_QUALITY = '' 61 | 62 | PRETRAINED_BACKBONE = 'pretrained_backbone_resume.pth' 63 | PRETRAINED_QUALITY = 'pretrained_qulity_resume.pth' 64 | ... 65 | ``` 66 | ## Performance Benchmark 67 | ![Face verification on still image and TF video datasets](images/table1.png) 68 | ![1:1 verification on IJB-B and IJB-C datasets](images/table2.png) 69 | ![1:N identification on IJB-B and IJB-C datasets](images/table3.png) 70 | 71 | 72 | ## Citation 73 | 74 | - If you think this work is useful for you, please cite 75 | 76 | @inproceedings{EQFace, 77 | title = {EQFace: A Simple Explicit Quality Network for Face Recognition}, 78 | author = {Liu, Rushuai and Tan, Weijun}, 79 | booktitle = {CVPRW}, 80 | year = {2021} 81 | } 82 | 83 | 84 | -------------------------------------------------------------------------------- /test_quality.py: -------------------------------------------------------------------------------- 1 | import torch 2 | import cv2 3 | from models.model_resnet import ResNet, FaceQuality 4 | import os 5 | import argparse 6 | import shutil 7 | import numpy as np 8 | 9 | parser = argparse.ArgumentParser(description='PyTorch Face Quality test') 10 | parser.add_argument('--backbone', default='backbone_resume.pth', type=str, metavar='PATH', 11 | help='path to backbone model') 12 | parser.add_argument('--quality', default='quality_resume.pth', type=str, metavar='PATH', 13 | help='path to quality model') 14 | parser.add_argument('--file', default='', type=str, metavar=' PATH', 15 | help='test file(image file or directory)') 16 | parser.add_argument('--output', default='quality_result', type=str, metavar=' PATH', 17 | help='output path') 18 | parser.add_argument('--cpu', dest='cpu', action='store_true', 19 | help='evaluate model on cpu') 20 | parser.add_argument('--gpu', default=0, type=int, 21 | help='index of gpu to run') 22 | 23 | def load_state_dict(model, state_dict): 24 | all_keys = {k for k in state_dict.keys()} 25 | for k in all_keys: 26 | if k.startswith('module.'): 27 | state_dict[k[7:]] = state_dict.pop(k) 28 | model_dict = model.state_dict() 29 | pretrained_dict = {k:v for k, v in state_dict.items() if k in model_dict and v.size() == model_dict[k].size()} 30 | if len(pretrained_dict) == len(model_dict): 31 | print("all params loaded") 32 | else: 33 | not_loaded_keys = {k for k in pretrained_dict.keys() if k not in model_dict.keys()} 34 | print("not loaded keys:", not_loaded_keys) 35 | model_dict.update(pretrained_dict) 36 | model.load_state_dict(model_dict) 37 | 38 | def get_face_quality(backbone, quality, device, img): 39 | resized = cv2.resize(img, (112, 112)) 40 | ccropped = resized[...,::-1] # BGR to RGB 41 | # load numpy to tensor 42 | ccropped = ccropped.swapaxes(1, 2).swapaxes(0, 1) 43 | ccropped = np.reshape(ccropped, [1, 3, 112, 112]) 44 | ccropped = np.array(ccropped, dtype = np.float32) 45 | ccropped = (ccropped - 127.5) / 128.0 46 | ccropped = torch.from_numpy(ccropped) 47 | 48 | # extract features 49 | backbone.eval() # set to evaluation mode 50 | with torch.no_grad(): 51 | _, fc = backbone(ccropped.to(device), True) 52 | s = quality(fc)[0] 53 | 54 | return s.cpu().numpy() 55 | 56 | def main(args): 57 | os.environ['CUDA_VISIBLE_DEVICES'] = str(args.gpu) 58 | DEVICE = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") 59 | 60 | BACKBONE = ResNet(num_layers=100, feature_dim=512) 61 | QUALITY = FaceQuality(512 * 7 * 7) 62 | 63 | if os.path.isfile(args.backbone): 64 | print("Loading Backbone Checkpoint '{}'".format(args.backbone)) 65 | checkpoint = torch.load(args.backbone, map_location='cpu') 66 | load_state_dict(BACKBONE, checkpoint) 67 | else: 68 | print("No Checkpoint Found at '{}' Please Have a Check or Continue to Train from Scratch".format(args.backbone)) 69 | return 70 | if os.path.isfile(args.quality): 71 | print("Loading Quality Checkpoint '{}'".format(args.quality)) 72 | checkpoint = torch.load(args.quality, map_location='cpu') 73 | load_state_dict(QUALITY, checkpoint) 74 | else: 75 | print("No Checkpoint Found at '{}' Please Have a Check or Continue to Train from Scratch".format(args.quality)) 76 | return 77 | BACKBONE.to(DEVICE) 78 | QUALITY.to(DEVICE) 79 | BACKBONE.eval() 80 | QUALITY.eval() 81 | 82 | if os.path.exists(args.output): 83 | shutil.rmtree(args.output) 84 | os.makedirs(args.output) 85 | 86 | if os.path.isfile(args.file): 87 | image = cv2.imread(args.file) 88 | if image is None or image.shape[0] == 0: 89 | print("Open image failed: ", args.file) 90 | return 91 | quality = get_face_quality(BACKBONE, QUALITY, DEVICE, image) 92 | cv2.imwrite('{}/{:.4f}.jpg'.format(args.output, quality[0]), image) 93 | elif os.path.isdir(args.file): 94 | for tmp in os.listdir(args.file): 95 | image = cv2.imread(os.path.join(args.file, tmp)) 96 | if image is None or image.shape[0] == 0: 97 | print("Open image failed: ", args.file) 98 | continue 99 | quality = get_face_quality(BACKBONE, QUALITY, DEVICE, image) 100 | print(quality) 101 | cv2.imwrite('{}/{:.4f}.jpg'.format(args.output, quality[0]), image) 102 | else: 103 | print(args.file, "not exists") 104 | return 105 | 106 | if __name__ == '__main__': 107 | main(parser.parse_args()) 108 | -------------------------------------------------------------------------------- /models/model_resnet.py: -------------------------------------------------------------------------------- 1 | import torch 2 | from torch import nn 3 | 4 | class BottleNeck_IR(nn.Module): 5 | def __init__(self, in_channel, out_channel, stride, dim_match): 6 | super(BottleNeck_IR, self).__init__() 7 | self.res_layer = nn.Sequential(nn.BatchNorm2d(in_channel), 8 | nn.Conv2d(in_channel, out_channel, (3, 3), 1, 1, bias=False), 9 | nn.BatchNorm2d(out_channel), 10 | nn.PReLU(out_channel), 11 | nn.Conv2d(out_channel, out_channel, (3, 3), stride, 1, bias=False), 12 | nn.BatchNorm2d(out_channel)) 13 | if dim_match: 14 | self.shortcut_layer = None 15 | else: 16 | self.shortcut_layer = nn.Sequential( 17 | nn.Conv2d(in_channel, out_channel, kernel_size=(1, 1), stride=stride, bias=False), 18 | nn.BatchNorm2d(out_channel) 19 | ) 20 | 21 | def forward(self, x): 22 | shortcut = x 23 | res = self.res_layer(x) 24 | 25 | if self.shortcut_layer is not None: 26 | shortcut = self.shortcut_layer(x) 27 | 28 | return shortcut + res 29 | 30 | channel_list = [64, 64, 128, 256, 512] 31 | def get_layers(num_layers): 32 | if num_layers == 34: 33 | return [3, 4, 6, 3] 34 | if num_layers == 50: 35 | return [3, 4, 14, 3] 36 | elif num_layers == 100: 37 | return [3, 13, 30, 3] 38 | elif num_layers == 152: 39 | return [3, 8, 36, 3] 40 | 41 | class ResNet(nn.Module): 42 | def __init__(self, num_layers=100, feature_dim=512, drop_ratio=0.4, channel_list=channel_list): 43 | super(ResNet, self).__init__() 44 | assert num_layers in [34, 50, 100, 152] 45 | layers = get_layers(num_layers) 46 | block = BottleNeck_IR 47 | 48 | self.input_layer = nn.Sequential(nn.Conv2d(3, channel_list[0], (3, 3), stride=1, padding=1, bias=False), 49 | nn.BatchNorm2d(channel_list[0]), 50 | nn.PReLU(channel_list[0])) 51 | self.layer1 = self._make_layer(block, channel_list[0], channel_list[1], layers[0], stride=2) 52 | self.layer2 = self._make_layer(block, channel_list[1], channel_list[2], layers[1], stride=2) 53 | self.layer3 = self._make_layer(block, channel_list[2], channel_list[3], layers[2], stride=2) 54 | self.layer4 = self._make_layer(block, channel_list[3], channel_list[4], layers[3], stride=2) 55 | 56 | self.output_layer = nn.Sequential(nn.BatchNorm2d(512), 57 | nn.Dropout(drop_ratio), 58 | nn.Flatten()) 59 | self.feature_layer = nn.Sequential(nn.Linear(512 * 7 * 7, feature_dim), 60 | nn.BatchNorm1d(feature_dim)) 61 | 62 | for m in self.modules(): 63 | if isinstance(m, nn.Conv2d) or isinstance(m, nn.Linear): 64 | nn.init.xavier_uniform_(m.weight) 65 | if m.bias is not None: 66 | nn.init.constant_(m.bias, 0.0) 67 | elif isinstance(m, nn.BatchNorm2d) or isinstance(m, nn.BatchNorm1d): 68 | nn.init.constant_(m.weight, 1) 69 | nn.init.constant_(m.bias, 0) 70 | 71 | def _make_layer(self, block, in_channel, out_channel, blocks, stride): 72 | layers = [] 73 | layers.append(block(in_channel, out_channel, stride, False)) 74 | for i in range(1, blocks): 75 | layers.append(block(out_channel, out_channel, 1, True)) 76 | return nn.Sequential(*layers) 77 | 78 | def forward(self, x, fc=False): 79 | x = self.input_layer(x) 80 | x = self.layer1(x) 81 | x = self.layer2(x) 82 | x = self.layer3(x) 83 | x = self.layer4(x) 84 | x = self.output_layer(x) 85 | feature = self.feature_layer(x) 86 | if fc: 87 | return feature, x 88 | return feature 89 | 90 | class FaceQuality(nn.Module): 91 | def __init__(self, feature_dim): 92 | super(FaceQuality, self).__init__() 93 | self.qualtiy = nn.Sequential( 94 | nn.Linear(feature_dim, 512, bias=False), 95 | nn.BatchNorm1d(512), 96 | nn.ReLU(inplace=True), 97 | nn.Linear(512, 2, bias=False), 98 | nn.Softmax(dim=1) 99 | ) 100 | for m in self.modules(): 101 | if isinstance(m, nn.Conv2d) or isinstance(m, nn.Linear): 102 | nn.init.xavier_uniform_(m.weight) 103 | if m.bias is not None: 104 | nn.init.constant_(m.bias, 0.0) 105 | elif isinstance(m, nn.BatchNorm2d) or isinstance(m, nn.BatchNorm1d): 106 | nn.init.constant_(m.weight, 1) 107 | nn.init.constant_(m.bias, 0) 108 | 109 | def forward(self, x): 110 | x = self.qualtiy(x) 111 | return x[:, 0:1] 112 | 113 | if __name__ == '__main__': 114 | input = torch.Tensor(2, 3, 112, 112) 115 | net = ResNet(50, mode='ir') 116 | 117 | out = net(input) 118 | print(out.shape) 119 | -------------------------------------------------------------------------------- /train_quality.py: -------------------------------------------------------------------------------- 1 | import torch 2 | import torch.nn as nn 3 | import torch.optim as optim 4 | import math 5 | import cv2 6 | import torchvision.transforms as transforms 7 | 8 | from dataset.dataset import ImageFolder 9 | from config import config 10 | from models.model_resnet import ResNet, FaceQuality 11 | from models.metrics import GaussianFace 12 | from models.focal import FocalLoss 13 | from util.utils import * 14 | import torch.distributed as dist 15 | import torch.multiprocessing as mp 16 | from tensorboardX import SummaryWriter 17 | from util.cosine_lr_scheduler import CosineDecayLR 18 | from tqdm import tqdm 19 | import os 20 | import random 21 | import numbers 22 | import shutil 23 | import argparse 24 | import numpy as np 25 | 26 | from ptflops import get_model_complexity_info 27 | 28 | def load_state_dict(model, state_dict): 29 | all_keys = {k for k in state_dict.keys()} 30 | for k in all_keys: 31 | if k.startswith('module.'): 32 | state_dict[k[7:]] = state_dict.pop(k) 33 | model_dict = model.state_dict() 34 | pretrained_dict = {k:v for k, v in state_dict.items() if k in model_dict and v.size() == model_dict[k].size()} 35 | if len(pretrained_dict) == len(model_dict): 36 | print("all params loaded") 37 | else: 38 | not_loaded_keys = {k for k in pretrained_dict.keys() if k not in model_dict.keys()} 39 | print("not loaded keys:", not_loaded_keys) 40 | model_dict.update(pretrained_dict) 41 | model.load_state_dict(model_dict) 42 | 43 | def train(): 44 | DEVICE = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") 45 | writer = SummaryWriter(config.LOG_ROOT) 46 | 47 | train_transform = transforms.Compose([ 48 | transforms.RandomApply([transforms.RandomResizedCrop(112, scale=(0.95, 1), ratio=(1, 1))]), 49 | transforms.Resize(112), 50 | transforms.RandomHorizontalFlip(), 51 | transforms.RandomGrayscale(0.01), 52 | transforms.ToTensor(), 53 | transforms.Normalize(mean = config.RGB_MEAN, std = config.RGB_STD), 54 | ]) 55 | 56 | 57 | dataset_train = ImageFolder(config.TRAIN_FILES, train_transform) 58 | train_loader = torch.utils.data.DataLoader( 59 | dataset_train, batch_size = config.BATCH_SIZE, pin_memory = True, shuffle=True, 60 | num_workers = 8, drop_last = True 61 | ) 62 | 63 | NUM_CLASS = train_loader.dataset.classes 64 | print("Number of Training Classes: {}".format(NUM_CLASS)) 65 | 66 | QUALITY = FaceQuality(512 * 7 * 7) 67 | BACKBONE = ResNet(num_layers=100, feature_dim=512) 68 | flops, params = get_model_complexity_info(BACKBONE, (3, 112, 112), as_strings=True, print_per_layer_stat=False) 69 | print('BACKBONE FLOPs:', flops) 70 | print('BACKBONE PARAMS:', params) 71 | HEAD = GaussianFace(in_features = config.EMBEDDING_SIZE, out_features = NUM_CLASS) 72 | LOSS = FocalLoss() 73 | 74 | if config.BACKBONE_RESUME_ROOT and config.HEAD_RESUME_ROOT: 75 | print("=" * 60) 76 | if os.path.isfile(config.BACKBONE_RESUME_ROOT): 77 | print("Loading Backbone Checkpoint '{}'".format(config.BACKBONE_RESUME_ROOT)) 78 | checkpoint = torch.load(config.BACKBONE_RESUME_ROOT) 79 | load_state_dict(BACKBONE, checkpoint) 80 | else: 81 | print("No Checkpoint Found at '{}' Please Have a Check or Continue to Train from Scratch".format(config.BACKBONE_RESUME_ROOT)) 82 | if os.path.isfile(config.HEAD_RESUME_ROOT): 83 | print("Loading Head Checkpoint '{}'".format(config.HEAD_RESUME_ROOT)) 84 | checkpoint = torch.load(config.HEAD_RESUME_ROOT) 85 | load_state_dict(HEAD, checkpoint) 86 | else: 87 | print("No Checkpoint Found at '{}' Please Have a Check or Continue to Train from Scratch".format(config.HEAD_RESUME_ROOT)) 88 | print("=" * 60) 89 | else: 90 | print('Error: Pretrained backbone and head are necessary for quality training') 91 | return 92 | 93 | 94 | BACKBONE = nn.DataParallel(BACKBONE, device_ids = config.BACKBONE_GPUS) 95 | BACKBONE = BACKBONE.cuda(config.BACKBONE_GPUS[0]) 96 | QUALITY = nn.DataParallel(QUALITY, device_ids = config.BACKBONE_GPUS) 97 | QUALITY = QUALITY.cuda(config.BACKBONE_GPUS[0]) 98 | HEAD = nn.DataParallel(HEAD, device_ids = config.HEAD_GPUS, output_device=config.HEAD_GPUS[0]) 99 | HEAD = HEAD.cuda(config.HEAD_GPUS[0]) 100 | BACKBONE.eval() 101 | OPTIMIZER = optim.SGD([{'params': QUALITY.parameters(), 'lr': config.QUALITY_LR}, {'params': HEAD.parameters(), 'lr': config.QUALITY_LR}], momentum=config.MOMENTUM) 102 | DISP_FREQ = len(train_loader) // 100 103 | 104 | NUM_EPOCH_WARM_UP = config.NUM_EPOCH_WARM_UP 105 | NUM_BATCH_WARM_UP = len(train_loader) * NUM_EPOCH_WARM_UP 106 | batch = 0 107 | step = 0 108 | 109 | scheduler = CosineDecayLR(OPTIMIZER, T_max=10*len(train_loader), lr_init = config.QUALITY_LR, lr_min = 1e-5, warmup = NUM_BATCH_WARM_UP) 110 | for epoch in range(config.NUM_EPOCH): 111 | HEAD.train() 112 | QUALITY.train() 113 | 114 | arcface_losses = AverageMeter() 115 | confidences = AverageMeter() 116 | top1 = AverageMeter() 117 | top5 = AverageMeter() 118 | scaler = torch.cuda.amp.GradScaler() 119 | for inputs, labels in tqdm(iter(train_loader)): 120 | inputs = inputs.cuda(config.BACKBONE_GPUS[0]) 121 | labels = labels.cuda(config.HEAD_GPUS[0]) 122 | with torch.no_grad(): 123 | features, fc = BACKBONE(inputs, True) 124 | with torch.cuda.amp.autocast(): 125 | confidence = QUALITY(fc) 126 | outputs = HEAD(confidence.cuda(config.HEAD_GPUS[0]), features.cuda(config.HEAD_GPUS[0]), labels, True) 127 | arcface_loss = LOSS(outputs, labels) 128 | # measure accuracy and record loss 129 | prec1, prec5 = accuracy(outputs.data, labels, topk = (1, 5)) 130 | arcface_losses.update(arcface_loss.data.item(), inputs.size(0)) 131 | confidences.update(torch.mean(confidence).data.item(), inputs.size(0)) 132 | top1.update(prec1.data.item(), inputs.size(0)) 133 | top5.update(prec5.data.item(), inputs.size(0)) 134 | loss = arcface_loss 135 | # compute gradient and do SGD step 136 | OPTIMIZER.zero_grad() 137 | #loss.backward() 138 | #OPTIMIZER.step() 139 | scaler.scale(loss).backward() 140 | scaler.step(OPTIMIZER) 141 | scaler.update() 142 | if ((batch + 1) % DISP_FREQ == 0) and batch != 0: 143 | print("=" * 60) 144 | print('Epoch {}/{} Batch {}/{}\t' 145 | 'Training Loss {arcface_loss.val:.4f}({arcface_loss.avg:.4f})\t' 146 | 'Training Prec@1 {top1.val:.3f} ({top1.avg:.3f})\t' 147 | 'Training Prec@5 {top5.val:.3f} ({top5.avg:.3f})'.format( 148 | epoch + 1, config.NUM_EPOCH, batch + 1, len(train_loader) * config.NUM_EPOCH, 149 | arcface_loss = arcface_losses, top1 = top1, top5 = top5)) 150 | print("=" * 60) 151 | 152 | batch += 1 # batch index 153 | scheduler.step(batch) 154 | if batch % 1000 == 0: 155 | print(OPTIMIZER) 156 | # training statistics per epoch (buffer for visualization) 157 | epoch_loss = arcface_losses.avg 158 | epoch_acc = top1.avg 159 | writer.add_scalar("Training_Loss", epoch_loss, epoch + 1) 160 | writer.add_scalar("Training_Accuracy", epoch_acc, epoch + 1) 161 | print("=" * 60) 162 | print('Epoch: {}/{}\t' 163 | 'Training Loss {loss.val:.4f} ({loss.avg:.4f})\t' 164 | 'Training Prec@1 {top1.val:.3f} ({top1.avg:.3f})\t' 165 | 'Training Prec@5 {top5.val:.3f} ({top5.avg:.3f})'.format( 166 | epoch + 1, config.NUM_EPOCH, loss = arcface_losses, top1 = top1, top5 = top5)) 167 | print("=" * 60) 168 | 169 | # save checkpoints per epoch 170 | curTime = get_time() 171 | if not os.path.exists(config.MODEL_ROOT): 172 | os.makedirs(config.MODEL_ROOT) 173 | torch.save(QUALITY.state_dict(), os.path.join(config.MODEL_ROOT, "Quality_Epoch_{}_Batch_{}_Time_{}_checkpoint.pth".format(epoch + 1, batch, curTime))) 174 | torch.save(HEAD.state_dict(), os.path.join(config.MODEL_ROOT, "Head_Epoch_{}_Batch_{}_Time_{}_checkpoint.pth".format(epoch + 1, batch, curTime))) 175 | 176 | if __name__ == "__main__": 177 | train() 178 | -------------------------------------------------------------------------------- /util/verification.py: -------------------------------------------------------------------------------- 1 | """Helper for evaluation on the Labeled Faces in the Wild dataset 2 | """ 3 | 4 | # MIT License 5 | # 6 | # Copyright (c) 2016 David Sandberg 7 | # 8 | # Permission is hereby granted, free of charge, to any person obtaining a copy 9 | # of this software and associated documentation files (the "Software"), to deal 10 | # in the Software without restriction, including without limitation the rights 11 | # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | # copies of the Software, and to permit persons to whom the Software is 13 | # furnished to do so, subject to the following conditions: 14 | # 15 | # The above copyright notice and this permission notice shall be included in all 16 | # copies or substantial portions of the Software. 17 | # 18 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 | # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 | # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 21 | # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 22 | # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 23 | # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 24 | # SOFTWARE. 25 | 26 | import numpy as np 27 | from sklearn.model_selection import KFold 28 | from sklearn.decomposition import PCA 29 | import sklearn 30 | from scipy import interpolate 31 | from scipy.spatial.distance import pdist 32 | 33 | 34 | # Support: ['calculate_roc', 'calculate_accuracy', 'calculate_val', 'calculate_val_far', 'evaluate'] 35 | 36 | 37 | def calculate_roc(thresholds, embeddings1, embeddings2, qualities1, qualities2, actual_issame, nrof_folds = 10, pca = 0, quality_thresold=0.1): 38 | assert (embeddings1.shape[0] == embeddings2.shape[0]) 39 | assert (embeddings1.shape[1] == embeddings2.shape[1]) 40 | index = [] 41 | for i in range(len(actual_issame)): 42 | if qualities1[i] < quality_thresold or qualities2[i] < quality_thresold: 43 | continue 44 | index.append(i) 45 | print("origin len:", len(actual_issame), ', high quality len:', len(index), ', quality thresold:', quality_thresold) 46 | embeddings1 = embeddings1[index] 47 | embeddings2 = embeddings2[index] 48 | actual_issame = actual_issame[index] 49 | 50 | nrof_pairs = min(len(actual_issame), embeddings1.shape[0]) 51 | nrof_thresholds = len(thresholds) 52 | k_fold = KFold(n_splits = nrof_folds, shuffle = False) 53 | 54 | tprs = np.zeros((nrof_folds, nrof_thresholds)) 55 | fprs = np.zeros((nrof_folds, nrof_thresholds)) 56 | accuracy = np.zeros((nrof_folds)) 57 | best_thresholds = np.zeros((nrof_folds)) 58 | indices = np.arange(nrof_pairs) 59 | # print('pca', pca) 60 | 61 | if pca == 0: 62 | diff = np.subtract(embeddings1, embeddings2) 63 | dist = np.sum(np.square(diff), 1) 64 | # dist = pdist(np.vstack([embeddings1, embeddings2]), 'cosine') 65 | 66 | for fold_idx, (train_set, test_set) in enumerate(k_fold.split(indices)): 67 | # print('train_set', train_set) 68 | # print('test_set', test_set) 69 | if pca > 0: 70 | print("doing pca on", fold_idx) 71 | embed1_train = embeddings1[train_set] 72 | embed2_train = embeddings2[train_set] 73 | _embed_train = np.concatenate((embed1_train, embed2_train), axis = 0) 74 | # print(_embed_train.shape) 75 | pca_model = PCA(n_components = pca) 76 | pca_model.fit(_embed_train) 77 | embed1 = pca_model.transform(embeddings1) 78 | embed2 = pca_model.transform(embeddings2) 79 | embed1 = sklearn.preprocessing.normalize(embed1) 80 | embed2 = sklearn.preprocessing.normalize(embed2) 81 | # print(embed1.shape, embed2.shape) 82 | diff = np.subtract(embed1, embed2) 83 | dist = np.sum(np.square(diff), 1) 84 | 85 | # Find the best threshold for the fold 86 | acc_train = np.zeros((nrof_thresholds)) 87 | for threshold_idx, threshold in enumerate(thresholds): 88 | _, _, acc_train[threshold_idx] = calculate_accuracy(threshold, dist[train_set], actual_issame[train_set]) 89 | best_threshold_index = np.argmax(acc_train) 90 | # print('best_threshold_index', best_threshold_index, acc_train[best_threshold_index]) 91 | best_thresholds[fold_idx] = thresholds[best_threshold_index] 92 | for threshold_idx, threshold in enumerate(thresholds): 93 | tprs[fold_idx, threshold_idx], fprs[fold_idx, threshold_idx], _ = calculate_accuracy(threshold, 94 | dist[test_set], 95 | actual_issame[ 96 | test_set]) 97 | _, _, accuracy[fold_idx] = calculate_accuracy(thresholds[best_threshold_index], dist[test_set], actual_issame[test_set]) 98 | 99 | tpr = np.mean(tprs, 0) 100 | fpr = np.mean(fprs, 0) 101 | return tpr, fpr, accuracy, best_thresholds 102 | 103 | 104 | def calculate_accuracy(threshold, dist, actual_issame): 105 | predict_issame = np.less(dist, threshold) 106 | tp = np.sum(np.logical_and(predict_issame, actual_issame)) 107 | fp = np.sum(np.logical_and(predict_issame, np.logical_not(actual_issame))) 108 | tn = np.sum(np.logical_and(np.logical_not(predict_issame), np.logical_not(actual_issame))) 109 | fn = np.sum(np.logical_and(np.logical_not(predict_issame), actual_issame)) 110 | 111 | tpr = 0 if (tp + fn == 0) else float(tp) / float(tp + fn) 112 | fpr = 0 if (fp + tn == 0) else float(fp) / float(fp + tn) 113 | acc = float(tp + tn) / dist.size 114 | return tpr, fpr, acc 115 | 116 | 117 | def calculate_val(thresholds, embeddings1, embeddings2, actual_issame, far_target, nrof_folds = 10): 118 | ''' 119 | Copy from [insightface](https://github.com/deepinsight/insightface) 120 | :param thresholds: 121 | :param embeddings1: 122 | :param embeddings2: 123 | :param actual_issame: 124 | :param far_target: 125 | :param nrof_folds: 126 | :return: 127 | ''' 128 | assert (embeddings1.shape[0] == embeddings2.shape[0]) 129 | assert (embeddings1.shape[1] == embeddings2.shape[1]) 130 | nrof_pairs = min(len(actual_issame), embeddings1.shape[0]) 131 | nrof_thresholds = len(thresholds) 132 | k_fold = KFold(n_splits = nrof_folds, shuffle = False) 133 | 134 | val = np.zeros(nrof_folds) 135 | far = np.zeros(nrof_folds) 136 | 137 | diff = np.subtract(embeddings1, embeddings2) 138 | dist = np.sum(np.square(diff), 1) 139 | indices = np.arange(nrof_pairs) 140 | 141 | for fold_idx, (train_set, test_set) in enumerate(k_fold.split(indices)): 142 | 143 | # Find the threshold that gives FAR = far_target 144 | far_train = np.zeros(nrof_thresholds) 145 | for threshold_idx, threshold in enumerate(thresholds): 146 | _, far_train[threshold_idx] = calculate_val_far(threshold, dist[train_set], actual_issame[train_set]) 147 | if np.max(far_train) >= far_target: 148 | f = interpolate.interp1d(far_train, thresholds, kind = 'slinear') 149 | threshold = f(far_target) 150 | else: 151 | threshold = 0.0 152 | 153 | val[fold_idx], far[fold_idx] = calculate_val_far(threshold, dist[test_set], actual_issame[test_set]) 154 | 155 | val_mean = np.mean(val) 156 | far_mean = np.mean(far) 157 | val_std = np.std(val) 158 | return val_mean, val_std, far_mean 159 | 160 | 161 | def calculate_val_far(threshold, dist, actual_issame): 162 | predict_issame = np.less(dist, threshold) 163 | true_accept = np.sum(np.logical_and(predict_issame, actual_issame)) 164 | false_accept = np.sum(np.logical_and(predict_issame, np.logical_not(actual_issame))) 165 | n_same = np.sum(actual_issame) 166 | n_diff = np.sum(np.logical_not(actual_issame)) 167 | val = float(true_accept) / float(n_same) 168 | far = float(false_accept) / float(n_diff) 169 | return val, far 170 | 171 | 172 | def evaluate(embeddings, qualities, actual_issame, nrof_folds = 10, pca = 0, quality_thresold=0.1): 173 | # Calculate evaluation metrics 174 | thresholds = np.arange(0, 4, 0.01) 175 | embeddings1 = embeddings[0::2] 176 | embeddings2 = embeddings[1::2] 177 | qualities1 = qualities[0::2] 178 | qualities2 = qualities[1::2] 179 | tpr, fpr, accuracy, best_thresholds = calculate_roc(thresholds, embeddings1, embeddings2, qualities1, qualities2, np.asarray(actual_issame), nrof_folds = nrof_folds, pca = pca, quality_thresold=quality_thresold) 180 | # thresholds = np.arange(0, 4, 0.001) 181 | # val, val_std, far = calculate_val(thresholds, embeddings1, embeddings2, 182 | # np.asarray(actual_issame), 1e-3, nrof_folds=nrof_folds) 183 | # return tpr, fpr, accuracy, best_thresholds, val, val_std, far 184 | return tpr, fpr, accuracy, best_thresholds 185 | -------------------------------------------------------------------------------- /train_feature.py: -------------------------------------------------------------------------------- 1 | import torch 2 | import torch.nn as nn 3 | import torch.optim as optim 4 | import math 5 | import torchvision.transforms as transforms 6 | import cv2 7 | from dataset.dataset import ImageFolder 8 | from config import config 9 | from models.model_resnet import ResNet, FaceQuality 10 | from models.metrics import GaussianFace 11 | from models.focal import FocalLoss 12 | from util.utils import * 13 | from util.cosine_lr_scheduler import CosineDecayLR 14 | import torch.distributed as dist 15 | import torch.multiprocessing as mp 16 | from tensorboardX import SummaryWriter 17 | from tqdm import tqdm 18 | import os 19 | import random 20 | import numbers 21 | import shutil 22 | import argparse 23 | import numpy as np 24 | from ptflops import get_model_complexity_info 25 | 26 | def load_state_dict(model, state_dict): 27 | all_keys = {k for k in state_dict.keys()} 28 | for k in all_keys: 29 | if k.startswith('module.'): 30 | state_dict[k[7:]] = state_dict.pop(k) 31 | model_dict = model.state_dict() 32 | pretrained_dict = {k:v for k, v in state_dict.items() if k in model_dict and v.size() == model_dict[k].size()} 33 | if len(pretrained_dict) == len(model_dict): 34 | print("all params loaded") 35 | else: 36 | not_loaded_keys = {k for k in pretrained_dict.keys() if k not in model_dict.keys()} 37 | print("not loaded keys:", not_loaded_keys) 38 | model_dict.update(pretrained_dict) 39 | model.load_state_dict(model_dict) 40 | 41 | def train(): 42 | DEVICE = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") 43 | writer = SummaryWriter(config.LOG_ROOT) 44 | 45 | train_transform = transforms.Compose([ 46 | transforms.RandomApply([transforms.RandomResizedCrop(112, scale=(0.95, 1), ratio=(1, 1))]), 47 | transforms.Resize(112), 48 | transforms.RandomHorizontalFlip(), 49 | transforms.RandomGrayscale(0.01), 50 | transforms.ToTensor(), 51 | transforms.Normalize(mean = config.RGB_MEAN, std = config.RGB_STD), 52 | ]) 53 | 54 | dataset_train = ImageFolder(config.TRAIN_FILES, train_transform) 55 | train_loader = torch.utils.data.DataLoader( 56 | dataset_train, batch_size = config.BATCH_SIZE, pin_memory = True, shuffle=True, 57 | num_workers = 8, drop_last = True 58 | ) 59 | 60 | NUM_CLASS = train_loader.dataset.classes 61 | print("Number of Training Classes: {}".format(NUM_CLASS)) 62 | 63 | BACKBONE = ResNet(num_layers=100, feature_dim=512) 64 | flops, params = get_model_complexity_info(BACKBONE, (3, 112, 112), as_strings=True, print_per_layer_stat=False) 65 | print('BACKBONE FLOPs:', flops) 66 | print('BACKBONE PARAMS:', params) 67 | 68 | PRETRAINED_BACKBONE = None 69 | PRETRAINED_QUALITY = None 70 | 71 | if os.path.isfile(config.PRETRAINED_BACKBONE) and os.path.isfile(config.PRETRAINED_QUALITY): 72 | PRETRAINED_BACKBONE = ResNet(num_layers=100, feature_dim=512) 73 | PRETRAINED_QUALITY = FaceQuality(512 * 7 * 7) 74 | checkpoint = torch.load(config.PRETRAINED_BACKBONE) 75 | load_state_dict(PRETRAINED_BACKBONE, checkpoint) 76 | PRETRAINED_BACKBONE = nn.DataParallel(PRETRAINED_BACKBONE, device_ids = config.BACKBONE_GPUS) 77 | PRETRAINED_BACKBONE = PRETRAINED_BACKBONE.cuda(0) 78 | PRETRAINED_BACKBONE.eval() 79 | 80 | checkpoint = torch.load(config.PRETRAINED_QUALITY) 81 | load_state_dict(PRETRAINED_QUALITY, checkpoint) 82 | PRETRAINED_QUALITY = nn.DataParallel(PRETRAINED_QUALITY, device_ids = config.BACKBONE_GPUS) 83 | PRETRAINED_QUALITY = PRETRAINED_QUALITY.cuda(0) 84 | PRETRAINED_QUALITY.eval() 85 | 86 | HEAD = GaussianFace(in_features = config.EMBEDDING_SIZE, out_features = NUM_CLASS) 87 | LOSS = FocalLoss() 88 | # optionally resume from a checkpoint 89 | if config.BACKBONE_RESUME_ROOT and config.HEAD_RESUME_ROOT: 90 | print("=" * 60) 91 | if os.path.isfile(config.BACKBONE_RESUME_ROOT): 92 | print("Loading Backbone Checkpoint '{}'".format(config.BACKBONE_RESUME_ROOT)) 93 | checkpoint = torch.load(config.BACKBONE_RESUME_ROOT) 94 | load_state_dict(BACKBONE, checkpoint) 95 | else: 96 | print("No Checkpoint Found at '{}' Please Have a Check or Continue to Train from Scratch".format(config.BACKBONE_RESUME_ROOT)) 97 | if os.path.isfile(config.HEAD_RESUME_ROOT): 98 | print("Loading Head Checkpoint '{}'".format(config.HEAD_RESUME_ROOT)) 99 | checkpoint = torch.load(config.HEAD_RESUME_ROOT) 100 | load_state_dict(HEAD, checkpoint) 101 | else: 102 | print("No Checkpoint Found at '{}' Please Have a Check or Continue to Train from Scratch".format(config.HEAD_RESUME_ROOT)) 103 | print("=" * 60) 104 | 105 | BACKBONE = nn.DataParallel(BACKBONE, device_ids = config.BACKBONE_GPUS, output_device=config.BACKBONE_GPUS[-1]) 106 | BACKBONE = BACKBONE.cuda(config.BACKBONE_GPUS[0]) 107 | HEAD = nn.DataParallel(HEAD, device_ids = config.HEAD_GPUS, output_device=config.HEAD_GPUS[0]) 108 | HEAD = HEAD.cuda(config.HEAD_GPUS[0]) 109 | OPTIMIZER = optim.SGD([ 110 | {'params': BACKBONE.parameters(), 'lr': config.BACKBONE_LR, 'weight_decay': config.WEIGHT_DECAY}, 111 | {'params': HEAD.parameters(), 'lr': config.BACKBONE_LR} 112 | ], 113 | momentum=config.MOMENTUM) 114 | DISP_FREQ = len(train_loader) // 100 115 | 116 | NUM_EPOCH_WARM_UP = config.NUM_EPOCH_WARM_UP 117 | NUM_BATCH_WARM_UP = len(train_loader) * NUM_EPOCH_WARM_UP 118 | batch = 0 119 | step = 0 120 | 121 | scheduler = CosineDecayLR(OPTIMIZER, T_max = 10*len(train_loader), lr_init = config.BACKBONE_LR, lr_min = 1e-5, warmup = NUM_BATCH_WARM_UP) 122 | for epoch in range(config.NUM_EPOCH): 123 | BACKBONE.train() 124 | HEAD.train() 125 | arcface_losses = AverageMeter() 126 | confidences = AverageMeter() 127 | top1 = AverageMeter() 128 | top5 = AverageMeter() 129 | scaler = torch.cuda.amp.GradScaler() 130 | for inputs, labels in tqdm(iter(train_loader)): 131 | inputs = inputs.cuda(config.BACKBONE_GPUS[0]) 132 | labels = labels.cuda(config.HEAD_GPUS[0]) 133 | with torch.cuda.amp.autocast(): 134 | features = BACKBONE(inputs) 135 | if PRETRAINED_BACKBONE is None or PRETRAINED_QUALITY is None: 136 | outputs = HEAD(None, features.cuda(config.HEAD_GPUS[0]), labels, False) 137 | else: 138 | with torch.no_grad(): 139 | _, fc = PRETRAINED_BACKBONE(inputs, True) 140 | quality = PRETRAINED_QUALITY(fc) 141 | outputs = HEAD(quality.cuda(config.HEAD_GPUS[0]), features.cuda(config.HEAD_GPUS[0]), labels, True) 142 | # measure accuracy and record loss 143 | arcface_loss = LOSS(outputs, labels) 144 | prec1, prec5 = accuracy(outputs.data, labels, topk = (1, 5)) 145 | arcface_losses.update(arcface_loss.data.item(), inputs.size(0)) 146 | top1.update(prec1.data.item(), inputs.size(0)) 147 | top5.update(prec5.data.item(), inputs.size(0)) 148 | loss = arcface_loss 149 | # compute gradient and do SGD step 150 | OPTIMIZER.zero_grad() 151 | #loss.backward() 152 | #OPTIMIZER.step() 153 | scaler.scale(loss).backward() 154 | scaler.step(OPTIMIZER) 155 | scaler.update() 156 | if ((batch + 1) % DISP_FREQ == 0) and batch != 0: 157 | print("=" * 60) 158 | print('Epoch {}/{} Batch {}/{}\t' 159 | 'Training Loss {arcface_loss.val:.4f} ({arcface_loss.avg:.4f})\t' 160 | 'Training Prec@1 {top1.val:.3f} ({top1.avg:.3f})\t' 161 | 'Training Prec@5 {top5.val:.3f} ({top5.avg:.3f})'.format( 162 | epoch + 1, config.NUM_EPOCH, batch + 1, len(train_loader) * config.NUM_EPOCH, 163 | arcface_loss = arcface_losses, top1 = top1, top5 = top5)) 164 | print("=" * 60) 165 | 166 | batch += 1 # batch index 167 | scheduler.step(batch) 168 | if batch % 1000 == 0: 169 | print(OPTIMIZER) 170 | # training statistics per epoch (buffer for visualization) 171 | epoch_loss = arcface_losses.avg 172 | epoch_acc = top1.avg 173 | writer.add_scalar("Training_Loss", epoch_loss, epoch + 1) 174 | writer.add_scalar("Training_Accuracy", epoch_acc, epoch + 1) 175 | print("=" * 60) 176 | print('Epoch: {}/{}\t' 177 | 'Training Loss {loss.val:.4f} ({loss.avg:.4f})\t' 178 | 'Training Prec@1 {top1.val:.3f} ({top1.avg:.3f})\t' 179 | 'Training Prec@5 {top5.val:.3f} ({top5.avg:.3f})'.format( 180 | epoch + 1, config.NUM_EPOCH, loss = arcface_losses, top1 = top1, top5 = top5)) 181 | print("=" * 60) 182 | 183 | # save checkpoints per epoch 184 | curTime = get_time() 185 | if not os.path.exists(config.MODEL_ROOT): 186 | os.makedirs(config.MODEL_ROOT) 187 | torch.save(BACKBONE.state_dict(), os.path.join(config.MODEL_ROOT, "Backbone_Epoch_{}_Batch_{}_Time_{}_checkpoint.pth".format(epoch + 1, batch, curTime))) 188 | torch.save(HEAD.state_dict(), os.path.join(config.MODEL_ROOT, "Head_Epoch_{}_Batch_{}_Time_{}_checkpoint.pth".format(epoch + 1, batch, curTime))) 189 | 190 | if __name__ == "__main__": 191 | train() 192 | -------------------------------------------------------------------------------- /util/utils.py: -------------------------------------------------------------------------------- 1 | import torch 2 | import torchvision.transforms as transforms 3 | import torch.nn.functional as F 4 | import torchvision.transforms.functional as tf 5 | from .verification import evaluate 6 | 7 | from datetime import datetime 8 | import matplotlib.pyplot as plt 9 | plt.switch_backend('agg') 10 | import numpy as np 11 | from PIL import Image 12 | import bcolz 13 | import io 14 | import os 15 | import math 16 | import numbers 17 | import random 18 | 19 | 20 | # Support: ['get_time', 'l2_norm', 'make_weights_for_balanced_classes', 'get_val_pair', 'get_val_data', 'separate_irse_bn_paras', 'separate_resnet_bn_paras', 'warm_up_lr', 'schedule_lr', 'de_preprocess', 'hflip_batch', 'ccrop_batch', 'gen_plot', 'perform_val', 'buffer_val', 'AverageMeter', 'accuracy'] 21 | 22 | 23 | def get_time(): 24 | return (str(datetime.now())[:-10]).replace(' ', '-').replace(':', '-') 25 | 26 | 27 | def l2_norm(input, axis = 1): 28 | norm = torch.norm(input, 2, axis, True) 29 | output = torch.div(input, norm) 30 | 31 | return output 32 | 33 | 34 | def make_weights_for_balanced_classes(images, nclasses): 35 | ''' 36 | Make a vector of weights for each image in the dataset, based 37 | on class frequency. The returned vector of weights can be used 38 | to create a WeightedRandomSampler for a DataLoader to have 39 | class balancing when sampling for a training batch. 40 | images - torchvisionDataset.imgs 41 | nclasses - len(torchvisionDataset.classes) 42 | https://discuss.pytorch.org/t/balanced-sampling-between-classes-with-torchvision-dataloader/2703/3 43 | ''' 44 | count = [0] * nclasses 45 | for item in images: 46 | count[item[1]] += 1 # item is (img-data, label-id) 47 | weight_per_class = [0.] * nclasses 48 | N = float(sum(count)) # total number of images 49 | for i in range(nclasses): 50 | weight_per_class[i] = N / float(count[i]) 51 | weight = [0] * len(images) 52 | for idx, val in enumerate(images): 53 | weight[idx] = weight_per_class[val[1]] 54 | 55 | return weight 56 | 57 | 58 | def get_val_pair(path, name): 59 | carray = bcolz.carray(rootdir = os.path.join(path, name), mode = 'r') 60 | issame = np.load('{}/{}_list.npy'.format(path, name)) 61 | 62 | return carray, issame 63 | 64 | 65 | def get_val_data(data_path): 66 | lfw, lfw_issame = get_val_pair(data_path, 'lfw') 67 | cfp_ff, cfp_ff_issame = get_val_pair(data_path, 'cfp_ff') 68 | cfp_fp, cfp_fp_issame = get_val_pair(data_path, 'cfp_fp') 69 | agedb_30, agedb_30_issame = get_val_pair(data_path, 'agedb_30') 70 | calfw, calfw_issame = get_val_pair(data_path, 'calfw') 71 | cplfw, cplfw_issame = get_val_pair(data_path, 'cplfw') 72 | vgg2_fp, vgg2_fp_issame = get_val_pair(data_path, 'vgg2_fp') 73 | 74 | return lfw, cfp_ff, cfp_fp, agedb_30, calfw, cplfw, vgg2_fp, lfw_issame, cfp_ff_issame, cfp_fp_issame, agedb_30_issame, calfw_issame, cplfw_issame, vgg2_fp_issame 75 | 76 | 77 | def separate_irse_bn_paras(modules): 78 | if not isinstance(modules, list): 79 | modules = [*modules.modules()] 80 | paras_only_bn = [] 81 | paras_wo_bn = [] 82 | for layer in modules: 83 | if 'distributed' in str(layer.__class__): 84 | continue 85 | if 'model' in str(layer.__class__): 86 | continue 87 | if 'cbam' in str(layer.__class__): 88 | continue 89 | if 'container' in str(layer.__class__): 90 | continue 91 | else: 92 | if 'batchnorm' in str(layer.__class__): 93 | paras_only_bn.extend([*layer.parameters()]) 94 | else: 95 | paras_wo_bn.extend([*layer.parameters()]) 96 | 97 | return paras_only_bn, paras_wo_bn 98 | 99 | 100 | def separate_resnet_bn_paras(modules): 101 | all_parameters = modules.parameters() 102 | paras_only_bn = [] 103 | 104 | for pname, p in modules.named_parameters(): 105 | if pname.find('bn') >= 0: 106 | paras_only_bn.append(p) 107 | 108 | paras_only_bn_id = list(map(id, paras_only_bn)) 109 | paras_wo_bn = list(filter(lambda p: id(p) not in paras_only_bn_id, all_parameters)) 110 | 111 | return paras_only_bn, paras_wo_bn 112 | 113 | 114 | def warm_up_lr(batch, num_batch_warm_up, init_lr, optimizer): 115 | for params in optimizer.param_groups: 116 | params['lr'] = batch * init_lr / num_batch_warm_up 117 | #print(optimizer) 118 | 119 | 120 | def schedule_lr(optimizer): 121 | for params in optimizer.param_groups: 122 | params['lr'] /= 10. 123 | 124 | print(optimizer) 125 | 126 | 127 | def de_preprocess(tensor): 128 | 129 | return tensor * 0.5 + 0.5 130 | 131 | 132 | hflip = transforms.Compose([ 133 | de_preprocess, 134 | transforms.ToPILImage(), 135 | transforms.functional.hflip, 136 | transforms.ToTensor(), 137 | transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5]) 138 | ]) 139 | 140 | 141 | def hflip_batch(imgs_tensor): 142 | hfliped_imgs = torch.empty_like(imgs_tensor) 143 | for i, img_ten in enumerate(imgs_tensor): 144 | hfliped_imgs[i] = hflip(img_ten) 145 | 146 | return hfliped_imgs 147 | 148 | 149 | ccrop = transforms.Compose([ 150 | de_preprocess, 151 | transforms.ToPILImage(), 152 | transforms.Resize([128, 128]), # smaller side resized 153 | transforms.CenterCrop([112, 112]), 154 | transforms.ToTensor(), 155 | transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5]) 156 | ]) 157 | 158 | 159 | def ccrop_batch(imgs_tensor): 160 | ccropped_imgs = torch.empty_like(imgs_tensor) 161 | for i, img_ten in enumerate(imgs_tensor): 162 | ccropped_imgs[i] = ccrop(img_ten) 163 | 164 | return ccropped_imgs 165 | 166 | 167 | def gen_plot(fpr, tpr): 168 | """Create a pyplot plot and save to buffer.""" 169 | plt.figure() 170 | plt.xlabel("FPR", fontsize = 14) 171 | plt.ylabel("TPR", fontsize = 14) 172 | plt.title("ROC Curve", fontsize = 14) 173 | plot = plt.plot(fpr, tpr, linewidth = 2) 174 | buf = io.BytesIO() 175 | plt.savefig(buf, format = 'jpeg') 176 | buf.seek(0) 177 | plt.close() 178 | 179 | return buf 180 | 181 | 182 | def perform_val(device, embedding_size, batch_size, backbone, quality, carray, issame, nrof_folds = 10, dataset='', tta = True): 183 | backbone.eval() # switch to evaluation mode 184 | quality.eval() 185 | 186 | to_image = transforms.ToPILImage() 187 | if dataset != '': 188 | os.makedirs(dataset) 189 | idx = 0 190 | embeddings = np.zeros([len(carray), embedding_size]) 191 | qualities = np.zeros([len(carray)]) 192 | with torch.no_grad(): 193 | while idx + batch_size <= len(carray): 194 | batch = torch.tensor(carray[idx:idx + batch_size][:, [2, 1, 0], :, :]) 195 | if tta: 196 | ccropped = ccrop_batch(batch) 197 | fliped = hflip_batch(ccropped) 198 | feature_cropped, fc_cropped = backbone(ccropped.to(device), True) 199 | quality_cropped = quality(fc_cropped) 200 | feature_fliped, fc_fliped = backbone(fliped.to(device), True) 201 | quality_fliped = quality(fc_fliped) 202 | emb_batch = feature_cropped.cpu() + feature_fliped.cpu() 203 | quality_final = (quality_cropped.cpu() + quality_fliped.cpu()) / 2 204 | embeddings[idx:idx + batch_size] = l2_norm(emb_batch) 205 | qualities[idx:idx + batch_size] = quality_final[:, 0] 206 | else: 207 | ccropped = ccrop_batch(batch) 208 | feature_cropped, fc_cropped = backbone(ccropped.to(device), True) 209 | quality_cropped = quality(fc_cropped) 210 | embeddings[idx:idx + batch_size] = l2_norm(feature_cropped).cpu() 211 | qualities[idx:idx + batch_size] = quality_cropped[:, 0].cpu() 212 | for i in range(len(qualities[idx:idx + batch_size])): 213 | if qualities[idx+i] < 0.3: 214 | img = to_image(batch[i] * 0.5 + 0.5) 215 | if dataset != '': 216 | img.save('{}/{:.4f}.jpg'.format(dataset, qualities[idx+i])) 217 | idx += batch_size 218 | if idx < len(carray): 219 | batch = torch.tensor(carray[idx:]) 220 | if tta: 221 | ccropped = ccrop_batch(batch) 222 | fliped = hflip_batch(ccropped) 223 | feature_cropped, fc_cropped = backbone(ccropped.to(device), True) 224 | quality_cropped = quality(fc_cropped) 225 | feature_fliped, fc_fliped = backbone(fliped.to(device), True) 226 | quality_fliped = quality(fc_fliped) 227 | emb_batch = feature_cropped.cpu() + feature_fliped.cpu() 228 | quality_final = (quality_cropped.cpu() + quality_fliped.cpu()) / 2 229 | embeddings[idx:] = l2_norm(emb_batch) 230 | qualities[idx:] = quality_final[:, 0] 231 | else: 232 | ccropped = ccrop_batch(batch) 233 | feature_cropped, fc_cropped = backbone(ccropped.to(device), True) 234 | quality_cropped = quality(fc_cropped) 235 | embeddings[idx:] = l2_norm(feature_cropped).cpu() 236 | qualities[idx:] = quality_cropped[:, 0].cpu() 237 | for i in range(len(qualities[idx:])): 238 | if qualities[idx+i] < 0.3: 239 | img = to_image(batch[i] * 0.5 + 0.5) 240 | if dataset != '': 241 | img.save('{}/{:.4f}.jpg'.format(dataset, qualities[idx+i])) 242 | for quality_thresold in [0.0, 0.1, 0.2, 0.3]: 243 | tpr, fpr, accuracy, best_thresholds = evaluate(embeddings, qualities, issame, nrof_folds, 0, quality_thresold) 244 | print(dataset, ":", quality_thresold, accuracy.mean(), best_thresholds.mean()) 245 | buf = gen_plot(fpr, tpr) 246 | roc_curve = Image.open(buf) 247 | roc_curve_tensor = transforms.ToTensor()(roc_curve) 248 | 249 | return accuracy.mean(), best_thresholds.mean(), roc_curve_tensor 250 | 251 | 252 | def buffer_val(writer, db_name, acc, best_threshold, roc_curve_tensor, epoch): 253 | writer.add_scalar('{}_Accuracy'.format(db_name), acc, epoch) 254 | writer.add_scalar('{}_Best_Threshold'.format(db_name), best_threshold, epoch) 255 | writer.add_image('{}_ROC_Curve'.format(db_name), roc_curve_tensor, epoch) 256 | 257 | 258 | class AverageMeter(object): 259 | """Computes and stores the average and current value""" 260 | def __init__(self): 261 | self.reset() 262 | 263 | def reset(self): 264 | self.val = 0 265 | self.avg = 0 266 | self.sum = 0 267 | self.count = 0 268 | 269 | def update(self, val, n = 1): 270 | self.val = val 271 | self.sum += val * n 272 | self.count += n 273 | self.avg = self.sum / self.count 274 | 275 | 276 | def accuracy(output, target, topk=(1,)): 277 | """Computes the precision@k for the specified values of k""" 278 | maxk = max(topk) 279 | batch_size = target.size(0) 280 | 281 | _, pred = output.topk(maxk, 1, True, True) 282 | pred = pred.t() 283 | correct = pred.eq(target.view(1, -1).expand_as(pred)) 284 | 285 | res = [] 286 | for k in topk: 287 | correct_k = correct[:k].reshape(-1).float().sum(0) 288 | res.append(correct_k.mul_(100.0 / batch_size)) 289 | 290 | return res 291 | 292 | class BottomRandomErasing(object): 293 | def __init__(self, p=0.5, scale=(0.02, 0.33), ratio=(0.3, 3.3), value=0, inplace=False): 294 | assert isinstance(value, (numbers.Number, str, tuple, list)) 295 | if (scale[0] > scale[1]) or (ratio[0] > ratio[1]): 296 | warnings.warn("range should be of kind (min, max)") 297 | if scale[0] < 0 or scale[1] > 1: 298 | raise ValueError("range of scale should be between 0 and 1") 299 | if p < 0 or p > 1: 300 | raise ValueError("range of random erasing probability should be between 0 and 1") 301 | 302 | self.p = p 303 | self.scale = scale 304 | self.ratio = ratio 305 | self.value = value 306 | self.inplace = inplace 307 | 308 | @staticmethod 309 | def get_params(img, scale, ratio, value=0): 310 | img_c, img_h, img_w = img.shape 311 | area = img_h * img_w / 2 312 | 313 | for attempt in range(10): 314 | erase_area = random.uniform(scale[0], scale[1]) * area 315 | aspect_ratio = random.uniform(ratio[0], ratio[1]) 316 | 317 | h = int(round(math.sqrt(erase_area * aspect_ratio))) 318 | w = int(round(math.sqrt(erase_area / aspect_ratio))) 319 | 320 | if h < img_h // 2 and w < img_w: 321 | i = random.randint(0, img_h // 2 - h) + img_h // 2 322 | j = random.randint(0, img_w - w) 323 | if isinstance(value, numbers.Number): 324 | v = value 325 | elif isinstance(value, torch._six.string_classes): 326 | v = torch.empty([img_c, h, w], dtype=torch.float32).normal_() 327 | elif isinstance(value, (list, tuple)): 328 | v = torch.tensor(value, dtype=torch.float32).view(-1, 1, 1).expand(-1, h, w) 329 | return i, j, h, w, v 330 | 331 | # Return original image 332 | return 0, 0, img_h, img_w, img 333 | 334 | def __call__(self, img): 335 | if random.uniform(0, 1) < self.p: 336 | x, y, h, w, v = self.get_params(img, scale=self.scale, ratio=self.ratio, value=self.value) 337 | return tf.erase(img, x, y, h, w, v, self.inplace) 338 | return img --------------------------------------------------------------------------------