YOLO训练步骤
1.Labelimg的安装实现方式
conda create -n labelimg python=3.8
conda activate labelimg
pip install labelimg
labelimg
2.使用lebelimg可视化标签
图片文件夹路径
标签文件夹路径
class.txt
3.制作数据集
有没有现成的数据集
从那里获取图片,标签
怎么划分数据集
怎么训练自己的模型
训练结束了,接着干什么
4.亲手制作现成的数据集
通过录制视频,然后视频截取图片获取信息
浏览器搜索roboflow,选择使用的对应的模型的数据集:显示训练集,验证集,测试集多少个
获取标签
使用的是labelimg进行标准。
使用伪标注的方式进行标注
5.设置配置文件.yaml
`path: E:\ultralytics-8.3.163\datasets\kunkun train: images\train val: images\val test: images/test
names: 0: phone 1: peanut 2: spray 3: box 4: headphones 5: key`
6.实拍采集思路
思路:随机拍摄几段视频,从视频中提取图片
拍摄各种角度,各种光照的视频拍段
创建makedata_set文件夹,新建videos文件夹和images文件夹,创建extract.py
import cv2 import os from tqdm import tqdm
def extract_frames(video_path, output_dir, fps_divisor, video_name): *""" \* *从视频中提取帧并保存为图片 ** \* *参数**: \* *video_path:* *视频文件路径** \* *output_dir:* *输出图片目录** \* *fps_divisor:* *每隔多少帧提取一帧* *(**例如**: 5* *表示每**5**帧取**1**帧**) \* *video_name:* *视频文件名**(**不含扩展名**) \* *""" \* *#* *创建输出目录如果不存在 \* if not os.path.exists(output_dir): os.makedirs(output_dir)
*#* *打开视频文件 \* cap = cv2.VideoCapture(video_path)
*#* *获取视频的总帧数 \* total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
*#* *初始化计数器 \* frame_count = 0 saved_count = 0
*#* *使用**tqdm**显示进度条 \* with tqdm(total=total_frames, desc=f"Processing {video_name}") as pbar: while True: *#* *读取一帧 \* ret, frame = cap.read()
*#* *如果没有更多帧,则退出循环 \* if not ret: break
*#* *检查是否应该保存这一帧 \* if frame_count % fps_divisor == 0: *#* *格式化文件名**: aa_xxxx.jpg \* filename = f"{video_name}_{saved_count:04d}.jpg" filepath = os.path.join(output_dir, filename)
*#* *保存图像 \* cv2.imwrite(filepath, frame) saved_count += 1
frame_count += 1 *#* *更新进度条 \* pbar.update(1)
*#* *释放视频捕获对象 \* cap.release() print(f"从 {video_name}.mp4 提取了 {saved_count} 张图片")
def main(): *#* *设置路径 \* videos_dir = r"E:\makedata_set\videos" images_dir = r"E:\makedata_set\images"
*#* *设置每隔多少帧提取一张图片* *(**可以调整这个值**) \* *#* *例如**: frames_per_second=5* *表示每**5**帧取**1**帧 \* frames_divisor = 5
*#* *遍历视频目录中的所有**.mp4**文件 \* for filename in os.listdir(videos_dir): if filename.endswith(".mp4"): *#* *获取不带扩展名的文件名 \* video_name = os.path.splitext(filename)[0]
*#* *构建完整的视频文件路径 \* video_path = os.path.join(videos_dir, filename)
*#* *处理单个视频文件 \* extract_frames(video_path, images_dir, frames_divisor, video_name)
if __name__ == "__main__": main()
6.1标签获取方法
首先是labels里创建一个classes.txt文件夹,这个标签文件夹对应于images文件,所以得到
conda activate labelimg
labelimg E:\makedata_set\images E:\makedata_set\labels\classes.txt E:\makedata_set\labels
手动进行标签,使用w进行标注,但是这样标注不可能全部标注
6.1.1所以先标注一小部分图片,拿这一小部分图片和标签做小型数据集,然后用这个小型数据集快速训练一个学渣模型,使用学渣模型训练未标注过的图片,将预测结果标注成YOLO格式的标签,这些标签叫做伪标签,只需要花点时间调一下这些伪标签就行。
随机提取一小部分图片出来,新建一个xz_dataset文件夹,用来存放小型数据集,里面新建几个空文件夹,使用常用的目录结构,使用train集和val集就行。
我有几十张.jpg图片放在这个文件夹里: E:\makedata_set\images 帮我随机提取20%的图片出来 其中的70%放在这个文件夹里: E:\makedata_set\xz_dataset\images\train 其中的30%放到这个文件夹里: E:\makedata_set\xz_dataset\images\val 注意要把文件移动出来
import os import shutil import random from pathlib import Path
def move_random_images(): *#* *定义路径 \* source_dir = r'E:\makedata_set\images' train_dir = r'E:\makedata_set\xz_dataset\images\train' val_dir = r'E:\makedata_set\xz_dataset\images\val'
*#* *创建目标文件夹(如果不存在) \* Path(train_dir).mkdir(parents=True, exist_ok=True) Path(val_dir).mkdir(parents=True, exist_ok=True)
*#* *获取所有**.jpg**文件 \* jpg_files = [f for f in os.listdir(source_dir) if f.lower().endswith('.jpg')]
*#* *计算需要提取的数量 \* total_count = len(jpg_files) extract_count = int(total_count * 0.2) *# 20%**的图片 ** \* *#* *随机选择要提取的图片 \* selected_files = random.sample(jpg_files, extract_count)
*#* *计算训练集和验证集的数量 \* train_count = int(extract_count * 0.7) *# 70%**用于训练 \* val_count = extract_count - train_count *# 30%**用于验证 ** \* *#* *分配文件到训练集和验证集 \* train_files = selected_files[:train_count] val_files = selected_files[train_count:]
*#* *移动文件到相应目录 \* for file in train_files: src_path = os.path.join(source_dir, file) dst_path = os.path.join(train_dir, file) shutil.move(src_path, dst_path)
for file in val_files: src_path = os.path.join(source_dir, file) dst_path = os.path.join(val_dir, file) shutil.move(src_path, dst_path)
print(f"总共处理了 {extract_count} 张图片") print(f"移动到训练集: {len(train_files)} 张") print(f"移动到验证集: {len(val_files)} 张")
if __name__ == "__main__": move_random_images()
然后标注一下学渣的训练集和验证集,然后运行mytrain.py进行训练,
from ultralytics import YOLO
if __name__ == "__main__": model = YOLO(r"yolo11n.pt") model.train( data=r"kunkun.yaml", epochs=100, imgsz=640, batch=1, cache="ram", workers=1, project="results", name="yolo11n", )
这样依然感觉强度不小
将这个学渣数据集放到源码的数据集里面,为学渣数据集创建一个配置文件,.yaml
path: E:\ultralytics-8.3.163\datasets\kunkuntrain: images\trainval: images\valtest: images/testnames: 0: phone 1: peanut 2: spray 3: box 4: headphones 5: key`
这样直接就可以训练了,因此这样将最终的模型训练出来了。
验证的话替换使用训练好的模型路径,而图像使用未标注好的图像路径才可以
使用学渣模型进行预测得到新标注的图片
将学渣数据集里的所有图片复制进复制回images文件夹,所有标签复制回labels文件夹,images是所有的图片,而labels是带有瑕疵的文件标签,可以使用labelimg进行调整标签,少部分进行调整或者删掉一些
6.1.2随机划分做一个数据集
新建一个python文件,split.py
我现在需要一些python代码随机划分-下数据集images文件里存放.jpg文件labels文件夹里存放.txt标签文件(YOLO格式)比如images/abc.jpg对应labels/abc.txt划分结果统一保存到kunkun文件夹里用这样的目录结构: kunkun\ images\ train\ val\ test\ labels\ train\ val\ test\ 划分比例设置成可以调整的参数只复制粘贴文件,不要乱动原本的图片和标签不要用sklearn这个包划分的时候用进度条提示一下进度条注释写清楚一点,我是python小白
分为测试集,训练集,验证集
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)