Skip to main content

Featured

YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors review

 YOLO 버전이 v7 버전으로 논문이 발표되었다. papers with code에서 쉽게 확인할 수 있으며 이 논문은 모듈 최적화 기법 위주이다. CSPNet이라던지 RepVGG 같은 관련 네트워크들을 간단하게 공부하고 논문을 이해하는 것을 추천한다. 아래는 official github이며 ReadMe를 보면 쉽게 사용 방법을 알 수 있다. https://github.com/wongkinyiu/yolov7 또한 본 논문은 아래와 같다. Wang, Chien-Yao, Alexey Bochkovskiy, and Hong-Yuan Mark Liao. "YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors." arXiv preprint arXiv:2207.02696 (2022). 그렇다면 간략하게 논문에 대해 알아보도록 한다. - Abstract YOLOv7이 알려진 모든 detector들보다 정확도와 속도 면에서 성능을 능가하고 있다고 설명한다. 또한 이 네트워크를 오직 COCO 데이터셋으로만 훈련했다고 설명한다. 다른 네트워크들보다 확실히 좋은 성능을 내고 있다는 것으로 abstract에서 소개하고 있다. - Introduction  이 논문에서 제안한 real-time detector는 주로 mobile GPU나 GPU 장치를 지지할 수 있다는 것을 희망한다고 한 것을 보아 GPU가 필요하다는 것으로 이해하였다. 또한 이 논문에서 제안된 방법들의 개발 방향을 현재 real-time detector들의 개발 흐름과 다르다고 설명한다. 훈련 과정의 최적화에 집중했다고 한다. 그래서 중점적인 것이 정확도를 향상시키기 위한 훈련 cost를 강화화는 최적화된 모듈과 최적 기법이라고 설명한다.  논문의 제목에서 나오는데 제안된 모듈들과 최적 기법들을 trainable bag-of-freebies라고 칭한다. 최근에, model re-pa...

Drawing Circle Problem

이번엔 간단히 원을 어떻게 그릴 수 있는지에 대해서 설명한다. 

Wave 1)

먼저 아래와 같은 원의 방정식이 있다.

$$(x - x_c)^2+(y - y_c)^2 = r^2$$

이는 x-y plane에서의 중심이 ($x_c$, $y_c$)이고 반지름이 $r$인 원이다. 이를 x 그리고 y로 정리하면 다음과 같다.

$$x = x_c \pm \sqrt{r^2-(y-y_c)^2}$$

$$y = y_c \pm \sqrt{r^2-(x-x_c)^2}$$

이를 가지고 Matlab을 이용하여 원을 그리기 위한 코드를 Line-by-Line으로 작성해본다.

먼저 원하는 원의 중심 그리고 반지름을 다음과 같이 선언한다.

1
2
3
4
x_c = 5;
y_c = 4;
r   = 1;
 
cs

다음으로 x축의 데이터를 생성을해야하는데, 위 식에서 $\pm$부분이 걸린다. 한번에 x축의 데이터를 저장할 수 없을 것 같으니 다음과 같이 선언해보자

1
2
3
4
5
6
7
8
dp = 0.01;
x_p = ((x_c - r):dp:(x_c + r))'; % y_p를 위해 x_c-r ~ x_c+r를 0.01간격으로 데이터 생성
x_n = ((x_c - r):dp:(x_c + r))'; % y_n을 위해 x_c-r ~ x_c+r를 0.01간격으로 데이터 생성
y_p = y_c + sqrt(r^2 - (x_p-x_c).^2);
y_n = y_c - sqrt(r^2 - (x_n-x_c).^2);
 
circle_pt = [x_p, y_p; x_n, y_n]; % 원을 이루는 x,y position을 하나의 배열로 통합
 
cs

circle_pt 행렬 변수로 원의 x, y position 정보를 하나의 배열로 통합하였다.
그러면 이를 간단히 plotting을 해보는 코드 작성은 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
12
figure;
plot(x_c,y_c,'r.','MarkerSize',20);%원의 중심점 찍자
hold on; grid on; %다음 그림이랑 겹쳐그릴 거고 grid를 생성해주자
xlim([x_c-r x_c+r]);    %plot x 축 표현 범위 설정
ylim([y_c-r y_c+r]);    %plot y 축 표현 범위 설정
title('Draw Circle')
xlabel('X-pos[m]');     %이왕이면 plot x 축 설명도
ylabel('Y-pos[m]');     %이왕이면 plot y 축 설명도
%Line 으로 그리기
plot(circle_pt(:,1),circle_pt(:,2),'b-','LineWidth',2); 
%점으로 찍어서 그리기
plot(circle_pt(:,1),circle_pt(:,2),'k.','MarkerSize',20);
cs

결과 plot은 다음과 같다.

잘 그려진 것 같다.
하지만 Line(파란색)으로 그려진게 x축으로 일직선으로 그려졌고, dot(검은색)으로 그려진것은 뭔가 x축 양쪽에 허전 한 부분이 생긴다.... 이건 변수 dp를 더 줄여도 이런현상이 생긴다. 
( 직접 해보세요 (ว˙∇˙)ง ).

다른 방법이 필요할 것 같다.

Wave 2)
다른 식을 사용해서 그려보자 Wave 1은 뭔가 찝찝했다.
이번엔 다음 식을 통해 그리는 것을 도전해보자

$$x = x_c+rcos\theta$$
$$y = y_c+rsin\theta$$

작성한 부분에서 수식 부분 이외에 별 다르게 바뀐건 없을것이라 생각이 들어야한다.


1
2
3
4
5
6
7
8
r = 5;
x_c = 5;    y_c = 5;
 
angle = (0:0.1:2*pi)';
 
x1 = (x_c + r*cos(angle));
y1=  (y_c + r*sin(angle));
circle_pt = [x1, y1];
cs

그렇다면 이를 이전것과 동일한 방식으로 plot 해보자

1
2
3
4
5
6
7
8
9
10
11
figure;
plot(x_c ,y_c,'r.','MarkerSize',20); hold on; grid on;
title('Draw Circle');
xlabel('X-pos[m]');     %이왕이면 plot x 축 설명도
ylabel('Y-pos[m]');     %이왕이면 plot y 축 설명도
xlim([x_c-r x_c+r]);    %plot x 축 표현 범위 설정
ylim([y_c-r y_c+r]);    %plot y 축 표현 범위 설정
%Line 으로 그리기
plot(circle_pt(:,1),circle_pt(:,2),'b-','LineWidth',2); 
%점으로 찍어서 그리기
plot(circle_pt(:,1),circle_pt(:,2),'k.','MarkerSize',20);
cs

결과 그림은 다음과 같다.


너무 잘 그려져서 뿌듯하다(*˘◡˘*)~.

Wave 3) 조금 더 가지고 놀아보면 원하는 각도 위치에서 1바퀴 도는 코드를 작성해보자

전체적으로 코드는 동일하고 plot을 어떻게 해줄지에 대한 요령을 다음 코드를 통해 습득해보자,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
clear all;
close all;
clc;
 
deg2rad = pi/180;
 
r = 5;
x_c = 5;    y_c = 5;
 
angle = (45:5:45+(360*1))'*deg2rad;% 저는 deg가 좋아요
 
x1 = (x_c + r*cos(angle));
y1=  (y_c + r*sin(angle));
circle_pt = [x1, y1];
 
figure;
plot(x_c ,y_c,'r.','MarkerSize',10); hold on; grid on;
title('Draw Circle');
xlabel('X-pos[m]');     %이왕이면 plot x 축 설명도
ylabel('Y-pos[m]');     %이왕이면 plot y 축 설명도
xlim([x_c-r x_c+r]);    %plot x 축 표현 범위 설정
ylim([y_c-r y_c+r]);    %plot y 축 표현 범위 설정
 
plot(circle_pt(1,1),circle_pt(1,2),'b.','MarkerSize',20);
for i=2:1:length(circle_pt)-1
    plot(circle_pt(i,1),circle_pt(i,2),'k.','MarkerSize',5);
    drawnow();
    pause(0.1);
end
plot(circle_pt(length(circle_pt),1),circle_pt(length(circle_pt),2),'r.','MarkerSize',20);
 
cs

결과는 다음 영상과 같다.


Wave 3까지 작성했는데 "단순히 원을 그린다"가 아니라 이를 위해 어떻게 Data를 저장해야하는지, 이 때 배열을 사용했는데 왜 배열을 사용하였는지(그냥 사용하기 편해서 사용하긴함), 왜 그렇게 배열을 구성했는지, Line으로 그리고 Dot으로 따로 보여준 것인지, 마지막 영상에서는 왜 점을 하나씩 찍으면서 원을 그렸는지 한번쯤은 고민? 추리? 해줬으면 한다.
 

Comments