使 用 l a b e l m e 进 行 检 测 、 分 割 数 据 集 制 作 使用labelme进行检测、分割数据集制作 使用labelme进行检测、分割数据集制作
教学视频:https://www.bilibili.com/video/BV1na4y1W7i3?from=search&seid=6829801342228999041
使用labelme进行检测、分割数据集的制作
实例-水稻分割数据集制作
- 一 安装
pip install labelme
- 二 打开
在cmd命令行窗口输入命令
labelme
- 三 安装成功
- 四 原数据集制作
原数据集是我网上自己随便收集的
有6个类别:香蕉(banana)、猫(cat)、狗(dog)、海豚(dolphin)、人(person)、猪(pig)
每个类别8张图片,且大小不一致
图片格式:png
1.已收集数据集(10个类别的图片)
2.dog
3.重新统一图片的size为512*512
读取dataset下所有png图片路径,并返回list
import cv2
import os
def get_file_path_by_name(file_dir):
'''
获取指定路径下所有文件的绝对路径
:param file_dir:
:return:
'''
L = []
for root, dirs, files in os.walk(file_dir): # 获取所有文件
for file in files: # 遍历所有文件名
if os.path.splitext(file)[1] == '.png': # 指定尾缀 ***重要***
L.append(os.path.join(root, file)) # 拼接处绝对路径并放入列表
print('总文件数目:', len(L))
return L
list_dir = get_file_path_by_name(r'C:\Users\29939\Desktop\dataset')
list_dir
主函数:读取–>Resize—>保存
# 1. 遍历所有png文件路径
for item in list_dir:
# 2. 读取图片
img_raw = cv2.imread(item)
# 3. reszize (512,512)
img_resize = cv2.resize(img_raw,(512,512),interpolation=cv2.INTER_AREA)
print(img_resize.shape) # 打印resize大小
# 4. 获取图片名字,用于另存
photo_name = os.path.split(item)[1]
# 5. 获取图片的类别名词,下面代码用的 “\\”是windows系统下的路径分割符,在linux下不同
class_name = item.split('\\')[-2]
saved_file_dir = os.path.join('..','dataset_samesize',class_name)
saved_file_path = os.path.join('..','dataset_samesize',class_name,photo_name)
# 6.创建文件夹,否则cv2.imwrite找不到文件路径,无法保存
if not os.path.exists(saved_file_dir):
os.makedirs(saved_file_dir)
print("目录:"+saved_file_dir+"创建成功!")
print(saved_file_path)
# 7.保存
cv2.imwrite(saved_file_path, img_resize)
结果
- 五 检测数据集制作
在图像上右击,选择create rectangle
补充:
点击Edit Polygans,可以再次修改已经成形的label框
- 六 分割数据集制作
在图像上右击,选择create Polygans
补充:
点击Edit Polygans,可以再次修改已经成形的label框
- 七 生成
python json_to_dataset.py D:/dataset/img1.json -o D:/dataset/output
labelme_json_to_dataset.exe D:/dataset/img1.json -o D:/dataset/output
- 八 批量生成
一 改py文件
文件路径:E:\Software\Anaconda3\Lib\site-packages\labelme\cli 下面 的json_to_dataset.py文件
import argparse
import base64
import json
import os
import os.path as osp
import imgviz
import PIL.Image
from labelme.logger import logger
from labelme import utils
def main():
logger.warning(
"This script is aimed to demonstrate how to convert the "
"JSON file to a single image dataset."
)
logger.warning(
"It won't handle multiple JSON files to generate a "
"real-use dataset."
)
parser = argparse.ArgumentParser()
parser.add_argument("json_file")
parser.add_argument("-o", "--out", default=None)
args = parser.parse_args()
json_file = args.json_file
file_name = json_file.split('.')[0]
if args.out is None:
out_dir = osp.basename(json_file).replace(".", "_")
out_dir = osp.join(osp.dirname(json_file), out_dir)
else:
out_dir = args.out
if not osp.exists(out_dir):
os.mkdir(out_dir)
data = json.load(open(json_file))
imageData = data.get("imageData")
if not imageData:
imagePath = os.path.join(os.path.dirname(json_file), data["imagePath"])
with open(imagePath, "rb") as f:
imageData = f.read()
imageData = base64.b64encode(imageData).decode("utf-8")
img = utils.img_b64_to_arr(imageData)
label_name_to_value = {"_background_": 0}
for shape in sorted(data["shapes"], key=lambda x: x["label"]):
label_name = shape["label"]
if label_name in label_name_to_value:
label_value = label_name_to_value[label_name]
else:
label_value = len(label_name_to_value)
label_name_to_value[label_name] = label_value
lbl, _ = utils.shapes_to_label(
img.shape, data["shapes"], label_name_to_value
)
label_names = [None] * (max(label_name_to_value.values()) + 1)
for name, value in label_name_to_value.items():
label_names[value] = name
lbl_viz = imgviz.label2rgb(
label=lbl, img=imgviz.asgray(img), label_names=label_names, loc="rb"
)
PIL.Image.fromarray(img).save(osp.join(out_dir, file_name+".png"))
utils.lblsave(osp.join(out_dir, file_name+"_label.png"), lbl)
PIL.Image.fromarray(lbl_viz).save(osp.join(out_dir, file_name+"_label_viz.png"))
with open(osp.join(out_dir, file_name+"_label_names.txt"), "w") as f:
for lbl_name in label_names:
f.write(lbl_name + "\n")
logger.info("Saved to: {}".format(out_dir))
if __name__ == "__main__":
main()
二 调用命令
批量生成label
-
1.确定批量生成json文件的文件夹路径
-
2.找出所有的json文件
-
3.调用命令将json文件转为分割数据集
-
1.确定批量生成json文件的文件夹路径
import os
path = r'C:/Users/Administrator/Desktop/dataset_samesize/dog' # path为json文件存放的路径
- 2.找出所有的json文件
def get_file_path_by_name(file_dir):
'''
获取指定路径下所有文件的绝对路径
:param file_dir:
:return:
'''
L = []
for root, dirs, files in os.walk(file_dir): # 获取所有文件
for file in files: # 遍历所有文件名
if os.path.splitext(file)[1] == '.json': # 指定尾缀 ***重要***
L.append(os.path.join(root, file)) # 拼接处绝对路径并放入列表
print('总文件数目:', len(L))
return L
list_dir = get_file_path_by_name(path)
list_dir
list_dir[0]
- 3.调用命令将json文件转为分割数据集
saving_dataset_dir = r'C://Users//Administrator//Desktop//dataset_samesize//dog//dataset//'
for target_json_path in list_dir:
os.system("labelme_json_to_dataset.exe %s" %target_json_path + ' -o %s' %saving_dataset_dir)
补充:安装可能所遇问题
一 AttributeError: module ‘enum’ has no attribute ‘IntFlag’
解决:卸载enum34,因为这个已经过期了,但是还没删
pip uninstall enum34
二 TypeError: rectangle() got an unexpected keyword argument 'width’问题
- 是Pillow的版本问题
解决:
pip install Pillow==5.3.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
视频:
https://www.bilibili.com/video/BV1na4y1W7i3?from=search&seid=6829801342228999041