最近在使用yolov7做实例分割的时候,想自己搞数据集时候使用的一些方法和代码,在此分享:
1.转换数据集mask图转换成json格式
我们有时候在网上下载一些实例分割数据集的时候,虽然他们是用labelme标注的,但是数据集中并没有对应的json格式的标注,而是将他们转换成了mask.png形式的图片掩码,查看的时候就跟全黑的图片一样,如下图:
虽然看起来是全黑的,但是其实这种成为二值图片,其中所对应的标注的目标区域是有值的,只不过都很小,有几类就有几个。下面提供一个仓库的代码可以将上面的那种二值图转换成json格式的标注:
https://github.com/guchengxi1994/mask2json
其中的readme文件可以找到代码实例:
我们直接将代码下载下来,用pycharm打开项目,将需要的包安装好后,在项目的根目录下创建.py文件mask2json.py,然后将上面的代码粘贴进去就能用了,但是这个代码的引用有一点问题,而且一次只能处理单张图片,所以我稍微加了一点东西可以处理两个文件夹:
from convertmask.utils.methods.get_multi_shapes import getMultiShapes
import cv2
import glob
import os
jpeg_folder_path = ''
png_folder_path = ''
savePath = ''
yamlPath = ''
# getMultiShapes.getMultiShapes(imgPath, maskPath, savePath, yamlPath) # with yaml
# getMultiShapes(imgPath, maskPath, savePath, yamlPath) # without yaml
jpeg_files = os.listdir(jpeg_folder_path)
# 使用os.listdir列出PNG文件夹中的所有文件
png_files = os.listdir(png_folder_path)
# 创建一个函数来处理两个文件的路径
def process_image_paths(jpeg_path, png_path):
getMultiShapes(jpeg_path, png_path, savePath, yamlPath)
i = 0
# 遍历JPEG文件列表,查找相同文件名的PNG图像
for jpeg_file in jpeg_files:
if jpeg_file.endswith(".jpg"):
jpeg_name, _ = os.path.splitext(jpeg_file) # 获取不带扩展名的文件名
for png_file in png_files:
if png_file == jpeg_name + ".png":
jpeg_path = os.path.join(jpeg_folder_path, jpeg_file)
png_path = os.path.join(png_folder_path, png_file)
# 调用处理函数并传递两个图像的路径
process_image_paths(jpeg_path, png_path)
i = i + 1
print(i)
将文件夹路径修改一下就行了,yamlpath是你的标签路径,里面存放的是图片中每个类别对应的标签背景为0,其他的顺序如果不确定的话可以先转换一张图片,然后用labelme打开来看一看,yamlpath文件内容如图:
2,json格式转yolo需要的txt格式
在搜索这个转换的时候我搜索yolov7,发现内容很少,然后又在v7的readme文件中看到,训练的命令跟yolov5是一样的,所以我找了一下yolov5的格式转换代码,参考这个博客就行了:
https://blog.csdn.net/jin__9981/article/details/128385498
第一次写博客,记录一下过程,后面需要用到好回过来翻^^