【目标检测】Labelme的改进——海量图片的自动标注「建议收藏」

【目标检测】Labelme的改进——海量图片的自动标注「建议收藏」  深度学习一般需要对大量的图片进行标注,但是手动标注耗时耗力,所以模仿labelme软件的功能,使用程序对大批量的图片进行自动标注,大大减少手动操作。下面介绍如何实现对大批量的图片进行标注。自动标注的程序实现:https://github.com/shuyucool/Labelme.git程序内容均为原创,如果使用麻烦您点赞呀如遇疑问,欢迎随时交流,定尽量解答。联系方式:7819…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

    深度学习一般需要对大量的图片进行标注,但是手动标注耗时耗力,所以模仿labelme软件的功能,使用程序对大批量的图片进行自动标注,大大减少手动操作。下面介绍如何实现对大批量的图片进行标注。

自动标注的程序实现:https://github.com/shuyucool/Labelme.git

程序内容均为原创,如果使用麻烦您点赞呀吐舌头

如遇疑问,欢迎随时交流,定尽量解答。联系方式:781990540

一: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文件。示意图如下:

【目标检测】Labelme的改进——海量图片的自动标注「建议收藏」【目标检测】Labelme的改进——海量图片的自动标注「建议收藏」

     轮廓坐标提取程序使用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的改进——海量图片的自动标注「建议收藏」

五:坐标数据与图像数据的融合

     坐标数据与图像数据的融合,生成可供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文件夹。如下图:

【目标检测】Labelme的改进——海量图片的自动标注「建议收藏」

以“1_json”文件为例,其中包含了五个文件。如下图:

【目标检测】Labelme的改进——海量图片的自动标注「建议收藏」

     其中的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位后再对齐进行图像增强,效果如下:

 

【目标检测】Labelme的改进——海量图片的自动标注「建议收藏」

 

    其实就是对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

     这样就能快速制作出大量的训练数据集,对于几千张图片的标注大概只需要几分钟就能完成,如果手动标注的话一个人至少需要两天。程序内容均为原创,使用请用麻烦点赞呀吐舌头

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/194973.html原文链接:https://javaforall.net

(0)
上一篇 2025年10月26日 下午1:15
下一篇 2025年10月26日 下午1:43


相关推荐

  • java 生成二维码

    java 生成二维码最近在做一个自提的需求 当用户下单后给该笔订单生成一个二维码 当用户去实体店自提的时候 实体店扫用户提供的二维码 这样该笔订单就算完成了 1 相关的依赖 dependency groupId com google zxing groupId artifactId javase artifactId version 3 3 0 amp l version dependency

    2026年3月17日
    2
  • uCOSII操作系统移植笔记

    uCOSII操作系统移植笔记笔记一:今天粗略的看了一下周立功关于uc/osII在lpc2104上的移植方面的说明,这之中印象最深的应该是irq中断和软中断方面的处理,由于arm芯片的特殊性(拥有7种处理器模式),即每种处理器模式都有自己的堆栈,这样在处理堆栈的时候就会相应的麻烦一些。在响应异常时,该移植计划在初始代码里面比在没有操作系统的初始代码多了irq的处理,移植里面的irq处理多了由汇编语言编写的对任务环境的保存,

    2022年6月3日
    35
  • android项目开发实战(android简单app实例代码)

    项目名:HoseWork完成时间:2018-10-01~2018-10-10性质:个人项目Demo地址:点击:https://github.com/FishInWater-1999/Android-app运行效果:产品介绍:学习星是一款面向广大学生、终生学习者打造的课程类app,集成了C,C++,Java,python,C#,JavaScript等十几种编程语言的学…

    2022年4月18日
    109
  • navicat 连接mysql报错10055问题

    navicat 连接mysql报错10055问题navicat 连接 mysql 报错 10055 问题解决 1 查看占用连接是否没有断开 2mysql 服务器是否有防火墙 3 修改注册表 3 1 使用 regedit 命令 访问 HKEY LOCAL MACHINE SYSTEM CurrentContr Services TCPIP Parameters 注册表子键 然后创建新的 REG DWORD 值 TcpTimedWait

    2026年3月18日
    2
  • CListCtrl实现tooltip信息提示

    CListCtrl实现tooltip信息提示当鼠标移动到CListCtrl的某一行时,提示一些信息。具体实现方法:1、头文件定义CToolTipCtrlm_tooltip;2、在OnInitDialog()中进行初始化EnableToolTips(TRUE);   m_tooltip.Create(this);   m_tooltip.SetMaxTipWidth(500);   m_tooltip.Act…

    2022年6月23日
    40
  • git 删除文件后如何恢复[通俗易懂]

    git 删除文件后如何恢复[通俗易懂]有时候不小心在git中rm了文件。怎么恢复呢?别急,咱们一步步来。首先gitstatus一把,看看此时工作区的状态[xxx@xxxstatic_files]$gitstatus#Onbranchmasternothingtocommit(workingdirectoryclean)可见此时没有任何修改的内容。再看看具体有什么xxx@xxxstatic_files]$

    2022年8月22日
    13

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号