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
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 --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
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
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
python autolabel.py \
--gpus 0 \
--cfg yolov3-tiny_tstl_416_my.cfg \
--checkpoint output/tstl3/model_epoch8200.pth \
--output labeling
Auto Labeling에서 추출된 Annotation을 이용한 이미지 crop -> 신호등 인식 강건성 검증
| RED | YELLOW | GREEN | OFF |
|---|---|---|---|
![]() | ![]() | ![]() | ![]() |
| case | description |
|---|---|
| 1 | 추론 실패 |
| 2~4 | epoch가 증가함에 따라 향상되는 성능 확인 |
| 5 | AutoLabeling과 검수를 통한 추가 데이터로 학습 |
| 6 | uturnsmall 추가 데이터로 최종 학습 |
| 7 | small 정확도 향상을 위한 추가 학습 |
총 데이터 484
train : val : test = 423 : 52 : 9
epoch=100
부적절한 cfg 설정으로 인한 추론 결과 부재
epoch=400
cfg 수정, NMS threshold 낮게 수정
인식은 되지만 겹치는 Bbox와 오인식된 class 확인
![]() |
epoch=1100
pretrained weights 사용
cfg 수정 NMS threshold 낮게 수정
xycar, traffic light는 특징점이 많아서 인식력이 좋음
left, right 여전히 오인식
마지막까지 감소하는 cls loss

![]() | ![]() |
![]() | ![]() |
epoch=8400
overfitting이 의심스럽지만 정확도가 상당히 높아짐
cls_loss

learning rate

![]() | ![]() |
![]() | ![]() |
총 데이터 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은 동일
검수 작업(잘못된 라벨링을 수정, 기준을 일관성있게 통일) 후
전보다 빠르게 수렴하는 것을 확인


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

![]() | ![]() |
small로만 이뤄진 데이터 239장을 이전 학습 모델에 추가 학습
train : val = 220 : 19
그래디언트 계산 및 파라미터 업데이트 과정에서 문제 발생
옵션을 --pretrained로 잘못 사용
300epoch만에 급격히 좋아진 인식률 확인

학습 전 epoch=2000
학습 후 epoch=2300
잘못 라벨링 된 데이터를 포함한 batch단위 학습
충분한 학습 결과 잘못된 GT 상쇄
낮은 확률로 옳바르게 추론(traffic light)
| Ground Truth | Inference |
|---|---|
![]() |
NonMaxSuppression 값을 낮추어 Bbox 검출 문턱값을 낮추고
대신 Accuracy를 0.5 이상으로 설정하여 학습하였더니 탁월한 성능 발휘
400여장의 데이터로 모델 구축 후 이를 토대로 AutoLabeling 구축
1700여장의 데이터 자동 라벨링 + 검수 작업 후 재학습 진행
이전보다 빠른 loss 수렴 + 인지 강건성 확보 확인
YOLOv5 사용 결과 단 시간 안에 높은 정확도 수렴
| Model | .pth | .trt |
|---|---|---|
| fp16 | int8 | |
| fps | ||
| Accuracy |