/baai-federated-learning-helmet-baseline

电力人工智能数据竞赛——安全帽未佩戴行为目标检测赛道基准模型

Primary LanguagePythonApache License 2.0Apache-2.0

电力人工智能数据竞赛-安全帽未佩戴行为目标检测赛道

以下为电力人工智能数据竞赛-安全帽未佩戴行为目标检测赛道基准模型介绍。其中包含了智源联邦学习框架的简化版本(真实版本后期会以论文的形式发布)、智源整理标注的初赛安全帽数据集和基于YOLOv3模型完成的实验。

环境要求

  • Python==3.7.6
  • Flask==1.1.1
  • gevent==20.9.0
  • loguru==0.5.3
  • numpy==1.18.1
  • Pillow==7.0.0
  • torch==1.6.0
  • terminaltables==3.1.0
  • torchvision==0.7.0
  • tqdm==4.42.1

详情请参考baai-federated-learning-helmet-baseline下面的requirements.txt

项目结构

.
├── README.md
├── baai-client  # 智源联邦学习客户端
│   ├── api
│   │   ├── __init__.py
│   │   └── my_api.py  # 选手联邦学习服务端需要调用智源联邦学习客户端的函数(训练、测试等)
│   ├── config
│   │   ├── __init__.py
│   │   └── project_conf.py  # 本机端口号和环境配置
│   ├── log
│   │   ├── D_preliminary_contest_helmet_federal_M_yolov3_SE_25_CE_4_ID_1.json  # 最后测试集提交结果
│   │   └── D_preliminary_contest_helmet_federal_M_yolov3_SE_25_CE_4_ID_1.log  # 训练、测试过程完整日志
│   ├── main.py  # 智源联邦学习客户端启动主函数
│   ├── service
│   │   └── federated
│   │       ├── client.py  # 智源联邦学习客户端类
│   │       ├── config
│   │       │   └── preliminary_contest_helmet_federal
│   │       │       ├── create_preliminary_contest_helmet_federal_model.sh  # 构建yolov3模型的bash脚本
│   │       │       ├── preliminary_contest_helmet_federal.data  # 本地初赛安全帽数据集路径信息
│   │       │       └── yolov3_preliminary_contest_helmet_federal.cfg  # 根据bash脚本生成的cfg文件
│   │       ├── models
│   │       │   └── models.py  # yolov3模型相关类
│   │       ├── utils
│   │       │   ├── data.py  # 处理加载数据集相关函数
│   │       │   ├── options.py  # 初始化参数函数
│   │       │   └── utils.py  # 辅助功能函数
│   └── utils
│       ├── __init__.py
│       ├── common_utils.py  # 常用功能函数
│       ├── http_request_utils.py  # 通信功能函数(GET、POST)
│       ├── request_api.py  # 调用通信功能函数api
│       └── result_utils.py  # 通信结果封装类
├── contestant-server  # 选手联邦学习服务端
│   ├── config
│   │   ├── __init__.py
│   │   └── project_conf.py  # 本机端口号和环境配置
│   ├── log
│   │   └── D_preliminary_contest_helmet_federal_M_yolov3_SE_25_CE_4.log  # 训练、测试过程完整日志
│   ├── service
│   │   └── federated
│   │       ├── config
│   │       │   └── preliminary_contest_helmet_federal
│   │       │       ├── create_preliminary_contest_helmet_federal_model.sh  # 构建yolov3模型的bash脚本
│   │       │       └── yolov3_preliminary_contest_helmet_federal.cfg  # 根据bash脚本生成的cfg文件
│   │       ├── models
│   │       │   └── models.py  # yolov3模型相关类
│   │       ├── server.py
│   │       ├── utils
│   │       │   ├── options.py  # 初始化参数函数
│   │       │   └── utils.py  # 辅助功能函数
│   │       └── weights  # 保存yolov3预训练模型
│   └── utils
│       ├── __init__.py
│       ├── common_utils.py  # 常用功能函数
│       ├── http_request_utils.py  # 通信功能函数(GET、POST)
│       ├── request_api.py  # 调用通信功能函数api
│       └── result_utils.py  # 通信结果封装类
├── requirements.txt  # 需要安装的python库
└── sgcc-client  # 国网电力联邦学习客户端(功能与智源联邦学习客户端相同,此处不展开介绍)
    ├── api
    │   ├── __init__.py
    │   └── my_api.py
    ├── config
    │   ├── __init__.py
    │   └── project_conf.py
    ├── log
    │   ├── D_preliminary_contest_helmet_federal_M_yolov3_SE_25_CE_4_ID_2.json
    │   └── D_preliminary_contest_helmet_federal_M_yolov3_SE_25_CE_4_ID_2.log
    ├── main.py
    ├── service
    │   └── federated
    │       ├── client.py
    │       ├── config
    │       │   └── preliminary_contest_helmet_federal
    │       │       ├── create_preliminary_contest_helmet_federal_model.sh
    │       │       ├── preliminary_contest_helmet_federal.data
    │       │       └── yolov3_preliminary_contest_helmet_federal.cfg
    │       ├── models
    │       │   └── models.py
    │       ├── utils
    │       │   ├── data.py
    │       │   ├── options.py
    │       │   └── utils.py
    └── utils
        ├── __init__.py
        ├── common_utils.py
        ├── http_request_utils.py
        ├── request_api.py
        └── result_utils.py

