기존에 사용한던 YOLOv3-Tiny에서 YOLOv5로 모델을 바꾸고 난 뒤부터, AI Turret을 제작하는 속도가 빨라졌다.
지금까지 YOLO가 Turret 설계에 있어 큰 걸림돌이었던 것 같다.
하지만 YOLO 문제가 어느 정도 해결되고 나니, 갑자기 잘 되던 3D Printer로 출력한 Frame에서 문제가 발생하였다... 🙈
이전 개발 일지(종합설계 일지 #5 ...)에서 변경한 목표 Object인 Pistol에 대해 Google Colab을 통해 학습을 진행하였다. 이번 학습은 YOLOv3-Tiny의 학습과는 달리 Colab의 프로세서 문제없이 원활한 학습이 가능했다.
학습에 필요한 이미지는 “RoboFolw”의 Pistol dataset을 활용하였다.
box_loss = 좌표값을 학습할 때의 loss
obj_loss = object인지 아닌지의 loss
cls_loss = 해당 object 학습 시 loss
mAP = 모든 점을 보간법을 이용해서 AP를 구한 값의 평균
AP = 평균 정밀도이며 Precision과 Recall을 고려한 종합적 평가 지표
(AP는 0~1 사이의 모든 Recall에 대응하는 평균 정확도)
Recall = 재현률로서 모든 정답 bounding box를 찾는 모델의 성능
Precision = 관련 객체만을 식별하는 모델의 성능
그래프에서 볼 수 있듯이 box_loss와 obj_loss는 학습이 진행될수록 감소하는 그래프를 cls_loss는 일정한 값을 유지한다. mAP, Precision, Recall의 그래프는 1에 수렴하는 형태로 나타난다.
학습이 진행될수록 낮은 손실률(loss)을 보이고 있으며, 동시에 높은 Recall을 보이고 있는 것을 볼 수 있다.
위의 학습 결과 분석을 통해 Custom된 Model이 높은 신뢰도를 보이고 있다는 것을 알 수 있었고, 이를 기반으로 실제 Object 이미지를 입력하여 탐지하는 실험을 진행하였다.
다양한 Pistol이 있는 Image Set에서 학습한 Object인 Pistol만 잘 탐지하는 것을 볼 수 있다.
간혹 몇 장 정도는 놓치긴 하지만, YOLOv3-Tiny에 비해 전반적으로 높은 인식률을 보이고 있다는 것을 알 수 있다.
YOLOv5를 사용한 Pistol Detect 실험을 하기 이전에, AI Turret을 구동할 환경인 PC 환경에서 YOLOv5의 기본 라이브러리를 사용한 실험을 진행하였다. 이는 YOLOv5에 대해 필요한 정보나 설정 등을 미리 확인하기 위함이다.
Galaxy Book 환경에서 정상 작동이 되는 것과 Person, Cell Phone으로 Object를 탐지하는 것을 볼 수 있다. 이때 사용한 카메라는 갤럭시북에 내장되어 있는 Web Cam이다.
YOLOv3-Tiny에 비해 더욱 빠른 프레임과 높은 인식률을 보였기에 YOLOv5는 AI Turret에 사용되기 적합한 것으로 생각된다.
Google Colab을 통해 학습한 Pistol에 대한 Data는 “best.pt”라는 파일로 추출된다. 여기서 best.pt 파일은 학습에 사용된 train, weight, cfg, names 등의 여러 정보를 담고 있는 파일이다.
이번 실험에서는 YOLOv5의 기본 설정값인 “yolov5s.pt”를 대신해서 학습한 best.pt 파일을 사용하였다. 이후, Pistol의 좌표를 탐지하는 실험을 진행하였다.
실험 당시, 목표 Object인 Pistol이 없어 위의 그림과 같이 권총 이미지를 종이에 출력하여 실험에 사용하였다. 종이에 출력된 Pistol 이미지여도 잘 인식하는 것을 볼 수 있고 충분한 영상 프레임이 나온다는 것을 알 수 있었다.
이번 실험은 목표 Object인 Pistol을 탐지 후, Object에 생긴 B.Box(Bounding Box)의 좌표값을 출력하는 것으로 구성되어있다.
이를 구현하기 위해서는 B.Box를 탐지하는 알고리즘이 있는 YOLOv5 내부 파일 중 “detect.py”를 활용하여야 한다. 또한, 기존 코드를 수정함으로써 B.Box의 좌표값을 추출할 수 있다.
기존 코드를 수정하여 구한 B.Box의 각각의 좌표를 활용하여 B.Box의 중앙값을 찾을 수 있으며, 이렇게 구한 좌표값을 활용하여 ESP32에 연결된 Servo Motor를 동작시킬 예정이다.
ESP32가 Servo Motor를 제어하기 위해서는 좌표값에 따른 Servo Motor 동작 각도가 필요한데, 이를 PC 환경에서 미리 계산하여 ESP32로 전송해줄 계획이다.
이러한 기능을 구현하기 위해서는 B.Box를 탐지하고 좌표값을 추출하는 detect.py을 활용하는 것이 아닌, subprocess 함수를 사용하여 best.pt를 호출하여 detect.py를 사용하는 추가적인 파일이 필요하다.
따라서 ESP32.py라는 파일을 만들어, pyserial을 활용하여 ESP32와의 통신을 구현할 수 있도록 만들었다.
ESP32.py
import subprocess
import serial
command = "python detect.py --weights best.pt --conf 0.7 --img 416 --source 0"
process= subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
subprocess.run(command, shell=True)
ser = serial.Serial('COM1', 115200)
while True:
output = process.stdout.readline()
if not output and process.poll() is not None:
break
if output:
coordinates = "x1 y1 x2 y2"
ser.write(coordinates.encode())
ser.close()
위 사진에서의 터미널 화면을 보면 감지된 Object의 class name과 그에 따흔 신뢰도, B.Box에 대한 좌표값이 출력되는 것을 볼 수 있다. 이는 아래의 코드와 동일하며, "BBox:" 뒷 부분이 B.Box의 각 지점의 좌표를 표시하고 있는 것이다.
Image 0, Class: pistol, Confidence: 0.91, BBox: [tensor (566.), tensor (295.), tensor (794.), tensor (547.)]
3D Printer를 이용하여 미리 설계해둔 AI Turret의 Frame을 출력하였으나, 모든 출력물이 온전히 출력된 것은 아니었다.
이는 Proto-Type을 출력한 후, 문제점을 수정한 설계를 진행하지 못하였기에 이러한 문제가 발생한 것으로 보인다.
Tilt Module 설계 Image 및 3D Printing 출력물
아쉽게도 Tilt Module은 크기 문제 때문에 5번의 재출력을 하였음에도 지금도 출력이 불가능한 상태이다. 이는 출력에서 발생하는 문제를 찾아 해결할 예정이다.
Pan Module 설계 Image 및 3D Printing 출력물
Pan Module 또한 Pan Servo Motor를 Frame 하단부에 위치시키는 과정에서 공간이 부족하였으며, Servo Motor의 Bracket 부분의 크기가 잘 못 되어 출력물에 대해 후가공이 필요하여 이를 수정하여 다시 출력해야 할 것으로 판단된다.
1st Axis Stabilizer Module 설계 Image 및 3D Printing 출력물
하지만 1st Axis Stabilizer Module은 온전히 출력되었으며, 실제로 Servo Motor를 위치시켜보아도 아무런 문제없이 정상적으로 동작하였다.
아마 Pan Module을 온전히 재출력 하여 모두 조립해보아야 특정 부품들의 재설계 필요 여부가 확실히 정해질 것으로 판단된다.
위의 출력된 여러 Frame 중 실험이 가능한 출력물만 사용하여 동작시키는 실험을 진행하였다.
하지만 Servo Motor를 출력된 Frame과 함께 조립하고 동작시켜보니, 의도와
동일하게 동작하는 것으로 보아 몇몇의 문제점만 보완하면 정상 작동이 가능할 것으로 판단된다.
최종 형상을 AI Turret System의 하단부에 무거운 물체를 두어 구성하는 것으로 정하였는데, 이를 더욱 추상화한 것이 아래의 그림이다.
위 그림에서 볼 수 있듯이 AI Turret System의 하단부에 아크릴 판을 덧대어 Power Supply, ESP32, 1ch Relay 등의 장비들을 두고 Main Processor를 MacBookAir M1으로 두었다.