<jupyter_start><jupyter_text>基于PaddleX的X光安检机打火机检测针对X光安检机扫描结果进行目标检测，检测目标为打火机。 一、项目背景项目构想始于训练营第一课，四位导师从工作、生活、爱好三个方面阐述了优秀的项目创意来源，该项目也是始于生活发现，七月底国内疫情反复，高铁站、地铁等公共交通场所实施严格的安检，本人从武汉回家时亲身体验了安检场所的拥堵问题，而该项目如果落地，则从一定程度上提高了安检效率，减少了人力消耗，同时也减少了安检场所的人员聚集现象，有助于疫情防控。 二、数据集简介本项目使用AIStudio公开数据集：[安检X光图片](http://aistudio.baidu.com/aistudio/datasetdetail/67989),数据集已经提前下载好了。特别注意，该数据集中没有划分预测集，且两个划分数据集的split files中‘/’都是反的，直接使用会找不到路径报错，这里使用PaddleX重新划分数据集<jupyter_code># 解压数据集（解压一次即可，请勿重复解压）
!unzip -oq /home/aistudio/D0002.zip -d /home/aistudio/data/
# 安装PaddleX
!pip install paddlex
# 按照7:2:1重新划分数据集
!paddlex --split_dataset --format VOC --dataset_dir data/D0002 --val_value 0.2 --test_value 0.1
# 查看数据集文件结构
!tree /home/aistudio/data/D0002 -L 1<jupyter_output><empty_output><jupyter_text>三、模型选择本项目使用PaddleX套件yolov3_mobilenetv1模型进行训练  四、开始训练 首先预处理图片数据集<jupyter_code>#设置训练GPU
import os
os.environ['CUDA_VISIBLE_DEVICES'] = '0'
from paddlex.det import transforms

# 定义训练和验证时的transforms，这里使用了mixup,randomdistort,resize,normalize四个处理手段，()内留空为使用默认参数设置
# API说明 https://paddlex.readthedocs.io/zh_CN/develop/apis/transforms/det_transforms.html

train_transforms = transforms.Compose([
    transforms.MixupImage(mixup_epoch=250), transforms.RandomDistort(),
    transforms.Resize(target_size=608, interp='RANDOM'), 
    transforms.Normalize()
])

eval_transforms = transforms.Compose([
    transforms.Resize(
        target_size=608, interp='CUBIC'), transforms.Normalize()
])
import paddlex as pdx
# 定义训练和验证所用的数据集
# API说明：https://paddlex.readthedocs.io/zh_CN/develop/apis/datasets.html#paddlex-datasets-vocdetection
train_dataset = pdx.datasets.VOCDetection(
    data_dir='data/D0002',
    file_list='data/D0002/train_list.txt',
    label_list='data/D0002/labels.txt',
    transforms=train_transforms,
    shuffle=True)

eval_dataset = pdx.datasets.VOCDetection(
    data_dir='data/D0002',
    file_list='data/D0002/val_list.txt',
    label_list='data/D0002/labels.txt',
    transforms=eval_transforms)<jupyter_output><empty_output><jupyter_text>调整参数 开始炼丹！调参是影响训练结果的关键，本案例调参相对简单（因为没学到家），大家可以反复尝试，了解各参数训练过程产生的影响<jupyter_code># 初始化模型
# API说明: https://paddlex.readthedocs.io/zh_CN/develop/apis/models/detection.html#paddlex-det-yolov3
model = pdx.det.YOLOv3(num_classes=len(train_dataset.labels), backbone='MobileNetV1')
# 模型训练
# API说明: https://paddlex.readthedocs.io/zh_CN/develop/apis/models/detection.html#id1
# 各参数介绍与调整说明：https://paddlex.readthedocs.io/zh_CN/develop/appendix/parameters.html
model.train(
    num_epochs=120,
    train_dataset=train_dataset,
    train_batch_size=8,
    eval_dataset=eval_dataset,
    learning_rate=0.0125,
    lr_decay_epochs=[210, 240],
    save_dir='output/yolov3_mobilenetv1')<jupyter_output><empty_output><jupyter_text>模型导出 再预测一下这里就不做部署了（因为还没学会）<jupyter_code>#导出最佳模型 可用于后续部署
#部署说明： https://paddlex.readthedocs.io/zh_CN/release-1.3/deploy/export_model.html
!paddlex --export_inference --model_dir=./output/yolov3_mobilenetv1/best_model --save_dir=./inference_model
# 模型预测 单张图片预测

import paddlex as pdx
model = pdx.load_model('./inference_model')
image_name = 'data/D0002/JPEGImages/000366401017449.jpg'
result = model.predict(image_name)
pdx.det.visualize(image_name, result, threshold=0.5, save_dir='./inference_model')<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.12443370582905466, 'fraction_numerical': 0.03231652068861371, 'mean_word_length': 6.3763919821826285, 'pattern_counts': {'":': 0, '<': 17, '<?xml version=': 0, '>': 17, 'https://': 6, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '4', 'dir': 'jupyter-structured-clean-dedup', 'id': '124533', 'license': 'Apache-2.0', 'n_tokens_mistral': 1753, 'n_tokens_neox': 1848, 'n_words': 119, 'path': '2278905.ipynb', 'repo_name': 'Endy-mion/PaddlePaddle', 'size': '3311'}