记录一下小样本目标检测点滴,还有mmrotate的环境配置,数据增强

毕业设计做的题目是小样本目标检测,用到的是mmrotate。

话说mmrotate是真的好用 

哇,但是这个装环境就装了一万年,前前后后实验环境用到的版本换了一遍又一遍,又由于学校实验室的系统和自己电脑的系统不一样(学校的是linux,自己的是windows),所以前后一共被折磨了两次┭┮﹏┭┮,不过好在最后还是成功的跑了起来。最后实验中用到的环境配置如下:

windows:cuda10.2+pytorch1.6.0+torchvision0.7.0+mmrotate0.1.0+mmcv-full1.4.6
linux:cuda11.0+pytorch1.7.0+torchversion0.8.0+mmrotate0.2.0+mmcv-full1.4.6

以下的环境安装都是以我在windows系统下的配置,实际上在linux终端下是一样的方法。话不多说,直接开始咱们的mmrotate环境安装流程。


官网给出的要求如下:

1.首先创建一个mmrotate环境并激活

创建一个新的环境是一个很好的习惯,不然会像我一开始一样老是路径有问题,我用的python版本是3.7的,可以根据自己的需要去选则python的版本。

conda create -n mmrotate python=3.7
conda activate mmrotate

2.安装pytorch和对应版本的torchversion

看第2点前建议先看看3,不然很有可能版本有问题。

直接去pytorch官网就可以复制代码pip命令生成安装链接,但是官网打开比较慢

Start Locally | PyTorch

所以可以直接按照我下面的格式去pip安装就行了

conda install pytorch==1.6.0 torchvision==0.7.0 cudatoolkit=10.2 -c pytorch

3.安装mmrotate

mmrotate官网上提供了两种安装mmrotate的方法(不过我比较菜只有第二种成功过😂)

(1)直接掉下面两行命令

pip install openmim
mim install mmrotate

但是好像这个mim install的mmcv不是mmcv-full版本的,可以先uninstall mmcv再下一个full版本的具体pip下载的格式可以看看第二种方法。

(2)第二种方法比较麻烦,但是几乎不会出现什么错误

1)首先,安装mmcv-full

pip install mmcv-full -f https://download.openmmlab.com/mmcv/dist/{cu_version}/{torch_version}/index.html

替换其中的cu_version和torch_version为你自己的版本。

这里需要注意的一点是,也是我在环境安装中反复踩的一个坑,mmcv-full的安装对pytorch的版本要求很奇怪(不知到是不是我的水平太低了😂),好像torch的版本只能是x.x.0的,比如1.7.0还有1.6.0,用1.7.1和1.6.1就没有mmcv-full的对应版本,这也就导致当时pip install mmcv-full的时候老是找不到版本(用pip安装mmcv-full的时候一定要用官网的代码!!!直接pip install是安装最新版本,可能又会有问题报错),像我在windows下的就这样子安装:

pip install mmcv-full==1.4.6 -f https://download.openmmlab.com/mmcv/dist/cu102/torch1.6.0/index.html

2)接着,安装mmdetection

mmrotate是基于mmdetection开发的,所以还需要安装一下mmdetection。

pip install mmdet

3)最后,安装mmrotate

mmrotate一直都在更新,上次我用还在等0.1.1的版本,结果过了一段时间都0.2.0了

pip install mmrotate

或者你也可以git安装

git clone https://github.com/open-mmlab/mmrotate.git
cd mmrotate
pip install -r requirements/build.txt
pip install -v -e .  # or "python setup.py develop"

这样子就大功告成啦!

 

带标签的dota数据集格式数据增强

from PIL import Image
from PIL import ImageChops
from PIL import ImageFile
ImageFile.LOAD_TRUNCATED_IMAGES = True
Image.MAX_IMAGE_PIXELS = None
from PIL import ImageFilter
from PIL import ImageEnhance
import os
import cv2
import numpy as np
import math






#仿射变换-平移
def move(imageDir,img_name,x,y): #平移,平移尺度为off
    img = Image.open(os.path.join(imageDir, img_name))
    offset = ImageChops.offset(img,x,y)
    return offset