下载地址

  • 初赛安全帽数据集
    • 其中智源客户端的数据集包括
      • preliminary_contest_helmet_federal/annotations下面的train1.jsonval1.jsontest.jsontest_image_info.json
      • preliminary_contest_helmet_federal/images下面的train1val1test
    • 国网电力客户端的数据集包括
      • preliminary_contest_helmet_federal/annotations下面的train2.jsonval2.jsontest.jsontest_image_info.json
      • preliminary_contest_helmet_federal/images下面的train2val2test
  • yolov3预训练模型
    当前主要采用weights下面的darknet53.conv.74

运行方式

智源联邦学习客户端

  • 进入baai-client/service/federated/config/preliminary_contest_helmet_federal目录

    • 修改preliminary_contest_helmet_federal.data当中的数据路径
    • 生成yolov3模型的cfg文件(先删除旧的cfg文件)
      bash create_preliminary_contest_helmet_federal_model.sh 2
  • 进入baai-client/config

    • 修改project_conf.py当中的hostport
  • 进入baai-client/service/federated/utils目录

    • 配置参数,特别是data_configmodel_defserver_ipserver_portclient_ipclient_port
  • 启动智源联邦学习客户端

    • 进入baai-client,运行以下指令
      python main.py

国网电力联邦学习客户端

  • 进入sgcc-client/service/federated/config/preliminary_contest_helmet_federal目录

    • 修改preliminary_contest_helmet_federal.data当中的数据路径
    • 生成yolov3模型的cfg文件(先删除旧的cfg文件)
      bash create_preliminary_contest_helmet_federal_model.sh 2
  • 进入sgcc-client/config

    • 修改project_conf.py当中的hostport
  • 进入sgcc-client/service/federated/utils目录

    • 配置参数,特别是data_configmodel_defserver_ipserver_portclient_ipclient_port
  • 启动国网电力联邦学习客户端

    • 进入sgcc-client,运行以下指令
      python main.py

选手联邦学习服务端

  • 把下载好的yolov3预训练模型拷贝到contestant-server/service/federated/weights

  • 进入contestant-server/service/federated/config/preliminary_contest_helmet_federal目录

    • 生成yolov3模型的cfg文件(先删除旧的cfg文件)
      bash create_preliminary_contest_helmet_federal_model.sh 2
  • 进入contestant-server/config

    • 修改project_conf.py当中的hostport
  • 进入contestant-server/service/federated/utils目录

    • 配置参数,特别是pretrained_weightsmodel_defserver_ipserver_portclient_ipsclient_ports
  • 启动选手联邦学习服务端

    • 进入contestant-server,运行以下指令
      PYTHONPATH=your/project/path/contestant-server python service/federated/server.py

实验指标

  • 正确率:P (Precision) = TP / (TP + FP),所有预测出来的正例中有多少是真的正例
  • 召回率:R (Recall) = TP / (TP + FN),所有真实正例中预测出了多少真实正例
  • F1值:F1 Score = 2 * P * R / (P + R),精确率和召回率的调和均值
  • mAP (mean Average Precision): 目标检测模型的评估指标,参考目标检测模型的评估指标mAP详解(附代码)
  • 国网电力指标:马上更新

实验结果

基于默认实验参数,初赛安全帽测试集基于YOLOv3模型的结果:

Index Class name Precision Recall F1 AP (mAP)
0 Wear_helmet 0.31408 0.66526 0.42670 0.55481
1 No_helmet 0.39388 0.82585 0.53337 0.72258
2 Total 0.35398 0.74556 0.48004 0.63870

选手问题答疑

问题1:

File "your/python/path/python3.7/site-packages/torch/nn/modules/container.py", line 74, in _get_item_by_idx  
raise IndexError('Index {} is out of range'.format(idx))  
IndexError: index 0 is out of range  

解决方案:在客户端和服务端生成新的cfg文件之前,先把旧的cfg文件删除掉。

问题2:

File "service/federated/server.py", line 81, in call_federated_train_size  
federated_train_size = Common.get_dict_by_json_str_func(train_job.value['data'])["federated_train_size"]  
TypeError: 'NoneType' object is not subscriptable

解决方案:查看客户端报错信息,如果是Flask包相关错误,将Flask升级为1.1.1版本。

问题3:

Start executing step: call federated train size  
Segmentation fault (core dumped)

解决方案:很可能是gevent版本的问题,升级到20.9.0版本。

问题4:
电力指标相关的问题。
解决方法:今天会更新国网电力指标说明。