LABLEME UPDATE DAMOD
Labelme的改進(jìn)——海量圖片的自動(dòng)標(biāo)注
????深度學(xué)習(xí)一般需要對大量的圖片進(jìn)行標(biāo)注,但是手動(dòng)標(biāo)注耗時(shí)耗力,所以模仿labelme軟件的功能,使用程序?qū)Υ笈康膱D片進(jìn)行自動(dòng)標(biāo)注,大大減少手動(dòng)操作。下面介紹如何實(shí)現(xiàn)對大批量的圖片進(jìn)行標(biāo)注。
自動(dòng)標(biāo)注的程序?qū)崿F(xiàn):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,根據(jù)自己的情況修改版本號(hào)
3) activate labelme
4) conda install pyyaml
5) pip install labelme
6) labelme
???安裝中可能會(huì)出現(xiàn)這樣的錯(cuò)誤:
?
from PyQt5 import QtCore?
ImportError: DLL load failed: 找不到指定的模塊。
?出現(xiàn)這樣錯(cuò)誤的原因是:
??????Anaconda 安裝的Python缺少了python3.dll,可以通過去python.org 下載所需版本的python安裝包并安裝,然后從安裝目錄中拷貝python3.dll文件,粘貼到Anaconda安裝目錄下,也就是python36.dll所在的目錄下,一般就是第一層目錄,具體要看自己的安裝情況。
詳細(xì)解決方案參照——https://blog.csdn.net/ltime/article/details/71403947
?
二:了解Labelme生成的json文件的內(nèi)部數(shù)據(jù),批量生成標(biāo)注圖像
{
? "imageData": "xxxxxx", # 原圖像數(shù)據(jù)通過b64編碼生成的字符串?dāng)?shù)據(jù),這里不重要,只需要知道是圖像數(shù)據(jù)的另一種存儲(chǔ)形式
? "shapes": [ # 所有對象的形狀,鼠標(biāo)點(diǎn)擊的輪廓坐標(biāo)點(diǎn),填充顏色等
? ? { # 第一個(gè)對象
? ? ? "points": [ # 邊緣是由點(diǎn)構(gòu)成,實(shí)際上就是物體的輪廓坐標(biāo)
? ? ? ? [
? ? ? ? ? 165.90909090909093, # 第一個(gè)點(diǎn) x 坐標(biāo)
? ? ? ? ? 36.909090909090935 ?# 第一個(gè)點(diǎn) y 坐標(biāo)
? ? ? ? ],
? ? ? ? ……
? ? ? ? [
? ? ? ? ? 240.90909090909093,
? ? ? ? ? 15.909090909090935
? ? ? ? ],
? ? ? ? [
? ? ? ? ? 216.90909090909093, # 最后一個(gè)點(diǎn)的x坐標(biāo)
? ? ? ? ? 31.909090909090935 # 最后一個(gè)點(diǎn)的y坐標(biāo)
? ? ? ? ]
? ? ? ],
? ? ? "fill_color": null, #填充顏色
? ? ? "label": "cat_1", ?# 第一個(gè)對象的標(biāo)簽
? ? ? "line_color": null
? ? },
? ? { ?# 第二個(gè)對象
? ? ? "points": [
? ? ? ? [
? ? ? ? ? 280.90909090909093,
? ? ? ? ? 31.909090909090935
? ? ? ? ],
? ? ? ? ……
? ? ? ? [
? ? ? ? ? 362.90909090909093,
? ? ? ? ? 20.909090909090935
? ? ? ? ],
? ? ? ? [
? ? ? ? ? 339.90909090909093,
? ? ? ? ? 32.909090909090935
? ? ? ? ]
? ? ? ],
? ? ? "fill_color": null,
? ? ? "label": "cat_2", # 第二個(gè)對象的標(biāo)簽
? ? ? "line_color": null
? ? }
? ],
? "fillColor": [
? ? 255,
? ? 0,
? ? 0,
? ? 128
? ],
? "imagePath": "/home/wu/1.jpg", # 原始圖片的路徑
? "lineColor": [
? ? 0,
? ? 255,
? ? 0,
? ? 128
? ]
}
?
詳細(xì)信息可以參考——https://blog.csdn.net/wc781708249/article/details/79595174
?
參考labelme軟件標(biāo)記后生成的json文件海量圖片的自動(dòng)標(biāo)注可以分為以下四個(gè)步驟:
【1】提取圖片中物體輪廓的坐標(biāo)
【2】將圖片編碼保存為json格式
【3】將【1】中的坐標(biāo)數(shù)據(jù)與【2】的編碼后的圖片數(shù)據(jù)“融合”
【4】自動(dòng)解析生成的json文件,并將16位的label.png轉(zhuǎn)為8位的圖片格式
?
三:提取物體輪廓坐標(biāo)
?????圖片中物體輪廓的提取需要將原圖現(xiàn)轉(zhuǎn)化為二值圖,然后找到各個(gè)連通域的坐標(biāo),將所有圖片中不同的連通域?qū)?yīng)的坐標(biāo)保存為mat文件。示意圖如下:
?????輪廓坐標(biāo)提取程序使用MATLAB編寫,為了方便大家閱讀,已經(jīng)精簡了程序并加了注釋:(不明白輪廓提取得到的數(shù)據(jù)可以參考補(bǔ)充提供的示例數(shù)據(jù),Z.mat數(shù)據(jù)中只有Z.btnimage類下是需要的數(shù)據(jù),就是簡單的背景減除或者二值化處理)
%%MATLAB版本%%
load('D:\Zerbrafish Tracking\107-LXP7-6\107-LXP7-6_Z.mat');%加載指定的數(shù)據(jù),因?yàn)槲野讯祷蟮膱D像都保存在了mat中
for i = 1:size(Z,2)
? ? Process_data= size(Z(i).imageCroped,2);
? ? if Process_data == 6 ?%當(dāng)魚的數(shù)量等于6時(shí),繼續(xù)執(zhí)行
? ? ? ? I = Z(i).btnimage{1,1};%讀入圖像 ?這一步是關(guān)鍵,可以在此程序基礎(chǔ)上修改,加載轉(zhuǎn)換成二值化的圖片
? ? ? ? BW = im2bw(I, graythresh(I));%轉(zhuǎn)換成2進(jìn)制圖像
? ? ? ? [B,L] = bwboundaries(BW,'noholes');%尋找邊緣,不包括孔
? ? ? ? mid_arug = cell(length(B),2);
? ? ?for k = 1:length(B)
? ? ? ? ?boundary = B{k}; %boundary表示所有的輪廓坐標(biāo),為了節(jié)省內(nèi)存,我們?nèi)∑?/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文件相同的必須工作。同時(shí)為了批量能夠?qū)D像進(jìn)行處理,編寫了一個(gè)轉(zhuǎn)換程序。批量轉(zhuǎn)換程序命名為:img2json.py。如果需要請點(diǎn)擊傳送門。(程序中已加入了詳細(xì)的中文注釋。)
?????以上面的圖片為例轉(zhuǎn)換成json文件后,其部分內(nèi)容如下:(真正的圖片數(shù)據(jù)很大,為方便演示,只展示部分)
五:坐標(biāo)數(shù)據(jù)與圖像數(shù)據(jù)的融合
?????坐標(biāo)數(shù)據(jù)與圖像數(shù)據(jù)的融合,生成可供Labelme解析的json文件。融合程序命名為imitate_json.py。如果需要請點(diǎn)擊傳送門。(程序中已加入了詳細(xì)的中文注釋。)自動(dòng)生成的json文件其實(shí)在內(nèi)容上和“二”中介紹的json內(nèi)部數(shù)據(jù)相同。
六:json文件的批量解析
?????如果一個(gè)一個(gè)的對“五”中生成的json文件解析,需要首先進(jìn)入Labelme的安裝路徑,找到Scripts文件夾,進(jìn)入后運(yùn)行:
python labelme_json_to_dataset [文件名] #比如 python labelme_json_to_dataset D:\Practice\fusion_json\1.josn
?????但這樣每次只能解析一個(gè)文件,為了能夠批量解析,我寫了一個(gè)批量解析的程序,命名為release_json.py。如有需要請點(diǎn)擊傳送門。(程序中已加入了詳細(xì)的中文注釋。)解析后會(huì)在當(dāng)前json文件路徑下生成一個(gè)對應(yīng)的json文件夾。如下圖:
以“1_json”文件為例,其中包含了五個(gè)文件。如下圖:
?????其中的label.png是uint16格式存儲(chǔ)的圖像,需要將其轉(zhuǎn)成uint8格式存儲(chǔ)的才能讓opencv讀取。16位的label.png批量轉(zhuǎn)換成8位的程序命名為uint16_to_uint8.py。程序如下:(非常精簡)
#!/usr/bin/env python
# _*_ coding: UTF-8 _*_
# author:"Zhang Shuyu"
"""使用skimage模塊讀取圖片,不改變圖片數(shù)據(jù)類型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模塊讀取圖片不會(huì)改變圖片的數(shù)據(jù)格式
? ? ? ? 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轉(zhuǎn)成8位后看起來還是一片黑色,當(dāng)其實(shí)已經(jīng)對目標(biāo)價(jià)上了標(biāo)簽。以上圖中的label.png為例,轉(zhuǎn)換為8位后再對齊進(jìn)行圖像增強(qiáng),效果如下:
?
?
????其實(shí)就是對uint8類型格式的圖片數(shù)據(jù)讀取后乘以40。(uint8的取值范圍是0~255,在MATLAB顯示label.png圖片雖然看起來一片黑,但目標(biāo)位置其實(shí)都加上了標(biāo)簽1,2,3,4,5,6,以上圖為例,乘以40后,目標(biāo)位置的像素相當(dāng)于變成了40,80,120,160,200,240,所以顯示出的圖像就是目標(biāo)顏色的深淺各不相同)
補(bǔ)充:
鑒于很多人詢問關(guān)于輪廓提取的數(shù)據(jù)問題,即加載的數(shù)據(jù)Z.mat是什么??我將自己的一個(gè)示例數(shù)據(jù)的鏈接提供給大家(Z.mat數(shù)據(jù)中只有Z.btnimage類下的數(shù)據(jù)是需要的數(shù)據(jù))
https://pan.baidu.com/s/16-PH3zpS4yM_UA5t6iTFrw
?????這樣就能快速制作出大量的訓(xùn)練數(shù)據(jù)集,對于幾千張圖片的標(biāo)注大概只需要幾分鐘就能完成,如果手動(dòng)標(biāo)注的話一個(gè)人至少需要兩天。程序內(nèi)容均為原創(chuàng),使用請用麻煩點(diǎn)贊呀
————————————————
版權(quán)聲明:本文為CSDN博主「Kellybook」的原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_30622831/java/article/details/80100605
總結(jié)
以上是生活随笔為你收集整理的LABLEME UPDATE DAMOD的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Docker_制作docker镜像
- 下一篇: 基于UNet和camvid数据集的道路分