ใ‚ใกใ‚ƒใใกใ‚ƒ ้–‹็™บ่€…๐Ÿฆพ
์ฝ”๋”ฉ ์ง ๐Ÿ’ช
ใ‚ใกใ‚ƒใใกใ‚ƒ ้–‹็™บ่€…๐Ÿฆพ
  • ์นดํ…Œ๊ณ ๋ฆฌ (135)
    • ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๊ตฌ์ถ• (12)
      • ๊ฐœ๋ฐœ ํ™˜๊ฒฝ (5)
      • DB (0)
      • Node.js (4)
      • ํ˜•์ƒ ๊ด€๋ฆฌ (2)
      • Spring (1)
    • ์›น (11)
      • React (5)
      • ์ŠคํŒŒ๋ฅดํƒ€์ฝ”๋”ฉํด๋Ÿฝ__์›น (6)
    • ๋ชจ๋ฐ”์ผ (2)
      • ์•ˆ๋“œ๋กœ์ด๋“œ (2)
    • ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด (55)
      • C (13)
      • Python (15)
      • SQL (5)
      • Java (22)
    • ์‚ฌ๋ฌผ์ธํ„ฐ๋„ท (11)
      • ์•„๋‘์ด๋…ธ (11)
    • ์ผ์ƒ (31)
      • ๋ง›์ง‘ (13)
      • ๋žญํ‚น๋‹ญ์ปด (4)
      • ํ›„๊ธฐ (11)
      • ์š”๋ฆฌ (3)
      • ์žก๋‹ด (0)
    • ๊ต์–‘ (4)
      • ์‹ฌ๋ฆฌํ•™ (3)
      • ํ…Œ๋‹ˆ์Šค (1)
    • ์ž๊ฒฉ์ฆ (9)
      • ์ •๋ณด์ฒ˜๋ฆฌ๊ธฐ์‚ฌ (9)

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ๐Ÿ’ป github

์ธ๊ธฐ ๊ธ€

์ตœ๊ทผ ๊ธ€

ํ‹ฐ์Šคํ† ๋ฆฌ

hELLO ยท Designed By ์ •์ƒ์šฐ.
ใ‚ใกใ‚ƒใใกใ‚ƒ ้–‹็™บ่€…๐Ÿฆพ

์ฝ”๋”ฉ ์ง ๐Ÿ’ช

[Python] YOLO ๋ชจ๋ธ ํ•™์Šต์„ ์œ„ํ•œ ์˜คํ”ˆ ๋ฐ์ดํ„ฐ ์…‹ ์ค€๋น„ (2)
ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด/Python

[Python] YOLO ๋ชจ๋ธ ํ•™์Šต์„ ์œ„ํ•œ ์˜คํ”ˆ ๋ฐ์ดํ„ฐ ์…‹ ์ค€๋น„ (2)

2023. 8. 16. 17:09

์ด์ „ ํฌ์ŠคํŒ…

[Python] YOLO ๋ชจ๋ธ ํ•™์Šต์„ ์œ„ํ•œ ์˜คํ”ˆ ๋ฐ์ดํ„ฐ ์…‹ ์ค€๋น„ (1)

 

[Python] YOLO ๋ชจ๋ธ ํ•™์Šต์„ ์œ„ํ•œ ์˜คํ”ˆ ๋ฐ์ดํ„ฐ ์…‹ ์ค€๋น„ (1)

=============== ๋ชฉํ‘œ =============== YOLO ๋ชจ๋ธ ํ•™์Šต์„ ์œ„ํ•œ ์˜คํ”ˆ ๋ฐ์ดํ„ฐ์…‹ ์ค€๋น„ ================================== 1. roboflow๋ฅผ ํ†ตํ•ด ๋ฐฐํฌ๋˜์–ด ์žˆ๋Š” ์˜คํ”ˆ ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ ์…‹ ๋‹ค์šด 2. ๊ตฌ๊ธ€ OpenImageDataset๊ณผ Google BigQuery

coding-gym.tistory.com


 

 

ใ€Š OIDv4_ToolKit ํ™œ์šฉ ใ€‹

OIDv4_ToolKit

 

GitHub - EscVM/OIDv4_ToolKit: Download and visualize single or multiple classes from the huge Open Images v4 dataset

