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

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

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

相关文章

Java基础教程:面向对象编程[2]

Java基础教程:面向对象编程[2] 内容大纲 访问修饰符 四种访问修饰符 Java中,可以使用访问控制符来保护对类、变量、方法和构造方法的访问。Java 支持 4 种不同的访问权限。 default (即缺省,什么也不写): 在同一包内可见&#xff…

【javascript】异步编年史,从“纯回调”到Promise

异步和分块——程序的分块执行 一开始学习javascript的时候, 我对异步的概念一脸懵逼, 因为当时百度了很多文章,但很多各种文章不负责任的把笼统的描述混杂在一起,让我对这个 JS中的重要概念难以理解, “异步是非阻塞的…

Shell编程之if语法练习(LNMP)全过程

大家好,我是延凯,本人原来在CSDN写作已经快一年了 都是相关Linux运维这方面的技术知识,现在搬到博客园也是我一直想的,本博客主要写Python,docker,shell等偏向开发云计算等知识点,谢谢各位&…

基于UNet和camvid数据集的道路分割

基于UNet和camvid数据集的道路分割h(1.3.0): 背景 语义分割是深度学习中的一个非常重要的研究方向,并且UNet是语义分割中一个非常经典的模型。在本次博客中,我尝试用UNet对camvid dataset数据集进行道路分割,大致期望的效果如下&…

二分法查找和普通查找

一、普通查找 对于数组和一个需要查找的元素来说,普通查找的原理很简单,即为从数组的第一个元素到最后一个元素进行遍历,如果第i个元素的值等于我们需要查找的值,那么返回找到的角标i,否则返回-1表示没有查找到。这里以…

Linux下安装zookeeper集群(奇数个)

1、 解压zookeeper压缩包 2、 data里创建“myid”文件(命令touch myid),内容是1(命令 echo 1 >> myid) 3、 zoo.cnf里配置dataDir、clientport、server.nIP:端口1(2881):端…

立体标定

立体标定应用标定数据转换成深度图标定 由于摄像头目前是我们手动进行定位的,我们现在还不知道两张图像与世界坐标之间的耦合关系,所以下一步要进行的是标定,用来确定分别获取两个摄像头的内部参数,并且根据两个摄像头在同一个世…

if _name_ == _main_

1.作用 py文件有2种使用方法,第1是自己本脚本自己独立执行;第2是被import到其他文件脚本中执行. if _name_ " _main_" 该语句控制其他下一步的脚本是否执行。如果是自己本脚本独立执行,那就运行该if条件下的脚本;如果…

LLVM完整参考安装

文章目录 一、直接下载编译好的,见图片命令二、下载源代码自己编译安装 下面提供下载并mv完全的文件包三、安装LLVM编译器一、直接下载编译好的,见图片命令 这里使用llvm官网编译好的包, 直接解压即可用LLVM下载官网点击这里下载llvm-6.0.1 下载完成后解压tar -vxf clangllv…

微软正式释出基于 Chromium 的 Edge 预览版本

百度智能云域名服务,.com新用户首购仅需25元 微软基于 Chromium 的全新版本 Edge 一直吸引着开发者与用户的目光,当地时间 8 日,官方终于释出了第一个 Dev 和 Canary 频道构建版本。 Dev 与 Canary build 都是开发者预览版,同属…

下载和安装R、RStudio !

现如今,R语言是统计领域广泛使用的工具,是属于GNU系统的一个自由、免费、源代码开放的软件,是用于统计计算和统计绘图的优秀工具。而RStudio是R的集成开发环境,用它进行R编程的学习和实践会更加轻松和方便。下面就教大家如何下载并…

豆瓣首页话题输入框的实现

在做问答的时候,遇到一个需求,用户的问题需要限制字数,不仅显示计算的超出字数,还需在超出的内容上加一些提醒的效果,例如豆瓣首页的话题输入框,抽时间研究了下,需要考虑下面几个问题&#xff1…

pytorch 吸烟检测yolov5s

YOLOV5s 吸烟目标检测 参考学习 文章目录 本原创项目长期更新,旨在完成校园异常行为实时精检测,作到集成N次开发优化(不止局限于调包)为止,近期将不断更新如下模型数据标注文件教程。关注博主,Star 一下g…

JQuery的ajax函数执行失败,alert函数弹框一闪而过

先查看<form>标签是否有action属性&#xff0c;如果没有&#xff0c;并且最后<button>标签的type属性为submit‘时&#xff0c;默认提交位置就是当前页面 如果在页面右键检查&#xff0c;点击网络&#xff0c;会在开头发现这样的post包&#xff1a; 在右侧消息头处…

C#中Request.ServerVariables详细说明及代理

Request.ServerVariables("Url") 返回服务器地址Request.ServerVariables("Path_Info") 客户端提供的路径信息Request.ServerVariables("Appl_Physical_Path") 与应用程序元数据库路径相应的物理路径Request.ServerVariables("Path_Transla…

coco与voc相互转化

把LabelImg标注的YOLO格式标签转化为VOC格式标签 和 把VOC格式标签转化为YOLO格式标签 点亮&#xff5e;黑夜 2020-07-07 11:08:24 3537 已收藏 90 分类专栏&#xff1a; 19—目标检测 文章标签&#xff1a; voc yolo 版权 把LabelImg标注的YOLO格式标签转化为VOC格式标签 和…

angular中封装fancyBox(图片预览)

首先在官网下载最新版的fancyBox(一定要去最新网站&#xff0c;以前依赖的jquery版本偏低)&#xff0c;附上链接&#xff1a;http://fancyapps.com/fancybox/3/ 然后在项目中引用jquery&#xff0c;然后在引用jquery.fancybox.min.css和jquery.fancybox.min.js。 如果需要动画和…

十二省联考题解 - JLOI2019 题解

十二省联考题解 - JLOI2019 题解 两个T3的难度较大 平均代码量远大于去年省选 套路题考查居多 A 难度等级 1 $n^2$暴力可以拿到$60$分的优秀成绩 然后可以想到把区间异或转化为前缀两点异或 可以想到使用二分答案的方法可持久化Trie解决&#xff0c;但是时间复杂度为$n\log^2 (…

前端vue的get和post请求

vue的get和post需要两个文件vue.js和vue-resource.js 以下是实现的代码&#xff0c;可以参考一下&#xff0c;需要注意的接口的请求需要考虑跨域的问题&#xff0c;其次就是访问页面需要在tomcat下访问&#xff0c;否则也会报跨域的问题 <!DOCTYPE html> <html lang&q…

[Vijos 1143]三取方格数

Description 设有N*N的方格图&#xff0c;我们将其中的某些方格填入正整数&#xff0c; 而其他的方格中放入0。 某人从图得左上角出发&#xff0c;可以向下走&#xff0c;也可以向右走&#xff0c;直到到达右下角。 在走过的路上&#xff0c;他取走了方格中的数。&#xff08;取…