リアルタイムスライドヘルメットコンストレイントシステム-プロジェクト背景とデータセット構成
31732 ワード
プロジェクトの背景
2021年5月13日から道路交通法改正のため、電動スクーターを使用する際、ヘルメットを着用しない場合、罰金2万ウォンが課される.しかし、依然としてヘルメットを着用せず、電動スクーターを使用しない人が多く、警察は一つ一つ取り締まることができないため、リアルタイムのスクーター取り締まるシステムを想定している.
DataSetの構成
-ヘルメットをかぶる、電動スクーターを使う、ヘルメットを使わない、電動スクーターを使うシーンをビデオで撮影し、フレーム単位でキャプチャした画像に変換して保存します.
import os
import cv2
def video2frame(video_name, invideofilename, save_path):
vidcap = cv2.VideoCapture(invideofilename)
count = 0
while True:
success,image = vidcap.read()
if not success:
break
if(int(vidcap.get(1)) % 10 == 0):
print ('Read a new frame: ', success)
fname = "{}.jpg".format("{0:05d}".format(count))
cv2.imwrite(save_path + video_name + '_' + fname, image) # save frame as JPEG file
count += 1
print("{} images are extracted in {}.". format(count, save_path))
video_list = os.listdir('./kickboard_video')
for video_name in video_list:
name = video_name.split('.')[0]
video2frame(name, './kickboard_video/' + video_name, './images/')
元のデータセットは770枚未満であるため、データの拡張によって増加する.Data Labeling
Data LabelingはMake Senseを使用します.ラベルには、ヘルメットをかぶっている人と、ヘルメットをかぶっていない人の2種類があります.
Data Augmentation
コードを作成するには、次のアドレスのGithubを参照してください.コードの機能は、マークアップされた画像を強化し、マークアップされた画像と一致する拡張画像に置き換えることができ、追加のマークアッププロセスを必要としないため、非常に役立ちます.
from data_aug.data_aug import *
from data_aug.bbox_util import *
import numpy as np
import cv2
import matplotlib.pyplot as plt
import pickle as pkl
%matplotlib inline
import os
from PIL import Image
def convert(size, box):
dw = 1./size[1]
dh = 1./size[0]
x = (box[0] + box[2])/2.0
y = (box[1] + box[3])/2.0
w = box[2] - box[0]
h = box[3] - box[1]
x = x*dw
w = w*dw
y = y*dh
h = h*dh
return (x,y,w,h)
img_path = '../images/' # 이미지 경로
label_path = '../labels/' # 라벨 경로
img_li = os.listdir(img_path)
label_li = os.listdir(label_path)
for i in range(len(img_li)):
file_name = img_li[i].split('.')[0]
image = '../images/' + img_li[i]
print('이미지 경로', image)
img = cv2.imread(image)[:,:,::-1]
label_name = label_path + image.split('/')[-1].split('.')[0] + '.txt'
print('라벨 경로', label_name)
size = []
size.append(img.shape[0])
size.append(img.shape[1])
print('이미지 크기', str(size))
bboxes = np.loadtxt(label_name, delimiter=' ', skiprows=0, dtype=float)
print('읽은 라벨 값 yolo', bboxes)
if bboxes.ndim==1:
rebboxes=np.zeros((1,bboxes.shape[0]))
else:
rebboxes=np.zeros(bboxes.shape)
if bboxes.ndim==1:
rebboxes[0][0]=bboxes[1]
rebboxes[0][1]=bboxes[2]
rebboxes[0][2]=bboxes[3]
rebboxes[0][3]=bboxes[4]
rebboxes[0][4]=bboxes[0]
boundingbox=np.zeros(rebboxes.shape)
else:
rebboxes=bboxes[:,1:]
rebboxes=np.hstack([rebboxes,bboxes[:,0:1]])
boundingbox=np.zeros(bboxes.shape)
print('순서 바꿈', rebboxes)
#([0]=좌측상단 x, [1]=좌측상단 y, [2]=우측하단 x,[3]=우측하단 y)
for i in range(boundingbox.shape[0]):
boundingbox[i,0], boundingbox[i,1] = size[1] * (rebboxes[i,0] - rebboxes[i,2] / 2), size[0] * (rebboxes[i,1] - rebboxes[i,3] / 2)
boundingbox[i,2], boundingbox[i,3] = size[1] * (rebboxes[i,0] + rebboxes[i,2] / 2), size[0] * (rebboxes[i,1] + rebboxes[i,3] / 2)
boundingbox[i,4]=rebboxes[i,4]
print('바운딩 박스', boundingbox)
# augmentation 과정
seq = Sequence([RandomHSV(40, 40, 30),RandomHorizontalFlip(), Scale(-0.7, -0.7),Translate(0.2, 0.2), RandomRotate(10), RandomShear()])
img_, boundingbox_ = seq(img.copy(), boundingbox.copy())
plotted_img = draw_rect(img_, boundingbox_)
plt.imshow(plotted_img)
yolobox=np.zeros((boundingbox_.shape))
plt.show()
# 라벨을 YOLO 형식으로 바꿔주는 과정
for i in range(0,boundingbox_.shape[0]):
x,y,w,h=convert(size,boundingbox_[i])
yolobox[i][0]=boundingbox_[i][4]
yolobox[i][1]=x
yolobox[i][2]=y
yolobox[i][3]=w
yolobox[i][4]=h
new_img_ = Image.fromarray(img_)
# augmentation한 이미지와 라벨 저장
print(new_img_.save('../aug_images_3/'+ 'aug_3_'+ file_name + '.jpg'))
print(np.savetxt('../aug_labels_3/' + 'aug_3_'+ file_name + '.txt',yolobox, fmt='%f',delimiter=' '))
拡張結果
Reference
この問題について(リアルタイムスライドヘルメットコンストレイントシステム-プロジェクト背景とデータセット構成), 我々は、より多くの情報をここで見つけました https://velog.io/@jsleeg98/실시간-킥보드-단속-시스템-프로젝트-프로젝트-배경과-Dataset-구성テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol