★★★ 本文源自AlStudio社区精品项目,【点击此处】查看更多精品内容 >>>
X光安检图像识别挑战赛比赛链接:https://challenge.xfyun.cn/topic/info?type=Xray-2023
另外,如果有参加基于可见光图像的柑橘花果梢语义分割挑战赛的小伙伴,可以参考[非官方]23科大讯飞—基于可见光图像的柑橘花果梢语义分割挑战赛baseline
一、赛事背景
X光安检是目前在城市轨交、铁路、机场、物流业广泛使用的物检手段。使用人工智能技术,辅助一线安检员进行X光安检判图,可以有效降低因为安检员经验、能力或工作状态造成的错漏检问题。在实际场景中,因待检测物品的多样性、成像角度、重叠遮挡等问题,X光安检图像检测算法研究存在一定挑战。
二、赛事任务
本赛事的任务是:基于科大讯飞提供的真实X光安检图像集构建检测模型,对X光安检图像中的指定类别的物品进行检测,识别出物体的位置和类别。
评估指标:
评测方式采用计算mAP(IoU = 0.5)的方式。
首先计算每个类的AP:
- 根据预测框和标注框的IoU是否达到阈值0.5判断该预测框是真阳性还是假阳性;
- 根据每个预测框的置信度进行从高到低排序;
- 在不同置信度阈值下计算精确率和召回率,得到若干组PR值;
- 绘制PR曲线并计算AP值。
然后计算mAP:把所有类的AP值求平均得到mAP。
三、 赛题解析
此次比赛提供带标注的训练数据,即待检测物品在包裹中的X光图像及其标注文件。
本次比赛标注文件中的类别为9类,包括:
刀(knife)、钳子(tongs)、玻璃瓶(glassbottle)、压力容器(pressure)、笔记本电脑(laptop)、雨伞(umbrella)、金属杯(metalcup)、剪刀(scissor)、打火机(lighter)。

待识别物品的X光成像示意图如图所示。
比赛提供的X光图像及其矩形框标注的文件按照数据来源存放在不同的文件夹中,图像文件采用jpg格式,标注文件采用xml格式,各字段含义参照voc数据集。voc各字段含义对应表为:
├── filename 文件名
├── size 图像尺寸
├── width 图像宽度
├── height 图像高度
└── depth 图像深度,一般为3表示是彩色图像
└── object 图像中的目标,可能有多个
├── name 该目标的标签名称
└── bndbox 该目标的标注框
├── xmin 该目标的左上角宽度方向坐标
├── ymin 该目标的左上角高度方向坐标
├── xmax 该目标的右下角宽度方向坐标
└── ymax 该目标的右下角高度方向坐标
提交格式说明:


个人理解:每张图片分别预测9个类别,如果图片不包含该类别则为[],反之则给出[xmin, ymin, xmax, ymax, 置信度]。
四、数据预处理
4.1 解压数据集
首先,解压数据集到/home/aistudio/data目录下。
!unzip /home/aistudio/data/data223254/XRay.zip -d /home/aistudio/data/
然后,整理数据集格式。
%cd /home/aistudio/data/XRay/train/
!mkdir JPEGImages
!mv XML Annotations
!mv *.jpg ./JPEGImages/
4.2 数据集划分
Step01: 使用 PaddleX 划分数据集。
首先安装 PaddleX 。
!pip install paddlex --user
通过 split_dataset 这个 API 按照 0.9:0.1 的比例划分训练集和验证集。
!paddlex --split_dataset --format VOC --dataset_dir /home/aistudio/data/XRay/train --val_value 0.1
Step02(非必须): PaddleX 划分数据集会生成一个 labels.txt 文件,这时我们可以选择将 labels.txt 中的类别顺序按照官方给出的类别顺序进行整理,这样后面模型预测出的类别标签就和官方给出的类别标签相对应。

!cp /home/aistudio/work/labels.txt /home/aistudio/data/XRay/train/
处理后的结果如图所示:

五、代码实现
5.1 安装PaddleDetection
# 克隆PaddleDetection仓库
%cd /home/aistudio/
# 1. 从gitee上直接克隆
# !git clone -b develop https://gitee.com/PaddlePaddle/PaddleDetection.git
# 2. 直接解压下载好的包
!unzip /home/aistudio/PaddleDetection.zip -d /home/aistudio/
# 安装其他依赖
%cd PaddleDetection
!pip install -r requirements.txt --user
# 编译安装paddledet
!python setup.py install
5.2 检测数据分析
该数据集总共包含 9 个标签,各类标签的数量分别为:
- pressure: 240
- glassbottle: 3069
- laptop: 366
- umbrella: 1265
- lighter: 429
- knife: 722
- tongs: 361
- scissor: 441
- metalcup: 251
import os
from unicodedata import name
import xml.etree.ElementTree as ET
import glob
def count_num(indir):
# 提取xml文件列表
os.chdir(indir)
annotations = os.listdir('.')
annotations = glob.glob(str(annotations) + '*.xml')
dict = {} # 新建字典,用于存放各类标签名及其对应的数目
for i, file in enumerate(annotations): # 遍历xml文件
# actual parsing
in_file = open(file, encoding = 'utf-8')
tree = ET.parse(in_file)
root = tree.getroot()
# 遍历文件的所有标签
for obj in root.iter('object'):
name = obj.find('name').text
if(name in dict.keys()): dict[name] += 1 # 如果标签不是第一次出现,则+1
else: dict[name] = 1 # 如果标签是第一次出现,则将该标签名对应的value初始化为1
# 打印结果
print("各类标签的数量分别为:")
for key in dict.keys():
print(key + ': ' + str(dict[key]))
indir='/home/aistudio/data/XRay/train/Annotations/' # xml文件所在的目录
count_num(indir) # 调用函数统计各类标签数目
图像尺寸分析: 通过图像尺寸分析,我们可以看到该数据集图片的尺寸不一。
import os
from unicodedata import name
import xml.etree.ElementTree as ET
import glob
def Image_size(indir):
# 提取xml文件列表
os.chdir(indir)
annotations = os.listdir('.')
annotations = glob.glob(str(annotations) + '*.xml')
width_heights = []
for i, file in enumerate(annotations): # 遍历xml文件
# actual parsing
in_file = open(file, encoding = 'utf-8')
tree = ET.parse(in_file)
root = tree.getroot()
width = int(root.find('size').find('width').text)
height = int(root.find('size').find('height').text)
if [width, height] not in width_heights: width_heights.append([width, height])
print("数据集中,有{}种不同的尺寸,分别是:".format(len(width_heights)))
for item in width_heights:
print(item)
indir='/home/aistudio/data/XRay/train/Annotations/' # xml文件所在的目录
Image_size(indir)
5.3 模型训练
评测方式采用计算mAP(IoU = 0.5)的方式。因此我们可以将数据集转换成COCO格式,方便我们对模型性能指标进行分析!
我们可以通过以下代码块将VOC格式数据集转换成COCO格式数据集。这里我修改了x2coco.py的源码,修改后的文件存放在/home/aistudio/work路径下,大家可以自行查看!
!rm /home/aistudio/PaddleDetection/tools/x2coco.py
!cp /home/aistudio/work/x2coco.py /home/aistudio/PaddleDetection/tools/
%cd /home/aistudio/PaddleDetection/
!python tools/x2coco.py \
--dataset_type voc \
--voc_anno_dir /home/aistudio/data/XRay/train/ \
--voc_anno_list /home/aistudio/data/XRay/train/train_list.txt \
--voc_label_list /home/aistudio/data/XRay/train/labels.txt \
--voc_out_name /home/aistudio/data/XRay/train/voc_train.json
!python tools/x2coco.py \
--dataset_type voc \
--voc_anno_dir /home/aistudio/data/XRay/train/ \
--voc_anno_list /home/aistudio/data/XRay/train/val_list.txt \
--voc_label_list /home/aistudio/data/XRay/train/labels.txt \
--voc_out_name /home/aistudio/data/XRay/train/voc_val.json
PP-YOLOE+:
# 替换配置文件
!rm /home/aistudio/PaddleDetection/configs/ppyoloe/_base_/optimizer_80e.yml
!rm /home/aistudio/PaddleDetection/configs/ppyoloe/_base_/ppyoloe_plus_crn.yml
!rm /home/aistudio/PaddleDetection/configs/ppyoloe/_base_/ppyoloe_plus_reader.yml
!rm /home/aistudio/PaddleDetection/configs/ppyoloe/ppyoloe_plus_crn_x_80e_coco.yml
!rm /home/aistudio/PaddleDetection/configs/runtime.yml
!rm /home/aistudio/PaddleDetection/configs/datasets/coco_detection.yml
!cp -r /home/aistudio/ppyoloe_plus_config/optimizer_80e.yml /home/aistudio/PaddleDetection/configs/ppyoloe/_base_/
!cp -r /home/aistudio/ppyoloe_plus_config/ppyoloe_plus_crn.yml /home/aistudio/PaddleDetection/configs/ppyoloe/_base_/
!cp -r /home/aistudio/ppyoloe_plus_config/ppyoloe_plus_reader.yml /home/aistudio/PaddleDetection/configs/ppyoloe/_base_/
!cp /home/aistudio/ppyoloe_plus_config/ppyoloe_plus_crn_x_80e_coco.yml /home/aistudio/PaddleDetection/configs/ppyoloe/
!cp /home/aistudio/ppyoloe_plus_config/runtime.yml /home/aistudio/PaddleDetection/configs/
!cp /home/aistudio/ppyoloe_plus_config/coco_detection.yml /home/aistudio/PaddleDetection/configs/datasets/
!python tools/train.py -c configs/ppyoloe/ppyoloe_plus_crn_x_80e_coco.yml --eval --use_vdl True --vdl_log_dir vdl_log_dir/scalar
RT-DETR:
# 替换配置文件
!rm -rf /home/aistudio/PaddleDetection/configs/rtdetr/_base_
!rm /home/aistudio/PaddleDetection/configs/rtdetr/rtdetr_hgnetv2_x_6x_coco.yml
!rm /home/aistudio/PaddleDetection/configs/runtime.yml
!rm /home/aistudio/PaddleDetection/configs/datasets/coco_detection.yml
!cp -r /home/aistudio/rtdetr_config/_base_ /home/aistudio/PaddleDetection/configs/rtdetr/
!cp /home/aistudio/rtdetr_config/rtdetr_hgnetv2_x_6x_coco.yml /home/aistudio/PaddleDetection/configs/rtdetr/
!cp /home/aistudio/rtdetr_config/runtime.yml /home/aistudio/PaddleDetection/configs/
!cp /home/aistudio/rtdetr_config/coco_detection.yml /home/aistudio/PaddleDetection/configs/datasets/
!python tools/train.py -c configs/rtdetr/rtdetr_hgnetv2_x_6x_coco.yml --fleet --eval -use_vdl True --vdl_log_dir vdl_log_dir/scalar
5.4 模型评估
PP-YOLOE+:
!python tools/eval.py -c configs/ppyoloe/ppyoloe_plus_crn_x_80e_coco.yml -o weights=output/ppyoloe_plus_crn_x_80e_coco/best_model.pdparams
指标如下:
- Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.556
- Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.732
- Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.608
- Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.209
- Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.501
- Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.552
- Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.563
- Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.726
- Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.763
- Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.388
- Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.710
- Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.783
RT-DETR:
!python tools/eval.py -c configs/rtdetr/rtdetr_hgnetv2_x_6x_coco.yml -o weights=output/rtdetr_hgnetv2_x_6x_coco/best_model.pdparams
- Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.501
- Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.678
- Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.544
- Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.195
- Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.485
- Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.495
- Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.507
- Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.645
- Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.743
- Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.693
- Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.727
- Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.769
5.5 模型导出
PP-YOLOE+:
!python tools/export_model.py -c configs/ppyoloe/ppyoloe_plus_crn_x_80e_coco.yml --output_dir=./inference_model -o weights=output/ppyoloe_plus_crn_x_80e_coco/best_model
RT-DETR:
!python tools/export_model.py -c configs/rtdetr/rtdetr_hgnetv2_x_6x_coco.yml --output_dir=./inference_model -o weights=output/rtdetr_hgnetv2_x_6x_coco/best_model
5.6 结果文件生成
最后提交结果的时候,我们需要生成一个coco数据集标注格式的文件,我们可以通过PaddleDetection中Python部署的demo来生成该文件,但需要注意以下几个问题。
- 类别顺序为: {‘knife’: 1, ‘tongs’: 2, ‘glassbottle’: 3, ‘pressure’: 4, ‘laptop’: 5, ‘umbrella’: 6, ‘metalcup’: 7, ‘scissor’: 8, ‘lighter’: 9};
- 提交文件需按序排列,首先按图片顺序排列,然后按类别顺序排列,置信度顺序随意。
- 坐标值必须为大于0的正数且不能超过图像的宽高。
修改后的infer.py文件存放在/home/aistudio/work目录下,大家可以自行查看!
!rm /home/aistudio/PaddleDetection/deploy/python/infer.py
!cp /home/aistudio/work/infer.py /home/aistudio/PaddleDetection/deploy/python/
PP-YOLOE+:
!python deploy/python/infer.py --model_dir=inference_model/ppyoloe_plus_crn_x_80e_coco --image_dir=/home/aistudio/data/XRay/test --device=GPU --output_dir infer_output --save_results --use_coco_category
RT-DETR:
!python deploy/python/infer.py --model_dir=inference_model/rtdetr_hgnetv2_x_6x_coco --image_dir=/home/aistudio/data/XRay/test --device=GPU --output_dir infer_output --save_results --use_coco_category
基础模型性能比较:
| 模型名称 | 分数 |
|---|---|
| ppyoloe_plus_crn_x_80e_coco | 0.65913 |
| rtdetr_hgnetv2_x_6x_coco | 0.62284 |
六、总结与提高
以上是[非官方版本]2023科大讯飞AI开发者大赛—X光安检图像识别挑战赛baseline,大家将更多的精力花在改进模型提升模型的性能上。
- 采样均衡:grassbottle的数目明显多于其它类别,可以考虑对部分类别进行离线增强实现采样均衡。
- 增加训练轮次:可以增加训练的轮数,大力出奇迹!
- 模型选择:比赛模型大小不能超过600MB,鼓励使用模型压缩和轻量化方法,同时提交的模型须为单模型,禁止使用多模型融合方法。我们可以采用更大参数量的模型,再对模型进行量化、剪枝、蒸馏等操作,减小模型体积的同时保持更好的检测性能。
- 建议参赛者在参加初赛过程中记录实验过程。
此文章为搬运
原项目链接


被折叠的 条评论
为什么被折叠?



