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 = 0saved_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小白

分为测试集,训练集,验证集

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