hsv 明度的范围_通过HSV转换的方式实现图片数据增强

在我的上一篇文章中,我记录了自己将MOT17-Det数据集转换成VOC格式:

HUST小菜鸡:将MOT17-Det数据集转成VOC格式​zhuanlan.zhihu.com
b39592faaf2a5b0125cbdd6a1a2d8b8a.png

但是在后期的测试过程中,发现了一些小问题:

  1. 首先是train.txt里面写入的图片数和标注的数目不一致,这在训练的过程中会产生错误(训练集中存在的图片的大于有标注的图片数据)
  2. 数据集体量过小,一共只有5000多张有标注的数据,拆分成训练集和测试集之后数据集的体量更小,训练时容易产生过拟合

考虑到这些问题,今天对其进行一些对应的更新:

  1. train.txt的生成和标注生成同步完成保证数据集和标注的体量一致
  2. 通过HSV变换的方式实现数据增强

有关于HSV和RGB空间的转换及相关特性参照我的这篇文章:

HUST小菜鸡:HSV和RGB通道颜色的区别和转换​zhuanlan.zhihu.com
b4d0fde84a727adf9d4e367ec5e6fdfb.png

首先先明确H,S,V分别表示什么

H表示色调,取值范围为(0,180)

S表示饱和度,取值范围为(0,255)

V表示亮度,取值范围为(0,255)

def gamma_transform_s(img, gamma):hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)illum = hsv[..., 1] / 255.illum = np.power(illum, gamma)v = illum * 255.v[v > 255] = 255v[v < 0] = 0hsv[..., 1] = v.astype(np.uint8)img = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)return imgdef gamma_transform_v(img, gamma):hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)illum = hsv[..., 2] / 255.illum = np.power(illum, gamma)v = illum * 255.v[v > 255] = 255v[v < 0] = 0hsv[..., 2] = v.astype(np.uint8)img = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)return imgdef gamma_transform_sv(img, gamma1,gamma2):hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)illum = hsv[..., 2] / 255.illum = np.power(illum, gamma1)v = illum * 255.v[v > 255] = 255v[v < 0] = 0hsv[..., 2] = v.astype(np.uint8)illum = hsv[..., 1] / 255.illum = np.power(illum, gamma2)v = illum * 255.v[v > 255] = 255v[v < 0] = 0hsv[..., 1] = v.astype(np.uint8)img = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)return img

这里定义了三个函数,一个是通过gamma变换进行饱和度变换,一个是通过gamma变换进行明度变换,一个是通过gamma变换进行饱和度和明度变换,这样就会产生原数据四倍体量的数据,并且所有的gamma都是随机生成的,使得数据集具有更多的普适性。

首先看一组测试的demo,看HSV转换后生成的数据

aa9c7ec32573843d89371538adfc8625.png
原图片文件

30a740f5d21fcbe5af62eb80eb65894e.png
明度通过gamma=0.5的变换后生成的图片

16188586088bf9cb42677b0bf462f8b4.png
明度通过gamma=1.15的变换后生成的图片

35dd7f548bba938e7644532a7f3aaa99.png
饱和度通过gamma=0.5的变换后生成的图片

56655aca9674c9523cc5b2a4bd41292f.png
饱和度通过gamma=1.15的变换后生成的图片

通过修改后的代码实现数据集的增强如下所示

