年齡性別識別¶
年齡性別識別,基於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`生成年齡分佈圖。

# 訓練
開始訓練,具體參數可以查看代碼,這裏介紹一下`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
效果圖:
