Logo Zephyrnet

Làm chủ chú thích: Tích hợp Detectron liền mạch với LabelImg

Ngày:

Giới thiệu

Việc gắn nhãn cho hình ảnh hoặc chú thích cho bức ảnh trong bức tranh lớn về thị giác máy tính là một thách thức. Khám phá của chúng tôi đi sâu vào hoạt động làm việc nhóm của LabelImg và Detectron, một bộ đôi mạnh mẽ kết hợp chú thích chính xác với việc xây dựng mô hình hiệu quả. LabelImg, dễ sử dụng và chính xác, dẫn đến chú thích cẩn thận, đặt nền tảng vững chắc để phát hiện đối tượng rõ ràng.

Khi chúng tôi khám phá LabelImg và vẽ các hộp giới hạn tốt hơn, chúng tôi sẽ chuyển sang Detectron một cách liền mạch. Khung mạnh mẽ này sắp xếp dữ liệu đã đánh dấu của chúng tôi, giúp dữ liệu này hữu ích trong việc đào tạo các mô hình nâng cao. LabelImg và Detectron cùng nhau giúp mọi người dễ dàng phát hiện đối tượng, cho dù bạn là người mới bắt đầu hay chuyên gia. Hãy đến đây, nơi mỗi hình ảnh được đánh dấu giúp chúng ta khai phá toàn bộ sức mạnh của thông tin hình ảnh.

Tích hợp Detectron với LabelImg

Mục tiêu học tập

  • Bắt đầu với LabelImg.
  • Thiết lập môi trường và cài đặt LabelImg.
  • Hiểu LabelImg và chức năng của nó.
  • Chuyển đổi dữ liệu VOC hoặc Pascal sang định dạng COCO để phát hiện đối tượng.

Bài báo này đã được xuất bản như một phần của Blogathon Khoa học Dữ liệu.

Mục lục

Sơ đồ

Sơ đồ tích hợp Detectron liền mạch với LabelImg

Thiết lập môi trường của bạn

1. Tạo môi trường ảo:

conda create -p ./venv python=3.8 -y

Lệnh này tạo một môi trường ảo có tên là “venv” bằng Python phiên bản 3.8.

2. Kích hoạt môi trường ảo: 

conda activate venv

Kích hoạt môi trường ảo để cách ly cài đặt LabelImg.

Cài đặt và sử dụng LabelImg

1. Cài đặt LabelImg:

pip install labelImg

Cài đặt LabelImg trong môi trường ảo được kích hoạt.

2. Khởi chạy LabelImg:

labelImg
Khởi chạy LabelImg

Xử lý sự cố: Nếu bạn gặp lỗi khi chạy tập lệnh

Nếu bạn gặp lỗi khi chạy tập lệnh, tôi đã chuẩn bị một kho lưu trữ zip chứa môi trường ảo (venv) để thuận tiện cho bạn.

1. Tải xuống Lưu trữ Zip:

  • Tải xuống kho lưu trữ venv.zip từ liên kết

2. Tạo thư mục LabelImg:

  • Tạo một thư mục mới có tên LabelImg trên máy cục bộ của bạn.

3. Giải nén thư mục venv:

  • Trích xuất nội dung của kho lưu trữ venv.zip vào thư mục LabelImg.

4. Kích hoạt môi trường ảo:

  • Mở dấu nhắc lệnh hoặc thiết bị đầu cuối của bạn.
  • Điều hướng đến thư mục LabelImg.
  • Chạy lệnh sau để kích hoạt môi trường ảo:
conda activate ./venv

Quá trình này đảm bảo bạn có môi trường ảo được cấu hình sẵn sẵn sàng để sử dụng với LabelImg. Kho lưu trữ zip được cung cấp đóng gói các phần phụ thuộc cần thiết, cho phép trải nghiệm mượt mà hơn mà không phải lo lắng về khả năng cài đặt.

Bây giờ, hãy tiếp tục các bước trước đó để cài đặt và sử dụng LabelImg trong môi trường ảo được kích hoạt này.

Quy trình làm việc chú thích với LabelImg

1. Chú thích hình ảnh ở định dạng PascalVOC:

  • Xây dựng và khởi chạy LabelImg.
  • Nhấp vào 'Thay đổi thư mục chú thích đã lưu mặc định' trong Menu/Tệp.
Các bước thực hiện Quy trình chú thích với LabelImg
  • Nhấp vào 'Open Dir' để chọn thư mục hình ảnh.
Các bước thực hiện Quy trình chú thích với LabelImg
Các bước thực hiện Quy trình chú thích với LabelImg
  • Sử dụng “Create RectBox” để chú thích các đối tượng trong ảnh.
Các bước thực hiện Quy trình chú thích với LabelImg
Các bước thực hiện Quy trình chú thích với LabelImg
Các bước thực hiện Quy trình chú thích với LabelImg
  • Lưu các chú thích vào thư mục được chỉ định.
Các bước thực hiện Quy trình chú thích với LabelImg

bên trong .xml 

<annotation>
	<folder>train</folder>
	<filename>0a8a68ee-f587-4dea-beec-79d02e7d3fa4___RS_Early.B 8461.JPG</filename>
	<path>/home/suyodhan/Documents/Blog /label
/train/0a8a68ee-f587-4dea-beec-79d02e7d3fa4___RS_Early.B 8461.JPG</path>
	<source>
		<database>Unknown</database>
	</source>
	<size>
		<width>256</width>
		<height>256</height>
		<depth>3</depth>
	</size>
	<segmented>0</segmented>
	<object>
		<name>Potato___Early_blight</name>
		<pose>Unspecified</pose>
		<truncated>0</truncated>
		<difficult>0</difficult>
		<bndbox>
			<xmin>12</xmin>
			<ymin>18</ymin>
			<xmax>252</xmax>
			<ymax>250</ymax>
		</bndbox>
	</object>
</annotation>

Cấu trúc XML này tuân theo định dạng chú thích Pascal VOC, thường được sử dụng cho các bộ dữ liệu phát hiện đối tượng. Định dạng này cung cấp cách trình bày tiêu chuẩn hóa dữ liệu được chú thích để đào tạo các mô hình thị giác máy tính. Nếu bạn có thêm hình ảnh có chú thích, bạn có thể tiếp tục tạo các tệp XML tương tự cho từng đối tượng được chú thích trong các hình ảnh tương ứng.

Chuyển đổi chú thích Pascal VOC sang định dạng COCO: Tập lệnh Python

Các mô hình phát hiện đối tượng thường yêu cầu chú thích ở các định dạng cụ thể để huấn luyện và đánh giá hiệu quả. Mặc dù Pascal VOC là định dạng được sử dụng rộng rãi nhưng các khung cụ thể như Detectron lại thích chú thích COCO hơn. Để thu hẹp khoảng cách này, chúng tôi giới thiệu một giải pháp đa năng Python script, voc2coco.py, được thiết kế để chuyển đổi liền mạch các chú thích Pascal VOC sang định dạng COCO.

#!/usr/bin/python

# pip install lxml

import sys
import os
import json
import xml.etree.ElementTree as ET
import glob

START_BOUNDING_BOX_ID = 1
PRE_DEFINE_CATEGORIES = None
# If necessary, pre-define category and its id
#  PRE_DEFINE_CATEGORIES = {"aeroplane": 1, "bicycle": 2, "bird": 3, "boat": 4,
#  "bottle":5, "bus": 6, "car": 7, "cat": 8, "chair": 9,
#  "cow": 10, "diningtable": 11, "dog": 12, "horse": 13,
#  "motorbike": 14, "person": 15, "pottedplant": 16,
#  "sheep": 17, "sofa": 18, "train": 19, "tvmonitor": 20}


def get(root, name):
    vars = root.findall(name)
    return vars


def get_and_check(root, name, length):
    vars = root.findall(name)
    if len(vars) == 0:
        raise ValueError("Can not find %s in %s." % (name, root.tag))
    if length > 0 and len(vars) != length:
        raise ValueError(
            "The size of %s is supposed to be %d, but is %d."
            % (name, length, len(vars))
        )
    if length == 1:
        vars = vars[0]
    return vars


def get_filename_as_int(filename):
    try:
        filename = filename.replace("", "/")
        filename = os.path.splitext(os.path.basename(filename))[0]
        return str(filename)
    except:
        raise ValueError("Filename %s is supposed to be an integer." % (filename))


def get_categories(xml_files):
    """Generate category name to id mapping from a list of xml files.
    
    Arguments:
        xml_files {list} -- A list of xml file paths.
    
    Returns:
        dict -- category name to id mapping.
    """
    classes_names = []
    for xml_file in xml_files:
        tree = ET.parse(xml_file)
        root = tree.getroot()
        for member in root.findall("object"):
            classes_names.append(member[0].text)
    classes_names = list(set(classes_names))
    classes_names.sort()
    return {name: i for i, name in enumerate(classes_names)}


def convert(xml_files, json_file):
    json_dict = {"images": [], "type": "instances", "annotations": [], "categories": []}
    if PRE_DEFINE_CATEGORIES is not None:
        categories = PRE_DEFINE_CATEGORIES
    else:
        categories = get_categories(xml_files)
    bnd_id = START_BOUNDING_BOX_ID
    for xml_file in xml_files:
        tree = ET.parse(xml_file)
        root = tree.getroot()
        path = get(root, "path")
        if len(path) == 1:
            filename = os.path.basename(path[0].text)
        elif len(path) == 0:
            filename = get_and_check(root, "filename", 1).text
        else:
            raise ValueError("%d paths found in %s" % (len(path), xml_file))
        ## The filename must be a number
        image_id = get_filename_as_int(filename)
        size = get_and_check(root, "size", 1)
        width = int(get_and_check(size, "width", 1).text)
        height = int(get_and_check(size, "height", 1).text)
        image = {
            "file_name": filename,
            "height": height,
            "width": width,
            "id": image_id,
        }
        json_dict["images"].append(image)
        ## Currently we do not support segmentation.
        #  segmented = get_and_check(root, 'segmented', 1).text
        #  assert segmented == '0'
        for obj in get(root, "object"):
            category = get_and_check(obj, "name", 1).text
            if category not in categories:
                new_id = len(categories)
                categories[category] = new_id
            category_id = categories[category]
            bndbox = get_and_check(obj, "bndbox", 1)
            xmin = int(get_and_check(bndbox, "xmin", 1).text) - 1
            ymin = int(get_and_check(bndbox, "ymin", 1).text) - 1
            xmax = int(get_and_check(bndbox, "xmax", 1).text)
            ymax = int(get_and_check(bndbox, "ymax", 1).text)
            assert xmax > xmin
            assert ymax > ymin
            o_width = abs(xmax - xmin)
            o_height = abs(ymax - ymin)
            ann = {
                "area": o_width * o_height,
                "iscrowd": 0,
                "image_id": image_id,
                "bbox": [xmin, ymin, o_width, o_height],
                "category_id": category_id,
                "id": bnd_id,
                "ignore": 0,
                "segmentation": [],
            }
            json_dict["annotations"].append(ann)
            bnd_id = bnd_id + 1

    for cate, cid in categories.items():
        cat = {"supercategory": "none", "id": cid, "name": cate}
        json_dict["categories"].append(cat)

    #os.makedirs(os.path.dirname(json_file), exist_ok=True)
    json_fp = open(json_file, "w")
    json_str = json.dumps(json_dict)
    json_fp.write(json_str)
    json_fp.close()


if __name__ == "__main__":
    import argparse

    parser = argparse.ArgumentParser(
        description="Convert Pascal VOC annotation to COCO format."
    )
    parser.add_argument("xml_dir", help="Directory path to xml files.", type=str)
    parser.add_argument("json_file", help="Output COCO format json file.", type=str)
    args = parser.parse_args()
    xml_files = glob.glob(os.path.join(args.xml_dir, "*.xml"))

    # If you want to do train/test split, you can pass a subset of xml files to convert function.
    print("Number of xml files: {}".format(len(xml_files)))
    convert(xml_files, args.json_file)
    print("Success: {}".format(args.json_file))

Tổng quan về kịch bản

Tập lệnh voc2coco.py đơn giản hóa quá trình chuyển đổi bằng cách tận dụng thư viện lxml. Trước khi đi sâu vào cách sử dụng, hãy khám phá các thành phần chính của nó:

1. Sự phụ thuộc:

  • Đảm bảo thư viện lxml được cài đặt bằng pip install lxml.

2. Cấu hình:

  • Tùy chọn xác định trước các danh mục bằng biến PRE_DEFINE_CATEGORIES. Bỏ ghi chú và sửa đổi phần này theo tập dữ liệu của bạn.

3. Chức năngNhận

  • get, get_and_check, get_filename_as_int: Các hàm trợ giúp để phân tích cú pháp XML.
  • get_categories: Tạo tên danh mục để ánh xạ ID từ danh sách các tệp XML.
  • chuyển đổi: Chức năng chuyển đổi chính xử lý các tệp XML và tạo JSON định dạng COCO.

Cách Sử dụng

Việc thực thi tập lệnh rất đơn giản, chạy nó từ dòng lệnh, cung cấp đường dẫn đến tệp XML Pascal VOC của bạn và chỉ định đường dẫn đầu ra mong muốn cho tệp JSON định dạng COCO. Đây là một ví dụ:

python voc2coco.py /path/to/xml/files /path/to/output/output.json

Đầu ra:

Tập lệnh xuất ra tệp JSON định dạng COCO có cấu trúc tốt chứa thông tin cần thiết về hình ảnh, chú thích và danh mục.

Đầu ra của tệp JSON định dạng COCO
Đầu ra từ tệp JSON định dạng COCO

Kết luận

Tóm lại, Kết thúc hành trình phát hiện đối tượng của chúng tôi bằng LabelImg và Detectron, điều quan trọng là phải nhận ra sự đa dạng của các công cụ chú thích phục vụ cho những người đam mê và chuyên gia. LabelImg, như một viên ngọc nguồn mở, mang lại tính linh hoạt và khả năng truy cập, khiến nó trở thành lựa chọn hàng đầu.

Ngoài các công cụ miễn phí, các giải pháp trả phí như VGG Image Annotator (VIA), RectLabel và Labelbox cũng hỗ trợ các nhiệm vụ phức tạp và dự án lớn. Các nền tảng này mang lại các tính năng nâng cao và khả năng mở rộng, mặc dù có đầu tư tài chính, đảm bảo hiệu quả trong các nỗ lực đặt cược cao.

Việc khám phá của chúng tôi nhấn mạnh việc chọn công cụ chú thích phù hợp dựa trên chi tiết cụ thể của dự án, ngân sách và mức độ phức tạp. Cho dù bám sát tính mở của LabelImg hay đầu tư vào các công cụ trả phí, điều quan trọng là sự phù hợp với quy mô và mục tiêu dự án của bạn. Trong lĩnh vực thị giác máy tính đang phát triển, các công cụ chú thích tiếp tục đa dạng hóa, cung cấp các tùy chọn cho các dự án thuộc mọi quy mô và độ phức tạp.

Chìa khóa chính

  • Giao diện trực quan và các tính năng nâng cao của LabelImg làm cho nó trở thành một công cụ nguồn mở linh hoạt để chú thích hình ảnh chính xác, lý tưởng cho những người muốn phát hiện đối tượng.
  • Các công cụ trả phí như VIA, RectLabel và Labelbox phục vụ cho các tác vụ chú thích phức tạp và các dự án quy mô lớn, cung cấp các tính năng nâng cao và khả năng mở rộng.
  • Bài học quan trọng là chọn công cụ chú thích phù hợp dựa trên nhu cầu, ngân sách và độ phức tạp mong muốn của dự án, đảm bảo hiệu quả và thành công trong nỗ lực phát hiện đối tượng.

Tài nguyên để học thêm:

1. Tài liệu LabelImg:

  • Khám phá tài liệu chính thức về LabelImg để hiểu rõ hơn về các tính năng và chức năng của nó.
  • Tài liệu LabelImg

