代码1
import cv2 import os # 视频文件路径 video_path = '00009.MTS' # 保存图片的文件夹路径 output_folder = 'picture' # 每隔多少帧提取一张图片 frame_interval = 20 # 创建输出文件夹(如果不存在) os.makedirs(output_folder, exist_ok=True) # 打开视频文件 cap = cv2.VideoCapture(video_path) # 初始化帧计数器 frame_count = 0 while True: # 读取一帧 ret, frame = cap.read() # 如果无法读取到帧,则退出循环 if not ret: break # 每隔 `frame_interval` 帧保存一次图片 if frame_count % frame_interval == 0: # 构建保存路径 output_path = os.path.join(output_folder, f'frame_{frame_count}.jpg') # 保存图片 cv2.imwrite(output_path, frame) # 增加帧计数器 frame_count += 1 # 释放视频对象 cap.release() #视频切割,每XX帧抽取一张图片,保存到指定文件夹
代码2
import os import shutil def move_images(source_folder, target_folder): # 获取所有图片文件 image_files = [f for f in os.listdir(source_folder) if f.endswith(('.jpg', '.png', '.jpeg', '.gif'))] # 按文件名排序,确保顺序一致 image_files.sort() # 遍历图片,每4张移动一次 for i, image_file in enumerate(image_files): if i % 5 == 0: # 间隔4张后移动 source_path = os.path.join(source_folder, image_file) target_path = os.path.join(target_folder, image_file) shutil.move(source_path, target_path) print(f"Moved {image_file} to {target_folder}") # 示例调用 source_folder = "WIN_20250627_11_56_44_Pro" target_folder = "small" move_images(source_folder, target_folder) #每隔XX张图片,抽取一张至目标文件夹
代码3
import os import shutil def distribute_images(source_folder, target_folder1, target_folder2): # 获取源文件夹中的所有文件 files = [f for f in os.listdir(source_folder) if os.path.isfile(os.path.join(source_folder, f))] # 初始化计数器 count = 1 # 遍历所有文件 for file in files: # 构建完整的文件路径 src_file = os.path.join(source_folder, file) # 根据计数器的值决定目标文件夹 if count % 4 < 3: dst_folder = target_folder1 else: dst_folder = target_folder2 # 构建目标文件路径 dst_file = os.path.join(dst_folder, file) # 复制文件到目标文件夹 shutil.copy(src_file, dst_file) # 更新计数器 count += 1 # 使用示例 source_folder = 'small' target_folder1 = r'D:\0711\dataset\images\train' target_folder2 = r'D:\0711\dataset\images\val' distribute_images(source_folder, target_folder1, target_folder2) #遍历目标文件夹,每4张图片为一个循环,前3张放入文件夹1,第4张放入文件夹2
1.路径yaml文件
train: /mnt/workspace/1/datasets/train/images val: /mnt/workspace/1/datasets/val/images nc: 2 names: ['l21b', 'l12f']
2.训练代码
from ultralytics import YOLO # 初始化模型(使用yolo11预训练权重) model = YOLO('yolo11n.pt') # model = YOLO('best.pt') # 训练配置 results = model.train( data='/mnt/workspace/data.yaml', # 指定数据集配置文件 epochs=150, # 训练轮次 imgsz=1280, # 输入图像尺寸 batch=16, # 批次大小 patience=400, )
3.转化为ONNX格式进行自动标注
from ultralytics import YOLO if __name__ == '__main__': # Load a pretrained YOLOv8 model model = YOLO('/mnt/workspace/best.pt') # Train the model on a custom dataset model.export(format='ONNX')
4.自动标注的模型yaml文件
type: yolo11 name: yolo11 display_name: yolo model_path: best.onnx nms_threshold: 0.45 confidence_threshold: 0.7 classes: - l12f - l21b
5.转化为openvino格式推理
from ultralytics import YOLO model = YOLO('best.pt') # 加载训练好的模型 model.export(format='openvino') # 自动生成openvino_dir目录包含IR文件
6.使用openvino推理
import openvino as ov from ultralytics import YOLO model = YOLO("best_openvino_model") results = model.predict(r"测试图片\frame_000006.png", save=True, conf=0.2,iou=0.9,imgsz=1280) # 处理返回的结果 for result in results: boxes = result.boxes # 获取边界框信息 result.show() # 显示结果
7.推理视频
import cv2 from ultralytics import YOLO if __name__ == "__main__": # Load a pretrained YOLOv8 model model = YOLO("best.pt") def process_video(video_path): # 打开视频文件 cap = cv2.VideoCapture(video_path) while cap.isOpened(): # 读取一帧视频 ret, frame = cap.read() if ret: # 进行目标检测 results = model(frame) # 获取检测结果并绘制到帧上 result_frame = results[0].plot() # 调整窗口大小以适应显示 cv2.namedWindow('Detected', cv2.WINDOW_NORMAL) # 显示原始帧和检测结果帧 cv2.imshow('Detected', result_frame) # 按 'q' 键退出循环 if cv2.waitKey(1) & 0xFF == ord('q'): break else: break # 释放视频捕获对象并关闭所有窗口 cap.release() cv2.destroyAllWindows() # 替换为你的视频文件路径 video_path = r"C:\Users\Lenovo\Desktop\18\20220914_161006_MOVI0006.mov" while True: process_video(video_path)
7.2.推理分帧验证模型
from ultralytics import YOLO if __name__ == '__main__': model = YOLO(r'C:\Users\HF03\Desktop\test02\datasets\best.pt') model.predict( source=r'C:\Users\HF03\Desktop\test02\datasets\nissan.mp4', show=True, save=True, save_frames=True, # 启用逐帧保存 vid_stride=5, #project=r'C:\Users\HF03\Desktop\test02\results', # 指定保存文件夹路径 #name='prediction_frames' # 子文件夹名称 )
7.3验证
import os import cv2 from ultralytics import YOLO import pandas as pd def load_model(): model = YOLO("best2.pt") return model def inference_and_annotate(model, image_path, output_folder): results = model(image_path) img = cv2.imread(image_path) detections = {} for result in results: boxes = result.boxes if boxes is not None and len(boxes) > 0: for box in boxes: x1, y1, x2, y2 = map(int, box.xyxy[0]) cls = int(box.cls[0]) conf = box.conf[0].item() label = f"{model.names[cls]} {conf:.2f}" # Draw bounding box and label cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.putText(img, label, (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2) # Store detection: class -> confidence detections[model.names[cls]] = conf # Save annotated image output_path = os.path.join(output_folder, os.path.basename(image_path)) cv2.imwrite(output_path, img) # Return a dictionary with filename and all detected classes/confidences return {"filename": os.path.basename(image_path), **detections} def process_images_in_folder(folder_path, model, output_folder, excel_path): os.makedirs(output_folder, exist_ok=True) all_detections = [] for filename in os.listdir(folder_path): if filename.lower().endswith(('.png', '.jpg', '.jpeg')): image_path = os.path.join(folder_path, filename) detection = inference_and_annotate(model, image_path, output_folder) all_detections.append(detection) # Convert list of dicts to DataFrame df = pd.DataFrame(all_detections) # Fill NaN values with 0 (or you can leave it empty) # df = df.fillna(0) df.to_excel(excel_path, index=False) print(f"Excel file saved at: {excel_path}") # Main if __name__ == "__main__": folder_path = r"picture" output_folder = r"annotated_images3" excel_path = r"results3.xlsx" model = load_model() process_images_in_folder(folder_path, model, output_folder, excel_path)