生成labelme能查看的json格式文件

2021-02-25 小白CV

labelme是數據標註中最常用到的標註工具。可以標註矩形框、圓形、線條、不規則圖形等等。所以這種多功能的標註工具,也應用廣泛。


但是,有時候我們也會從別處獲取一些已經標註好的數據,或只是坐標點。那如何用labelme查看呢?今天這篇文章就介紹,如何生成能labelme直接打開的json文件。

本文閱讀大約需要2min,但建議收藏,動手實踐之。

1.保存四邊形矩形框bbox標註信息

任意四邊形坐標標記格式:tl_x,tl_y,tr_x,tr_y,br_x,br_y,bl_x,bl_y。從左上點開始順時針旋轉的四個頂點的坐標,如下圖所示:

將TXT文檔中標註信息,存儲到labelme標註的json文件內,代碼如下:

import json
import base64
from PIL import Image
import io
import os
import cv2
import numpy as np


def generate_json(file_dir, file_name):
    str_json = {}
    shapes = []
    # 讀取坐標
    fr = open(os.path.join(file_dir, file_name))
    for line in fr.readlines():  # 逐行讀取,濾除空格等
        print(line.strip())
        print(type(line.strip()))
        lineArr = line.strip().split(',')
        print("lineArr:", lineArr)
        points = []
        points.append([float(lineArr[0]), float(lineArr[1])])
        points.append([float(lineArr[2]), float(lineArr[3])])
        points.append([float(lineArr[4]), float(lineArr[5])])
        points.append([float(lineArr[6]), float(lineArr[7])])
        print(points)  # 從左上點開始順時針旋轉的四個頂點的坐標
        shape = {}
        shape["label"] = "plate_1"
        shape["points"] = points
        shape["line_color"] = []
        shape["fill_color"] = []
        shape["flags"] = {}
        shapes.append(shape)
    str_json["version"] = "3.14.1"
    str_json["flags"] = {}
    str_json["shapes"] = shapes
    str_json["lineColor"] = [0, 255, 0, 128]
    str_json["fillColor"] = [255, 0, 0, 128]
    picture_basename = file_name.replace('.txt', '.png')
    str_json["imagePath"] = picture_basename
    img = cv2.imread(os.path.join(file_dir, picture_basename))
    str_json["imageHeight"] = img.shape[0]
    str_json["imageWidth"] = img.shape[1]
    str_json["imageData"] = base64encode_img(os.path.join(file_dir, picture_basename))
    return str_json


def base64encode_img(image_path):
    src_image = Image.open(image_path)
    output_buffer = io.BytesIO()
    src_image.save(output_buffer, format='JPEG')
    byte_data = output_buffer.getvalue()
    base64_str = base64.b64encode(byte_data).decode('utf-8')
    return base64_str

if __name__=="__main__":
    """
    txt文件和圖像(png)文件,均存儲在下面這個文件夾下
    生成的json文件,也保存到這個文件夾下
    """
    file_dir = r"E:\temp"
    file_name_list = [file_name for file_name in os.listdir(file_dir) \
                      if file_name.lower().endswith('txt')]

    for file_name in file_name_list:
        str_json = generate_json(file_dir, file_name)
        json_data = json.dumps(str_json, indent=2, ensure_ascii=False)
        jsonfile_name = file_name.replace(".txt", ".json")
        f = open(os.path.join(file_dir, jsonfile_name), 'w')
        f.write(json_data)
        f.close()

檢驗下生成的json,是否成功。用labelme打開,查看標註結果,進行檢驗:

2.保存不規則邊框polygon標註信息

這裡與bbox的區別就在於:

所以,在poly中坐標點的數量是不固定的。在讀取時候,依次將坐標點存儲進來就行

import json
import base64
from PIL import Image
import io
import os
import cv2
import numpy as np


def generate_json(file_dir, file_name):
    str_json = {}
    shapes = []
    # 讀取坐標
    fr = open(os.path.join(file_dir, file_name))
    for line in fr.readlines():  # 逐行讀取,濾除空格等
        print(line.strip())
        print(type(line.strip()))
        lineArr = line.strip().split(',')
        print("lineArr:", lineArr)
        points = []
        for i in range(0, len(lineArr), 2):
            points.append([float(lineArr[i]), float(lineArr[i+1])])
        print(points)  # 從左上點開始順時針旋轉的四個頂點的坐標
        shape = {}
        shape["label"] = "plate_1"
        shape["points"] = points
        shape["line_color"] = []
        shape["fill_color"] = []
        shape["flags"] = {}
        shapes.append(shape)
    str_json["version"] = "3.14.1"
    str_json["flags"] = {}
    str_json["shapes"] = shapes
    str_json["lineColor"] = [0, 255, 0, 128]
    str_json["fillColor"] = [255, 0, 0, 128]
    picture_basename = file_name.replace('.txt', '.png')
    str_json["imagePath"] = picture_basename
    img = cv2.imread(os.path.join(file_dir, picture_basename))
    str_json["imageHeight"] = img.shape[0]
    str_json["imageWidth"] = img.shape[1]
    str_json["imageData"] = base64encode_img(os.path.join(file_dir, picture_basename))
    return str_json