2. Tài liệu về khung Detectron:

  • Đi sâu vào tài liệu về Detectron, khung phát hiện đối tượng mạnh mẽ, để hiểu các khả năng và cách sử dụng của nó.
  • Tài liệu về máy dò

3. Hướng dẫn sử dụng Công cụ chú thích hình ảnh VGG (VIA):

  • Nếu bạn muốn khám phá VIA, Công cụ chú thích hình ảnh VGG, hãy tham khảo hướng dẫn toàn diện để biết hướng dẫn chi tiết.
  • Hướng dẫn sử dụng VIA

4.RectLabel Tài liệu:

  • Tìm hiểu thêm về RectLabel, một công cụ chú thích trả phí, bằng cách tham khảo tài liệu chính thức của công cụ này để biết hướng dẫn về cách sử dụng và các tính năng.
  • Tài liệu RectLabel

5.Trung tâm học tập Labelbox:

  • Khám phá các tài nguyên giáo dục và hướng dẫn trong Trung tâm Kiến thức Labelbox để nâng cao hiểu biết của bạn về nền tảng chú thích này.
  • Trung tâm học tập Labelbox

Những câu hỏi thường gặp

Câu hỏi 1: LabelImg là gì và nó khác với các công cụ chú thích khác như thế nào?

Trả lời: LabelImg là một công cụ chú thích hình ảnh nguồn mở dành cho các tác vụ phát hiện đối tượng. Giao diện thân thiện với người dùng và tính linh hoạt của nó làm cho nó trở nên khác biệt. Không giống như một số công cụ, LabelImg cho phép chú thích hộp giới hạn chính xác, khiến nó trở thành lựa chọn ưu tiên cho những người mới làm quen với việc phát hiện đối tượng.

Câu hỏi 2: Có các công cụ chú thích trả phí thay thế không và chúng so sánh như thế nào với các công cụ chú thích miễn phí?

Đáp: Có, một số công cụ chú thích trả phí, chẳng hạn như VGG Image Annotator (VIA), RectLabel và Labelbox, cung cấp các tính năng nâng cao và khả năng mở rộng. Trong khi các công cụ miễn phí như LabelImg rất tuyệt vời cho các tác vụ cơ bản thì các giải pháp trả phí lại được điều chỉnh cho các dự án phức tạp hơn, cung cấp các tính năng cộng tác và nâng cao hiệu quả.

Câu hỏi 3: Tầm quan trọng của việc chuyển đổi chú thích sang định dạng Pascal VOC là gì?

Trả lời: Việc chuyển đổi chú thích sang định dạng Pascal VOC là rất quan trọng để tương thích với các khung như Detectron. Nó đảm bảo ghi nhãn lớp nhất quán và tích hợp liền mạch vào quy trình đào tạo, tạo điều kiện thuận lợi cho việc tạo ra các mô hình phát hiện đối tượng chính xác.

Câu hỏi 4: Detectron góp phần đào tạo mô hình hiệu quả trong việc phát hiện đối tượng như thế nào?

Trả lời: Detectron là một khung phát hiện đối tượng mạnh mẽ giúp đơn giản hóa quá trình đào tạo mô hình. Nó đóng một vai trò quan trọng trong việc xử lý dữ liệu chú thích, chuẩn bị cho việc đào tạo và tối ưu hóa hiệu quả tổng thể của các mô hình phát hiện đối tượng.

Câu hỏi 5: Tôi có thể sử dụng các công cụ chú thích trả phí cho các dự án quy mô nhỏ hay chúng chủ yếu dành cho các nhiệm vụ cấp doanh nghiệp?

Đáp: Mặc dù các công cụ chú thích trả phí thường được liên kết với các nhiệm vụ cấp doanh nghiệp nhưng chúng cũng có thể mang lại lợi ích cho các dự án quy mô nhỏ. Quyết định phụ thuộc vào các yêu cầu cụ thể, hạn chế về ngân sách và mức độ phức tạp mong muốn đối với các nhiệm vụ chú thích.

Phương tiện hiển thị trong bài viết này không thuộc sở hữu của Analytics Vidhya và được sử dụng theo quyết định riêng của Tác giả. 

tại chỗ_img

Tin tức mới nhất

tại chỗ_img