如何将YOLOv5检测的交通标志Bounding Box保存至自定义文件夹?需改文件吗?
实现YOLOv5保存交通标志Bounding Box区域为图片的方法
需要修改YOLOv5的相关代码,因为默认YOLOv5只负责绘制检测框和输出结果图,没有自动裁剪保存检测区域的功能。下面是两种简单的实现方式:
方法一:直接在detect.py中添加裁剪逻辑
- 打开YOLOv5根目录下的
detect.py文件,找到处理单张图片的循环段(for path, img, im0s, vid_cap in dataset:)。 - 在处理检测结果(
pred)的代码块中,添加以下逻辑:# 自定义保存文件夹,可自行修改路径 save_crop_dir = './cropped_traffic_signs' # 自动创建文件夹,不存在则新建 os.makedirs(save_crop_dir, exist_ok=True) # 遍历当前图片的所有检测结果 for i, det in enumerate(pred): if len(det): # 将检测框坐标转换为原始图片的尺寸 det[:, :4] = scale_coords(img.shape[2:], det[:, :4], im0s.shape).round() # 逐个处理每个检测框 for idx, (*xyxy, conf, cls) in enumerate(det): # 提取检测框的坐标值并转为整数 x1, y1, x2, y2 = map(int, xyxy) # 从原始图片中裁剪出检测框区域 cropped_sign = im0s[y1:y2, x1:x2] # 生成不重复的保存文件名,避免覆盖 base_name = os.path.basename(path).split('.')[0] save_name = f"{base_name}_sign_{idx}_cls{int(cls)}.jpg" save_path = os.path.join(save_crop_dir, save_name) # 保存裁剪后的图片 cv2.imwrite(save_path, cropped_sign) - 确保代码顶部已经导入
os模块,如果没有就添加:import os。
方法二:在绘制检测框的函数中添加保存逻辑
如果希望每次绘制检测框时自动保存裁剪区域,可以修改utils/plots.py中的plot_one_box函数:
- 打开
utils/plots.py,找到plot_one_box函数。 - 在函数内部(比如绘制完框之后)添加裁剪保存代码:
# 自定义保存路径 save_crop_dir = './cropped_traffic_signs' os.makedirs(save_crop_dir, exist_ok=True) # 提取坐标并裁剪 x1, y1, x2, y2 = map(int, xyxy) cropped_sign = im[y1:y2, x1:x2] # 用UUID生成唯一文件名 import uuid save_name = f"{str(uuid.uuid4())[:8]}_sign.jpg" cv2.imwrite(os.path.join(save_crop_dir, save_name), cropped_sign) - 注意如果用UUID的话,需要在函数顶部导入
uuid模块,或者直接用其他方式生成唯一文件名。
两种方法都能实现需求,推荐第一种,不需要改动其他函数的参数逻辑,更直接易懂。
内容的提问来源于stack exchange,提问作者HANEESH NAGA KRISHNA MEKALA
相关产品推荐
相关产品推荐

