网站开发员工资棋牌搭建工具
网站开发员工资,棋牌搭建工具,网站换域名能换不,三屏营销型网站建设一、环境安装 工欲善其事#xff0c;必先利其器#xff0c;所以第一步就是安装环境#xff0c;有两个选择#xff0c;云端速成和本地手动#xff0c;具体步骤如下#xff1a;
1.速成环境安装 1.1找一个算力云平台 进去之后#xff0c;去租用一个#xff0c;看情况而定…一、环境安装工欲善其事必先利其器所以第一步就是安装环境有两个选择云端速成和本地手动具体步骤如下1.速成环境安装1.1找一个算力云平台进去之后去租用一个看情况而定1.2选用合适容器找到社区镜像搜索自己要用的第一个亲测有效环境安装完成2.手动安装环境2.1安装Anaconda或者minconda直接网上搜索安装教程后者一听就小点看自己选择都能用2.2安装vscode或者pycharm新手建议pycharm老手应该不会看这些2.3创建虚拟环境2.3.1 进入命令行cmd需要配置环境变量pathanaconda里面第三打开不需要配环境变量2.3.2创建并激活环境conda create -n 环境名称 python版本号conda activate 环境名称进去之后命令行变化前面从base变成环境名称你需要安装就在这里直接输入安装命令比如安装ultralytics需要什么安装什么ultralytics官方手册安装 Ultralytics - Ultralytics YOLO 文档pip install -U ultralytics2.3.3vscode或者pycharm使用创建的虚拟环境直接去网上搜如果前置完成vscode选择虚拟环境只需要点右下角你创建 的虚拟环境就行pycharm也是类似能搜到二、数据集TT100K感谢清华腾讯的数据集官网https://cg.cs.tsinghua.edu.cn/traffic-sign/InProceedings{Zhe_2016_CVPR, author {Zhu, Zhe and Liang, Dun and Zhang, Songhai and Huang, Xiaolei and Li, Baoli and Hu, Shimin}, title {Traffic-Sign Detection and Classification in the Wild}, booktitle {The IEEE Conference on Computer Vision and Pattern Recognition (CVPR)}, year {2016} }不过这个数据集是把标注放在一个json文件里面不能直接拿来训练需要转换成yolo格式有个博主做了可以去看一看YOLO5用于交通标志牌TT100K数据集的训练预测包含数据集格式的转换——TT100K-CoCo格式-YOLO格式数据集比例的重新划分以及对应图片集的重新划分_交通标志数据集-CSDN博客ai做的转换代码也能使用import os import json import cv2 import shutil import xml.dom.minidom from tqdm import tqdm import argparse from random import random class TT100K2COCO: def __init__(self, base_path/root/autodl-tmp/TT100K/data): # 统一根目录 self.base_path base_path # 原始标注文件路径 self.origin_json_path os.path.join(self.base_path, annotations.json) # 统计结果保存路径 self.stats_json_path os.path.join(self.base_path, statistics.json) # 输出数据集路径 self.output_dir os.path.join(self.base_path, dataset) # 确保输出目录存在 os.makedirs(os.path.join(self.output_dir, annotations), exist_okTrue) def class_statistics(self, threshold100): 统计类别并筛选图片数大于 threshold 的类 print(Step 1: 正在进行类别统计...) with open(self.origin_json_path, r) as f: origin_dict json.load(f) classes origin_dict[types] sta {i: [] for i in classes} images_dic origin_dict[imgs] saved_images [] for image_id, image_element in images_dic.items(): image_path image_element[path].split(/)[-1] obj_list image_element[objects] for anno_dic in obj_list: label_key anno_dic[category] if image_path not in sta[label_key]: sta[label_key].append(image_path) # 过滤 result_types {k: v for k, v in sta.items() if len(v) threshold} for i in result_types: print(fType {i}: {len(result_types[i])} images) saved_images.extend(result_types[i]) saved_images list(set(saved_images)) final_res {type: list(result_types.keys()), details: result_types, images: saved_images} with open(self.stats_json_path, w, encodingutf-8) as f: json.dump(final_res, f, ensure_asciiFalse, indent1) print(f统计完成保留类别数: {len(result_types)}) def original_datasets2object_datasets_re(self): 将原始标注转换为 COCO JSON 格式并按比例划分 print(Step 2: 正在转换为 COCO 格式并划分集...) with open(self.origin_json_path) as f: origin_dict json.load(f) with open(self.stats_json_path) as f: select_dict json.load(f) classes select_dict[type] # 初始化三个数据集字典 datasets {phase: {info: {}, licenses: [], categories: [], images: [], annotations: []} for phase in [train, val, test]} label_map {cls: i for i, cls in enumerate(classes)} for phase in datasets: for i, cls in enumerate(classes): datasets[phase][categories].append({id: i, name: cls, supercategory: traffic_sign}) images_dic origin_dict[imgs] obj_id 1 # 统计每个类别图片总数用于按比例划分 owntype_sum {cls: 0 for cls in classes} count_tracker {cls: 0 for cls in classes} # 第一次遍历确定每张图的归属类别出现最多的类并计数 valid_img_ids [] for img_id, img_elem in images_dic.items(): img_name img_elem[path].split(/)[-1] if img_name in select_dict[images]: categories_in_img [obj[category] for obj in img_elem[objects] if obj[category] in classes] if categories_in_img: main_type max(set(categories_in_img), keycategories_in_img.count) owntype_sum[main_type] 1 valid_img_ids.append((img_id, main_type)) # 第二次遍历填充数据 for img_id, main_type in tqdm(valid_img_ids): img_elem images_dic[img_id] img_path os.path.join(self.base_path, img_elem[path]) # 读取尺寸 im cv2.imread(img_path) if im is None: continue h, w, _ im.shape # 划分逻辑 7:2:1 count_tracker[main_type] 1 ratio count_tracker[main_type] / owntype_sum[main_type] if ratio 0.7: phase train elif ratio 0.9: phase val else: phase test datasets[phase][images].append({ file_name: img_elem[path].split(/)[-1], id: img_id, width: w, height: h }) for obj in img_elem[objects]: if obj[category] in classes: x, y obj[bbox][xmin], obj[bbox][ymin] width obj[bbox][xmax] - x height obj[bbox][ymax] - y datasets[phase][annotations].append({ area: width * height, bbox: [x, y, width, height], category_id: label_map[obj[category]], id: obj_id, image_id: img_id, iscrowd: 0, segmentation: [[x, y, xwidth, y, xwidth, yheight, x, yheight]] }) obj_id 1 for phase in [train, val, test]: save_p os.path.join(self.output_dir, fannotations/{phase}.json) with open(save_p, w) as f: json.dump(datasets[phase], f) print(COCO 标注生成完毕。) def coco_json2yolo_txt(self, phase): 将 COCO JSON 转换为 YOLO TXT 格式 print(fStep 3: 正在转换 {phase} 为 YOLO TXT...) json_path os.path.join(self.output_dir, fannotations/{phase}.json) save_dir os.path.join(self.output_dir, flabels/{phase}) os.makedirs(save_dir, exist_okTrue) with open(json_path, r) as f: data json.load(f) id_map {cat[id]: i for i, cat in enumerate(data[categories])} # 生成 classes.txt with open(os.path.join(self.output_dir, classes.txt), w) as f: for cat in data[categories]: f.write(cat[name] \n) for img in tqdm(data[images]): img_id img[id] w, h img[width], img[height] txt_name os.path.splitext(img[file_name])[0] .txt with open(os.path.join(save_dir, txt_name), w) as f_txt: for ann in data[annotations]: if ann[image_id] img_id: box ann[bbox] # 归一化坐标: [center_x, center_y, width, height] cx (box[0] box[2]/2) / w cy (box[1] box[3]/2) / h nw box[2] / w nh box[3] / h f_txt.write(f{id_map[ann[category_id]]} {cx:.6f} {cy:.6f} {nw:.6f} {nh:.6f}\n) def copy_images(self): 根据划分物理搬运图片到指定目录 print(Step 4: 正在物理搬运图片...) for phase in [train, val, test]: img_save_dir os.path.join(self.output_dir, images, phase) os.makedirs(img_save_dir, exist_okTrue) json_path os.path.join(self.output_dir, fannotations/{phase}.json) with open(json_path, r) as f: data json.load(f) for img_info in tqdm(data[images]): # 假设原始图片在 base_path 对应的子目录中如 train/ 或 test/ # TT100K 原始结构通常是 data/train/xxxxx.jpg # 这里我们搜索原路径 src_image None for sub in [train, test, other]: potential_path os.path.join(self.base_path, sub, img_info[file_name]) if os.path.exists(potential_path): src_image potential_path break if src_image: shutil.copy(src_image, os.path.join(img_save_dir, img_info[file_name])) if __name__ __main__: # 修改这里的路径为你 Linux 上的路径 BASE_DATA_PATH /root/autodl-tmp/TT100K/data tt100k TT100K2COCO(BASE_DATA_PATH) # 按顺序执行 tt100k.class_statistics(threshold100) # 1. 统计并筛选类别 tt100k.original_datasets2object_datasets_re() # 2. 生成 COCO JSON for p in [train, val, test]: # 3. 生成 YOLO TXT tt100k.coco_json2yolo_txt(p) tt100k.copy_images() # 4. 搬运图片 print(所有操作已完成你的 YOLO 格式数据集位于:, os.path.join(BASE_DATA_PATH, dataset))修改一下路径就可以三、连接云服务器本地训练可以跳过在网上搜索可能需要配置一些东西我这是配置后使用过能用的3.1安装vscode插件Remote-SSH3.2连接云服务器点击倒数第二个图标点击设置点击第一个按照相对格式配置host随便取一个hostnameuserport从你云服务复制登陆指令倒数第三行格式是ssh -p 端口号 userhostnameHost 名字 HostName 主机 User root port 端口号配置好后刷新进入-是进入输入密码服务器控制台复制linux不显示密码粘贴回车就行四、训练模型这也是主播第一次做有不对指正互相交流下图是社区镜像中配置的train_26.py是用来训练模型具体参数根据自己的情况调整运行py文件就行数据集yaml# Ultralytics AGPL-3.0 License - https://ultralytics.com/license # COCO128 dataset https://www.kaggle.com/datasets/ultralytics/coco128 (first 128 images from COCO train2017) by Ultralytics # Documentation: https://docs.ultralytics.com/datasets/detect/coco/ # Example usage: yolo train datacoco128.yaml # parent # ├── ultralytics # └── datasets # └── coco128 ← downloads here (7 MB) # Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..] path: /root/ultralytics-YOLO26/datasets/TT100K # dataset root dir train: images/train # train images (relative to path) 128 images val: images/val # val images (relative to path) 128 images test: images/test # test images (optional) # Classes names: 0: i2 1: i4 2: i5 3: il100 4: il60 5: il80 6: io 7: ip 8: p10 9: p11 10: p12 11: p19 12: p23 13: p26 14: p27 15: p3 16: p5 17: p6 18: pg 19: ph4 20: ph4.5 21: pl100 22: pl120 23: pl20 24: pl30 25: pl40 26: pl5 27: pl50 28: pl60 29: pl70 30: pl80 31: pm20 32: pm30 33: pm55 34: pn 35: pne 36: po 37: pr40 38: w13 39: w55 40: w57 41: w59训练好会在runs/detect/train/weight中有best.pt和last.pt后续导出部署就行有错误请指正一起讨论环境有问题也可以互相交流感谢所有提供资料的有侵权联系我需要资料联系我数据集说明代码等