Download and visualize single or multiple classes from the huge Open Images v4 dataset - GitHub - EscVM/OIDv4_ToolKit: Download and visualize single or multiple classes from the huge Open Images v4...

github.com

์„ค๋ช…์— ์˜ํ•˜๋ฉด ์•ฝ 600๊ฐœ ํด๋ž˜์Šค๋ฅผ

ํฌํ•จํ•œ ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ ์…‹์„ ๋‹ค์šด๋กœ๋“œ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•˜๋„ค์š”.

 

๊ธฐ๋ณธ์ ์ธ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ณด๋ฉด Google Open Images Dataset V4์—

๊ธฐ๋ฐ˜ํ•ด ์›ํ•˜๋Š” ํŠน์ • ๋ฐ์ดํ„ฐ ์…‹์„ ์ถ”์ถœํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

์šฐ์„  ํ•ด๋‹น GitHub๋ฅผ ๋ณธ์ธ์˜ ํ”„๋กœ์ ํŠธ ์œ„์น˜์— cloneํ•ฉ๋‹ˆ๋‹ค.

git clone https://github.com/EscVM/OIDv4_ToolKit.git

pip install -r requirements.txt

 

 

Git clone๊ณผ ํ•„์š” ํŒจํ‚ค์ง€ ๋“ค์„ pip install์„ ํ†ตํ•ด ๋‹ค์šด๋กœ๋“œ ๋ฐ›์€ ํ›„

๋™์ผํ•˜๊ฒŒ Google Open Images Dataset V4์—์„œ ์ œ๊ณตํ•˜๋Š”

ํด๋ž˜์Šค ํŒŒ์ผ์„ ํ™•์ธ ํ›„ ๋ณธ์ธ์—๊ฒŒ ํ•ด๋‹น ํ•˜๋Š” ์ด๋ฏธ์ง€ ํด๋ž˜์Šค๋ฅผ ํƒ์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.

class-descriptions-boxable.csv
0.01MB

 

 

 

์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ์…‹์„ ๋‹ค์šด๋กœ๋“œ ๋ฐ›๊ฒ ์Šต๋‹ˆ๋‹ค.

--type_csv ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ†ตํ•ด train ํŒŒ์ผ test ํŒŒ์ผ val ํŒŒ์ผ

ํ˜น์€ ์ „์ฒด ํŒŒ์ผ์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ช…๋ น์–ด ์„ค๋ช… ์˜ˆ์‹œ
<command> 'downloader'    'visualizer'    'ill_downloader' downloader
ํ•˜์ดํผ ํŒŒ๋ผ๋ฏธํ„ฐ ์„ค๋ช… ์˜ˆ์‹œ
--classes list of classes Jellyfish
--type_csv 'train'    'test'    'validation'    'all' test
--sub Subset of human verified images or machine generated h or m h
--image_IsOccluded,
--image_IsTruncated
--image_IsGroupOf
--image_IsDepiction
--image_IsInside
1 or 0  
--multiclasses default or 1 0 [default]
--n_threads default 20  
--noLabels no labels  
--iimit integer number 20

 

# OIDv4_TooKit ํด๋” ๊ฒฝ๋กœ๋กœ ์ด๋™
cd OIDv4_ToolKit

# main.py ์‹คํ–‰
python main.py downloader --classes Jellyfish --type_csv test

ํ•ดํŒŒ๋ฆฌ์˜ ํ…Œ์ŠคํŠธ ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ์…‹ ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์•„๋ณด๋‹ˆ 103๊ฐœ์ž…๋‹ˆ๋‹ค.

 

 

์ •์ƒ์ ์œผ๋กœ ํ•ด๋‹น ํด๋ž˜์Šค์˜ ํ…Œ์ŠคํŠธ ์ด๋ฏธ์ง€ ํŒŒ์ผ๊ณผ label ํŒŒ์ผ์„

๋‹ค์šด๋กœ๋“œ ๋ฐ›์€ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋•Œ ๋ผ๋ฒจ ํŒŒ์ผ์˜ ๊ฒฝ์šฐ ์ •๊ทœํ™” ๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฏ€๋กœ 

๋”ฐ๋กœ yolo ํ˜•์‹์˜ ๋ผ๋ฒจ ๋ฐ์ดํ„ฐ๋กœ ์ •๊ทœํ™” ์‹œ์ผœ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

ํ•ด๋‹น ์ •๊ทœํ™” ์ฝ”๋“œ๋Š” ์•„๋ž˜ ๊นƒํ—ˆ๋ธŒ์˜ ์ฝ”๋“œ๋ฅผ ์ฐธ์กฐํ–ˆ์Šต๋‹ˆ๋‹ค.

https://gist.github.com/EscVM/b6e5d60343c88f358742aa9e0de2cc3f

 

Translate OIDv4 labels to YOLO format

Translate OIDv4 labels to YOLO format. GitHub Gist: instantly share code, notes, and snippets.

gist.github.com

 

ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ ํŒŒ์ผ์„ ์ž„์˜๋กœ oid_to_yolo.py๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ
OIDv4_ToolKit ํด๋” ํ•˜์œ„์—์„œ ์‹คํ–‰ํ•ด ์ค๋‹ˆ๋‹ค.

# ---------------
# Date: 7/25/2018
# Place: Biella
# Author: EscVM
# Project: OID v4 to Yolo
# ---------------


import os
from tqdm import tqdm
from sys import exit
import argparse
import cv2
from textwrap import dedent

ROOT_DIR = 'OID'       # ๋ฃจํŠธ ํด๋” ๊ฒฝ๋กœ ์„ค์ •
OUTPUT_DIR = 'OUTPUT'  # OUTPUT ๊ฒฝ๋กœ ํด๋”๋ช… ์„ค์ •
NAME_DIR = 'To_Yolo'   # OUTPUT ๊ฒฝ๋กœ ํ•˜์œ„ ํด๋”๋ช… ์„ค์ •


def argument_parser():
    parser = argparse.ArgumentParser(description='Convert OID format to Yolo')
    parser.add_argument("command",
                        metavar="<command> 'convert' or 'dummy'",
                        help="'convert oid format to yolo' or 'dummy', add no target images")
    parser.add_argument('--dataset', required=True,
                        metavar="type of dataset: 'validation', 'test', 'train', 'all'",
                        help='"validation" or "train" or "test" or "all"')
    parser.add_argument('--class_name', required=True,
                        metavar="name of the class to convert",
                        help='Convert: name of the class Ex: "Apple" Dummy: where to add images')
    parser.add_argument('--class_number', required=False,
                        default=0,
                        metavar="dictionary value of the class",
                        help="It's the value assigned to the class")
    parser.add_argument('--copy', required=False,
                        default=False,
                        metavar="boolean: copy images in a common folder",
                        help="copy images with labels in a common folder")
    parser.add_argument('--names', required=False,
                        default=False,
                        metavar="boolean: create .names file with classes",
                        help="boolean: create .names file with classes")
    parser.add_argument('--dummy_name', required=False,
                        default=False,
                        metavar="class_name to add as dummy to class_name",
                        help="add images to class_name with void labels")
    parser.add_argument('--move', required=False,
                        default=False,
                        metavar="boolean: move images from original folder",
                        help="if '1' moves imase to To_YOLO folder")

    args = parser.parse_args()

    return args


class Engine(object):

    global ROOT_DIR
    global OUTPUT_DIR
    global NAME_DIR

    def __init__(self, dataset, class_name, class_number, copy, names, move):
        self.dataset = dataset
        self.class_name = class_name
        self.class_number = class_number
        self.copy = copy
        self.names = names
        self.move = move

        self.class_list = []

    def run_converter(self):

        self.make_start()

        if self.dataset != 'all':
            self.dataset_dir = os.path.join(ROOT_DIR, 'Dataset', self.dataset, self.class_name)
            self.label_dir = os.path.join(self.dataset_dir, 'Label')
            self.output_dataset_dir = os.path.join(OUTPUT_DIR, NAME_DIR, self.dataset, self.class_name)

            if not os.path.exists(self.output_dataset_dir):
                os.makedirs(self.output_dataset_dir)

            self.img_file = os.listdir(self.dataset_dir)

            print("[INFO] {} images found".format(len(self.img_file) - 1))
            print("[INFO] ----  x | y | width | height  ---- output format".format(len(self.img_file) - 1))

            self.make_labels()

            if self.names == '1':
                self.make_names()

        else:
            dataset_DIR = os.path.join(ROOT_DIR, 'Dataset')
            dataset_list = tuple(os.listdir(dataset_DIR))
            for dataset in dataset_list:
                self.dataset_dir = os.path.join(ROOT_DIR, 'Dataset', dataset, self.class_name)
                self.label_dir = os.path.join(self.dataset_dir, 'Label')
                self.output_dataset_dir = os.path.join(OUTPUT_DIR, NAME_DIR, dataset, self.class_name)

                if not os.path.exists(self.output_dataset_dir):
                    os.makedirs(self.output_dataset_dir)

                self.img_file = os.listdir(self.dataset_dir)

                print("[INFO] {} images found".format(len(self.img_file) - 1))
                print("[INFO] ----  x | y | width | height  ---- output format".format(len(self.img_file) - 1))

                self.make_labels()

                if self.names == '1':
                    self.make_names()

    def run_dummy(self, dummy_name):

        self.make_start()

        dataset_dir = os.path.join(ROOT_DIR, 'Dataset', self.dataset, dummy_name)
        self.output_dataset_dir = os.path.join(OUTPUT_DIR, NAME_DIR, self.dataset, self.class_name)

        if not os.path.exists(self.output_dataset_dir):
            print("The selected output folder does not exists")
            exit(1)

        img_file = os.listdir(dataset_dir)

        print("[INFO] {} images found".format(len(img_file) - 1))
        print("[INFO] VOID output format".format(len(img_file) - 1))

        for element in tqdm(img_file):
            if element.endswith('.jpg'):
                img_path = os.path.join(dataset_dir, element)
                self.img_path_yolo = os.path.join(self.output_dataset_dir, element)
                img_name = str(element.split('.')[0]) + '.txt'
                label_path_yolo = os.path.join(self.output_dataset_dir, img_name)

                self.img = cv2.imread(img_path)

                label_yolo = open(label_path_yolo, 'w')

                label_yolo.close()

                if self.copy == '1':
                    self.make_copy()

                if self.move == '1':
                    self.make_copy()


        self.make_end()


    def make_labels(self):

        for element in tqdm(self.img_file):
            if element.endswith('.jpg'):
                self.img_path = os.path.join(self.dataset_dir, element)
                self.img_path_yolo = os.path.join(self.output_dataset_dir, element)
                img_name = str(element.split('.')[0]) + '.txt'
                self.label_path_original = os.path.join(self.label_dir, img_name)
                label_path_yolo = os.path.join(self.output_dataset_dir, img_name)

                self.img = cv2.imread(self.img_path)
                label_original = open(self.label_path_original, 'r')

                label_yolo = open(label_path_yolo, 'w')

                for line in label_original:
                    # name_of_class X_min Y_min X_max Y_max
                    line = line.strip()
                    l = line.split(' ')

                    class_name = l.pop(0)
                    try:
                        float(l[0])
                    except ValueError:
                        class_name += ' ' + l.pop(0)

                    if class_name not in self.class_list:
                        self.class_list.append(class_name)

                    for i in range(len(l)):
                        l[i] = float(l[i])
                    x = ((l[2] + l[0]) / 2)
                    y = ((l[3] + l[1]) / 2)
                    width = (l[2] - l[0])
                    height = (l[3] - l[1])

                    img_width = 1 / self.img.shape[1]
                    img_height = 1 / self.img.shape[0]

                    x *= img_width
                    y *= img_height
                    width *= img_width
                    height *= img_height

                    if self.class_number != 0:
                        c_name = self.class_number
                    else:
                        c_name = self.class_list.index(class_name)

                    print("{0} {1} {2} {3} {4}".format(c_name, x, y, width, height), file=label_yolo)

                if self.copy == '1':
                    self.make_copy()

                if self.move == '1':
                    self.make_copy()
                    self.make_move()

                label_yolo.close()
                label_original.close()

        self.make_end()

    def make_copy(self):
        cv2.imwrite(self.img_path_yolo, self.img)

    def make_move(self):
        os.remove(self.img_path)
        os.remove(self.label_path_original)

    def make_names(self):

        file_path = os.path.join(OUTPUT_DIR, NAME_DIR, 'obj.names')
        f = open(file_path, 'w')
        for i in range(len(self.class_list)):
            print("{}".format((self.class_list[i]).lower()), file=f)
        f.close()

    def make_end(self):
        if self.copy == '1':
            print("[INFO] Done!")
            print("[INFO] There are {} images in your dataset".format(len(os.listdir(self.output_dataset_dir)) / 2))

        else:
            print("[INFO] Done!")
            print("[INFO] There are {} images in your dataset".format(len(os.listdir(self.output_dataset_dir))))

    def make_start(self):
        print(dedent("""
   _____  ____  ____  _  _  __  
  (  _  )(_  _)(  _ \( \/ )/. | 
   )(_)(  _)(_  )(_) )\  /(_  _)
  (_____)(____)(____/  \/   (_) 
	 ____  _____ 
	(_  _)(  _  )
	  )(   )(_)( 
	 (__) (_____)
    _  _  _____  __    _____ 
   ( \/ )(  _  )(  )  (  _  )
    \  /  )(_)(  )(__  )(_)( 
    (__) (_____)(____)(_____)
             """))




