深度学习图片和标注排序,移动等一些常用操作代码

博主在做一些目标检测和语义分割训练时,总会遇到标注和图片需要改名,排序,分类的一些情况,现在将一些代码贴出分享,后续也会持续更新。

1.标注和图片改名排序

import os
import string

path = r''//文件路径

# 获取该目录下所有文件,存入列表中
fileList = os.listdir(path)

index = 0//索引号
index_1 = 0//索引号
for i in fileList:
    i_d = os.path.join(path,i)
    a = os.path.join(path,i_d)+'\n'
    suffix = a[-5:]//获取后缀名
    suffix_1 = a[-5:]//获取后缀名
    if(suffix == ".txt\n"):
        oldname = i_d
        newname = path + '/' + 'seg' + '_' + str(index) + '.txt'
        os.rename(oldname, newname)//重命名
        index += 1
    if(suffix_1 == ".jpg\n"):
        oldname_1 = i_d
        newname_1 = path + '/' + 'seg' + '_' +str(index_1) + '.jpg'
        os.rename(oldname_1, newname_1)//重命名
        index_1 += 1

2.将标注和图片分开

import os
import shutil


def split(filepath):
    files = os.listdir(filepath)
    for fi in files:
        fi_d = os.path.join(filepath,fi)
        if os.path.isdir(fi_d):
            gci(fi_d)
        else:
            str = os.path.join(filepath,fi_d)+'\n'
            #imagepath = os.path.join(filepath,fi_d)
            #labelpath = os.path.join(filepath,fi_d)
            suffix = str[-5:]
            #print(suffix)
            if(suffix == ".jpg\n"):
                print(str ,'is a jpg file' + '\n')
                shutil.move(fi_d,image_path)
                #img_path = imagepath
                #image = Image.open(img_path)
                #image.save(new_path + '/' + fi)
                #list_txt.writelines(str)
            else:
                shutil.move(fi_d,label_path)
                #print(str,'is not a jpg file' + '\n')


# recursion traverse
#list_txt = open('list.txt', 'w')
#list_txt = open('list.txt', 'w', encoding='utf-8')
path = r''//标注和图片路径
image_path = r''//图像路径
label_path = r''//标注路径
print(path)
split(path)
#list_txt.close()

3.切图,将大图切成小图
'''
将一张图片填充为正方形后切为9张图

'''
from PIL import Image
import os
import shutil
import sys

#遍历图片
def gci(file_path):
    files = os.listdir(file_path)
    for fi in files:
        fi_d = os.path.join(file_path,fi)
        if os.path.isdir(fi_d):
            gci(fi_d)
        else:
            str = os.path.join(file_path,fi_d)
            suffix = str[-4:]
            if(suffix == ".png" or suffix == ".jpg"):
                image = Image.open(str)
                cut_image(image,fi)

            else:
                print(str + "is not a jpg file ")

#切图
def cut_image(image,fi):
    width, height = image.size
    item_width = int(width / 4)
    item_height = int(height/4)
    box_list = []
    # (left, upper, right, lower)
    for i in range(0,4):#si重循环,生成16张图片基于原图的位置
        for j in range(0,4):
            #print((i*item_width,j*item_width,(i+1)*item_width,(j+1)*item_width))
            box = (j*item_width,i*item_height,(j+1)*item_width,(i+1)*item_height)
            box_list.append(box)

    image_list = [image.crop(box) for box in box_list]
    save_images(image_list,fi)

#保存
def save_images(image_list,fi):
    index = 1
    for image in image_list:
        image.save(save_path + '/' + str(index) + '_' + fi)
        index += 1

if __name__ == '__main__':
    file_path =r""
    save_path = r''
    image = gci(file_path)

4.将标注后的大图和标签分成图

import cv2
import numpy as np
import os

# def read_label(label_dir):
#     flag = 0
#     with open(label_dir) as f:
#         while(1):
#             object = f.readline()
#             if not object:
#                 break
#             object = object.split(' ')
#
#             tmp = np.zeros([5,1])
#             tmp[0,0] = int(object[0])
#             tmp[1,0] = float(object[1])
#             tmp[2,0] = float(object[2])
#             tmp[3,0] = float(object[3])
#             tmp[4,0] = float(object[4][0:-1])
#             if not flag:
#                 res = tmp
#                 flag = 1
#             else:
#                 res = np.concatenate([res,tmp],axis = -1)
#     return res

def read_label(label_dir):
    res = []
    with open(label_dir,'r') as f:
        while(1):
            object = f.readline()
            if not object:
                break
            object = object.split(' ')
            tmp = []
            # if int(object[0])!=0:
            #     continue
            tmp.append(int(object[0]))
            x = float(object[1])*W
            y = float(object[2])*H
            w = float(object[3])*W
            h = float(object[4])*H
            if w*resize_size/min_size<=5 or h*resize_size/min_size<=5:
                min_l = min(w,h)
                if min_l == w:
                    ratio = h/w
                    w = 5*min_size/resize_size
                    h = w*ratio
                else:
                    ratio = w/h
                    h = 5*min_size/resize_size
                    w = h * ratio

            tmp.append(max(int(x-w/2),0))
            tmp.append(max(int(y-h/2),0))
            tmp.append(min(int(x+w/2),W-1))
            tmp.append(min(int(y+h/2),H-1))
            # tmp.append(int(x-w/2))
            # tmp.append(int(y-h/2))
            # tmp.append(int(x+w/2))
            # tmp.append(int(y+h/2))
            res.append(tmp)
    res = sorted(res,key=lambda x:(x[1],x[2]))
    return res
