一、X光安检图像检测挑战赛3.0
地址:challenge.xfyun.cn/topic/info?…
1.赛事背景
X光安检是目前在城市轨交、铁路、机场、物流业广泛使用的物检手段。使用人工智能技术,辅助一线安检员进行X光安检判图,可以有效降低因为安检员经验、能力或工作状态造成的错漏检问题。在实际场景中,因待检测物品的多样性、成像角度、重叠遮挡等问题,X光安检图像检测算法研究存在一定挑战。
2.赛事任务
本赛事的任务是:基于科大讯飞提供的真实X光安检图像集构建检测模型,对X光安检图像中的指定类别的物品进行检测。
3.评审规则
3.1 数据说明
此次比赛提供带标注的训练数据,即待检测物品在包裹中的X光图像及其标注文件。
本次比赛标注文件中的类别为8类,包括:
刀(knife)、剪刀(scissors)、打火机(lighter)、优盘(USBFlashDisk)、压力容器(pressure)、带喷嘴塑料瓶(plasticBottleWithaNozzle)、公章(seal)、电池(battery)。
待识别物品的X光成像示意图如图所示。
比赛提供的X光图像及其矩形框标注的文件按照数据来源存放在不同的文件夹中,图像文件采用jpg格式,标注文件采用xml格式,各字段含义参照voc数据集。voc各字段含义对应表为:
- filename 文件名
- size 图像尺寸
- width 图像宽度
- height 图像高度
- depth 图像深度,一般为3表示是彩色图像
- object 图像中的目标,可能有多个
- name 该目标的标签名称
- bndbox 该目标的标注框
- xmin 该目标的左上角宽度方向坐标
- ymin 该目标的左上角高度方向坐标
- xmax 该目标的右下角宽度方向坐标
- ymax 该目标的右下角高度方向坐标
3.2 评估指标
评测方式采用计算mAP(IoU = 0.5)的方式。
首先计算每个类的AP:
(1)根据预测框和标注框的IoU是否达到阈值0.5判断该预测框是真阳性还是假阳性;
(2)根据每个预测框的置信度进行从高到低排序;
(3)在不同置信度阈值下计算精确率和召回率,得到若干组PR值;
(4)绘制PR曲线并计算AP值。
然后计算mAP:把所有类的AP值求平均得到mAP。
3.3 作品提交要求
作品必须健康、合法、无任何不良信息及商业宣传行为,不违反任何中华人民共和国有关法律。须保证原创性,不侵犯任何第三方知识产权或其他权利;一经发现或经权利人指出,主办方将直接取消其参赛资格,科大讯飞保留赛事解释权。
选手需要提交json格式文件,详情见示例。其中,坐标值必须为大于0的正数且不能超过图像的宽高。
按照赛题数据页面2022gamedatasettest1.txt里面的顺序组织json
提交文件需按序排列,首先按图片顺序排列,然后按类别顺序排列,置信度顺序随意。
- (a) 图片顺序,请按照图片编号顺序。
- (b) 类别顺序,请参照下列顺序: {'knife': 1, 'scissors': 2, 'lighter': 3, 'USBFlashDisk': 4, 'pressure': 5, 'plasticBottleWithaNozzle': 6, 'seal': 7, 'battery': 8}
二、数据集处理
1.标注文件整理
# 解压缩数据集 !unzip -qoa data/data165820/round1.zip -d data/ !unzip -qoa data/data165820/round2_test.zip -d data/
!mv data/讯飞研究院-X光安检图像检测挑战赛2022公开数据 data/round1
!mkdir data/round1/train/XML
import glob import shutil import os def move_xml(domain_name): xml_dir=f"data/round1/train/{domain_name}/XML" filenames=glob.glob(f'{xml_dir}/*.xml') print(f"{xml_dir}移动的XML共有{len(filenames)}个。") if len(filenames)==0: return for filename in filenames: file_path, shortname=os.path.split(filename) new_name=domain_name+'_'+shortname new_name=os.path.join("data/round1/train/XML", new_name) shutil.move(filename, new_name) shutil.rmtree(xml_dir) print("重命名并移动文件完成。")
move_xml('domain1') move_xml('domain2') move_xml('domain3')
data/round1/train/domain1/XML移动的XML共有1323个。 重命名并移动文件完成。 data/round1/train/domain2/XML移动的XML共有1383个。 重命名并移动文件完成。 data/round1/train/domain3/XML移动的XML共有1308个。 重命名并移动文件完成。
print(len(glob.glob('data/round1/train/XML/*.xml')))
4014
!mv data/round1/train/XML data/round1/train/Annotations
2.图片文件整理
import glob import shutil import os def move_xml(domain_name): jpg_dir=f"data/round1/train/{domain_name}/" filenames=glob.glob(f'{jpg_dir}/*.jpg') print(f"{jpg_dir}移动的XML共有{len(filenames)}个。") if len(filenames)==0: return for filename in filenames: file_path, shortname=os.path.split(filename) new_name=domain_name+'_'+shortname new_name=os.path.join("data/round1/train/JPEGImages", new_name) shutil.move(filename, new_name) shutil.rmtree(jpg_dir) print("重命名并移动文件完成。")
!mkdir data/round1/train/JPEGImages
move_xml('domain1') move_xml('domain2') move_xml('domain3')
data/round1/train/domain1/移动的XML共有1323个。 重命名并移动文件完成。 data/round1/train/domain2/移动的XML共有1383个。 重命名并移动文件完成。 data/round1/train/domain3/移动的XML共有1308个。 重命名并移动文件完成。
print(len(glob.glob('data/round1/train/JPEGImages/*.jpg')))
4014
3.PaddleX 安装
!python -m pip install --upgrade -q pip --user !pip install -q -U paddlex
4.数据集划分
!paddlex --split_dataset --format VOC --dataset_dir data/round1/train/ --val_value 0.2
[32m[08-21 13:52:20 MainThread @logger.py:242][0m Argv: /opt/conda/envs/python35-paddle120-env/bin/paddlex --split_dataset --format VOC --dataset_dir data/round1/train/ --val_value 0.2 [0m[33m[08-21 13:52:20 MainThread @utils.py:79][0m [5m[33mWRN[0m paddlepaddle version: 2.3.1. The dynamic graph version of PARL is under development, not fully tested and supported [0m/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/parl/remote/communication.py:38: DeprecationWarning: 'pyarrow.default_serialization_context' is deprecated as of 2.0.0 and will be removed in a future version. Use pickle or the pyarrow IPC functionality instead. context = pyarrow.default_serialization_context() [0m/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/__init__.py:107: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working from collections import MutableMapping [0m/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/rcsetup.py:20: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working from collections import Iterable, Mapping [0m/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/colors.py:53: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working from collections import Sized [0m2022-08-21 13:52:21,696-WARNING: type object 'QuantizationTransformPass' has no attribute '_supported_quantizable_op_type' [0m2022-08-21 13:52:21,696-WARNING: If you want to use training-aware and post-training quantization, please use Paddle >= 1.8.4 or develop version [0m2022-08-21 13:52:23 [INFO] Dataset split starts...[0m [0m2022-08-21 13:52:23 [INFO] Dataset split done.[0m [0m2022-08-21 13:52:23 [INFO] Train samples: 3212[0m [0m2022-08-21 13:52:23 [INFO] Eval samples: 802[0m [0m2022-08-21 13:52:23 [INFO] Test samples: 0[0m [0m2022-08-21 13:52:23 [INFO] Split files saved in data/round1/train/[0m [0m[0m
!ls data/round1/train/
Annotations JPEGImages labels.txt train_list.txt val_list.txt
5.图片查看





