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()
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()
    作者:华王
博客:https://www.cnblogs.com/huahuawang/
                    
                
                
            
        
浙公网安备 33010602011771号