#仿射变换-平移 txt
def move_txt(imageDir,txtDir,savetxtDir,img_name,txt_name,txt_savename,x,y):
    img = Image.open(os.path.join(imageDir, img_name))
    with open(os.path.join(savetxtDir, txt_savename), 'w') as fp:
        fp.write("imagesource:GoogleEarth")
        fp.write('\n')
        fp.write("gsd:0.146343590398")
        fp.write('\n')
    with open(os.path.join(txtDir,txt_name)) as f:
        i=0
        for line in f.readlines():
            i=i+1
            temp_list=[]
            if i>2:   #从第3行开始读
                temp_list = line.split(' ')
                temp_list[-1] = temp_list[-1].replace('\n', ',')
                x1 = float(temp_list[0]) + x
                y1 = float(temp_list[1]) + y
                x2 = float(temp_list[2]) + x
                y2 = float(temp_list[3]) + y
                x3 = float(temp_list[4]) + x
                y3 = float(temp_list[5]) + y
                x4 = float(temp_list[6]) + x
                y4 = float(temp_list[7]) + y
                for x in [x1,x2,x3,x4]:
                    if x>img.width:
                        x-=img.width
                    if x<0:
                        x+=img.width
                for y in [y1,y2,y3,y4]:
                    if y>img.height:
                        y-=img.height
                    if y<0:
                        y-=img.height
                put_str = ' '.join([str(x1), str(y1), str(x2), str(y2), str(x3), str(y3), str(x4), str(y4), str('bigship'), str(0)])
                with open(os.path.join(savetxtDir, txt_savename), 'a') as fp:
                    fp.write(put_str)
                    fp.write('\n')
    return 0


#仿射变换-翻转
def flip(imageDir,img_name):   #翻转图像
    img = Image.open(os.path.join(imageDir, img_name))
    filp_img = img.transpose(Image.FLIP_LEFT_RIGHT)
    # filp_img.save(os.path.join(root_path,img_name.split('.')[0] + '_flip.jpg'))
    return filp_img
#仿射变换-翻转txt
def flip_txt(imageDir,txtDir,savetxtDir,img_name,txt_name,txt_savename,x,y):
    img = Image.open(os.path.join(imageDir, img_name))
    with open(os.path.join(savetxtDir, txt_savename), 'w') as fp:
        fp.write("imagesource:GoogleEarth")
        fp.write('\n')
        fp.write("gsd:0.146343590398")
        fp.write('\n')
    with open(os.path.join(txtDir,txt_name)) as f:
        i=0
        for line in f.readlines():
            i=i+1
            temp_list=[]
            if i>2:   #从第3行开始读
                temp_list = line.split(' ')
                temp_list[-1] = temp_list[-1].replace('\n', ',')
                x1 = img.width-float(temp_list[0])
                y1 = float(temp_list[1])
                x2 = img.width-float(temp_list[2])
                y2 = float(temp_list[3])
                x3 = img.width-float(temp_list[4])
                y3 = float(temp_list[5])
                x4 = img.width-float(temp_list[6])
                y4 = float(temp_list[7])
                put_str = ' '.join([str(x1), str(y1), str(x2), str(y2), str(x3), str(y3), str(x4), str(y4), str('bigship'), str(0)])
                with open(os.path.join(savetxtDir, txt_savename), 'a') as fp:
                    fp.write(put_str)
                    fp.write('\n')
    return 0

#旋转角度
def rotation(imageDir, img_name, sita):
    img = Image.open(os.path.join(imageDir, img_name))
    rotation_img = img.rotate(sita,expand=True) #旋转角度
    # rotation_img.save(os.path.join(root_path,img_name.split('.')[0] + '_rotation.jpg'))
    return rotation_img
