# AutoExportAndTest **Repository Path**: study-cooperation/AutoExportAndTest ## Basic Information - **Project Name**: AutoExportAndTest - **Description**: 训练过程中自动导出模型,测试模型 - **Primary Language**: Python - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2019-01-17 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 简介 本项目主要是训练测试过程中的一些工具,主要分为以下几个部分: * 在训练过程中自动导出模型并测试 * 测试过程中分析测试结果,并写入结果到Excel表格 # 文件结构 ``` ./ │ auto_export_and_train.py │ class_nums.json │ predict_caffe.py │ requirements.txt │ result_analysis.py │ train.sh │ ├─utils │ │ basic.py │ │ detector.py │ │ evaluator.py │ │ io.py │ │ __init__.py ``` # 自动导出模型并测试 本工具主要是为了减轻训练完成后导出多个模型、测试多个模型的负担。为了使用本工具,需要配置好[此项目](https://gitee.com/study-cooperation/models)的环境, 并确保能够开始训练。 本工具主要是用`auto_export_and_train.py`和`trian.sh`两个文件,并且只支持Linux环境。 ## 使用方法 1. 克隆本项目到本地 使用`git clone git@gitee.com:study-cooperation/AutoExportAndTest.git`或者直接下载压缩包 2. 打开`train.sh`,主要修改以下参数: * `PIPELINE_CONFIG_PATH`:训练时所使用的配置文件(pipeline.config)路径 * `TRAIN_DIR`:训练过程中的snapshot保存路径,包括`model.ckpt`文件等 * `FROZEN_MODEL_OUTPUT_DIR`:导出的`frozen_inference_graph.pb`最后存放的文件夹 * `LABEL_MAP_PATH`:训练使用的`label.pbtxt`文件所在路径 * `TEST_IMAGE_DIR`:测试图片所在目录 * `PID_FILE_PATH`:程序执行过程中需要释放掉训练程序占用的GPU,所以在程序里面需要获取训练程序的pid,因此将pid保存到指定的文件中。不需要pid.txt文件存在,只需要目录存在即可 * `--min_iter`:导出测试模型的最低训练次数,低于指定次数的模型会忽略不计 * `--iter_gap`:两次导出测试模型中间的最小间隔 3. 执行`train.sh`: `./train.sh` 还有一些参数未写在`trian.sh`中,如果需要可以自己添加,详细介绍如下: * `--user_name`:可选参数,者不指定此参数表明不使用微信接收消息,否则发送微信消息给`user_name`(微信中的备注名)指定的用户,注意,不能给登录用户自己发送消息。如果指定了`--user_name`,则会在程序刚开始运行时弹出微信登录的二维码,需要手机微信扫码登录 * `--pb_file_postfix`:可选参数,导出的测试模型的后缀 * `--irsd`:可选,图片测试的结果,如果不指定则不保存 * `--checktime_gap`:可选,两次检查之间的时间间隔,默认为120秒 ## 注意事项 1. 如果不指定接收消息的微信用户,则可以在屏幕上或者生成的`info.log`文件中看到测试结果和测试过程。 2. 在自动测试的过程中会调用[predict.py](./predict.py)中的`predict_image`函数,用户可以定义自己的`predict_image`函数,只需满足以下的接口形式即可: ```python # 可以使用自己的预测程序,只要接口满足下面调用的要求,多余参数都有默认值即可 precision, recall = predict_image(image_dir, label_map_path, pb_path, image_result_save_dir=image_result_save_dir) ``` 其余参数都需要有默认值。 # 分析检测结果并写入Excel表格 本工具分析每张图片的检测结果,得到每张图片中每个品类的错误分布情况,辅助进一步的训练。主要是`result_analysis.py`这个文件。 对于每张图片,主要分析以下的几种检测结果: |照片编号|品类|标记代码|样本总数|人工标记数|识别数|准确框|标签错误框|多框|漏框|错误识别的类别| |:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:| |图片名称|属于哪个大类(caffe或者是其他)|样本的类别名称|此类别的样本总数|当前图片中此类别的人工标记个数|此类别的模型检测数|模型检测数中能够与人工标记一一对应的框|模型检测的框中标签错误的个数(不包括多框的)|模型检测到的,但是人工标记中没有的|人工标记的,但是模型未检测到的|标签错误的框出现的所有错误label及个数| ## API文档 写入Excel表格的功能需要`openpyxl`包的支持,通过`pip install openpyxl`安装。 `result_analysis.py`只包含一个类`ResultAnalyzer`,并提供以下API: * `__init__(workbook_save_path, all_sample_nums_path)`:`workbook_save_path`为生成的Excel工作表保存的位置;`all_sample_nums_path`为`class_nums.json`文件所在路径; * `analysis_result(image_name, category, label_map_dict, gt_boxes, gt_classes, prediction_boxes, prediction_classes)`:构造好`ResultAnalyzer`类的对象之后可以利用本函数分析每张图片的检测结果,`category`为每张图片检测的大的品类名称,例如caffe、`maipian`等,`label_map_dict`为索引到类别名称的字典,后面四个参数为检测结果和真实标记; * `write_single_image_result_2_sheet(single_image_result=None)`:将一张图片的检测结果写入Excel的sheet1中,可以指定`single_image_result`为之前某次调用`analysis_result`函数的返回结果或者不指定,不指定的话会使用最近一次调用的结果; * `analysis_and_write_single_image_result_2_sheet(self, image_name, category, label_map_dict, gt_boxes, gt_classes, prediction_boxes, prediction_classes)`:将以上两个函数组合成一个函数; * `get_confusion_matrix(self, len_of_all_labels: int, gt_boxes=None, gt_classes=None, pred_boxes=None, pred_classes=None)`:计算混淆矩阵,`len_of_all_labels`为样本中所有类别个数,也即混淆矩阵的shape,后面四个参数为检测结果和真是标记; * `write_confusion_matrix(label_map_dict, c_m=None)`:将混淆矩阵写入Excel表的一个新的Sheeet中,`label_map_dict`为类别编号到类名的映射字典,`c_m`为指定的混淆矩阵,如果不指定,会使用最近一次调用`get_confusion_matrix`函数计算得到的结果; * `get_and_write_confusion_matrix(self, label_map_dict, gt_boxes=None, gt_classes=None, pred_boxes=None, pred_classes=None)`:将以上两个函数组合成一个; * `save(self, save_path=None)`:将结果保存到指定的Excel表格,如不指定,则使用在构造函数中指定的路径。