반응형

YOLO는 많은 사람들이 사용하고 있는 객체 인식 오픈소스입니다.

이미 선행학습 (Pre-trained)된 데이터도 있지만, 제가 원하는 클래스는 송전탑 (Transmission tower) 클래스입니다.

따라서 해당 클래스만 학습해보도록 하겠습니다.

환경: Ubuntu 18.04 LTS

데이터 셋을 구하기 위해 먼저 크롤링을 해줍니다.

구글 크롬 드라이버를 이용할 것입니다.

크롬 드라이버를 본인의 크롬 버전에 맞게 다운로드 받습니다.

Link: https://chromedriver.chromium.org/downloads

크롬 버전 확인 방법은 그림 1과 같습니다.

그림 1

 

그림 1-1

크롤러 프로그램은 google-images-download를 사용했습니다.

Link: https://github.com/ultralytics/google-images-download

Readme에 적힌대로 진행하면 크롤링을 진행할 수 있습니다.

다음은 레이블링을 해야합니다.

이미지 내에 객체의 좌표를 로깅하는 것입니다.

본 포스팅에선 YOLO mark를 사용했습니다.

Link: https://github.com/AlexeyAB/Yolo_mark


  1. git clone https://github.com/AlexeyAB/Yolo_mark
  2. cd Yolo_mark
  3. cmake .
  4. make
  5. chmod u+x ./linux_mark.sh
  6. ./linux_mark.sh

위 커맨드들을 입력해주시면 그림 2와 같은 창이 팝업됩니다.

그림 2


저는 이미 송전탑 이미지들을 넣어놔서 다음과 같은 이미지가 나오지만, 처음에는 비행기 그림이 나옵니다.

크롤링한 이미지들을 다음 경로에 넣어주면 그림 2와 같아집니다.

Path: Yolo_mark/x64/Release/data/img

레이블링 하는 법은 마우스 드래그로 합니다.

다른 상세한 단축키들은 h키를 눌러 확인할 수 있습니다.

클래스 명을 바꿔주는 방법은 다음 경로에 있는 파일을 수정하면 됩니다.

Path: Yolo_mark/x64/Release/data/obj.names

클래스 개수를 수정해주는 파일은 다음 경로의 파일입니다. 파일 내용 중 classes를 바꿔주면 됩니다.

Path: Yolo_mark/x64/Release/data/obj.data

그림 3은 드래그 후의 결과입니다. 드래그 한 후 다음 이미지로 넘어가면 train.txt로 저장되는데 이를 yolo 학습때 사용하면 됩니다.

그림 3

YOLO프로그램이 있는 darknet 폴더로 들어갑니다.

 

현재 저희는레이블링을 하며 names, data, image 데이터 셋 3가지의 custom data를 만들었습니다. 이를 학습에 이용하기 위해 수정해봅니다.

 

기본적으로 data 파일은 cfg폴더에 있고, names파일과 image data는 data폴더에 있습니다.

 

각자 맞는 장소에 옮겨줍니다.

 

이때 train.txt파일 내부에는 이전 Yolo mark에서 레이블링 진행했던 경로로 되어있는데, 경로를 다음 커맨드로 일괄 치환해줍니다.

 

  1. vi train.txt
  2. :%s/x64\/Release\///i
  3. wq

선행학습된 weight 파일을 받아줍니다.

 

cmd: wget https://pjreddie.com/media/files/darknet53.conv.74

 



여기서 문제점이 있습니다. 기본적으로 -gpus 옵션은 다중 gpu도 가능한데, gpus를 enable하려면 makefile을 수정해야합니다.

makefile 1번째 줄의 GPU=0를 GPU=1로 바꿔줍니다.

본 블로깅에선 CUDA 10.1버전을 사용했는데 바꿔준 후 make를 하면 에러가 납니다. 제 생각엔 CUDA 10버전부터는 불가능한 것으로 보입니다. 따라서 CUDA 9버전이 설치되어 있는 서버에서 진행했습니다.

또한 weight를 저장하는 간격을 설정하기 위해 detector.c를 수정해 줍니다.