#仿射变换-旋转txt
def rotation_txt(imageDir,txtDir,savetxtDir,img_name,txt_name,txt_savename,sita):
    img = Image.open(os.path.join(imageDir, img_name))
    w = img.width
    h = img.height
    print(w,h)
    sita = sita/180*3.1415926
    with open(os.path.join(savetxtDir, txt_savename), 'w') as fp:
        fp.write("imagesource:GoogleEarth")
        fp.write('\n')
        fp.write("gsd:0.146343590398")
        fp.write('\n')
    with open(os.path.join(txtDir, txt_name)) as f:
        i = 0
        for line in f.readlines():
            i = i + 1
            temp_list = []
            if i > 2:  # 从第3行开始读
                temp_list = line.split(' ')
                temp_list[-1] = temp_list[-1].replace('\n', ',')
                x1 = float(temp_list[0])
                y1 = float(temp_list[1])
                l1 = math.sqrt(x1 ** 2 + y1 ** 2)
                a1 = math.atan(y1 / x1)
                X1 = l1 * math.cos(sita-a1)
                Y1 = w * math.sin(sita) - l1 * math.sin(sita-a1)
                x2 = float(temp_list[2])
                y2 = float(temp_list[3])
                l2 = math.sqrt(x2 ** 2 + y2 ** 2)
                a2 = math.atan(y2 / x2)
                X2 = l2 * math.cos(sita - a2)
                Y2 = w * math.sin(sita) - l2 * math.sin(sita - a2)
                x3 = float(temp_list[4])
                y3 = float(temp_list[5])
                l3 = math.sqrt(x3 ** 2 + y3 ** 2)
                a3 = math.atan(y3 / x3)
                X3 = l3 * math.cos(sita - a3)
                Y3 = w * math.sin(sita) - l3 * math.sin(sita - a3)
                x4 = float(temp_list[6])
                y4 = float(temp_list[7])
                l4 = math.sqrt(x4 ** 2 + y4 ** 2)
                a4 = math.atan(y4 / x4)
                X4 = l4 * math.cos(sita - a4)
                Y4 = w * math.sin(sita) - l4 * math.sin(sita - a4)
                put_str = ' '.join([str(X1), str(Y1), str(X2), str(Y2), str(X3), str(Y3), str(X4), str(Y4), str('bigship'), str(0)])
                print(put_str)
                with open(os.path.join(savetxtDir, txt_savename), 'a') as fp:
                    fp.write(put_str)
                    fp.write('\n')
    return 0




#随机颜色
def randomColor(imageDir, img_name):
    """
    对图像进行颜色抖动
    :param image: PIL的图像image
    :return: 有颜色色差的图像image
    """
    image = Image.open(os.path.join(imageDir, img_name))
    random_factor = np.random.randint(0, 31) / 10.  # 随机因子
    color_image = ImageEnhance.Color(image).enhance(random_factor)  # 调整图像的饱和度
    random_factor = np.random.randint(10, 21) / 10.  # 随机因子
    brightness_image = ImageEnhance.Brightness(color_image).enhance(random_factor)  # 调整图像的亮度
    random_factor = np.random.randint(10, 21) / 10.  # 随机因子
    contrast_image = ImageEnhance.Contrast(brightness_image).enhance(random_factor)  # 调整图像对比度
    random_factor = np.random.randint(0, 31) / 10.  # 随机因子
    return ImageEnhance.Sharpness(contrast_image).enhance(random_factor)  # 调整图像锐度

#对比度增强
def contrastEnhancement(imageDir, img_name):  # 对比度增强
    image = Image.open(os.path.join(imageDir, img_name))
    enh_con = ImageEnhance.Contrast(image)
    contrast = 1.5
    image_contrasted = enh_con.enhance(contrast)
    return image_contrasted

#亮度增强
def brightnessEnhancement(imageDir,img_name):#亮度增强
    image = Image.open(os.path.join(imageDir, img_name))
    enh_bri = ImageEnhance.Brightness(image)
    brightness = 1.5
    image_brightened = enh_bri.enhance(brightness)
    return image_brightened

#颜色增强
def colorEnhancement(imageDir,img_name):#颜色增强
    image = Image.open(os.path.join(imageDir, img_name))
    enh_col = ImageEnhance.Color(image)
    color = 1.5
    image_colored = enh_col.enhance(color)
    return image_colored

def  only_change_name(txtDir,savetxtDir,txt_name,txt_savename):
    with open(os.path.join(savetxtDir, txt_savename), 'w') as fp:
        fp.write("imagesource:GoogleEarth")
        fp.write('\n')
        fp.write("gsd:0.146343590398")
        fp.write('\n')
        with open(os.path.join(txtDir, txt_name)) as f:
            for line in f.readlines():
                with open(os.path.join(savetxtDir, txt_savename), 'a') as fp:
                    fp.write(line)
    return 0