import os
import cv2
import codecs
import time
import numpy as npori_gt_lists = ['D:/MOT17-Det/train/MOT17-02/gt/gt.txt','D:/MOT17-Det/train/MOT17-04/gt/gt.txt','D:/MOT17-Det/train/MOT17-05/gt/gt.txt','D:/MOT17-Det/train/MOT17-09/gt/gt.txt','D:/MOT17-Det/train/MOT17-10/gt/gt.txt','D:/MOT17-Det/train/MOT17-11/gt/gt.txt','D:/MOT17-Det/train/MOT17-13/gt/gt.txt']img_dir = 'D:/MOT17-Det/voc/JPEGImages/'
annotation_dir = 'D:/MOT17-Det/voc/Annotations/'
root = 'D:/MOT17-Det/voc/ImageSets/Main/'fp_trainlist = open(root + 'train_list.txt','w')def replace_char(string,char,index):string = list(string)string[index] = charreturn ''.join(string)def gamma_transform_s(img, gamma):hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)illum = hsv[..., 1] / 255.illum = np.power(illum, gamma)v = illum * 255.v[v > 255] = 255v[v < 0] = 0hsv[..., 1] = v.astype(np.uint8)img = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)return imgdef gamma_transform_v(img, gamma):hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)illum = hsv[..., 2] / 255.illum = np.power(illum, gamma)v = illum * 255.v[v > 255] = 255v[v < 0] = 0hsv[..., 2] = v.astype(np.uint8)img = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)return imgdef gamma_transform_sv(img, gamma1,gamma2):hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)illum = hsv[..., 2] / 255.illum = np.power(illum, gamma1)v = illum * 255.v[v > 255] = 255v[v < 0] = 0hsv[..., 2] = v.astype(np.uint8)illum = hsv[..., 1] / 255.illum = np.power(illum, gamma2)v = illum * 255.v[v > 255] = 255v[v < 0] = 0hsv[..., 1] = v.astype(np.uint8)img = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)return imgfor each_dir in ori_gt_lists:start_time = time.time()fp = open(each_dir, 'r')userlines = fp.readlines()fp.close()# 寻找gt中的对应的最大frame# max_indx = 0# for line in userlines:#     e_fram = int(line.split(',')[0])#     if e_fram > max_index:#         max_index = e_fram# print(max_index)fram_list = []for line in userlines:e_fram = int(line.split(',')[0])fram_list.append(e_fram)max_index = max(fram_list)print(each_dir + 'max_index:', max_index)for i in range(1, max_index):clear_name = each_dir[-12:-10] + format(str(i), '0>6s')format_name = clear_name + '.jpg'detail_dir = img_dir + format_nameimg = cv2.imread(detail_dir)shape_img = img.shapeheight = shape_img[0]width = shape_img[1]depth = shape_img[2]gamma1 = np.random.uniform(0.5,1.5)gamma2 = np.random.uniform(0.5, 1.5)gamma3 = np.random.uniform(0.5, 1.5)gamma4 = np.random.uniform(0.5, 1.5)img1 = gamma_transform_s(img,gamma1)img2 = gamma_transform_v(img, gamma2)img3 = gamma_transform_sv(img, gamma3,gamma4)format_name1 = replace_char(format_name,'1',2)format_name2 = replace_char(format_name, '2', 2)format_name3 = replace_char(format_name, '3', 2)cv2.imwrite(img_dir+format_name1,img1)cv2.imwrite(img_dir + format_name2, img2)cv2.imwrite(img_dir + format_name3, img3)txt_name = format_name[:-4]txt_name1 = format_name1[:-4]txt_name2 = format_name2[:-4]txt_name3 = format_name3[:-4]# fp.writelines(txt_name + 'n')# fp.writelines(txt_name1 + 'n')# fp.writelines(txt_name2 + 'n')# fp.writelines(txt_name3 + 'n')xml_list = [txt_name,txt_name1,txt_name2,txt_name3]each_index = [num for num,x in enumerate(fram_list) if x == (i)]for xml_name in xml_list:fp_trainlist.writelines(xml_name + 'n')with codecs.open(annotation_dir + xml_name + '.xml', 'w') as xml:xml.write('<?xml version="1.0" encoding="UTF-8"?>n')xml.write('<annotation>n')xml.write('t<folder>' + 'voc' + '</folder>n')xml.write('t<filename>' + xml_name + '.jpg' + '</filename>n')# xml.write('t<path>' + path + "/" + info1 + '</path>n')xml.write('t<source>n')xml.write('tt<database> The MOT17-Det </database>n')xml.write('t</source>n')xml.write('t<size>n')xml.write('tt<width>' + str(width) + '</width>n')xml.write('tt<height>' + str(height) + '</height>n')xml.write('tt<depth>' + str(depth) + '</depth>n')xml.write('t</size>n')xml.write('tt<segmented>0</segmented>n')for j in range(len(each_index)):num = each_index[j]x1 = int(userlines[num].split(',')[2])y1 = int(userlines[num].split(',')[3])x2 = int(userlines[num].split(',')[4])y2 = int(userlines[num].split(',')[5])xml.write('t<object>n')xml.write('tt<name>person</name>n')xml.write('tt<pose>Unspecified</pose>n')xml.write('tt<truncated>0</truncated>n')xml.write('tt<difficult>0</difficult>n')xml.write('tt<bndbox>n')xml.write('ttt<xmin>' + str(x1) + '</xmin>n')xml.write('ttt<ymin>' + str(y1) + '</ymin>n')xml.write('ttt<xmax>' + str(x1 + x2) + '</xmax>n')xml.write('ttt<ymax>' + str(y1 + y2) + '</ymax>n')xml.write('tt</bndbox>n')xml.write('t</object>n')xml.write('</annotation>')end_time = time.time()print('process {} cost time:{}s'.format(each_dir,(end_time-start_time)))
fp_trainlist.close()
print('succeed in processing all gt files')