if __name__ == '__main__':


    args = argument_parser()


    if args.command == 'convert':

        converter = Engine(args.dataset, args.class_name, args.class_number, args.copy, args.names, args.move)

        converter.run_converter()

    if args.command == 'dummy':

        dummy_generator = Engine(args.dataset, args.class_name, args.class_number, args.copy, args.names, args.move)

        dummy_generator.run_dummy(args.dummy_name)

 

ํ•ด๋‹น ํŒŒ์ด์ฌ ์‹คํ–‰ ํŒŒ์ผ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ๊ฒฝ์šฐ ํŒŒ์ผ์˜

์ƒ๋‹จ์„ ์ฐธ๊ณ ํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

# OIDv4_ToolKit ์œ„์น˜๋กœ ์ด๋™
cd OIDv4_ToolKit

# oid_to_yolo.py ์‹คํ–‰
python oid_to_yolo.py convert --dataset test --class_name Jellyfish --copy True

ํ•ด๋‹น ํŒŒ์ผ ์‹คํ–‰ ๊ฒฐ๊ณผ ์ •์ƒ์ ์œผ๋กœ OUTPUT ํ’€๋” ๋‚ด์—

๋ณต์‚ฌ ๋œ ์ด๋ฏธ์ง€ ํŒŒ์ผ๊ณผ YOLO ํ˜•์‹์œผ๋กœ ์ •๊ทœํ™” ๋œ ๋ผ๋ฒจ ํŒŒ์ผ 104์Œ์ด ์™„๋ฃŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

 

 

 

๊ฐœ์ธ์ ์œผ๋กœ๋Š” OIDv4_ToolKit์˜ ๋ฐฉ์‹์ด ์ •๊ทœํ™”๋„ ๊ฐ„ํŽธํ•˜๊ณ 

์›ํ•˜๋Š” ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ์…‹๋งŒ ์–ป์„ ์ˆ˜ ์žˆ์–ด ํŽธ๋ฆฌํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ €์ž‘์žํ‘œ์‹œ ๋น„์˜๋ฆฌ ๋ณ€๊ฒฝ๊ธˆ์ง€ (์ƒˆ์ฐฝ์—ด๋ฆผ)
    'ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด/Python' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
    • [Python] ๊ตฌ๊ธ€ Colab์„ ํ™œ์šฉํ•œ YOLO ๋ชจ๋ธ ํ•™์Šต
    • [Python] YOLO ๋ชจ๋ธ ํ•™์Šต์„ ์œ„ํ•œ ์˜คํ”ˆ ๋ฐ์ดํ„ฐ ์…‹ ์ค€๋น„ (1)
    • [Python] YOLOv5๋ฅผ ํ™œ์šฉํ•œ ๊ฐ์ฒด ์ธ์‹(Object Detection) (2)
    • [Python] YOLOv5๋ฅผ ํ™œ์šฉํ•œ ๊ฐ์ฒด ์ธ์‹(Object Detection) (1)
    ใ‚ใกใ‚ƒใใกใ‚ƒ ้–‹็™บ่€…๐Ÿฆพ
    ใ‚ใกใ‚ƒใใกใ‚ƒ ้–‹็™บ่€…๐Ÿฆพ
    ๐Ÿ‘Š ๋ธ”๋กœ๊ทธ๋„ ๊ทผ์„ฑ์ด๋‹ค? ๐Ÿ‘Š

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”