운전중 도로 교통 법규 위반 차량을 발견해도 즉각 신고가 현실적으로 어려워 자동 감지 및 신고 시스템을 만들고자 함
프로젝트 목표:
- 실시간 블랙박스 영상속 위반 차량 감지+신고
- 블랙박스 영상 속에서 실시간으로 특정 위반 사항을 감지하고, 필요한 경우 이를 신고할 수 있는 시스템을 개발
주요 구현 요소:
- 위반 사항 분류 (Classification of Violations): 신호위반, 안전모 미착용, 중앙선 침범, 차선 변경 위반과 같은 특정 위반 사항을 식별하고 분류
- Object Tracking (객체 추적): 감지된 객체를 연속적으로 추적하여, 해당 객체의 움직임을 모니터링
- Object Detection (객체 감지): 블랙박스 영상에서 차량 및 사람과 같은 객체를 감지
시각화용 데이터:
- 서울시 법규위반별 교통사고 현황 통계:
- 법규위반별 교통사고 현황:
위반 사항 분류:
- 신호위반
- 안전모 미착용
- 중앙선 침범
- 차선 변경 위반
데이터:
- [AI HUB]비식별화된 교통법규 위반 상황 데이터
![20230222안전모미착용_0000000010_02.jpg](https://file.core.today/editor/image/20231030/20230222%EC%95%88%EC%A0%84%EB%AA%A8%EB%AF%B8%EC%B0%A9%EC%9A%A9_0000000010_02386cd40.jpg)
- [Kaggle]traffic violation dataset V.3
- https://www.kaggle.com/datasets/meliodassourav/traffic-violation-dataset-v3
- [Roboflow]Traffic Violation
- https://universe.roboflow.com/computer-vision-uiivc/traffic-violation-0ufqq/browse?queryText=&pageSize=50&startingIndex=0&browseQuery=true
- [AI HUB]차로 위반 영상 데이터
- 모델 훈련 및 평가: Object Detection 및 위반 사항 분류 모델을 구축하고 훈련, 모델의 정확성과 성능을 평가하는 방법을 고려
- 현장 테스트: 모델을 현장에서 테스트하고 실제 도로 환경에서 어떻게 동작하는지 확인
- 신고 시스템: 위반을 감지한 후, 어떻게 신고를 처리할지에 대한 구체적인 계획이 필요. 법 집행 기관과 협력하여 시스템을 구현해야 할 수도 있음
- 데이터 보안 및 개인정보 보호: 영상 데이터를 다룰 때 개인정보와 관련된 법률 및 보안 문제에 대한 고려가 필요
- 실시간 처리: 실시간 데이터를 처리하기 위한 높은 처리량 및 낮은 지연 시간을 갖추는 것이 중요
- UI/UX 디자인: 사용자가 시스템을 효과적으로 활용할 수 있는 사용자 경험 디자인을 고려
- 법률적 측면: 법적 제약 사항 및 규정 준수를 고려하여 시스템을 구현
《스마트건설 챌린지 2022 - 도로분야 스마트 기술 경연대회 #3》 - 고속도로 교통법규 위반상황 AI 분석 기술
시각화용 데이터:
서울시 법규위반별 교통사고 현황 통계:
법규위반별 교통사고 현황:
데이터:
- [AI HUB]비식별화된 교통법규 위반 상황 데이터
- [Kaggle]traffic violation dataset V.3
- [Roboflow]Traffic Violation
- [AI HUB]차로 위반 영상 데이터 - 사용
- [AI HUB]자동차 차종/연식/번호판 인식용 영상 - 사용
- [AI HUB]자율주행차의 다양한 주행환경에서의 신호등 신호정보 인식 데이터셋
- [AI HUB]신호등/도로표지판 인지 영상(수도권) - 사용
테스트 영상:
- 새싹 주차장 직촬 영상
- 영국 8K 고퀄리티 고속도로 영상
어려웠던 점:
- 차량 번호 인식 과정에서
- 한국 데이터이면서 블락박스 영상인 라벨링된 데이터가 많지 않아서, cctv영상으로 대체하였다
시도:
유투브 YOLO8, EasyOCR을 사용한 번포판 인식: https://www.youtube.com/watch?v=fyJB1t0o0ms&t=580s
진행 과정:
- 차량 감지(Vehicle Detection)
- 번호판 감지(License Plate Detection)
- OCR(Optical Character Recognition)
1. 차량 감지(Vehicle Detection)
Model: Yolov8n, Yolov8m
Dataset: COCO Dataset
330K images (>200K labeled)
1.5 million object instances
80 object categories
Classes: Car, Motorcycle, Bus, Truck
YOLO model structure
차량 트래킹(Object Tracking)
model: Sort
- A simple online and realtime tracking algorithm for 2D multiple object tracking in video sequences
2. 번호판 감지(License Plate Detection)
Model: Yolov8m 50 epoch, 120epoch
Dataset: [Roboflow]License Plate Recognition Object Detection Dataset (v4, resized640_aug3x-ACCURATE) by Roboflow Universe Projects
24242 images
Augmentations
Flip: Horizontal
Crop: 0% Minimum Zoom, 15% Maximum Zoom
Rotation: Between -10° and +10°
Shear: ±2° Horizontal, ±2° Vertical
Grayscale: Apply to 10% of images
Hue: Between -15° and +15°
Saturation: Between -15% and +15%
Brightness: Between -15% and +15%
Exposure: Between -15% and +15%
Blur: Up to 0.5px
Cutout: 5 boxes with 2% size each
Training:
hyper parameters:
task=detect, mode=train, model=yolov8m.pt, data=/content/License_plate_recognition/dataset/License-Plate-Recognition-4/data.yaml, epochs=500, patience=50, batch=16, imgsz=640, save=True, save_period=-1, cache=False, device=None, workers=8, project=license_plate_detection_yolov8m, name=None, exist_ok=False, pretrained=True, optimizer=auto, verbose=True, seed=0, deterministic=True, single_cls=False, rect=False, cos_lr=False, close_mosaic=10, resume=False, amp=True, fraction=1.0, profile=False, freeze=None, overlap_mask=True, mask_ratio=4, dropout=0.0, val=True, split=val, save_json=False, save_hybrid=False, conf=None, iou=0.7, max_det=300, half=False, dnn=False, plots=True, source=None, show=False, save_txt=False, save_conf=False, save_crop=False, show_labels=True, show_conf=True, vid_stride=1, stream_buffer=False, line_width=None, visualize=False, augment=False, agnostic_nms=False, classes=None, retina_masks=False, boxes=True, format=torchscript, keras=False, optimize=False, int8=False, dynamic=False, simplify=False, opset=None, workspace=4, nms=False, lr0=0.01, lrf=0.01, momentum=0.937, weight_decay=0.0005, warmup_epochs=3.0, warmup_momentum=0.8, warmup_bias_lr=0.1, box=7.5, cls=0.5, dfl=1.5, pose=12.0, kobj=1.0, label_smoothing=0.0, nbs=64, hsv_h=0.015, hsv_s=0.7, hsv_v=0.4, degrees=0.0, translate=0.1, scale=0.5, shear=0.0, perspective=0.0, flipud=0.0, fliplr=0.5, mosaic=1.0, mixup=0.0, copy_paste=0.0, cfg=None, tracker=botsort.yaml, save_dir=license_plate_detection_yolov8m/train
model summary:
from n params module arguments 0 -1 1 1392 ultralytics.nn.modules.conv.Conv [3, 48, 3, 2] 1 -1 1 41664 ultralytics.nn.modules.conv.Conv [48, 96, 3, 2] 2 -1 2 111360 ultralytics.nn.modules.block.C2f [96, 96, 2, True] 3 -1 1 166272 ultralytics.nn.modules.conv.Conv [96, 192, 3, 2] 4 -1 4 813312 ultralytics.nn.modules.block.C2f [192, 192, 4, True] 5 -1 1 664320 ultralytics.nn.modules.conv.Conv [192, 384, 3, 2] 6 -1 4 3248640 ultralytics.nn.modules.block.C2f [384, 384, 4, True] 7 -1 1 1991808 ultralytics.nn.modules.conv.Conv [384, 576, 3, 2] 8 -1 2 3985920 ultralytics.nn.modules.block.C2f [576, 576, 2, True] 9 -1 1 831168 ultralytics.nn.modules.block.SPPF [576, 576, 5] 10 -1 1 0 torch.nn.modules.upsampling.Upsample [None, 2, 'nearest'] 11 [-1, 6] 1 0 ultralytics.nn.modules.conv.Concat [1] 12 -1 2 1993728 ultralytics.nn.modules.block.C2f [960, 384, 2] 13 -1 1 0 torch.nn.modules.upsampling.Upsample [None, 2, 'nearest'] 14 [-1, 4] 1 0 ultralytics.nn.modules.conv.Concat [1] 15 -1 2 517632 ultralytics.nn.modules.block.C2f [576, 192, 2] 16 -1 1 332160 ultralytics.nn.modules.conv.Conv [192, 192, 3, 2] 17 [-1, 12] 1 0 ultralytics.nn.modules.conv.Concat [1] 18 -1 2 1846272 ultralytics.nn.modules.block.C2f [576, 384, 2] 19 -1 1 1327872 ultralytics.nn.modules.conv.Conv [384, 384, 3, 2] 20 [-1, 9] 1 0 ultralytics.nn.modules.conv.Concat [1] 21 -1 2 4207104 ultralytics.nn.modules.block.C2f [960, 576, 2] 22 [15, 18, 21] 1 3776275 ultralytics.nn.modules.head.Detect [1, [192, 384, 576]] Model summary: 295 layers, 25856899 parameters, 25856883 gradients
optimizer: SGD(lr=0.01, momentum=0.9) with parameter groups 77 weight(decay=0.0), 84 weight(decay=0.0005), 83 bias(decay=0.0)
Image sizes: 640 train, 640 val
WandB
3. OCR(Optical Character Recognition)
Model: EasyOCR
Preprocessing steps:
Grayscale Conversion: This simplifies the image by removing color information, making further processing faster and focusing on intensity.
Contrast Enhancement with CLAHE (Contrast Limited Adaptive Histogram Equalization): Improves the contrast of the image, making details more distinct, especially useful in varying lighting conditions.
Gaussian Blur: Reduces noise and smoothes the image, which can help in reducing false edges detected in the subsequent edge detection step.
Canny Edge Detection: Identifies edges in the image. This is useful for finding the boundaries of objects, in this case, the license plate.
Finding Contours and Perspective Transformation: Identifies contours in the image and, if a rectangular contour (assumed to be the license plate) is found, applies a perspective transformation to get a front-facing view of the license plate.
Original Image:
Detected Car:
Grayscale:
CLAHE:
Gaussian Blur:
Canny Edge Detection:
Attempts and Failure:
Tracking cars with yolov8:
- worse outputs compared to Sort, took longer time→ attempted at early stages, improved output expected
Clips from Dashboard cam:
Car and License Plates were well detected, but video quality too low for OCR
phenomenon occurred more frequently when relative speed of vehicle was faster
Room for Improvements:
Try variety of Object Detection models for comparison
Try variety of OCR models for comparison(TesseractOCR, PaddleOCR)
Enhance Video Quality for better detection and recognition
Try Segmentation