def in_area(object,start_x,start_y,end_x,end_y):
    def cal_iou(box1,box2):
        l = max(box1[1],box2[0])
        t = max(box1[2],box2[1])
        r = min(box1[3],box2[2])
        d = min(box1[4],box2[3])
        inter = max(0,r-l)*max(0,d-t)
        area1 = (box1[3]-box1[1])*(box1[4]-box1[2])
        area2 = (box2[2]-box2[0])*(box2[3]-box2[1])
        iou = inter/(-inter+area1+area2)
        return iou,area1/area2

    iou , max_iou = cal_iou(object,[start_x,start_y,end_x,end_y])
    if iou>0.1*max_iou:
        return True
    # if start_x<=object[1]<=end_x or start_y<=object[2]<=end_y and start_x<=object[3]<=end_x and start_y<=object[4]<=end_y:
    #     return True
    return False


def process_img(img,objects):

    # left = np.min(objects[1,:] - objects[3,:]/2)*W
    # right = np.max(objects[1, :] + objects[3, :] / 2)*W
    # top = np.min(objects[2, :] - objects[4, :] / 2)*H
    # down = np.max(objects[2, :] + objects[4, :] / 2)*H
    # if left>right-min_size:
    #     left = right-min_size
    #     if left<0:
    #         left = 0
    #         right = left+min_size
    #
    # if top>down-min_size:
    #     top = down-min_size
    #     if top<0:
    #         top = 0
    #         right = top+min_size
    j = 1
    mask = [True]*len(objects)
    for t,object in enumerate(objects):
        if mask[t]==True:
            start_x = max(object[1]-min_size//2,0)
            end_x = min(start_x+min_size,W-1)
            if end_x == W-1:
                start_x = end_x-min_size
            start_y = max(object[2]-min_size//2,0)
            end_y = min(start_y+min_size, H-1)
            if end_y == H-1:
                start_y = end_y-min_size
            delete_id = []
            for i in range(len(objects)):
                if in_area(objects[i],start_x,start_y,end_x,end_y):
                    delete_id.append(i)

            cut_pic = img[start_y:end_y,start_x:end_x,:]

            save_name = save_dir+img_name[0:-4]+"_"+str(j)
            cv2.imwrite(save_name+'.jpg',cut_pic)
            # cut_pic = cv2.resize(cut_pic,(608,608))


            with open(save_name+'.txt','w+') as f:
                for ids in delete_id:
                    o = objects[ids]
                    mask[ids] = False
                    class_id = o[0]
                    a = (o[1] - start_x)
                    b = (o[2] - start_y)
                    c = (o[3] - start_x)
                    d = (o[4] - start_y)
                    # cv2.rectangle(cut_pic, (a, b), (c, d), [255, 255, 255], 2)
                    # cv2.imshow('cut', cut_pic)
                    # cv2.waitKey(0)
                    xmin = max((o[1] - start_x) / (min_size),0)
                    ymin = max((o[2] - start_y) / (min_size),0)
                    xmax = min((o[3] - start_x) / (min_size),0.999)
                    ymax = min((o[4] - start_y) / (min_size),0.999)

                    # print((xmax+xmin)/2)
                    # print((ymax+ymin)/2)
                    # print(xmax-xmin)
                    # print(ymax-ymin)

                    f.write(str(class_id)+' '+str((xmax+xmin)/2)+' '+str((ymax+ymin)/2)+' '+str(xmax-xmin)+' '+str(ymax-ymin)+'\n')
                    # cv2.rectangle(cut_pic, (int(((xmax+xmin)/2-(xmax-xmin)/2) * min_size), int(((ymax+ym  in)/2-(ymax-ymin)/2) * min_size)),
                    #               (int(((xmax+xmin)/2+(xmax-xmin)/2)  * min_size), int(((ymax+ymin)/2+(ymax-ymin)/2)  * min_size)), (255, 255, 255), 2)
                    # cv2.imshow('cut', cut_pic)
                    # cv2.waitKey(0)
            j = j+1
    return


min_size = 1000
resize_size = 608
data_dir = r'D:\\Study\\yolov4 3-channel-and-layer-pruning-master\\data\\picture1\\'
save_dir = r'C:\Users\51683\Desktop\cutdata\\'
datas = os.listdir(data_dir)
imgs = [data for data in datas if data.endswith('JPG')]
labels = [data for data in datas if data.endswith('txt')]
for img_name in imgs:
    label = img_name.replace('JPG','txt')
    if label in labels:
        image = cv2.imread(data_dir+img_name)
        H, W, _ = np.shape(image)
        objects = read_label(data_dir+label)
        if not objects:
            continue
        process_img(image,objects)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YoungDark7

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值