工作记录:训练、测试 TF-SSD

本文详细记录了使用SSD_VGG_300模型进行目标检测任务的训练及测试过程,包括参数配置、训练迭代效果、问题分析及改进措施等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.训练

ssd_vgg_300中修改:(num_classes可以在运行训练文件时指定,因此这里可以不修改)

'num_classes': 14,
'no_annotation_label': 14,
'normalizations': [13, -1, -1, -1, -1, -1],

设置训练参数,运行训练文件:

DATASET_DIR=./OPTIMAL_Z_FINAL
TRAIN_DIR=./My_chkp
CHECKPOINT_PATH=./checkpoints/vgg_16.ckpt

python train_ssd_network.py \
    --train_dir=${TRAIN_DIR} \
    --dataset_dir=${DATASET_DIR} \
    --dataset_name=optimal_z_2017 \
    --dataset_split_name=train \
    --model_name=ssd_300_vgg \
    --checkpoint_path=${CHECKPOINT_PATH} \
    --checkpoint_model_scope=vgg_16 \
    --checkpoint_exclude_scopes=ssd_300_vgg/conv6,ssd_300_vgg/conv7,ssd_300_vgg/block8,ssd_300_vgg/block9,ssd_300_vgg/block10,ssd_300_vgg/block11,ssd_300_vgg/block4_box,ssd_300_vgg/block7_box,ssd_300_vgg/block8_box,ssd_300_vgg/block9_box,ssd_300_vgg/block10_box,ssd_300_vgg/block11_box \
    --trainable_scopes=ssd_300_vgg/conv6,ssd_300_vgg/conv7,ssd_300_vgg/block8,ssd_300_vgg/block9,ssd_300_vgg/block10,ssd_300_vgg/block11,ssd_300_vgg/block4_box,ssd_300_vgg/block7_box,ssd_300_vgg/block8_box,ssd_300_vgg/block9_box,ssd_300_vgg/block10_box,ssd_300_vgg/block11_box \
    --save_summaries_secs=60 \
    --save_interval_secs=600 \
    --weight_decay=0.0005 \
    --optimizer=adam \
    --learning_rate=0.001 \
    --learning_rate_decay_factor=0.94 \
    --batch_size=50 \
    --num_classes=14 \
    --labels_offset=1 \
    --max_number_of_steps=1000000 

2.测试

测试之前,保证datasets/optimal_z_2017中:(注意这里的valid不要写成test)

SPLITS_TO_SIZES={'train': 12520, 'valid': 9233,}
NUM_CLASSES=13

测试参数:

DATASET_DIR=./OPTIMAL_Z_FINAL
TRAIN_DIR=./My_chkp
EVAL_DIR=${TRAIN_DIR}/eval
python eval_ssd_network.py \
    --eval_dir=${EVAL_DIR} \
    --dataset_dir=${DATASET_DIR} \
    --dataset_name=optimal_z_2017 \
    --dataset_split_name=valid \
    --model_name=ssd_300_vgg \
    --checkpoint_path=${TRAIN_DIR} \
    --wait_for_checkpoints=True \
    --batch_size=1 \
    --max_num_batches=500 \
    --num_classes=14 

修改ssd_vgg_300
权重所使用的训练参数:

    --weight_decay=0.0005 \
    --optimizer=adam \
    --learning_rate=0.001 \
    --learning_rate_decay_factor=0.94 \
    --batch_size=50 \
    --num_classes=14 \
    --labels_offset=0 \
迭代次数2000样本mAP/%
9474722.7811

此时网络已经不能更收敛了,观察tensorboard的可视化结果,发现只有个别类别准确率达到50%,其余的大多数20%,还有很多0%,因此可以确定代码哪里参数设置有问题,总之,此次训练失败。
期待后续工作,深入调试这份代码,争取在自己的数据库上达到50%的准确率。


修改ssd_vgg_300
权重所使用的训练参数:

    --weight_decay=0.0005 \
    --optimizer=adam \
    --learning_rate=0.001 \
    --learning_rate_decay_factor=0.94 \
    --batch_size=50 \
    --num_classes=13 \
    --labels_offset=0 \
迭代次数2000样本mAP/%
587816.59
1009018.61
2027124.26
3047225.53
4066225.71
5090625.65
6115425.82
7140725.81
8154925.80
9158625.80
10076625.80

权重所使用的训练参数:

    --weight_decay=0.0005 \
    --optimizer=adam \
    --learning_rate=0.001 \
    --learning_rate_decay_factor=0.94 \
    --batch_size=50 \
    --num_classes=14 \
    --labels_offset=1 \

测试结果:(VOC07mAP)

500样本2000样本
第0次迭代mAP=0%;
第840次迭代mAP=2.34%
第3386次迭代mAP=4.77%
第5082次迭代mAP=7.46%
第7629次迭代mAP=10.24%
第9331次迭代mAP=10.82%
第10183次迭代mAP=11.15%mAP=19.47%
第15289次迭代mAP=11.78%
第20386次迭代mAP=12.13%mAP=20.38%
第25484次迭代mAP=13.22%
第30582次迭代mAP=12.70%mAP=21.98%
第35683次迭代mAP=12.38%
第40784次迭代mAP=12.24%mAP=22.28%
第45889次迭代mAP=12.46%
第50995次迭代mAP=12.51%mAP=22.56%
第55253次迭代mAP=12.40%
第60362次迭代mAP=12.43%mAP=22.40%
第65448次迭代mAP=12.40%
第71389次迭代mAP=12.39%mAP=22.38%
第76516次迭代mAP=12.41%
第81557次迭代mAP=12.42%mAP=22.42%
第91792次迭代mAP=22.40%
第101054次迭代mAP=22.40%
第110355次迭代mAP=22.40%
第次迭代mAP=%
第次迭代mAP=%
第次迭代mAP=%
第次迭代mAP=%
第次迭代mAP=%

3.结果对比

之前只修改了类别数、没修改标签数的测试结果:(虽然收敛了,但是还是有点慢)

0次迭代,mAP=0%;
第822次迭代,mAP=1.31%;
第1655次迭代,mAP=2.57%;
第3322次迭代,mAP=6.15%;
第6659次迭代,mAP=9.05%;
第8329次迭代,mAP=9.02%;
第10001次迭代,mAP=10.42%;
第12517次迭代,mAP=10.97%;
第15877次迭代,mAP=12.13%;
第20086次迭代,mAP=11.79%;

之前没有修改类别数、没修改标签数的测试结果:(显然失败)

第441571次迭代,mAP=8.34%;

3.可视化

tensorard --logdir=./eval --port=7000
<think>好的,我现在需要帮助用户了解如何在Jetson Nano上部署MobileNet-SSD来实现路面井盖的检测。首先,用户要求流程图,所以我得先理清楚整个流程的步骤,然后组织成一个结构清晰的回答。 首先,我应该回想一下部署深度学习模型的一般流程。通常包括数据准备、模型选择或训练、模型转换、部署到边缘设备,然后进行推理和优化。但具体到MobileNet-SSD和Jetson Nano,可能会有一些特定的步骤,比如使用TensorRT加速之类的。 接下来,我需要确认MobileNet-SSD的部署流程。MobileNet-SSD结合了MobileNet作为特征提取器和SSD(Single Shot MultiBox Detector)作为检测头,适合在计算资源有限的设备上运行,比如Jetson Nano。但是用户提到的是井盖识别,所以可能需要先收集井盖的数据集,或者使用已有的公开数据集,或者自己制作。 然后是环境配置,Jetson Nano通常使用JetPack SDK,包含CUDA、cuDNN、TensorRT等库,这些对加速推理很重要。所以用户需要先设置好环境,可能包括安装OpenCV、PyTorch或TensorFlow,不过MobileNet-SSD可能有不同的实现,比如Caffe版本,或者是TensorFlow的模型,所以需要确定具体的框架。 接下来是模型转换的问题。如果原始模型是Caffe的,可能需要转换为TensorRT的格式,或者ONNX,这样才能在Jetson Nano上高效运行。这里可能需要用到NVIDIA提供的工具,比如tf-trtexec或者ONNX-TensorRT转换器。 然后是部署和推理部分,需要编写代码加载模型,处理摄像头输入或者图像,进行推理,然后后处理得到检测框和类别,最后显示结果。这部分需要考虑性能优化,比如调整输入分辨率,使用FP16或者INT8量化,以及多线程处理等。 可能还需要考虑数据标注的问题,如果用户没有现成的井盖数据集,可能需要自己标注,使用工具如LabelImg,然后转换成PASCAL VOC或者COCO格式,用于训练。 不过用户的问题主要是部署,所以可能不需要详细讲训练过程,但可能需要提到是否要重新训练模型,或者使用预训练模型进行微调。 现在需要把这些步骤组织成流程图的形式。流程图通常包括开始、各个处理步骤、判断节点、结束等。所以可能的步骤是: 1. 环境准备:安装JetPack,CUDA,cuDNN,TensorRT,OpenCV等。 2. 数据收集与标注:收集井盖图像,标注,生成数据集。 3. 模型选择与训练:使用MobileNet-SSD架构,在数据集上训练,或者微调预训练模型。 4. 模型转换:将训练好的模型转换为TensorRT引擎,优化推理速度。 5. 部署到Jetson Nano:编写推理脚本,处理输入输出。 6. 性能优化:调整参数,量化,提高FPS。 7. 测试与验证:使用真实场景测试准确率和速度。 不过用户可能更关注的是部署部分,而不是训练,所以可能需要简化训练步骤,或者假设用户已经有训练好的模型。 另外,Jetson Nano上部署模型通常需要转换模型为TensorRT,所以这一步是关键。例如,将Caffe或TensorFlow的模型转成ONNX,再转成TensorRT引擎,或者直接使用NVIDIA提供的转换工具。 在编写代码部分,可能需要使用Python,利用OpenCV捕获视频流,用TensorRT或PyTorch加载模型,进行推理,然后用OpenCV绘制检测框。 还需要考虑实时性的问题,如何优化帧率,可能涉及降低输入分辨率,调整模型参数,使用GPU加速等。 现在需要把这些步骤整理成流程图,用文字描述出来,可能的结构如下: 流程图步骤: 1. 开始 2. 环境配置:安装JetPack、深度学习框架、依赖库 3. 数据准备:收集井盖图像,标注,划分训练集和测试集 4. 模型训练:加载预训练MobileNet-SSD,微调训练 5. 模型导出:保存为可部署格式(如ONNX、Caffe模型) 6. 模型转换:使用TensorRT转换为优化后的引擎 7. 部署到Jetson Nano:编写推理脚本,集成摄像头输入 8. 推理与后处理:运行模型,解码输出,绘制检测框 9. 性能优化:调整参数,量化模型 10. 测试验证:评估准确率和实时性 11. 结束 其中,是否需要训练取决于用户是否有现成模型。如果用户直接使用预训练模型,可能跳过训练步骤,但井盖检测可能需要自定义数据集,所以训练可能是必要的。 可能还需要判断节点,比如是否有现成模型?是否需要标注数据? 但用户的问题是“部署MobileNet-SSD实现路面井盖识别检测”,所以可能包括训练和部署的全流程,而不仅仅是部署现成的模型。 现在需要考虑如何将这些步骤用文字描述的流程图呈现,同时符合用户要求的格式,比如使用$$...$$公式块?不过流程图一般用文字描述步骤和箭头连接。或者用有序列表和子步骤。 根据用户给的系统级指令,独立公式需要用$$...$$,但流程图可能用文本描述的结构,比如步骤1→步骤2→步骤3等。 用户要求流程图,可能需要用文字描述各个步骤及顺序,可能用箭头连接或者编号。例如: 流程图步骤描述: 1. 环境准备 - 安装JetPack SDK - 配置CUDA/cuDNN - 安装Python依赖(OpenCV, TensorRT等) 2. 数据收集与标注 - 采集井盖图像 - 使用标注工具标注边界框 - 生成VOC/COCO格式数据集 3. 模型训练 - 加载预训练MobileNet-SSD - 在自定义数据集上微调 - 验证模型精度 4. 模型转换 - 导出为ONNX或Caffe模型 - 使用TensorRT转换生成.engine文件 5. 部署推理 - 编写摄像头数据读取代码 - 加载TensorRT引擎 - 预处理输入图像 - 执行推理 - 后处理获取检测结果 - 绘制边界框并显示 6. 性能优化 - 调整输入分辨率 - FP16/INT8量化 - 多线程处理 7. 测试验证 - 实地测试井盖检测 - 评估帧率与准确率 然后按照这个顺序用箭头连接起来。不过用户需要的是流程图,可能需要更结构化的表示,比如使用→符号表示流程方向,或者用嵌套的列表表示步骤之间的顺序和分支。 另外,需要注意使用中文,并且确保所有行内数学表达式用$...$,如果有的话。比如在公式中如果有数学符号,但在这个问题中可能数学表达式较少,主要是流程步骤。 现在需要将上述步骤整理成一个清晰的流程图描述,可能用文字和箭头表示步骤的顺序,例如: 开始 ↓ 环境配置(JetPack, CUDA, 依赖库) ↓ 数据准备(采集、标注、生成数据集) ↓ 模型训练(MobileNet-SSD微调) ↓ 模型转换(导出为TensorRT引擎) ↓ 部署推理(摄像头输入,预处理,推理,后处理) ↓ 性能优化(量化,调整参数) ↓ 测试验证 ↓ 结束 这样用文字和箭头表示流程的各个步骤。不过用户可能需要更详细的每个步骤中的关键点,比如在模型转换中具体如何操作,或者在部署推理时如何处理输入输出。 可能还需要考虑是否有循环或者判断,比如在性能优化后是否需要返回部署推理再次测试,直到满足性能要求。这种情况下,流程图会有反馈箭头,但在文字描述中可能需要说明。 总结起来,整个流程可以分为几个主要阶段:环境准备、数据准备、模型训练、模型转换、部署推理、优化和测试。每个阶段有具体的子步骤。需要将这些阶段按顺序排列,并描述其内容。 最后,确保回答结构清晰,分步骤说明,帮助用户逐步理解和实施。同时,注意使用中文,避免使用Markdown格式,但按照用户的要求,系统级指令中的独立公式需要用$$...$$,但在此问题中可能用不上,除非涉及到公式,比如模型结构中的参数,但暂时可能不需要。</think>在Jetson Nano上部署MobileNet-SSD实现路面井盖识别检测的流程可分为以下步骤,流程图如下: --- ### **流程图** 1. **环境配置** $$ \text{安装JetPack SDK} \rightarrow \text{配置CUDA/cuDNN} \rightarrow \text{安装Python依赖(OpenCV、TensorRT等)} $$ 2. **数据准备** $$ \text{采集井盖图像} \rightarrow \text{标注边界框(LabelImg工具)} \rightarrow \text{生成VOC/COCO格式数据集} $$ 3. **模型训练** $$ \text{加载预训练MobileNet-SSD} \rightarrow \text{微调训练(自定义数据集)} \rightarrow \text{验证模型精度} $$ 4. **模型转换** $$ \text{导出为ONNX或Caffe模型} \rightarrow \text{使用TensorRT转换为.engine文件} $$ 5. **部署推理** $$ \text{读取摄像头输入} \rightarrow \text{图像预处理(缩放、归一化)} \rightarrow \text{TensorRT推理} \rightarrow \text{后处理(解码边界框)} \rightarrow \text{显示检测结果} $$ 6. **性能优化** $$ \text{调整输入分辨率} \rightarrow \text{FP16/INT8量化} \rightarrow \text{多线程流水线} $$ 7. **测试验证** $$ \text{实地测试井盖检测} \rightarrow \text{评估帧率(FPS)和准确率(mAP)} $$ --- ### **分步说明** 1. **环境配置** - 安装JetPack 4.6+(包含CUDA、cuDNN、TensorRT)。 - 配置Python环境,安装OpenCV、PyTorch或TensorFlow(根据模型框架)。 2. **数据准备** - 使用摄像头或公开数据集采集井盖图像(至少500张以上)。 - 用LabelImg标注井盖位置,生成`XML`文件(VOC格式)。 - 按8:2划分训练集和验证集。 3. **模型训练** - 选择MobileNet-SSD架构(推荐Caffe或TensorFlow实现)。 - 修改配置文件(如`labelmap.prototxt`),指定井盖类别。 - 在Jetson Nano或云端训练,直至损失收敛(需GPU加速)。 4. **模型转换** -训练好的模型转换为TensorRT格式: - **Caffe模型**:直接通过`trtexec`生成TensorRT引擎。 - **TensorFlow模型**:先转为ONNX,再通过`onnx-tensorrt`转换。 - 启用FP16/INT8量化以提升推理速度。 5. **部署推理** - 编写Python脚本,调用CSI/USB摄像头输入: ```python import cv2 cap = cv2.VideoCapture(0) # 摄像头初始化 ``` - 预处理图像(缩放到$300 \times 300$,归一化到$[-1, 1]$)。 - 加载TensorRT引擎执行推理: ```python with open("mobilenet_ssd.engine", "rb") as f: engine = runtime.deserialize_cuda_engine(f.read()) ``` - 后处理输出,过滤低置信度检测框(阈值设为$0.6$)。 6. **性能优化** - 降低输入分辨率(如$300 \times 300 \rightarrow 200 \times 200$)。 - 启用TensorRT的FP16模式: ```bash trtexec --fp16 --deploy=model.prototxt --model=model.caffemodel ``` - 使用多线程处理摄像头输入和推理任务。 7. **测试验证** - 在真实路面场景中测试记录检测准确率和漏检率。 - 使用`tegrastats`监控Jetson Nano的CPU/GPU利用率,确保实时性(目标≥10 FPS)。 --- ### **关键注意事项** - 若检测效果差,需扩充数据集或增加数据增强(旋转、亮度调整)。 - 部署时需关闭图形界面(`sudo systemctl set-default multi-user.target`),释放GPU内存。 - 使用`nvpmodel`设置为最大性能模式(`sudo nvpmodel -m 0`)。 通过以上流程,可在Jetson Nano上实现高效的实时井盖检测系统。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值