python使用目标检测算法输出的box对图像目标进行抠图保存(附源码)

文章目录

  • 前言
  • 一、输出标签格式转换
  • 二、代码步骤分解
    • 1.引入库
    • 2.修改图片、标签路径以及抠图保存路径
    • 3.遍历文件夹中的图片
    • 4.根据标签信息查找图片中的目标
    • 5.使用cv对图像进行抠图保存
  • 三、python完整程序
  • 总结


前言

在实际深度学习项目中,偶尔目标检测算法检测出的目标也会作为分类网络的输入数据,我们怎样利用目标检测算法的结果(如目标类别信息和box坐标信息)快速地对被检测图像进行抠图,以抠出来的图来扩充分类网络的数据,将是本文讲的主要内容。


提示:以下是本篇文章正文内容,代码程序可供参考

一、输出标签格式转换

以YOLOv5算法为例,打开–save-txt,目标检测结果则保存为txt标签文件(yolo格式),首先使用yolo转voc格式的脚本把txt文件批量转化为voc格式的标签,即xml文件。xml文件的内容如下图所示:包含目标类别信息和box的坐标信息,下面将以读取xml文件,来获取box坐标,进而对图像进行抠图。
python使用目标检测算法输出的box对图像目标进行抠图保存(附源码)_第1张图片

二、代码步骤分解

1.引入库

代码如下:

import cv2
import numpy as np
import xml.dom.minidom
import os
import argparse

2.修改图片、标签路径以及抠图保存路径

代码如下:

def main():
  # 将要被抠图的原始图片路径
  img_path = 'F:/Helmet_qi/work_clothes/work_clothes_img_ALL/' 
  # 转化后的XML文件的路径
  anno_path = 'F:/Helmet_qi/work_clothes/clothes_xml_ALL/'
  # 抠图保存的文件夹路径
  cut_path = 'F:/Helmet_qi/work_clothes/cut_img_0/'
  # 获取文件夹中的文件
  imagelist = os.listdir(img_path)

3.遍历文件夹中的图片

  for image in imagelist:
    image_pre, ext = os.path.splitext(image)
    img_file = img_path + image
    img = cv2.imread(img_file)
    xml_file = anno_path + image_pre + '.xml'
    DOMTree = xml.dom.minidom.parse(xml_file)
    collection = DOMTree.documentElement
    objects = collection.getElementsByTagName("object")

4.根据标签信息查找图片中的目标

读取xml文件中的目标类别与box的坐标信息

for object in objects:
      bndbox = object.getElementsByTagName('bndbox')[0]
      xmin = bndbox.getElementsByTagName('xmin')[0]
      xmin_data = xmin.childNodes[0].data
      ymin = bndbox.getElementsByTagName('ymin')[0]
      ymin_data = ymin.childNodes[0].data
      xmax = bndbox.getElementsByTagName('xmax')[0]
      xmax_data = xmax.childNodes[0].data
      ymax = bndbox.getElementsByTagName('ymax')[0]
      ymax_data = ymax.childNodes[0].data
      xmin = int(xmin_data)
      xmax = int(xmax_data)
      ymin = int(ymin_data)
      ymax = int(ymax_data)

5.使用cv对图像进行抠图保存

      img_cut = img[ymin:ymax, xmin:xmax, :]
      cv2.imwrite(cut_path + 'cut_img_{}.jpg'.format(image_pre), img_cut)

三、python完整程序

# -*- coding: utf-8 -*-
# @Time  : 2022/10/30 23:30
# @Author : yuguo
# @File  : cai_img_from_box.py
# @Software: PyCharm
import cv2
import numpy as np
import xml.dom.minidom
import os
import argparse

def main():
  # 将要被抠图的原始图片路径
  img_path = 'F:/Helmet_qi/work_clothes/work_clothes_img_ALL/' 
  # 转化后的XML文件的路径
  anno_path = 'F:/Helmet_qi/work_clothes/clothes_xml_ALL/'
  # 抠图保存的文件夹路径
  cut_path = 'F:/Helmet_qi/work_clothes/cut_img_0/'
  # 获取文件夹中的文件
  imagelist = os.listdir(img_path)

  imagelist = os.listdir(img_path)

  for image in imagelist:
    image_pre, ext = os.path.splitext(image)
    img_file = img_path + image
    img = cv2.imread(img_file)
    xml_file = anno_path + image_pre + '.xml'
    DOMTree = xml.dom.minidom.parse(xml_file)
    collection = DOMTree.documentElement
    objects = collection.getElementsByTagName("object")

    for object in objects:
      print("start")
      bndbox = object.getElementsByTagName('bndbox')[0]
      xmin = bndbox.getElementsByTagName('xmin')[0]
      xmin_data = xmin.childNodes[0].data
      ymin = bndbox.getElementsByTagName('ymin')[0]
      ymin_data = ymin.childNodes[0].data
      xmax = bndbox.getElementsByTagName('xmax')[0]
      xmax_data = xmax.childNodes[0].data
      ymax = bndbox.getElementsByTagName('ymax')[0]
      ymax_data = ymax.childNodes[0].data
      xmin = int(xmin_data)
      xmax = int(xmax_data)
      ymin = int(ymin_data)
      ymax = int(ymax_data)
      img_cut = img[ymin:ymax, xmin:xmax, :]
      cv2.imwrite(cut_path + 'cut_img_{}.jpg'.format(image_pre), img_cut)
      
if __name__ == '__main__':
  main()

总结

作者在做智慧工地项目时,甲方要求识别工人安全帽佩戴和工作服穿戴,其中安全帽佩戴使用的是目标检测算法,而工作服穿戴使用的是分类算法,数据集就是使用目标检测算法直接检测输出txt标签信息,然后按照本文步骤一步步操作,很快就得到大量分类数据集。不过需要字手动筛选下。本文见本使用起来方便快捷。
学好python,大大提高工作效率!觉得还不错的,感谢关注收藏,后续还会继续分享好用的数据处理脚本。

你可能感兴趣的:(resnet34,深度学习,分类网络数据集,目标检测,python,算法)