Commit 09c5b226 authored by suily's avatar suily
Browse files

添加小数据集

parent 46260e34
...@@ -2,9 +2,7 @@ ...@@ -2,9 +2,7 @@
*.pth *.pth
backup/ backup/
proxy.sh proxy.sh
datasets/annotations/ datasets_backup/
datasets/train2017/
datasets/val2017/
logs/ logs/
*.onnx *.onnx
*.log *.log
\ No newline at end of file
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
`DETRs Beat YOLOs on Real-time Object Detection` `DETRs Beat YOLOs on Real-time Object Detection`
- https://arxiv.org/abs/2304.08069 - https://arxiv.org/abs/2304.08069
## 模型结构 ## 模型结构
RT-DETR是一种先进的实时物体检测器,它建立在视觉转换器(Vision Transformer)架构之上: RT-DETR是一种端到端的实时物体检测器,它建立在视觉转换器(Vision Transformer)架构之上:
模型利用主干网络的最后三个阶段的输出特征{S3,S4,S5}作为编码器的输入; 模型利用主干网络的最后三个阶段的输出特征{S3,S4,S5}作为编码器的输入;
混合编码器通过度内特征交互(AIFI)和跨尺度特征融合模块(CCFM)将多尺度特征转换成图像特征序列; 混合编码器通过度内特征交互(AIFI)和跨尺度特征融合模块(CCFM)将多尺度特征转换成图像特征序列;
随后采用loU感知查询选择从编码器输出的特征序列中选择固定数量的特征,作为解码器的初始目标查询; 随后采用loU感知查询选择从编码器输出的特征序列中选择固定数量的特征,作为解码器的初始目标查询;
...@@ -21,7 +21,7 @@ RT-DETR-R50/101 做主干方便和现有的 DETR 变体进行对比,而 RT-DET ...@@ -21,7 +21,7 @@ RT-DETR-R50/101 做主干方便和现有的 DETR 变体进行对比,而 RT-DET
它首先将二维的 S5 特征拉成向量,然后交给 AIFI 模块处理,其数学过程就是多头自注意力与 FFN,随后,再将输出 Reshape 回二维,记作 F5,以便去完成后续的所谓的“跨尺度特征融合”。 它首先将二维的 S5 特征拉成向量,然后交给 AIFI 模块处理,其数学过程就是多头自注意力与 FFN,随后,再将输出 Reshape 回二维,记作 F5,以便去完成后续的所谓的“跨尺度特征融合”。
CCFM模块是由 2 个 1×1 卷积和 N 个 RepBlock 构成的,通过调整 CCFM 中 RepBlock 的数量和 Encoder 的编码维度分别控制 Hybrid Encoder 的深度和宽度,同时对 backbone 进行相应的调整即可实现检测器的缩放。 CCFM模块是由 2 个 1×1 卷积和 N 个 RepBlock 构成的,通过调整 CCFM 中 RepBlock 的数量和 Encoder 的编码维度分别控制 Hybrid Encoder 的深度和宽度,同时对 backbone 进行相应的调整即可实现检测器的缩放。
3、loU:在训练期间约束检测器对高 IoU 的特征产生高分类分数,对低 IoU 的特征产生低分类分数。从而使得模型根据分类分数选择的 Top-K 特征对应的预测框同时具有高分类分数和高 IoU 分数。 3、loU:在训练期间约束检测器对高 IoU 的特征产生高分类分数,对低 IoU 的特征产生低分类分数。从而使得模型根据分类分数选择的 Top-K 特征对应的预测框同时具有高分类分数和高 IoU 分数。
4、解码器:支持不同层数的灵活推理,无需重训练。 4、解码器:支持不同层数的灵活推理,无需重训练。
...@@ -29,12 +29,6 @@ CCFM模块是由 2 个 1×1 卷积和 N 个 RepBlock 构成的,通过调整 CC ...@@ -29,12 +29,6 @@ CCFM模块是由 2 个 1×1 卷积和 N 个 RepBlock 构成的,通过调整 CC
<img src="./doc/RT-DETR.PNG"/> <img src="./doc/RT-DETR.PNG"/>
</div> </div>
## 代码改动说明
项目要求torch==2.0.1、torchvision==0.15.2,dcu的torch==2.1.0、torchvision==0.16.0版本过高。
问题主要集中在torchvison.datapoints、torchvison.transformers等库的调用中,其中torchvision的datapoints依赖库在高版本中完全被移除了。
因此进行了代码适配修改,根据api替换了一遍,由于修改过多不再一一展示,可在仓库内搜索"TODO"查看。
ps:仓库中是改动后的代码,不需再次修改
## 环境配置 ## 环境配置
### Docker(方法一) ### Docker(方法一)
``` ```
...@@ -78,9 +72,9 @@ pip install -r requirements.txt ...@@ -78,9 +72,9 @@ pip install -r requirements.txt
## 数据集 ## 数据集
### 训练数据集 ### 训练数据集
`Coco2017` `Coco2017`
仅需要annotations_trainval2017.zip、val2017.zip、train2017.zip作为数据集。可通过[scnet](http://113.200.138.88:18080/aidatasets/coco2017)[官网链接](https://cocodataset.org/#download)进行下载,下载后的压缩包需要解压缩。通过官网下载和解压数据集的代码如下: 仅需要annotations_trainval2017.zip、val2017.zip、train2017.zip作为数据集。可通过[scnet](http://113.200.138.88:18080/aidatasets/coco2017)[官网链接](https://cocodataset.org/#download) 进行下载,下载后的压缩包需要解压缩。通过官网下载和解压完整数据集的代码如下:
ps:本仓库内准备了小数据集供训练测试,位于。。。。。 ps:本仓库内准备了小数据集供训练测试,位于dataset/
``` ```
cd RT-DETR/datasets cd RT-DETR/datasets
......
# coding:utf-8
import os
import shutil
def extract_data(source_folder, target_folder,feat_number):
# 创建目标文件夹
if not os.path.exists(target_folder):
os.makedirs(target_folder)
# 遍历源文件夹中的每个子文件夹
for subdir in os.listdir(source_folder):
subdir_path = os.path.join(source_folder, subdir)
# 获取子文件夹中的前n个文件,os.scandir防止文件过多逐个遍历
i=0
if os.path.isdir(subdir_path):
for entry in os.scandir(subdir_path):
if i == feat_number:
break
else:
i=i+1
if entry.is_file():
file_path = os.path.join(subdir_path, entry.name)
print(os.path.join(target_folder, subdir_path.split(os.sep)[-1]))
os.makedirs(os.path.join(target_folder, subdir_path.split(os.sep)[-1]), exist_ok=True)
shutil.copy(file_path, os.path.join(target_folder, subdir_path.split(os.sep)[-1]))
print(f"Extracted {entry.name} from {subdir}")
def main(source_folder, target_folder,feat_number):
extract_data(source_folder, target_folder,feat_number)
if __name__ == "__main__":
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--source_folder", type=str)
parser.add_argument("--target_folder", type=str)
parser.add_argument("--feat_number", type=int)
args = parser.parse_args()
main(args.source_folder, args.target_folder,args.feat_number)
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment