1 yolox使用

 

yolox使用

github:https://github.com/Megvii-BaseDetection/YOLOX

使用示例参考:https://zhuanlan.zhihu.com/p/397499216

 

#########################
1 YOLO-X

一 Doc
github:https://github.com/Megvii-BaseDetection/YOLOX
使用示例参考:https://zhuanlan.zhihu.com/p/397499216

二 Train
2.1 数据集处理(VOC)
../datasets/VOCdevkit/VOC2007/Annotation
             /JPEGImages
             /ImageSets (Main:test.txt,trainval.txt)
2.2 -f 定义模型参数
../exps/example/yolox_voc/yolox_voc.s.py    
   改:self.num_classes = 4
../yolox/data/datasets/voc_classes.py
   改:自己定义的类别
其他修改,参照file:yolox/exp/yolox_base.py

2.3 修改训练集信息,开始训练
python tools/train.py -f exps/example/yolox_voc/yolox_voc_s.py -d 8 -b 64 --fp16 -o -c /path/to/yolox_s.pth [--cache]
修改1:../exps/example/yolox_voc/yolox_voc_s.py 46行-->  image_sets=[('2007', 'trainval')],
修改2:max_labels=50  #表示图片最多的目标数量 (按自己的实际情况)

2.4 修改不同的网络结构
修改1:继续修改exps/example/yolox_voc/yolox_voc_s.py中的,self.depth和self.width
 ##参考 Yolox_s网络为例,exps/default/yolox_s.py中,self.depth=0.33,self.width=0.5

三 :修改其他相关
1修改验证epoch的数量 
#默认训练迭代10个epoch,对验证集做1次验证,计划每迭代1个epoch,即做一个验证
修改:exps/example/yolox_voc/yolox_voc_s.py 《》 参考:yolox/exp/yolox_base.py
self.print_interval = 1
self.eval_interval = 1

四 :tools/demo.py测试 
修改为VOC测试
 1 修改全部COCO_CLASSES -->VOC_CLASSES,
     修改15行 from yolox.data.datasets.voc_classes import VOC_CLASSES

python tools/demo.py image -f exps/default/yolox_s.py -c /path/to/your/yolox_s.pth --path assets/ --conf 0.25 --nms 0.45 --tsize 640 --save_result --device [cpu/gpu]

   

注意:
 -1重新训练,需要删除 ../datasets/VOCdevkit/ (除了VOC2017,其他删除)

 

2 修改

###########修改模型,日志,tensorboard等保存目录##########
1tarin :/project/train/src_repo/YOLOX-main/yolox/core/trainer.py

2save_model:/project/train/src_repo/YOLOX-main/yolox/utils/checkpoint.py
-45行
        shutil.copyfile(filename, best_filename)
        best_pt="/project/train/models/best_ckpt.pth" #wh
        shutil.copyfile(filename, best_pt) #wh
        print("###### best_ckpt 保存成功!")
    if model_name=="latest": #wh
        shutil.copyfile(filename,"/project/train/models/latest_ckpt.pth") #wh
        print("###### latest_ckpt 保存成功!")

3tensorboard:/project/train/src_repo/YOLOX-main/yolox/core/trainer.py
-180行
            if self.args.logger == "tensorboard":
                # self.tblogger = SummaryWriter(os.path.join(self.file_name, "tensorboard"))
                self.tblogger = SummaryWriter("/project/train/tensorboard") #wh

4log:/project/train/src_repo/YOLOX-main/yolox/utils/logger.py
-85 行
    save_file = os.path.join(save_dir, filename)
    save_file = "/project/train/log/log.txt" #wh

 

3 voc数据集处理

"""
前期:
原始数据路径: /home/data/933(.jpg .xml)

功能:
1整理数据格式为 VOC2007 格式
dataset_dir ="/project/train/src_repo/YOLOX-main/datasets/VOCdevkit/VOC2007"
 -Annotations
 -imageSets 
     --main
        --test.txt
        --trainval.txt
 -JPEGImages

2 数据集划分为8:2

"""
import os,shutil
from PIL import Image
import datetime
import shutil
import random