그림 4에서 빨간색으로 밑줄 친 부분이 몇 epoch에 weight를 저장할지 설정하는 것입니다. 기존 10000을 100으로 바꾸었습니다.

그림 4

이후 학습 커맨드를 입력해줍니다.

 

./darknet detector train data/obj.data cfg/yolov3.cfg darknet53.conv.74 -gpus 0,1

학습 가중치 파일은 backup폴더에 저장됩니다.

그림 6과 같이 학습이 되는 것을 볼 수 있습니다.

그림 5

반응형

'인공지능' 카테고리의 다른 글

pytorch model summary  (0) 2021.03.16
GRU VS LSTM  (0) 2021.03.15
YOLO V5 사용하기  (0) 2021.03.15
YOLO V3 원하는 객체만 바운더리 박스 칠하기  (0) 2021.01.05
인공지능 관련 용어집  (0) 2021.01.05
반응형

인공지능 관련 연구를 하며 YOLO를 많이 접하게 됩니다.

이때 사용하는 기능은 객체 인식 후 바운더리 박스의 좌표 값, 정확도 임계값 또는 특정 클래스만 인식 등이 있습니다.

어떤 소스를 고쳐야 하는지 알아봅니다.

참고: L = 줄 번호

환경은 Ubuntu 18.04 LTS, C, C++ 버전입니다.

먼저 darknet.c L400 에 있는 main 함수를 보겠습니다.

실행시킬때 넘겨받는 옵션들을 처리하게 됩니다.

일반적인 테스트 프로세스는 yolo를 실행할 때 detect 옵션을 줍니다.

따라서 main 함수에서 detector.c L562 test_detector 함수로 들어갑니다.

test_detector

L 577~585: 파일 경로가 옵션으로 주어졌으면 해당 파일이 input image, 아니라면 입력할 수 있도록 함
L 597: 객체 인식
L 600: 객체 인식 결과 변수 할당
L 604: 박스 그리기
L 605: 메모리 해제
L 606~615: 이미지 저장

이 부분에서 dets라는 변수는 YOLO 네트워크의 결과물이라고 할 수 있습니다.

이러한 dets 변수를 파라미터로 갖고 draw_detections 함수로 들어갑니다.

draw_detections는 image.c L239 에 정의되어있습니다.

이 함수에서 앞서 언급한 작업을 진행할 수 있습니다.

dets[i].prob : 정확도
names[j] : 클래스
L 294 : label 입력 제거한다면 label이 결과물에 표시되지 않습니다.
draw_box_width(): 바운더리 박스 그리는 함수 마찬가지로 제거하면 박스가 그려지지 않습니다.
left, top, right, bot: 인식된 객체의 바운더리 박스 좌표

위 변수들을 적당히 조합한다면 그림 1과 같이 원하는 객체만 박스를 그릴 수 있습니다.

 

반응형

'인공지능' 카테고리의 다른 글

pytorch model summary  (0) 2021.03.16
GRU VS LSTM  (0) 2021.03.15
YOLO V5 사용하기  (0) 2021.03.15
YOLO v3 커스텀 데이터 셋 학습  (0) 2021.01.05
인공지능 관련 용어집  (0) 2021.01.05
반응형

인공지능 관련 용어 공부자료

참고:https://brunch.co.kr/@stormktu9/148

 

- 상정 논법 (Abduction) = 가추, 귀추, 유사 추론(plausible inference)

Rule의 Condition을 추측해내는 것. -> 결과는 False일 수 있음.(추측(=heuristic)이기 때문)

A->B에서 B를 알면 A를 추론 가능

- 연역법(deduction)

전제가 참이면 결론이 필연적으로 참이되는 것

- 귀납법(induction)

관찰과 경험을 통해 자료를 수집하고, 수집한 자료에서 비롯된 성향, 관련성을 가지고 결론을 도출하는 방법

- 에이전트(Agent)

복잡한 동적인 환경에서 목표를 달성하려고 시도하는 시스템

"Agent 는 자신의 센서 (Sensor) 를을 통해 환경 (environments) 을 지각 (Percept) 하여 작용기 (effectors) 를 통해 그 환경에 대해 반응 (action) 하는 시스템을 말한다" (Russel 1994)

정리하자면, 현재 인공지능들은 Agent의 컴포넌트이며 모든것(행동인식, 객체인식 등)이 집약된 것이 Agent

-액추에이터(Actuator)

하나의 에이전트가 어떤 환경에 대해 작동하는 메커니즘 

*제어의 목적을 달성하도록 조작량을 변화시킬 수 있는 구조가 필요*

ex) 인간 - 팔, 손, 손가락, 다리

-아달라인(Adaptive Linear Neuron, Adaline)

분류(classification)를 위한 보다 발전된 머신러닝 알고리즘인 회귀(regression), 로지스틱 회귀(logistic regression), SVM(support Vector Machine)에 대한 알고리즘의 토대 마련 - 너무 어렵..

- A/B 테스팅

테스터를 두 집단으로 나누고 집단 A에게 기존 프로덕트를 제공, 집단 B에게 새로운 프로덕트 제공하여 어떤 집단이 더 높은 성과를 보이는지 측정 -> 인과관계 추측 가능

- Alpha-Beta Pruning

2명의 player가 참가하는 Min-Max problem과 같은 상황에서 자신에게 유리한 노드들만 남기는 기법 -> 결과적으로 pruning 하지 않은 min-max와 결과는 같지만 더 효율적이라함(효율적 = 속도 -> 탐색할 노드의 개수가 줄었기 때문)

- 유추(Analogy)

"손과 손바닥의 관계는 발과 무엇의 관계와 같나?"

또 다른 예로 선생이 학생들에게 예제문제를 풀어주고 그와 유사한 문제를 학생들 스스로 풀게하는 경우 -> 일반적인 딥러닝 학습 과정

- 추론(Inference, Reasoning)

이미 알고있는 명제를 기초로 하여 새로운 명제를 유도하는 과정 -> 일반적인 딥러닝 테스트 과정

-적응공명이론(Adaptive Resonance Theory, ART)

기존에 학습되었던 것이 새로운 학습에 의해 지워지지 않도록 새로운 지식을 자동적으로 전체 지식 베이스에 일관성 있는 방법으로 통합한다. -> lifelong learning에 사용되는 이론

-퍼지 집합(Fuzzy Set)

membership-degree function의 특징을 가지며 이는 전체 집합의 모든 멤버를 구간[0, 1]에 매핑한 것. 0의 값은 멤버가 주어진 집합에 속하지 않는다는 뜻

- 퍼지이론(fuzzy)

퍼지 논리는 불분명한 상태, 모호한 상태를 참 혹은 거짓의 이진 논리에서 벗어난 다치성(비슷하게는 아날로그 값)으로 표현하는 논리 개념이다. (퍼지 집합론에 기본을 둠)

- A* 알고리즘 -> 포스팅 필요

최단거리 찾기 알고리즘 중 가장 훌륭한 선택 -> 다익스트라, BFS 보다 빠름

- 역전파(Back-propagation) -> 포스팅 필요

신경망을 훈련시키기 위해 사용하는 기술

- 베이즈 정리 -> 포스팅 필요

- Entropy

무질서한 정도

- K-means clustering algorithm

partitional clustering의 종류 중 하나로 hyperparameter인 k(seed point)를 이용하여 clustering하는 기법

1.initialization - loop[2.assignment - 3.update]로 이루어져 있음

1. 초기 cluster 중심 설정 k

2. 모든 데이터와 각 중심사이의 거리를 계산하고 가까운 것들끼리 군집화

3. 군집된 데이터들의 벡터 평균으로 중심점 갱신

break: 갱신시 변화가 없을 경우 종료

- K-NN

새로운 데이터가 입력되었을 때 기존의 데이터 바탕으로 분류하는 것

hyperparameter: K, 거리 측정 방법(유클리디안, 맨하탄 등)

 

 

반응형

'인공지능' 카테고리의 다른 글

pytorch model summary  (0) 2021.03.16
GRU VS LSTM  (0) 2021.03.15
YOLO V5 사용하기  (0) 2021.03.15
YOLO v3 커스텀 데이터 셋 학습  (0) 2021.01.05
YOLO V3 원하는 객체만 바운더리 박스 칠하기  (0) 2021.01.05

+ Recent posts