清华源:https://pypi.tuna.tsinghua.edu.cn/simple/
视频切割,每XX帧抽取一张图片,保存到指定文件夹
import cv2 import os # 视频文件路径 video_path = 'WIN_20250627_11_56_44_Pro.mp4' # 保存图片的文件夹路径 output_folder = 'picture' # 每隔多少帧提取一张图片 frame_interval = 5 # 创建输出文件夹(如果不存在) 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帧抽取一张图片,保存到指定文件夹
#每隔XX张图片,抽取一张至目标文件夹
import os import shutil def copy_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() # 遍历图片,每隔10张复制一次 for i, image_file in enumerate(image_files): if i % 10 == 0: # 每隔10张复制一张 source_path = os.path.join(source_folder, image_file) target_path = os.path.join(target_folder, image_file) shutil.copy(source_path, target_path) # 改为 copy 以保留原文件 print(f"Copied {image_file} to {target_folder}") # 示例调用 source_folder = "picture" target_folder = r"D:\0711\140" copy_images(source_folder, target_folder) #每隔XX张图片,抽取一张至目标文件夹
#遍历目标文件夹,每4张图片为一个循环,前3张放入文件夹1,第4张放入文件夹2
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
拷贝字体文件
cp Arial.Unicode.ttf /root/.config/Ultralytics
data.yaml文件
# 训练集、验证集、测试集的图片路径(相对于path的路径) train: /mnt/workspace/dataset/images/train val: /mnt/workspace/dataset/images/val # 类别名称与ID的映射(必须与TXT文件中的class_id对应!) names: - ARIYA - ARIYA后视镜关 - ARIYA后视镜开 - ARIYA轮毂 - 天籁 - 天籁后视镜关 - 天籁后视镜开 - 天籁轮毂 - 奇骏 - 奇骏后视镜关 - 奇骏后视镜开 - 奇骏轮毂 - 异物
训练程序
from ultralytics import YOLO # 加载预训练模型(推荐从官方模型初始化) model = YOLO(r'/mnt/workspace/yolo11n.pt') # 开始训练! results = model.train( data=r"/mnt/workspace/data.yaml", # 数据集配置文件路径 epochs=200, # 训练轮次(建议至少100轮) batch=0.8, # 批量大小(根据GPU显存调整) imgsz=1280, # 输入图像尺寸 name="my_custom_model", # 训练结果保存目录名称 optimizer="auto", # 优化器(推荐自动选择) lr0=0.01, # 初始学习率 patience=200, # 早停等待轮次(检测不到改进则停止) )
model.yaml文件
type: yolo11 name: yolo11 display_name: Day0710 model_path: best1.onnx nms_threshold: 0.45 confidence_threshold: 0.25 classes: - ARIYA - ARIYA后视镜关 - ARIYA后视镜开 - ARIYA轮毂 - 天籁 - 天籁后视镜关 - 天籁后视镜开 - 天籁轮毂 - 奇骏 - 奇骏后视镜关 - 奇骏后视镜开 - 奇骏轮毂 - 异物
#转换onnx,openvino
from ultralytics import YOLO # Load a YOLO11n PyTorch model model = YOLO("best.pt") # Export the model model.export(format="openvino") # creates 'yolo11n_openvino_model/' model.export(format="onnx") # creates 'yolo11n_openvino_model/' #转换onnx,openvino
#遍历路径文件夹下所有图片推理,输出各class置信度统计excel
import os #import cv2 from PIL import Image, ImageDraw, ImageFont from ultralytics import YOLO import pandas as pd import numpy as np def load_model(): model = YOLO(r"D:\7.12\12\best.pt") return model def inference_and_annotate(model, image_path, output_folder): results = model(image_path) # 使用PIL打开图像 pil_img = Image.open(image_path) draw = ImageDraw.Draw(pil_img) # 设置中文字体 font_path = r"C:\Windows\Fonts\simhei.ttf" # Windows系统默认黑体 try: font = ImageFont.truetype(font_path, 24) except IOError: try: font = ImageFont.load_default() print("警告: 无法加载中文字体,将使用默认字体") except Exception as e: print(f"错误: 无法加载任何字体 - {e}") font = None 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}" # 使用PIL绘制矩形框 - 修改颜色格式为RGB draw.rectangle([x1, y1, x2, y2], outline=(0, 255, 0), width=5) # 使用PIL绘制文本 if font: draw.text((x1, y1 - 30), label, font=font, fill=(0, 255, 0)) else: # 作为备用,使用简单的文本 draw.text((x1, y1 - 30), label, fill=(0, 255, 0)) # Store detection: class -> confidence detections[model.names[cls]] = conf # Save annotated image output_path = os.path.join(output_folder, os.path.basename(image_path)) pil_img.save(output_path) # 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"D:\7.12\12\picture\picture" output_folder = r"D:\7.12\12\detected_images1" excel_path = r"D:\7.12\12\detection_results1.xlsx" model = load_model() process_images_in_folder(folder_path, model, output_folder, excel_path)
#备用检测视频
from ultralytics import YOLO if __name__ == '__main__': model = YOLO(r'best12_openvino_model') model.predict( source=r'WIN_20250627_11_56_44_Pro.mp4', show=True, save=True, save_frames=True, # 启用逐帧保存 vid_stride=5, project=r'D:\0711\results', # 指定保存文件夹路径 name='prediction_frames' # 子文件夹名称 ) #备用检测视频
推理图片并打印置信度信息
from ultralytics import YOLO if __name__ == '__main__': model = YOLO(r'/mnt/workspace/runs/detect/train70/weights/best.pt') results = model.predict(source=r'/mnt/workspace/tuili', save=True, imgsz=1280) for i, result in enumerate(results): print(f"\n--- 图片 {i+1}/{len(results)}:{result.path} ---") boxes = result.boxes if len(boxes) == 0: print("未检测到目标") else: for j, box in enumerate(boxes): confidence = float(box.conf) cls_id = int(box.cls) cls_name = result.names[cls_id] if hasattr(result, 'names') else f"类别{cls_id}" print(f"目标 {j+1}/{len(boxes)}:{cls_name} (ID:{cls_id}),置信度:{confidence:.4f}")