# 重新分布数据
def separate_data(init_dir,target_dir):
    print("Start Time: ",datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
    files_list =os.listdir(init_dir)
    jpg_list =[]
    xml_list =[]
    for file in files_list:
        if file.lower().endswith("jpg"):
            jpg_list.append(file)
        elif file.lower().endswith("xml"):
            xml_list.append(file)
        else:
            print(f"{file} 不满足收集条件,已经被过滤")
    print(f"collect jpg : {len(jpg_list)}")
    print(f"collect xml : {len(xml_list)}")

    mk_dir(target_dir,"JPEGImages")
    mk_dir(target_dir,"Annotations")
    for jpg in jpg_list:        
        copy_file(init_dir,jpg,target_dir+os.sep+"JPEGImages")
    for xml in xml_list:      
        copy_file(init_dir,xml,target_dir+os.sep+"Annotations")

    print("End Time: ",datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
    print("整理 jpg,xml文件成功!!","\n")

def mk_dir(target_dir,creat_dir):
    new_path =os.path.join(target_dir,creat_dir)
    if not os.path.exists(target_dir):
        os.mkdir(target_dir)
    if not os.path.exists(new_path):
        os.mkdir(new_path)
        print("创建new文件夹成功: ",new_path)

# 复制pic ,xml等文件到其他目录
def copy_file(old_dir,filename,new_dir):
    try:
        source_file =os.path.join(old_dir,filename)
        shutil.copy(source_file, new_dir)
        # shutil.move(source_file, new_dir)# 线上使用,move节约时间
        # print(filename,"success!!")
    except Exception as e:
        print(f"copy {filename} fail:", e)

# 清空文件夹内所有文件,不删除dir(为use)
def del_file(path):
    ls = os.listdir(path)
    for i in ls:
        c_path = os.path.join(path, i)
        if os.path.isdir(c_path):
            del_file(c_path)
            print(f"清空文件夹{i} Success!!")
        else:
            os.remove(c_path)
 
# 删除test文件夹 
def del_dir(del_dir):
    if os.path.exists(del_dir):
        shutil.rmtree(del_dir)
        print("删除文件夹:",del_dir)   
    os.mkdir(del_dir)
    print("新建voc2007空文件夹 Success!")

def collect_images_Proportion():
    imageSets_dir="/project/train/src_repo/YOLOX-main/datasets/VOCdevkit/VOC2007/ImageSets"
    os.mkdir(imageSets_dir)
    os.mkdir(f"{imageSets_dir}/Main")
    print("创建new文件夹成功: ",f"{imageSets_dir}/Main")

    train_pr=0.8
    xml_names=os.listdir('/project/train/src_repo/YOLOX-main/datasets/VOCdevkit/VOC2007/Annotations')
    nums=len(xml_names)
    train_nums=int(train_pr*nums)
    index_list=range(nums)
    train_index=random.sample(index_list,train_nums)

    train_val=open('/project/train/src_repo/YOLOX-main/datasets/VOCdevkit/VOC2007/ImageSets/Main/trainval.txt','w')
    test=open('/project/train/src_repo/YOLOX-main/datasets/VOCdevkit/VOC2007/ImageSets/Main/test.txt','w')

    for i in index_list:
        name=xml_names[i].split('.')[0]+'\n'
        if i in train_index:
            train_val.write(name)
        else:
            test.write(name)

    train_val.close()
    test.close()
    print("划分数据集成功,请在Main中查看")

if __name__ == '__main__':
    init_dir = "/home/data/933"
    target_dir ="/project/train/src_repo/YOLOX-main/datasets/VOCdevkit/VOC2007"
    # del_dir(target_dir) #清空文件夹
    separate_data(init_dir,target_dir)
    collect_images_Proportion()
voc_datahandle.py
import os
import random


train_pr=0.7

xml_names=os.listdir('VOCdevkit/VOC2007/Annotations')
nums=len(xml_names)

train_nums=int(train_pr*nums)

list=range(nums)
train_index=random.sample(list,train_nums)

train_val=open('VOCdevkit/VOC2007/ImageSets/Main/trainval.txt','w')
test=open('VOCdevkit/VOC2007/ImageSets/Main/test.txt','w')

for i in list:
    name=xml_names[i].split('.')[0]+'\n'
    if i in train_index:
        train_val.write(name)
    else:
        test.write(name)

train_val.close()
test.close()
make_voc_data.py

 

posted @ 2022-05-10 13:43  风hua  阅读(149)  评论(0)    收藏  举报