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 |