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

本文主要是介绍记录一下小样本目标检测点滴,还有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): #平移,平移尺度为offimg = 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=0for line in f.readlines():i=i+1temp_list=[]if i>2:   #从第3行开始读temp_list = line.split(' ')temp_list[-1] = temp_list[-1].replace('\n', ',')x1 = float(temp_list[0]) + xy1 = float(temp_list[1]) + yx2 = float(temp_list[2]) + xy2 = float(temp_list[3]) + yx3 = float(temp_list[4]) + xy3 = float(temp_list[5]) + yx4 = float(temp_list[6]) + xy4 = float(temp_list[7]) + yfor x in [x1,x2,x3,x4]:if x>img.width:x-=img.widthif x<0:x+=img.widthfor y in [y1,y2,y3,y4]:if y>img.height:y-=img.heightif y<0:y-=img.heightput_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=0for line in f.readlines():i=i+1temp_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.widthh = img.heightprint(w,h)sita = sita/180*3.1415926with 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 = 0for line in f.readlines():i = i + 1temp_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.5image_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.5image_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.5image_colored = enh_col.enhance(color)return image_coloreddef  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 gainsimage=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  # uint8x = 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 / 128hue = 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 imageelse: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 imageimageDir="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=5000i=0
for i in range(0,1):i=i+1txt_name=str(i)+'.txt'img_name=str(i)+'.png'save_i=i+0img_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)

这篇关于记录一下小样本目标检测点滴,还有mmrotate的环境配置,数据增强的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/412082

相关文章

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

Zookeeper安装和配置说明

一、Zookeeper的搭建方式 Zookeeper安装方式有三种,单机模式和集群模式以及伪集群模式。 ■ 单机模式:Zookeeper只运行在一台服务器上,适合测试环境; ■ 伪集群模式:就是在一台物理机上运行多个Zookeeper 实例; ■ 集群模式:Zookeeper运行于一个集群上,适合生产环境,这个计算机集群被称为一个“集合体”(ensemble) Zookeeper通过复制来实现

CentOS7安装配置mysql5.7 tar免安装版

一、CentOS7.4系统自带mariadb # 查看系统自带的Mariadb[root@localhost~]# rpm -qa|grep mariadbmariadb-libs-5.5.44-2.el7.centos.x86_64# 卸载系统自带的Mariadb[root@localhost ~]# rpm -e --nodeps mariadb-libs-5.5.44-2.el7

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

hadoop开启回收站配置

开启回收站功能,可以将删除的文件在不超时的情况下,恢复原数据,起到防止误删除、备份等作用。 开启回收站功能参数说明 (1)默认值fs.trash.interval = 0,0表示禁用回收站;其他值表示设置文件的存活时间。 (2)默认值fs.trash.checkpoint.interval = 0,检查回收站的间隔时间。如果该值为0,则该值设置和fs.trash.interval的参数值相等。

NameNode内存生产配置

Hadoop2.x 系列,配置 NameNode 内存 NameNode 内存默认 2000m ,如果服务器内存 4G , NameNode 内存可以配置 3g 。在 hadoop-env.sh 文件中配置如下。 HADOOP_NAMENODE_OPTS=-Xmx3072m Hadoop3.x 系列,配置 Nam