def base64encode_img(image_path):
    src_image = Image.open(image_path)
    output_buffer = io.BytesIO()
    src_image.save(output_buffer, format='JPEG')
    byte_data = output_buffer.getvalue()
    base64_str = base64.b64encode(byte_data).decode('utf-8')
    return base64_str

if __name__=="__main__":
    """
    txt文件和圖像(png)文件,均存儲在下面這個文件夾下
    生成的json文件,也保存到這個文件夾下
    """
    file_dir = r"E:\temp\polygon"
    file_name_list = [file_name for file_name in os.listdir(file_dir) \
                      if file_name.lower().endswith('txt')]

    for file_name in file_name_list:
        str_json = generate_json(file_dir, file_name)
        json_data = json.dumps(str_json, indent=2, ensure_ascii=False)
        jsonfile_name = file_name.replace(".txt", ".json")
        with open(os.path.join(file_dir, jsonfile_name), 'w') as f:
            f.write(json_data)

同樣,labelme打開,查看標註結果:

參考連結:https://blog.csdn.net/skye_95/article/details/103635846

課程推薦:NumPy 手碼一層神經網絡,訓練貓咪二分類

神經網絡越寫越深,參數容量越來越大。那只有一層的神經網絡,能不能訓練用於識別可愛的貓咪呢? 

這篇文章不再用 TensorFlow、PyTorch 等人工智慧的框架,採用最基礎的數學庫 NumPy,手把手帶你一步步吃透深度學習最基礎知識點: 

數據的讀取與分析

NumPy 定義一層網絡的權重 w 和偏置 b,並初始化網絡

定義損失函數、參數梯度優化

整體梳理數據的流向和計算

總結

學完本Chat,希望能幫助你對深層、複雜的神經網絡有更加深刻的理解。對網絡中的數據流向、參數優化有更加清晰的認識。


獲取連結方式:

1.點擊「閱讀原文」,直達獲取連結。

2.可在公眾號聊天框,回復關鍵字「gitchat」,獲取直達連結。

