LABLEME UPDATE DAMOD
Labelme的改进——海量图片的自动标注
深度学习一般需要对大量的图片进行标注,但是手动标注耗时耗力,所以模仿labelme软件的功能,使用程序对大批量的图片进行自动标注,大大减少手动操作。下面介绍如何实现对大批量的图片进行标注。
自动标注的程序实现:https://github.com/shuyucool/Labelme.git
一:Labelme的安装参考——https://github.com/wkentaro/labelme.git
这里简要介绍windows下如何安装:
1) 打开Anaconda命令行工具
2) conda create --name=labelme python=3.5 #我使用的版本是Python3.5,根据自己的情况修改版本号
3) activate labelme
4) conda install pyyaml
5) pip install labelme
6) labelme
安装中可能会出现这样的错误:
from PyQt5 import QtCore
ImportError: DLL load failed: 找不到指定的模块。
出现这样错误的原因是:
Anaconda 安装的Python缺少了python3.dll,可以通过去python.org 下载所需版本的python安装包并安装,然后从安装目录中拷贝python3.dll文件,粘贴到Anaconda安装目录下,也就是python36.dll所在的目录下,一般就是第一层目录,具体要看自己的安装情况。
详细解决方案参照——https://blog.csdn.net/ltime/article/details/71403947
二:了解Labelme生成的json文件的内部数据,批量生成标注图像
{
"imageData": "xxxxxx", # 原图像数据通过b64编码生成的字符串数据,这里不重要,只需要知道是图像数据的另一种存储形式
"shapes": [ # 所有对象的形状,鼠标点击的轮廓坐标点,填充颜色等
{ # 第一个对象
"points": [ # 边缘是由点构成,实际上就是物体的轮廓坐标
[
165.90909090909093, # 第一个点 x 坐标
36.909090909090935 # 第一个点 y 坐标
],
……
[
240.90909090909093,
15.909090909090935
],
[
216.90909090909093, # 最后一个点的x坐标
31.909090909090935 # 最后一个点的y坐标
]
],
"fill_color": null, #填充颜色
"label": "cat_1", # 第一个对象的标签
"line_color": null
},
{ # 第二个对象
"points": [
[
280.90909090909093,
31.909090909090935
],
……
[
362.90909090909093,
20.909090909090935
],
[
339.90909090909093,
32.909090909090935
]
],
"fill_color": null,
"label": "cat_2", # 第二个对象的标签
"line_color": null
}
],
"fillColor": [
255,
0,
0,
128
],
"imagePath": "/home/wu/1.jpg", # 原始图片的路径
"lineColor": [
0,
255,
0,
128
]
}
详细信息可以参考——https://blog.csdn.net/wc781708249/article/details/79595174
参考labelme软件标记后生成的json文件海量图片的自动标注可以分为以下四个步骤:
【1】提取图片中物体轮廓的坐标
【2】将图片编码保存为json格式
【3】将【1】中的坐标数据与【2】的编码后的图片数据“融合”
【4】自动解析生成的json文件,并将16位的label.png转为8位的图片格式
三:提取物体轮廓坐标
图片中物体轮廓的提取需要将原图现转化为二值图,然后找到各个连通域的坐标,将所有图片中不同的连通域对应的坐标保存为mat文件。示意图如下:
轮廓坐标提取程序使用MATLAB编写,为了方便大家阅读,已经精简了程序并加了注释:(不明白轮廓提取得到的数据可以参考补充提供的示例数据,Z.mat数据中只有Z.btnimage类下是需要的数据,就是简单的背景减除或者二值化处理)
%%MATLAB版本%%
load('D:\Zerbrafish Tracking\107-LXP7-6\107-LXP7-6_Z.mat');%加载指定的数据,因为我把二值化后的图像都保存在了mat中
for i = 1:size(Z,2)
Process_data= size(Z(i).imageCroped,2);
if Process_data == 6 %当鱼的数量等于6时,继续执行
I = Z(i).btnimage{1,1};%读入图像 这一步是关键,可以在此程序基础上修改,加载转换成二值化的图片
BW = im2bw(I, graythresh(I));%转换成2进制图像
[B,L] = bwboundaries(BW,'noholes');%寻找边缘,不包括孔
mid_arug = cell(length(B),2);
for k = 1:length(B)
boundary = B{k}; %boundary表示所有的轮廓坐标,为了节省内存,我们取其1/4
x_coordinate = boundary(1:4:end,2);
y_coordinate = boundary(1:4:end,1);
mid_arug{k,1} = {boundary(1:4:end,2)};
mid_arug{k,2} = {boundary(1:4:end,1)};
end
assignin('base',['img_',num2str(i)],mid_arug);
end
end
四:将图片编码后保存为json文件
这是为了最后生成的json文件和Labelme软件生成的json文件相同的必须工作。同时为了批量能够对图像进行处理,编写了一个转换程序。批量转换程序命名为:img2json.py。如果需要请点击传送门。(程序中已加入了详细的中文注释。)
以上面的图片为例转换成json文件后,其部分内容如下:(真正的图片数据很大,为方便演示,只展示部分)
五:坐标数据与图像数据的融合
坐标数据与图像数据的融合,生成可供Labelme解析的json文件。融合程序命名为imitate_json.py。如果需要请点击传送门。(程序中已加入了详细的中文注释。)自动生成的json文件其实在内容上和“二”中介绍的json内部数据相同。
六:json文件的批量解析
如果一个一个的对“五”中生成的json文件解析,需要首先进入Labelme的安装路径,找到Scripts文件夹,进入后运行:
python labelme_json_to_dataset [文件名] #比如 python labelme_json_to_dataset D:\Practice\fusion_json\1.josn
但这样每次只能解析一个文件,为了能够批量解析,我写了一个批量解析的程序,命名为release_json.py。如有需要请点击传送门。(程序中已加入了详细的中文注释。)解析后会在当前json文件路径下生成一个对应的json文件夹。如下图:
以“1_json”文件为例,其中包含了五个文件。如下图:
其中的label.png是uint16格式存储的图像,需要将其转成uint8格式存储的才能让opencv读取。16位的label.png批量转换成8位的程序命名为uint16_to_uint8.py。程序如下:(非常精简)
#!/usr/bin/env python
# _*_ coding: UTF-8 _*_
# author:"Zhang Shuyu"
"""使用skimage模块读取图片,不改变图片数据类型uint16,保存为uint8类型"""
import os
import cv2
import natsort
import numpy as np
from skimage import io
from matplotlib import pylab as plt
input_file = "D:\\Practice\\fusion_json\\" #文件路径
img_type = ".png"
for root, dirs, files in os.walk(input_file,topdown=True):
for name in natsort.natsorted(dirs): #natsort,自然排序
file_name = os.path.join(input_file + name,"label_1" + img_type)
img = io.imread(file_name) #Todo:使用skimage模块读取图片不会改变图片的数据格式
print(img.dtype)
img = img.astype(np.uint8)
print(img.dtype)
cv2.imwrite(os.path.join(input_file + name,"label_1" + img_type),img)
其中的label.png转成8位后看起来还是一片黑色,当其实已经对目标价上了标签。以上图中的label.png为例,转换为8位后再对齐进行图像增强,效果如下:
其实就是对uint8类型格式的图片数据读取后乘以40。(uint8的取值范围是0~255,在MATLAB显示label.png图片虽然看起来一片黑,但目标位置其实都加上了标签1,2,3,4,5,6,以上图为例,乘以40后,目标位置的像素相当于变成了40,80,120,160,200,240,所以显示出的图像就是目标颜色的深浅各不相同)
补充:
鉴于很多人询问关于轮廓提取的数据问题,即加载的数据Z.mat是什么??我将自己的一个示例数据的链接提供给大家(Z.mat数据中只有Z.btnimage类下的数据是需要的数据)
https://pan.baidu.com/s/16-PH3zpS4yM_UA5t6iTFrw
这样就能快速制作出大量的训练数据集,对于几千张图片的标注大概只需要几分钟就能完成,如果手动标注的话一个人至少需要两天。程序内容均为原创,使用请用麻烦点赞呀
————————————————
版权声明:本文为CSDN博主「Kellybook」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_30622831/java/article/details/80100605
LABLEME UPDATE DAMOD相关推荐
- 使用JPA进行Update操作 @Query注解的用法,JPL
使用jpa进行update操作有两种,第一种就是先查询,set,再进行save更新.这种做法过于繁杂,我只是要进行一个更新操作却变成了三步,所以我推荐使用第二种: @Modifying @Query( ...
- 使用JPA进行update操作时,报org.springframework.beans.factory.BeanCreationException: Error creating bean with
使用JPA进行update操作时,报org.springframework.beans.factory.BeanCreationException: Error creating bean with ...
- SVN用法大全,SVN除了update、commit还有什么
svn除了大家都知道的update.commit以外还有什么常用功能呢? 点击TortoiseSVN后,出现了右图的列表,这其中有哪些是常用的功能呢?最近在家办公,有些东西要svn操作,就了解了下. ...
- MySql数据库Update批量更新与批量更新多条记录的不同值实现方法
批量更新 mysql更新语句很简单,更新一条数据的某个字段,一般这样写: UPDATE mytable SET myfield = 'value' WHERE other_field = 'other ...
- Microsoft Store无法下载应用 Windows update服务无法启用,错误5:拒绝访问 的解决方法。
Microsoft Store无法下载应用,点了安装没反应,查看服务里windows update开启了没有.只有这项服务开启才能在微软商店里安装应用. (ps:安装xbox需要把设置里地区改为香港特 ...
- ElasticSearch(六) Update API
一.修改部分字段By UpdateRequest UpdateRequest updateRequest = new UpdateRequest(); updateRequest.index(&qu ...
- Ubuntu apt-get install、apt-get -f install、apt-get --purge remove、apt-get update、apt-get upgrade、
1. 常用命令列表 命令 描述 apt-cache search package 搜索软件包 apt-cache show package 获取包的相关信息,如说明.大小.版本等 sudo apt-g ...
- update 改写 merge into
update语句改写成merge into有时会提高运行速度 看两个案例 1.根据业务将两个嵌套子查询改写成max,速度有3min提升到3s UPDATE OPER_792.LL_SCB_YDKB_2 ...
- Oracle 触发器 Update 不能操作本表的疑问
今天要解决一个需求,类似表A有个字段叫flag存储的是0 or 1 ,当一行记录更改为1的时候,其他行同字段要变为0. 这样的需求第一个思路想尝试下能否用触发器来实现 create or repla ...
最新文章
- Excel常用公式记录
- SAP有用的NOTE(持续更新)
- micropython中文社区 socket通讯_python网络编程学习笔记(3):socket网络服务器
- 数据结构-二叉排序树
- 如何不让FCKEditor自动添加P标签
- guava读取配置文件_使用Guava MapSplitters配置Hadoop
- JAVA入门级教学之(package和import)
- stol函数在linux下使用,Linux下ATT汇编语法简介一
- PyTorch Mobile已支持Android!
- 【原创】设计模式面对面之观察者模式
- ArrayList(1.8)
- C# json解析字符串总是多出双引号_SSM框架中JSON数据交互实现页面显示图书种类...
- 滚动电梯卡延期复制教学
- BeanUtils工具类常用方法
- 数据持久层框架Mybatis
- win10鼠标主题linux,win10系统安装鼠标指针主题包的操作方法
- Python输入一个三位数,输出其个位数字、十位数字和百位数字。
- 解决iconfont 图标不显示问题
- Win10提示未插入扬声器或耳机
- IT运维的365天--009微信双开批处理文件运行出错(当前目录无效)的解决