年齡性別識別

年齡性別識別,基於insightface功能模塊開發的,支持多張人臉同時檢測和識別。

源碼地址:https://github.com/yeyupiaoling/Age-Gender-MXNET

環境

  • 安裝mxnet,支持1.3~1.6版本,安裝命令如下。
    ```shell script
    pip install mxnet-cu101==1.5.0
# 數據集

 - 默認支持以下三種數據集,將以下三個數據集下載解壓到`dataset`目錄下。

1. http://afad-dataset.github.io/
2. http://mmlab.ie.cuhk.edu.hk/projects/MegaAge/
3. https://ibug.doc.ic.ac.uk/resources/agedb/

 - 執行生成數據列表。
```shell script
python create_dataset.py
  • 如果想訓練自定義數據集,只需生成類似以下的數據列表就可以了。
    ```shell script
    dataset/AgeDB/0_MariaCallas_35_f.jpg,0,35
    dataset/AgeDB/10000_GlennClose_62_f.jpg,0,62
    dataset/AgeDB/10001_GoldieHawn_23_f.jpg,0,23
    dataset/AgeDB/10003_GoldieHawn_24_f.jpg,0,24
    dataset/AgeDB/10004_GoldieHawn_27_f.jpg,0,27
    dataset/AgeDB/10005_GoldieHawn_28_f.jpg,0,28
    dataset/AgeDB/10006_GoldieHawn_29_f.jpg,0,29
如果想看各個年齡的分佈,可以執行`show_age_distribution.py`生成年齡分佈圖。

![](/static/files/2021-04-07/09fb3bb01d824c508da785524df36e05.png)


# 訓練

開始訓練,具體參數可以查看代碼,這裏介紹一下`network`參數,這個參數是選擇模型的,當指定爲`r50`則選擇ResNet作爲特徵提取模型,當`m50`則使用MobileNet作爲特徵提取模型。
```shell script
python train.py

訓練輸出的結果:

gpu num: 1
num_layers 50
data_shape [3, 112, 112]
Called with argument: Namespace(batch_size=128, color=0, ctx_num=1, cutoff=0, data_dir='dataset', data_shape='3,112,112', end_epoch=200, gpu_ids='0', image_channel=3, image_h=112, image_w=112, lr=0.1, lr_steps='10,30,80,150,200', network='m50', num_layers=50, prefix='temp/model', pretrained='', rand_mirror=1, rescale_threshold=0, version_input=1, version_output='GAP')
1 GAP 32
INFO:root:loading recordio dataset\train.rec...
INFO:root:dataset\train.rec 數據大小:303018
INFO:root:是否隨機翻轉圖片:1
INFO:root:loading recordio dataset\val.rec...
INFO:root:dataset\val.rec 數據大小:1032
INFO:root:是否隨機翻轉圖片:False
call reset()
開始訓練...
INFO:root:Epoch[0] Batch [0-20] Speed: 520.85 samples/sec   acc=0.572545    MAE=10.734747   CUM_5=0.240699
INFO:root:Epoch[0] Batch [20-40]    Speed: 518.95 samples/sec   acc=0.589844    MAE=9.351172    CUM_5=0.289844
INFO:root:Epoch[0] Batch [40-60]    Speed: 516.86 samples/sec   acc=0.603125    MAE=9.184766    CUM_5=0.303906
INFO:root:Epoch[0] Batch [60-80]    Speed: 508.44 samples/sec   acc=0.609766    MAE=8.759375    CUM_5=0.336719
INFO:root:Epoch[0] Batch [80-100]   Speed: 461.26 samples/sec   acc=0.656250    MAE=8.224609    CUM_5=0.361328
INFO:root:Epoch[0] Batch [100-120]  Speed: 518.43 samples/sec   acc=0.696875    MAE=7.611328    CUM_5=0.400391
INFO:root:Epoch[0] Batch [120-140]  Speed: 514.88 samples/sec   acc=0.715234    MAE=7.224609    CUM_5=0.426172
INFO:root:Epoch[0] Batch [140-160]  Speed: 517.80 samples/sec   acc=0.722266    MAE=6.976172    CUM_5=0.437500

評估

訓練結束之後,執行下面的命令評估模型的識別準確率。
```shell script
python eval.py

輸出結果,從結果來看,準確率還是可以的。
```shell
100%|██████████| 1032/1032 [00:06<00:00, 153.75it/s]
性別準確率:0.972868
年齡準確率:0.761628

預測

使用訓練好的模型或者筆者提供的模型執行年齡性別識別,通過指定圖像文件路徑完成識別。
```shell script
python infer.py –image=test.jpg

識別輸出結果:
```shell
第1張人臉,位置(160, 32, 204, 84), 性別:男, 年齡:30
第2張人臉,位置(545, 162, 579, 206), 性別:女, 年齡:31
第3張人臉,位置(632, 118, 666, 158), 性別:男, 年齡:28
第4張人臉,位置(91, 159, 151, 237), 性別:男, 年齡:38
第5張人臉,位置(723, 123, 760, 169), 性別:男, 年齡:26
第6張人臉,位置(263, 120, 317, 191), 性別:男, 年齡:27
第7張人臉,位置(438, 134, 481, 190), 性別:男, 年齡:46
第8張人臉,位置(908, 160, 963, 224), 性別:男, 年齡:35
第9張人臉,位置(39, 51, 81, 102), 性別:女, 年齡:31
第10張人臉,位置(807, 148, 847, 196), 性別:女, 年齡:26
第11張人臉,位置(449, 40, 485, 84), 性別:男, 年齡:29
第12張人臉,位置(378, 46, 412, 86), 性別:女, 年齡:33
第13張人臉,位置(534, 46, 567, 83), 性別:男, 年齡:30
第14張人臉,位置(272, 20, 311, 67), 性別:男, 年齡:28
第15張人臉,位置(358, 216, 375, 237), 性別:男, 年齡:27

效果圖:

小夜