相關焦點

  • 如何在沒有網絡的情況下校驗json文件格式?
    一般情況下,當我們修改了json文件,最讓人頭疼的不是保證內容正確,而是保證json格式的正確,因為內容是顯而易見的,而格式文件體積一旦大起來就只能憑藉工具和一雙慧眼了
  • 【python】讀取json文件
    閱讀大概需要5分鐘跟隨小博主,每天進步一丟丟最近要打個比賽,在處理數據的時候,發現數據竟然是json文件的,
  • 程式設計師都應該了解的一種數據格式之 JSON
    以上數據形式圖片來源JSON官方文檔:http://www.json.org/json-zh.htmlJSON使用場景介紹完JSON的數據格式,那我們來看看JSON在企業中使用的比較多的場景。接口返回數據和序列化。
  • python讀寫json文件
    json是網際網路文本傳輸的標準格式之一,本質是字典和列表的組合, 內容示意如下{ "summary"
  • Python處理JSON文件從未如此簡單
    JSON格式是一種輕量級的數據交換格式簡單地說,JSON 可以將 javascript 對象中表示的一組數據轉換為字符串,然後就可以在函數之間輕鬆地傳遞這個字符串,這個數據格式容易在機器上解析和生成。JSON文件的格式比較簡單
  • 精品教程,用Pandas解析json格式的數據,建議收藏
    在實際工作中,尤其是網頁端數據的傳輸,我們經常會遇到json數據,看上去和Python當中的字典類型的數據很像,本文呢小編就通過pandas當中的內置方法json_normalize()來處理json格式的數據,最終生成DataFrame數據集方便我們進行後續的操作。
  • 如何使用Python 和 Pandas讀寫JSON文件
    在第一部分中,我們將使用Python包json來創建一個JSON文件並寫入一個JSON文件。在下一部分中,我們將使用Pandas的 json方法將JSON文件加載到Pandas 數據幀中。在這裡,我們將學習如何從本地和一個URL讀取JSON文件,以及如何使用Pandas讀取一個嵌套的JSON文件。
  • 千萬不要用JSON作配置文件
    JSON是一種「輕量級的數據交換格式」,它「易於人類讀寫」和「便於機器解析和生成」。作為一種數據交換格式,JSON相當不錯。人們可以輕易閱讀和編寫它,機器也很容易解析(儘管存在問題)。在機器可讀和人類可讀性之間取得很好的平衡,相對於XML有了巨大改進,我認為XML對機器或人類可讀性都很差。將它用於其它目的有點類似於說:「嘿,這個錘子釘釘子真好用!
  • Python零基礎編程——文件、JSON數據存儲
    、JSON、網絡、線程一 文件操作1-文件讀取#讀取文件,全部輸出(with的這種方式,會自動close()釋放資源)filePath = 'D:\DevPython\Works\PythonPrime\data.csv'with open(filePath) as f_csv: context = f_csv.read()
  • 如何利用Python處理JSON格式的數據,建議收藏!!!
    格式的模塊有json和pickle兩個json模塊和pickle都提供了四個方法:dumps, dump, loads, load序列化:將python的數據轉換為json格式的字符串反序列化:將json格式的字符串轉換成python的數據類型首先我們來看一下序列化是如何操作的,我們首先用json.dump()將字典寫入json格式的文件中能夠進行類似操作的則是dataframe
  • python對json的操作總結
    作者:loleina來源:http://www.cnblogs.com/loleina/p/5623968.htmlJson簡介:Json,全名 JavaScript Object Notation,是一種輕量級的數據交換格式。Json最廣泛的應用是作為AJAX中web伺服器和客戶端的通訊的數據格式。
  • 乾貨|如何利用Python處理JSON格式的數據,建議收藏!
    >序列化:將python的數據轉換為json格式的字符串反序列化:將json格式的字符串轉換成python的數據類型序列化首先我們來看一下序列化是如何操作的,我們首先用json.dump()將字典寫入json格式的文件中能夠進行類似操作的則是dataframe當中的to_json()方法,比方說而當你分別打開這兩個文件時,裡面的內容分別是以鍵值對呈現的json數據。
  • 如何在 Linux 終端上漂亮地列印 JSON 文件
    如何在 Linux 終端上漂亮地列印 JSON 文件 JSON 文件非常棒,因為它們以人類可讀的格式存儲數據集合。然而,如果 JSON 文件被最小化過,那麼閱讀 JSON 文件可能會很痛苦。
  • 如何在Python中優雅地處理JSON文件
    我們將討論如何最好地處理簡單的JSON文件以及嵌套的JSON文件,當然我們也將討論如何訪問Json文件數據中的特定位置的值。什麼是JSON文件JSON(Java Script Object Notation)是一種流行的文件格式,主要用於在web應用程式中存儲和傳輸數據。
  • PDF是什麼格式?怎麼才能生成PDF文件?
    現在我們日常工作接觸的文檔大部分都是PDF格式,那麼PDF到底是一種什麼格式呢?要怎麼樣才能做出一個PDF文件呢?PDF也是一種文檔格式,但相比較我們常用的office文檔,格式會更穩定,不會因為版本不兼容導致排版亂,而且不易被隨便修改,另外同一個文檔PDF會更小一些。那麼要怎樣才能做出一個PDF文件呢?PDF可以由3種方式生成,一種就是其他文檔格式轉換成;第二種PDF編輯器新建;第三種也可以通過掃描設備生成。
  • 數據類型和Json格式
    我馬上想到了json。21世紀初,Douglas Crockford尋找一種簡便的數據交換格式,能夠在伺服器之間交換數據。當時通用的數據交換語言是XML,但是Douglas Crockford覺得XML的生成和解析都太麻煩,所以他提出了一種簡化格式,也就是Json。
  • JSON從入門到精通
    一、基礎入門1、什麼是jsonJSON:一種與開發語言無關的、輕量級的數據存儲格式,全稱JavaScript Object Notation,一種數據格式的標準規範,起初來源於JavaScript這門語言,後來隨著使用的廣泛,幾乎每門開發語言都有處理
  • 用 Python 的 Template 類生成文件報告
    在本文中,您將學習如何利用此類根據當前使用的數據生成輸出文件,以及如何以相同的方式操作字符串。因此,本文不僅使用您在日常工作中可能遇到的示例,還為您提供了許多您可能知道的實際工具,並且該工具將此類用於生成報告文件。下面讓我們開始吧!注意:本文基於Python 3.9.0(CPython)。
  • 知乎強推的萬能文件查看神器,幾百種格式文件都能ok!
    鐵子們,我是剪視頻的,關於文件格式的問題,我說啥了嘛嗚嗚嗚嗚....要不是這次疫情,藥丸妹真的不知道原來辦公文件有這麼多格式!!光下載各種軟體就已經讓原本就有點反應遲鈍的小本本,徹底宣布罷工!- PS崩,PS崩,PS崩完CAD崩,CAD崩完3D崩 -直到同事推薦了這個——超實用萬能文件查看神器,據說還是個進口貨,國外很多高效人士都在使用。給藥丸妹嚇得顫顫抖抖就下載了...真香!小本本再也不慌了!
  • php解析json格式的文本
    昨天,在我校的高級培訓群裡,有同學諮詢了如何用php解析json格式的文本問題,老師發現這個問題比較典型,在此將相關的知識點總結分享給同學們,希望對其他同學掌握該知識點也能起到一些幫助。同學jsoly提問說,有這樣的一個數組$arr(如下圖所示)想轉換為php的數組,該如何處理。一眼望去就是個json格式的字符串,顯然php裡面不能這樣定義,這樣的定義會報語法錯誤,就像這樣:該同學認為用json格式存儲數據比較簡潔,問直接用json格式定義一個數組該怎麼做。