#通过在 hsv 色彩空间中,对 h、s、v三个通道增加扰动,来进行色调增强变换
def augment_hsv(imageDir,image_name, hgain, sgain, vgain):
    """
    HSV color-space augmentation
    :param image:       待增强的图片
    :param hgain:       HSV 中的 h 扰动系数,yolov5:0.015
    :param sgain:       HSV 中的 s 扰动系数,yolov5:0.7
    :param vgain:       HSV 中的 v 扰动系数,yolov5:0.4
    :return:
    """
    image=Image.open(os.path.join(imageDir,image_name))
    if hgain or sgain or vgain:
        # 随机取-1到1三个实数,乘以 hsv 三通道扰动系数
        # r:[1-gain,1+gain]
        r = np.random.uniform(-1, 1, 3) * [hgain, sgain, vgain] + 1  # random gains
        image=cv2.cvtColor(image,cv2.COLOR_RGB2BGR)
        image_hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
        # cv2.split:通道拆分
        # h:[0~180], s:[0~255], v:[0~255]
        hue, sat, val = cv2.split(image_hsv)
        dtype = image.dtype  # uint8

        x = np.arange(0, 256, dtype=r.dtype)
        lut_hue = ((x * r[0]) % 180).astype(dtype)
        lut_sat = np.clip(x * r[1], 0, 255).astype(dtype)
        lut_val = np.clip(x * r[2], 0, 255).astype(dtype)

        # cv2.LUT:dst(I) = lut(src(I) + d),d为常数0 / 128
        hue = cv2.LUT(hue, lut_hue)
        sat = cv2.LUT(sat, lut_sat)
        val = cv2.LUT(val, lut_val)

        # 通道合并
        image_hsv = cv2.merge((hue, sat, val)).astype(dtype)

        # 将hsv格式转为RGB格式
        image_dst = cv2.cvtColor(image_hsv, cv2.COLOR_HSV2BGR)
        image=Image.formarry(cv2.cvtColor(image_dst, cv2.COLOR_BGR2RGB))
        return image
    else:
        return image
# 图像的缩放
def change_scale(imageDir,img_name,h,w,jitter=0.5):
    image = Image.open(os.path.join(imageDir, img_name))
    iw, ih = image.size
    # 对图像进行缩放并且进行长和宽的扭曲
    new_ar = w/h * rand(1-jitter,1+jitter)/rand(1-jitter,1+jitter)
    scale = rand(.15,2.5)
    if new_ar < 1:
        nh = int(scale*h)
        nw = int(nh*new_ar)
    else:
        nw = int(scale*w)
        nh = int(nw/new_ar)
        image = image.resize((nw,nh), Image.BICUBIC)
    return image

imageDir="D:\Bishe\mmrotate-main\\fangshesjzq\img" #要改变的图片的路径文件夹
txtDir="D:\Bishe\mmrotate-main\\fangshesjzq\\txt"#要改变的txt的路径文件夹
saveimgDir="D:\Bishe\mmrotate-main\\fangshesjzq\saveimg"   #要保存的图片的路径文件夹
savetxtDir="D:\Bishe\mmrotate-main\\fangshesjzq\savetxt"

#平移参数
x=0
y=5000

i=0
for i in range(0,1):
    i=i+1
    txt_name=str(i)+'.txt'
    img_name=str(i)+'.png'
    save_i=i+0
    img_savename=str(save_i)+'.png'
    txt_savename=str(save_i)+'.txt'
    # saveImage=move(imageDir,img_name,x,y)
    # move_txt(imageDir,txtDir,savetxtDir,img_name,txt_name,txt_savename,x,y)
    # saveImage=flip(imageDir,img_name)
    # flip_txt(imageDir, txtDir, savetxtDir, img_name, txt_name, txt_savename, x, y)
    # saveImage=rotation(imageDir,img_name,30)
    # rotation_txt(imageDir, txtDir, savetxtDir, img_name, txt_name, txt_savename, 30)
    # saveImage=randomColor(imageDir, img_name)
    # saveImage=contrastEnhancement(imageDir, img_name)
    # saveImage=brightnessEnhancement(imageDir, img_name)
    saveImage=colorEnhancement(imageDir, img_name)
    # saveImage=augment_hsv(imageDir,img_name, 0.5, 0.5, 0.5)
    # only_change_name(txtDir, savetxtDir, txt_name, txt_savename)
    # saveImage=change_scale(imageDir, img_name, 1000,1000, jitter=0.5)
    saveImage.save(os.path.join(saveimgDir, img_savename))
    print("finish"+"  "+str(img_name))











今天就更新到这,q我催我更新(1609373452)

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值