Jetson & 머신러닝

[3] YOLO기반의 신호등 신호 인식을 통한 신호변경 안내 및 앞 차 출발인식 시스템 구축(프로그래밍, 하드웨어 구성 포함)

아크리엑터 2024. 7. 12. 12:52
반응형


앞의 게시물에서 하드웨어에 대한 설명을 했고, 그 하드웨어에 대한 safe shutdown 스크립트만 추가하면 하드웨어 관련 사항은 끝날 것 같다.

 

아래 글과도 관련있다.

https://makejarvis.tistory.com/170

 

[생활코딩#1] 이미지 학습 및 사물 인식 응용 방법

1. 배경 chatgpt 4o 가 일반화되는 상황에서, LLM으로 사람이 하는 모든 행위(보고, 듣고, 말하고, 생각하는)를 구현할수 있게 된다.   과거라면,  모델을 직접 만들어야지 내가 직접했다고 할수 있

makejarvis.tistory.com

 

1. safe shutdown

script를 os에 넣어서, 차량 전원이 꺼지면 OS를 자동으로 shutdown하도록 한다.   전원이 종료되면, 꺼지도록 만든다. 물론, 전원이 종료되었을 때, shutdown되는 동안 전원이 공급되도록 만들어줘야 한다.

 

이를 위해서는 아래의 2개 글을 참고해서, 특정 GPIO 핀이 ON상태가 되면, shutdown시키도록 설정을 하도록 한다.

https://makejarvis.tistory.com/147

 

jetson nano, xavier safe shutdown button 안전 종료 버튼 만들기 (1)

updated 2024.7.7   아래 것이 더 나아서 업데이트 합니다. 기존 글은 종료 버튼이 아니라, 다른 용도로 활용할 수 있습니다. https://makejarvis.tistory.com/171 아주 간단한, 우분투 전원버튼으로 자동 Shutdo

makejarvis.tistory.com

 

https://makejarvis.tistory.com/164

 

Jetson Xavier 안전 종료 버튼 실행(3)

updated 2024.7.7   아래 것이 더 나아서 업데이트 합니다. 아래 글은 다른 용도로 사용할 수있습니다. https://makejarvis.tistory.com/171 아주 간단한, 우분투 전원버튼으로 자동 Shutdown 종료 방법기존에는

makejarvis.tistory.com

 

마지막으로, 전원이 꺼졌을 때 GPIO핀을 ON상태로 바꿔주는 것은 별도의 회로로 구성을 한다. 이것은 아래의 글에 설명하였다.

https://makejarvis.tistory.com/152

 

[2] 신호등 신호 변경 인식 및 차량 출발 인식 시스템 만들기

몇 년전 차안에서 있은 일부터 기록한다. 첫번째 사례는 출근길에 자주 있었던 상황이다. 서울에서 분당까지 출근할 때, 사거리에 멈췄을 때 잠시 눈을 감고 쉴 때가 많다. 1시간의 출근 시간동

makejarvis.tistory.com

 

 

 

2. 신호등 인식을 시키기 위한 카메라 구입


usb 카메라를 구입했음.  시야각은 가능하면 좁게 볼수 있는 놈으로 정하는 것이 낫다. 75도짜리를 하려고 했는데, 최종은 90도 앵글의 카메라를 샀다.
https://s.click.aliexpress.com/e/_onw6XEm

 

US $42.44 | 3840*2160 4K HD CMOS IMX415 95 Degree USB 2.0 Camera Module With Digital Mic 30FPS  MJPEG, YUY2

US $42.44 | 3840*2160 4K HD CMOS IMX415 95 Degree USB 2.0 Camera Module With Digital Mic 30FPS MJPEG, YUY2

star.aliexpress.com



90도 짜리도 시야각이 좀 넓기는 하다. 그리고 촬영된 영상이 외곡이 안되어야지 분석하는데 효과적이지 않을까 싶다.

이것 저것 사다가 시험해보려하니 비용이 많이 들어서, 현재 있는 부품들로 한정하였다.


3. 학습하기 위한 차, 신로등 이미지 얻기

이미지를 얻는 방법은 다양할텐데, 하드웨어를 차량에 설치 하지 않은 상황이라서, 구매한 카메라를 휴대폰에 연결해서 동영상을 촬영하였다.
그 후, 촬영된 동영상에서 신호등과 차량 이미지를 뽑아내게 했다. 이 방법은 기존의 yolo의 기본적으로 제공되는 모델을 이용해서 자동차, 버스, 트럭, 신허등 이미지를 인식했을 때, 파일에 해당 이미지를 저장하고 인식한 이미지의 테두리 사각형을 표시하도록 하는 방식을 사용해봤다. 이 결과물을 이용해서, 신호등에 대한 색상인식만 추가하면 품질 수준이 더 높게 될 것 같은 생각에서...

하지만, 당장 빨리 하려니 노가다가 제일 쉬운 방법으로 직접 이미지 샘플링하고, 인형에 눈 붙이듯이 자동차와 신호등 색상을 분류하도록 하는 방식으로 진행했다.

위에서 전반적인 내용을 설명했는데, 촬영 동영상을 얻는 방법이다. 구매한 카메라를 휴대폰에 연결해서 촬영하는 방법은 아래의 앱을 사용하였다.  구글스토어에서 usb camera 일반 버전을 사용하였다. 다른 앱을 사용해도 된다.



촬영된 동영상에서 필요한 사진을 동영상 툴을 이용해서 스냅샷을 저장하였다. 이렇게 해서 실체 차량 주행 영상에서 스냅샷 사진을 수백개 만들었다.  블랙박스의 카메라 영상을 사용하니, 카메라 렌즈가 상이해서 이미지에 대한 인식이 다를 수 있어서, 실제 사용하게될 카메라로 촬영한 영상을 직접 얻어서 학습용도로 사용하게 하였다.


4. 라벨링 작업

학습을 시키기 위해서, 스냅샷으로 촬영한 파일에 눈알 붙이는 작업을 해야 한다. 이 라벨링 작업은 labelme 프로그램을 사용하였다. regtangle로 설정하였다. 

 오래간 만에 블로그 접속해서, "4.라벨링 작업"을 추가 업데이트 한다. 한 1년 만에 재정리하는 것 같다. 라벨링을  darknet의 yolo_mark를 사용하였다. 사용한 내용을 추가하려 블로그에 내용을 보니, 과거에는 labelme를 사용했었구나 하는 기억이 든다.

이미 새로운 사진들에 라벨링을 다 해버린 상황이라서,  yolo_mark로 그냥 아래에 설명한다. yolo_mark 는  아래의 github에서 설치할 수 있다. 

https://github.com/AlexeyAB/Yolo_mark

설치, 컴파일 방법은 별도로 하지 않겠다.  github에 설명된 내용을 보고 컴파일을 하면 된다.

 

라벨링을 하기 위해 촬영한 신호등, 도로 사진과 필요한 메타정보를 만든다. 우선, 이미지 파일과 필요한 메타정보를 아래에 설명한다.

-----+--- yolo_mark ----- yolo_mark
     |
     +--- traffic ------- train  ------  image   ----  *.jpg
     |
     +--- valid.txt
     |
     +--- traffic.objnames
     |
     +--- traffic.yaml

 

  • traffic.objnames :   내용은 아래에 순서대로 넣었다. 가로등, 건물 등과 같은 것을 추가하면 차가 서 있는 것을 인식할 수도 있을 텐데, 간단하게 몇개만 인식해서 돌아가게 만들어보려 한다.
car
red
green
red-left
green-left
warn
notice

 

  • valid.txt :  이미지 파일이 저장된 파일 목록이 들어간다.  find명령으로 만들었다. 약 300장 정도 넣었다.
../traffic/train/image/cap_IPS_2024-04-25.07.59.35.4290_00:00:01_03.jpg
../traffic/train/image/cap_IPS_2024-04-25.07.59.35.4290_00:00:04_04-bg.jpg
../traffic/train/image/cap_IPS_2024-04-25.07.59.35.4290_00:00:09_06.jpg
../traffic/train/image/cap_IPS_2024-04-25.07.59.35.4290_00:00:19_08.jpg
../traffic/train/image/cap_IPS_2024-04-25.07.59.35.4290_00:00:22_09.jpg
../traffic/train/image/cap_IPS_2024-04-25.07.59.35.4290_00:00:24_11.jpg
../traffic/train/image/cap_IPS_2024-04-25.07.59.35.4290_00:00:24_12.jpg
../traffic/train/image/cap_IPS_2024-04-25.07.59.35.4290_00:00:30_13-bg.jpg
../traffic/train/image/cap_IPS_2024-04-25.07.59.35.4290_00:00:33_15.jpg
../traffic/train/image/cap_IPS_2024-04-25.07.59.35.4290_00:00:34_16.jpg
../traffic/train/image/cap_IPS_2024-04-25.07.59.35.4290_00:00:34_17.jpg
../traffic/train/image/cap_IPS_2024-04-25.07.59.35.4290_00:00:43_19.jpg
../traffic/train/image/cap_IPS_2024-04-25.07.59.35.4290_00:00:45_20.jpg
../traffic/train/image/cap_IPS_2024-04-25.07.59.35.4290_00:00:53_21.jpg
../traffic/train/image/cap_IPS_2024-04-25.07.59.35.4290_00:01:39_22.jpg
../traffic/train/image/cap_IPS_2024-04-25.07.59.35.4290_00:01:44_24.jpg

 

  라벨링을 해보자. 아래와 같이 실행한다.

./yolo_mark ../traffic/train/image ../traffic/valid.txt ../traffic/traffic.objnames

 

실행된 GUI에서 사물(Object ID: 0부터 traffic.objnames에 등록된 순서대로 번호가 매겨진다)  각 사진의 사물마다 사각형으로 표시를 하여 Object-ID를 기록한다.

 

 

라벨링이 완료된 파일은 이미지파일이 있는 폴더에 텍스트 파일로 저장이 된다. 파일명은 "이미지파일명.txt" 형태로 저장된다. 그 내용은 아래와 같이 첫번째 컬럼은  오브젝트ID가, 그리고, 그 뒤의 4개의 숫자는 사각으로 표시한 좌표값이다. 전체 높이, 폭을 1.0으로 지정했을 때의 좌표값이다. 아래의 사례에는 2번 Green, 0번 Car, 6번 Notice 사물로 표시되었다.

2 0.507422 0.402083 0.107031 0.026389
0 0.485938 0.586806 0.056250 0.098611
0 0.544531 0.585417 0.034375 0.043056
6 0.650000 0.299306 0.078125 0.048611
6 0.805469 0.343056 0.043750 0.105556
6 0.592969 0.706944 0.306250 0.122222

 

5. PyTorch 2.1.0 / Torch Vision 0.16.1 설치(CUDA지원)

학습과 실제 추론 작업을 하기 위해, Jetson Device에 torch와 torchvision을 설치하였다. 기존 설치된 것은 CUDA를 지원하지 않아서, GPU없이 CPU로만 실행되어서 모두 삭제하고 설치하는 방식으로 CUDA지원하게 하였다.

jetson nano에서 이렇게 설치를 해서, 학습도 할 수 있지만 시간이 오래 걸리고 메모리의 제약이 있어서, 학습은 성능이 더 좋은 시스템에서 진행하도록 하였다. (내 경우에는  Jetson AGX Xavier가 있어서, 이것을 학습용으로 사용하였다)  당연히, 학습/추론에 사용할 디바이스에 아래 절차로 설치를 해줘야 한다. jetson nano에도 동일하게 설치된다.

https://makejarvis.tistory.com/166

 

torch / vision 설치 on Jetson Xavier (yolo GPU학습용)

1. 기본 설치$ sudo apt-get install python3-pip libopenblas-base libopenmpi-dev libomp-dev$ sudo pip3 install 'Cython 2. torch 다운로드   jetpack 5.1.3이 설치된 Xavier에서 여러가지 방법을 해봤다. 소스로 설치를 해봤고, whl

makejarvis.tistory.com

 

5. yolov8 설치/환경설정

아래의 2개 글을 참고해서, yolov8을 설치한다.  첫번째 글에 있는 yolov5를 사용해도 큰 차이는 없다.

https://makejarvis.tistory.com/172

 

python 가상환경(venv) 사용하기

1. 가상 환경프로젝트 마다 파이썬의 패키지 버전을 달리해야 하는 경우가 있는데, 개별 프로젝트 단위로 설치되는 패키지 버전을 달리할 수 있도록 한다. 2. venv 설치$ sudo apt install python3-venvReadi

makejarvis.tistory.com

 

https://makejarvis.tistory.com/167

 

yolov8 설치 on Jetson xavier

$ sudo pip3 install ultralyticsCollecting ultralytics Downloading ultralytics-8.2.48-py3-none-any.whl (793 kB) |████████████████████████████████| 793 kB 1.2 MB/s Collecting ultralytics-thop>=2

makejarvis.tistory.com

 

 

6. 학습

학습할 때 사용하기 위한 파일을 만든다.  traffic.yaml 파일의 내용을 아래와 같이 만든다.  "4.라벨링"에서 정의한 사물이름을 순서대로 지정하고,  사물의 개수를 nc로 표시한다. 마지막으로, 학습을 하기 위한 폴더의 위치를 등록한다. 아래는 상대패스로 기록하였는데, 절대패스로 등록해야 하는지 모르겠다. 해보고 안되면 재수정할 예정이다.  최종은 절대패스로 정의하였다.

그리고, 학습 후, 확인을 하기 위한 폴더를 하나더 만들어두었고, 기존의 학습용 파일을 동일하게 넣어두었다. 이 파일의 비율을 8:2로 만들어야 한다고 제일 좋은 결과가 나온다라는 말도 있는데, 잘 모르겠다. 우선은 돌아가게 만들자.

names:
  - car
  - red
  - green
  - red-left
  - green-left
  - warn
  - notice
nc: 7
train: /home/user/work/Data/traffic/train/images/
val: /home/user/work/Data/traffic/valid/images/

 

아래와 같이 실행해본다. yolov5가 설치된 폴더에서 아래의 명령을 입력하였다. 배치크기는 16, epochs는 100번으로 설정하였다. 

$ python train.py --batch 16 --epochs 100 --data ../Data/traffic/traffic.yaml --cfg models/yolov5n.yaml --weights weights/yolov5n.pt

 

실행되는 내용은 아래와 같이 출력된다. 만일 중간에 yaml에 등록된 path를 읽을 수 없으면 오류가 날 수 있다. 그것은 오류 내용을 보고 잘 고치면 될 것 같다.

 

 

 

 

 

 

train: weights=weights/yolov5n.pt, cfg=models/yolov5n.yaml, data=../Data/traffic/traffic.yaml, hyp=data/hyps/hyp.scratch-low.yaml, epochs=100, batch_size=16, imgsz=640, rect=False, resume=False, nosave=False, noval=False, noautoanchor=False, noplots=False, evolve=None, evolve_population=data/hyps, resume_evolve=None, bucket=, cache=None, image_weights=False, device=, multi_scale=False, single_cls=False, optimizer=SGD, sync_bn=False, workers=8, project=runs/train, name=exp, exist_ok=False, quad=False, cos_lr=False, label_smoothing=0.0, patience=100, freeze=[0], save_period=-1, seed=0, local_rank=-1, entity=None, upload_dataset=False, bbox_interval=-1, artifact_alias=latest, ndjson_console=False, ndjson_file=False
github: ⚠️ YOLOv5 is out of date by 77 commits. Use 'git pull' or 'git clone https://github.com/ultralytics/yolov5' to update.
YOLOv5 🚀 v7.0-321-g3742ab49 Python-3.8.10 torch-2.1.0a0+41361538.nv23.06 CUDA:0 (Xavier, 30991MiB)

hyperparameters: 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=0.05, cls=0.5, cls_pw=1.0, obj=1.0, obj_pw=1.0, iou_t=0.2, anchor_t=4.0, fl_gamma=0.0, 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
Comet: run 'pip install comet_ml' to automatically track and visualize YOLOv5 🚀 runs in Comet
TensorBoard: Start with 'tensorboard --logdir runs/train', view at http://localhost:6006/
Downloading https://github.com/ultralytics/yolov5/releases/download/v7.0/yolov5n.pt to weights/yolov5n.pt...
100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 3.87M/3.87M [00:00<00:00, 26.0MB/s]

Overriding model.yaml nc=80 with nc=7

                 from  n    params  module                                  arguments                     
  0                -1  1      1760  models.common.Conv                      [3, 16, 6, 2, 2]              
  1                -1  1      4672  models.common.Conv                      [16, 32, 3, 2]                
  2                -1  1      4800  models.common.C3                        [32, 32, 1]                   
  3                -1  1     18560  models.common.Conv                      [32, 64, 3, 2]                
  4                -1  2     29184  models.common.C3                        [64, 64, 2]                   
  5                -1  1     73984  models.common.Conv                      [64, 128, 3, 2]               
  6                -1  3    156928  models.common.C3                        [128, 128, 3]                 
  7                -1  1    295424  models.common.Conv                      [128, 256, 3, 2]              
  8                -1  1    296448  models.common.C3                        [256, 256, 1]                 
  9                -1  1    164608  models.common.SPPF                      [256, 256, 5]                 
 10                -1  1     33024  models.common.Conv                      [256, 128, 1, 1]              
 11                -1  1         0  torch.nn.modules.upsampling.Upsample    [None, 2, 'nearest']          
 12           [-1, 6]  1         0  models.common.Concat                    [1]                           
 13                -1  1     90880  models.common.C3                        [256, 128, 1, False]          
 14                -1  1      8320  models.common.Conv                      [128, 64, 1, 1]               
 15                -1  1         0  torch.nn.modules.upsampling.Upsample    [None, 2, 'nearest']          
 16           [-1, 4]  1         0  models.common.Concat                    [1]                           
 17                -1  1     22912  models.common.C3                        [128, 64, 1, False]           
 18                -1  1     36992  models.common.Conv                      [64, 64, 3, 2]                
 19          [-1, 14]  1         0  models.common.Concat                    [1]                           
 20                -1  1     74496  models.common.C3                        [128, 128, 1, False]          
 21                -1  1    147712  models.common.Conv                      [128, 128, 3, 2]              
 22          [-1, 10]  1         0  models.common.Concat                    [1]                           
 23                -1  1    296448  models.common.C3                        [256, 256, 1, False]          
 24      [17, 20, 23]  1     16236  models.yolo.Detect                      [7, [[10, 13, 16, 30, 33, 23], [30, 61, 62, 45, 59, 119], [116, 90, 156, 198, 373, 326]], [64, 128, 256]]
YOLOv5n summary: 214 layers, 1773388 parameters, 1773388 gradients, 4.3 GFLOPs

Transferred 342/349 items from weights/yolov5n.pt
AMP: checks passed ✅
optimizer: SGD(lr=0.01) with parameter groups 57 weight(decay=0.0), 60 weight(decay=0.0005), 60 bias
train: Scanning /home/user/work/Data/traffic/train/labels... 333 images, 14 backgrounds, 0 corrupt: 100%|██████████| 333/333 [00:00<00:00, 1662.54it/s]
train: New cache created: /home/user/work/Data/traffic/train/labels.cache
val: Scanning /home/user/work/Data/traffic/valid/labels... 333 images, 14 backgrounds, 0 corrupt: 100%|██████████| 333/333 [00:00<00:00, 993.60it/s]
val: New cache created: /home/user/work/Data/traffic/valid/labels.cache

AutoAnchor: 4.65 anchors/target, 0.989 Best Possible Recall (BPR). Current anchors are a good fit to dataset ✅
Plotting labels to runs/train/exp3/labels.jpg... 
Image sizes 640 train, 640 val
Using 8 dataloader workers
Logging results to runs/train/exp3
Starting training for 100 epochs...



      Epoch    GPU_mem   box_loss   obj_loss   cls_loss  Instances       Size
       0/99      2.11G     0.1206    0.04806    0.05579         87        640: 100%|██████████| 21/21 [00:15<00:00,  1.36it/s]
                 Class     Images  Instances          P          R      mAP50   mAP50-95: 100%|██████████| 11/11 [00:13<00:00,  1.19s/it]
                   all        333       1190     0.0305     0.0447       0.02    0.00446

      Epoch    GPU_mem   box_loss   obj_loss   cls_loss  Instances       Size
       1/99      2.31G     0.0998    0.04277     0.0301         80        640: 100%|██████████| 21/21 [00:09<00:00,  2.13it/s]
                 Class     Images  Instances          P          R      mAP50   mAP50-95: 100%|██████████| 11/11 [00:13<00:00,  1.25s/it]
                   all        333       1190      0.308     0.0799     0.0188    0.00626

      Epoch    GPU_mem   box_loss   obj_loss   cls_loss  Instances       Size
       2/99      2.31G    0.09208    0.03586    0.02094         83        640: 100%|██████████| 21/21 [00:09<00:00,  2.19it/s]
                 Class     Images  Instances          P          R      mAP50   mAP50-95: 100%|██████████| 11/11 [00:13<00:00,  1.18s/it]
                   all        333       1190        0.9     0.0692     0.0418      0.011

      Epoch    GPU_mem   box_loss   obj_loss   cls_loss  Instances       Size
       3/99      2.31G    0.08904    0.03495    0.01649         87        640: 100%|██████████| 21/21 [00:09<00:00,  2.24it/s]
                 Class     Images  Instances          P          R      mAP50   mAP50-95: 100%|██████████| 11/11 [00:13<00:00,  1.27s/it]
                   all        333       1190      0.648     0.0805     0.0656     0.0175

      Epoch    GPU_mem   box_loss   obj_loss   cls_loss  Instances       Size
       4/99      2.31G    0.08878    0.03333     0.0152         83        640: 100%|██████████| 21/21 [00:09<00:00,  2.23it/s]
                 Class     Images  Instances          P          R      mAP50   mAP50-95: 100%|██████████| 11/11 [00:13<00:00,  1.25s/it]
                   all        333       1190      0.824     0.0829     0.0808     0.0253

      Epoch    GPU_mem   box_loss   obj_loss   cls_loss  Instances       Size
       5/99      2.31G    0.08165    0.03347    0.01426        118        640: 100%|██████████| 21/21 [00:09<00:00,  2.29it/s]
                 Class     Images  Instances          P          R      mAP50   mAP50-95: 100%|██████████| 11/11 [00:11<00:00,  1.01s/it]
                   all        333       1190      0.817     0.0848     0.0868     0.0216

      Epoch    GPU_mem   box_loss   obj_loss   cls_loss  Instances       Size
       6/99      2.31G    0.07724    0.03031    0.01322         80        640: 100%|██████████| 21/21 [00:10<00:00,  1.92it/s]
                 Class     Images  Instances          P          R      mAP50   mAP50-95: 100%|██████████| 11/11 [00:12<00:00,  1.11s/it]
                   all        333       1190       0.81     0.0977     0.0615     0.0141

      Epoch    GPU_mem   box_loss   obj_loss   cls_loss  Instances       Size
       7/99      2.31G    0.07345    0.03155    0.01198        125        640: 100%|██████████| 21/21 [00:10<00:00,  2.01it/s]
                 Class     Images  Instances          P          R      mAP50   mAP50-95: 100%|██████████| 11/11 [00:13<00:00,  1.22s/it]
                   all        333       1190      0.808      0.169      0.122     0.0504

      Epoch    GPU_mem   box_loss   obj_loss   cls_loss  Instances       Size
       8/99      2.31G    0.06562    0.03033    0.01177         82        640: 100%|██████████| 21/21 [00:09<00:00,  2.24it/s]
                 Class     Images  Instances          P          R      mAP50   mAP50-95: 100%|██████████| 11/11 [00:13<00:00,  1.20s/it]
                   all        333       1190      0.804      0.163      0.116     0.0505

      Epoch    GPU_mem   box_loss   obj_loss   cls_loss  Instances       Size
       9/99      2.31G     0.0634    0.02779      0.011         76        640: 100%|██████████| 21/21 [00:09<00:00,  2.21it/s]
                 Class     Images  Instances          P          R      mAP50   mAP50-95: 100%|██████████| 11/11 [00:12<00:00,  1.17s/it]
                   all        333       1190      0.868      0.175       0.17     0.0662

      Epoch    GPU_mem   box_loss   obj_loss   cls_loss  Instances       Size
      10/99      2.31G    0.06268    0.02843    0.01015        110        640: 100%|██████████| 21/21 [00:09<00:00,  2.22it/s]
                 Class     Images  Instances          P          R      mAP50   mAP50-95: 100%|██████████| 11/11 [00:13<00:00,  1.20s/it]
                   all        333       1190      0.838      0.184      0.149     0.0679
                   
   .......
   
   
         Epoch    GPU_mem   box_loss   obj_loss   cls_loss  Instances       Size
      98/99      2.31G     0.0241    0.01906   0.003498         96        640: 100%|██████████| 21/21 [00:10<00:00,  1.96it/s]
                 Class     Images  Instances          P          R      mAP50   mAP50-95: 100%|██████████| 11/11 [00:17<00:00,  1.63s/it]
                   all        333       1190       0.81      0.403      0.424      0.275

      Epoch    GPU_mem   box_loss   obj_loss   cls_loss  Instances       Size
      99/99      2.31G    0.02376     0.0183   0.003537         79        640: 100%|██████████| 21/21 [00:13<00:00,  1.56it/s]
                 Class     Images  Instances          P          R      mAP50   mAP50-95: 100%|██████████| 11/11 [00:16<00:00,  1.52s/it]
                   all        333       1190      0.818      0.404      0.424      0.275

100 epochs completed in 0.812 hours.
Optimizer stripped from runs/train/exp3/weights/last.pt, 3.8MB
Optimizer stripped from runs/train/exp3/weights/best.pt, 3.8MB

Validating runs/train/exp3/weights/best.pt...
Fusing layers... 
YOLOv5n summary: 157 layers, 1768636 parameters, 0 gradients, 4.2 GFLOPs
                 Class     Images  Instances          P          R      mAP50   mAP50-95: 100%|██████████| 11/11 [00:12<00:00,  1.15s/it]
                   all        333       1190      0.817      0.403      0.424      0.277
                   car        333        681      0.936       0.99      0.992      0.826
                   red        333         43      0.468      0.186      0.297      0.147
                 green        333        126      0.482      0.706      0.591      0.293
              red-left        333         19          1          0     0.0691     0.0326
            green-left        333         16          1          0    0.00867    0.00473
                  warn        333         16          1          0     0.0749     0.0418
                notice        333        289      0.836      0.941      0.935      0.595
Results saved to runs/train/exp3

 

학습 완료 후의 결과를 확인해봤는데, 정확도가 많이 떨어진다.  인식을 정확히 해야 하는 것이 car, gree, red-left, green-left에 대한 인식을 정확히 해야지 출발을 알려줄 수 있다. 

 

블랙박스에서 신호등 사진을 많이 구해서 추가해야겠다.

또, 이미지를 추가해서 해봤다.

      Epoch    GPU_mem   box_loss   obj_loss   cls_loss  Instances       Size
    999/999         4G    0.01174   0.007816  0.0005113        103        640: 100%|██████████| 21/21 [00:15<00:0
                 Class     Images  Instances          P          R      mAP50   mAP50-95: 100%|██████████| 6/6 [0
                   all        333       1190      0.962      0.893       0.96      0.758

1000 epochs completed in 9.173 hours.
Optimizer stripped from runs/train/exp5/weights/last.pt, 3.8MB
Optimizer stripped from runs/train/exp5/weights/best.pt, 3.8MB

Validating runs/train/exp5/weights/best.pt...
Fusing layers... 
YOLOv5n summary: 157 layers, 1768636 parameters, 0 gradients, 4.2 GFLOPs
                 Class     Images  Instances          P          R      mAP50   mAP50-95: 100%|██████████| 6/6 [0
                   all        333       1190      0.964       0.89      0.962      0.758
                   car        333        681      0.996      0.996      0.995      0.959
                   red        333         43       0.89      0.884      0.938       0.67
                 green        333        126      0.931      0.873       0.96      0.715
              red-left        333         19      0.944       0.89      0.966      0.735
            green-left        333         16          1      0.605      0.884      0.664
                  warn        333         16          1      0.992      0.995      0.691
                notice        333        289      0.987      0.993      0.995      0.872
Results saved to runs/train/exp5

빨간색, 좌회전, 노란색 신호등이 부족하다.  내가 직진을 많이하고 정지선에 멈추는 회수가 작다는 것인가!...

그래프만 보면, 이전 보다 훨씬 좋아보이기는 하는데, 실제 사진을 인식시켜 보니 잘못 인식하는 경우와 인식되지 못하는 경우가 발생된다. 빨간색과 좌회전 신호를 잘 찾지를 못한다.  노란색은 잘 만나지를 못하는 터라 그리고, 노란색은 이후에 사용하지 않을 것이라 크게 고려될 부분은 아니다. 빨간색과 좌회전 신호를 찾아서 넣어보자.  (언제??  나중에...) 

우선 진도를 나가야 겠다.

 

7. 시험

 

 

 

8. 차량 장착

 

 

 

9. 실제 적용한 내용

 

 

 

 

 

 

반응형