YOLOv3_TSTL

BERT·2023년 6월 21일
1

Perception

목록 보기
18/20

Traffic Sign Traffic Light

컨테이너 볼륨 연결 파일

yolov3-pytorch yolov3_onnx_rt 생성

컨테이너 생성 및 진입

컨테이너 생성

docker run \
--name yolov3_tstl \
--gpus all \
-p 6006:8888 \
-it \
-v ${PWD}/DockerFile/yolov3-pytorch:/yolov3-pytorch \
-v ${PWD}/DockerFile/yolov3_onnx_rt:/yolov3_onnx_rt \
-v /home/bert/Downloads/datasets/tstl/tstl_dataset:/yolov3-pytorch/datasets \
nvcr.io/nvidia/pytorch:21.12-py3 /bin/bash

재진입

docker start yolov3_tstl
docker exec -it yolov3_tstl /bin/bash

종속성

pip install -r /yolov3-pytorch/requirements.txt

실행

TSTL class

left
right
stop
crosswalk
uturn
traffic_light
xycar
ignore

훈련

ls *.jpg | awk -F/ '{gsub(".jpg$", "", $NF); print $NF}' > ../ImageSets/train.txt

.cfg Training으로 수정 후 진행(batch=32, subdivision=16)
--mode 훈련 모드
--cfg 모델 설정 파일
--gpus 사용할 VGA
--output 결과 출력 파일명

python main.py \
--mode train \
--cfg yolov3-tiny_tstl_416_my.cfg \
--gpus 0 \
--output tstl3

tensorboard 확인

tensorboard --logdir=./output/tstl3 --port 8888

웹에서 확인

http://localhost:6006/#scalars

평가

ls *.jpg | awk -F/ '{gsub(".jpg$", "", $NF); print $NF}' > ../ImageSets/eval.txt
python main.py \
--mode eval \
--cfg ./yolov3-tiny_tstl_416_my.cfg \
--gpus 0 \
--checkpoint ./output/tstl3/model_epoch8200.pth

테스트

ls *.jpg | awk -F/ '{gsub(".jpg$", "", $NF); print $NF}' > test.txt
ls *.png | awk -F/ '{gsub(".png$", "", $NF); print $NF}' > test.txt
python main.py \
--mode demo \
--cfg ./yolov3-tiny_tstl_416_my.cfg \
--gpus 1 \
--checkpoint ./output/tstl3/model_epoch8200.pth \
--output tstl3

ONNX 변환

model/yolov3.py에 ONNX_EXPORT = True
.cfg Testing으로 수정 후 진행(batch=1, subdivision=1)
파일 반환 : .onnx, darknet .weights

python main.py \
--mode onnx \
--cfg ./yolov3-tiny_tstl_416_my.cfg \
--gpus 0 \
--checkpoint ./output/tstl3/model_epoch8200.pth

추론

python onnx_infer.py \
--gpus 0 \
--model output/tstl3/model_epoch8200.onnx

TX2에서 실행할 것

python /yolov3_onnx_rt/yolov3_to_onnx.py \
--cfg ../yolov3-pytorch/yolov3-tiny_tstl_416_my.cfg \
--weights ../yolov3-pytorch/output/tstl3/model_epoch8200.weights \
--num_class 8

TensorRT 변환

TX2에서 실행할 것

python /yolov3_onnx_rt/onnx_to_tensorrt.py \
--cfg ../yolov3-pytorch/yolov3-tiny_tstl_416_my.cfg \
--onnx ../yolov3-pytorch/output/tstl3/model_epoch8200.onnx \
--num_class 8 \
--input_img datasets/test/img3_sign.jpg

Auto Labeling

python autolabel.py \
--gpus 0 \
--cfg yolov3-tiny_tstl_416_my.cfg \
--checkpoint output/tstl3/model_epoch8200.pth \
--output labeling

Auto Labeling에서 추출된 Annotation을 이용한 이미지 crop -> 신호등 인식 강건성 검증

REDYELLOWGREENOFF

결과

casedescription
1추론 실패
2~4epoch가 증가함에 따라
향상되는 성능 확인
5AutoLabeling과 검수를 통한
추가 데이터로 학습
6uturn\rarrsmall
추가 데이터로 최종 학습
7small 정확도 향상을 위한 추가 학습

1

총 데이터 484
train : val : test = 423 : 52 : 9
epoch=100
부적절한 cfg 설정으로 인한 추론 결과 부재

2

epoch=400
cfg 수정, NMS threshold 낮게 수정
인식은 되지만 겹치는 Bbox와 오인식된 class 확인

3

epoch=1100
pretrained weights 사용
cfg 수정 NMS threshold 낮게 수정
xycar, traffic light는 특징점이 많아서 인식력이 좋음
left, right 여전히 오인식

마지막까지 감소하는 cls loss

4

epoch=8400
overfitting이 의심스럽지만 정확도가 상당히 높아짐

cls_loss

learning rate

5

총 데이터 1735
train : val : test = 1565 : 150 : 20
epoch=2500
train 데이터셋에서 170개의 무작위 데이터를 eval 데이터셋으로 이동

#!/bin/bash

num_val_images=170
train_folder="./train"
val_folder="./eval"

train_images=("$train_folder/JPEGImages"/*.jpg)
shuf -zn"$num_val_images" -e "${train_images[@]}" | \
xargs -0 -I {} mv {} "$val_folder/JPEGImages"

for img_path in "$val_folder/JPEGImages"/*.jpg; do
    img_filename=$(basename "$img_path")
    annotation_file="$train_folder/Annotations/${img_filename%.*}.txt"
    if [ -f "$annotation_file" ]; then
        mv "$annotation_file" "$val_folder/Annotations"
    fi
done

데이터셋이 커져서 총 epoch는 줄었지만 총 step은 동일
검수 작업(잘못된 라벨링을 수정, 기준을 일관성있게 통일) 후
전보다 빠르게 수렴하는 것을 확인

6

총 데이터 1735 + 543
기존에 uturn에 대한 표지판 존재 X
따라서 uturn을 작은 모형차인 small로 대체
새로운 라벨 small을 위한 추가 데이터 543장
train : val : test = 2050 : 200 : 28
epoch=2000

7

small로만 이뤄진 데이터 239장을 이전 학습 모델에 추가 학습
train : val = 220 : 19

그래디언트 계산 및 파라미터 업데이트 과정에서 문제 발생
옵션을 --pretrained로 잘못 사용

300epoch만에 급격히 좋아진 인식률 확인

학습 전 epoch=2000

학습 후 epoch=2300

고찰

훈련

Batch Training

잘못 라벨링 된 데이터를 포함한 batch단위 학습
충분한 학습 결과 잘못된 GT 상쇄
낮은 확률로 옳바르게 추론(traffic light)

Ground TruthInference

Fine Tunning for HyperParameter

NonMaxSuppression 값을 낮추어 Bbox 검출 문턱값을 낮추고
대신 Accuracy를 0.5 이상으로 설정하여 학습하였더니 탁월한 성능 발휘

More Training Dataset

400여장의 데이터로 모델 구축 후 이를 토대로 AutoLabeling 구축
1700여장의 데이터 자동 라벨링 + 검수 작업 후 재학습 진행
이전보다 빠른 loss 수렴 + 인지 강건성 확보 확인

Another Object Detection Model

YOLOv5 사용 결과 단 시간 안에 높은 정확도 수렴

고성능 GPU vs TX2

Model Quantization

Model Acceleration

Model.pth.trt
fp16int8
fps
Accuracy

객체 위치 추정

Vision Geometry

BEV

0개의 댓글