841c34d01ba00249e15e9cc2468c218f.png
数据集体量变成了21243

标注的数量和train.txt中的数量也一致实现了匹配,实现了数据增强的目的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/245402.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java数组如何相加_java数组排序,并将数组内的数据求和

java数据编列并求和&#xff0c;江湖我狼哥&#xff0c;人狠话不多&#xff0c;直接上代码&#xff01;import java.util.Arrays;public class Intarry {public static void main (String[] args){//定义一个数组int intarry[] {20,30,40,10};int num0;Arrays.sort(intarry);/…

python在工厂中的应用_什么是工厂函数?Python 中工厂函数怎么理解?

其实谈工厂函数前必须首先把嵌套作用域和闭包讲清楚python有一个很有意思的地方&#xff0c;就是def函数可以嵌套在另一个def函数之中。调用外层函数时&#xff0c;运行到的内层def语句仅仅是完成对内层函数的定义&#xff0c;而不会去调用内层函数&#xff0c;除非在嵌套函数之…

java protected关键字_Java 权限protected关键字纠正

以前一直认为自己理解了Java四种权限访问&#xff0c;昨天突然编程时发现protected居然在子类中不能调用&#xff0c;然后越看越迷糊&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;public&#xff1a; Java语言中访问限制最宽的修饰符&#xff0c;…

老版本fortran语言 内存无效_编程语言的分类

编程语言世代第一代和第二代语言又称低级语言&#xff08;Low-level language&#xff09;&#xff0c;其余被视为高级语言&#xff08;High-level language&#xff09;第一代编程语言即机器语言&#xff0c;由0和1构成&#xff0c;通过面板、打孔带或者打孔卡输入。第二代编程…

金融统计分析python论文_比较好写的本科金融专业论文题目 本科金融专业论文题目怎么取...

为论文写作提供【100道】比较好写的本科金融专业论文题目,海量本科金融专业相关论文题目,包括专科与本科以及硕士论文题目,解决您的本科金融专业论文题目怎么取的相关难题&#xff01;一、比较好写的本科金融专业论文题目:1、微观金融视角下财务管理专业应用型本科人才培养目标…

互联网java常用框架_来,带你鸟瞰 Java 中4款常用的并发框架!

1. 为什么要写这篇文章几年前 NoSQL 开始流行的时候&#xff0c;像其他团队一样&#xff0c;我们的团队也热衷于令人兴奋的新东西&#xff0c;并且计划替换一个应用程序的数据库。 但是&#xff0c;当深入实现细节时&#xff0c;我们想起了一位智者曾经说过的话&#xff1a;“细…

2020亚太杯数学建模_比赛 | 2020年APMCM亚太地区大学生数学建模竞赛

2020年11月26日到30日&#xff0c;在我院老师指导下&#xff0c;由统计分析竞赛社组织的41支队伍&#xff0c;共123人&#xff0c;参加了亚太地区大学生数学建模竞赛组委会主办的大学生学科类竞赛。此次竞赛题目分为A题和B题&#xff0c;参赛者需从A&#xff0c;B两题中任选其一…

java声明复数类_JAVA声明复数类

声明复数类&#xff0c;成员变量包括实部和虚部&#xff0c;成员方法包括实现由字符串构造复数、复数加法、减法&#xff0c;字符串描述、比较相等等操作。虽然我只是一个刚学一个月JAVA的菜鸡&#xff0c;但是强迫症让我把复数乘法和除法一起写出来了。public class Complex {…

python接口测试非json的断言_荐在接口自动化测试中,如何利用Pytest + JSONPath 进行接口响应断言...

之前有一篇文章&#xff0c;介绍了如何使用JSONSchema对接口响应进行断言&#xff0c;主要的适用场景是对响应的数据结构进行校验&#xff0c;保证客户端收到的数据结构稳定和合法。今天&#xff0c;介绍使用JSONPath对接口响应的值进行断言方法。上一篇文章《在接口自动化测试…

python3中异常处理_python中的五种异常处理机制介绍|python3教程|python入门|python教程...

https://www.xin3721.com/eschool/python.html从几年前开始学习编程直到现在&#xff0c;一直对程序中的异常处理怀有恐惧和排斥心理。之所以这样&#xff0c;是因为不了解。这次攻python&#xff0c;首先把自己最畏惧和最不熟悉的几块内容列出来&#xff0c;里面就有「异常处理…

java static 单例模式_Java 单例模式全面学习

介绍什么是单例模式&#xff1a;保证一个类仅有一个实例&#xff0c;并提供一个访问它的全局访问点解决什么问题&#xff1a;省略创建对象所花费的时间&#xff0c;不需要频繁创建对象&#xff0c;减轻 GC 压力。单例模式有以下几种实现方式&#xff1a;懒汉式第一次使用的时候…

sql 没有调试 菜单_MySQL递归查询上下级菜单

正文在传统的后台管理系统里面经常会需要展示多级菜单关系&#xff0c;今天我们来学一下如何使用一条SQL语句展示多级菜单。现在我们有一张corpinfo单位表&#xff0c;里面有一个belong字段指向上级单位&#xff0c;首先来看一下现在表里有什么数据&#xff1a;SELECT uid,ubel…

java 桥 word_java导出word的6种方式(转发)

最近做的项目&#xff0c;需要将一些信息导出到word中。在网上找了好多解决方案&#xff0c;现在将这几天的总结分享一下。目前来看&#xff0c;java导出word大致有6种解决方案&#xff1a;1&#xff1a;Jacob是Java-COM Bridge的缩写&#xff0c;它在Java与微软的COM组件之间构…

python删除指定天数前的文件_python 删除指定时间间隔之前的文件实例

遍历指定文件夹下的文件&#xff0c;根据文件后缀名&#xff0c;获取指定类型的文件列表&#xff1b;根据文件列表里的文件路径&#xff0c;逐个获取文件属性里的“修改时间”&#xff0c;如果“修改时间”与“系统当前时间”差值大于某个值&#xff0c;则删除该文件。#!/usr/b…

jieba 词典 词频_在Hanlp词典和jieba词典中手动添加未登录词

在使用Hanlp词典或者jieba词典进行分词的时候&#xff0c;会出现分词不准的情况&#xff0c;原因是内置词典中并没有收录当前这个词&#xff0c;也就是我们所说的未登录词&#xff0c;只要把这个词加入到内置词典中就可以解决类似问题&#xff0c;如何操作呢&#xff0c;下面我…

android访问java服务器_Android_post访问java服务器端

//javaee工程访问地址String url "http://localhost:8080/TestAndroid";//把要请求的值封装到namevalupair的集合中NameValuePair nameValuePair1 new BasicNameValuePair("name","zhangsna");NameValuePair nameValuePair2 new BasicNameVal…

pythonweb啥意思_python-web-guide

Python Web 入坑指南____ _ _ __ __ _ ____ _ _| _ \ _ _| |_| |__ ___ _ __ \ \ / /__| |__ / ___|_ _(_) __| | ___| |_) | | | | __| _ \ / _ \| _ \ \ \ /\ / / _ \ _ \ | | _| | | | |/ _ |/ _ \| __/| |_| | |_| | | | (_) | | | | \ V V / __/ |_) | | |_| | |_| | | (_…

java范例_Java范例集锦(一)

范例1&#xff1a;不用其他变量实现两个变量通常在对变量互换时&#xff0c;将创建一个临时变量来共同完成互换&#xff0c;临时变量的互换增加了系统资源的消耗。如果需要交换的是两个整数类型的变量&#xff0c;则可以使用异或运算符(^)进行更高效的处理。实现代码如下&#…

python查找输出文字_Python基础练习,查询文本内容并输出;

1、编写可供用户查询的员工信息表&#xff1a;1).用户认证(输入用户名&#xff0c;密码)2).查询关键字&#xff1a;姓名3).显示ID&#xff0c;name&#xff0c;section&#xff0c;phone4).员工信息表内容如下&#xff1a;cat search_name.txt001wenlong IT12345678002xiaojun …

python列表索引超出范围 等于啥_python - IndexError:列表分配索引超出范围,Python

我正在尝试实现功能。它的工作方式应该是这样的&#xff1a;它需要两个列表。标记一些索引&#xff0c;最好居中。父母双方都切换标记索引。其他索引按顺序转到其父元素。如果该父元素中已经存在相同的元素&#xff0c;则它将映射并检查同一元素在其他父元素的位置并到达那里。…