저는 따로 시장을 전망하는 사람도 아니며, 다양한 article을 읽지도 않았고, 해당 분야의 사람들과 소통을 많이 하지도 않습니다. 따라서 아래글에는 오류가 상당할 수 있으며, 단순히 한 개인의 생각임을 먼저 말씀드립니다.

 

  MCU나 CPU(이하 MCU로 통일하여 명명)는 ARM등의 Core와 다양한 Peripheral들로 구성됩니다. 각각의 Peripheral들은 하나의 Chipset으로 구현되어 판매될 정도이니, MCU는 그 자체로 매우 큰 'SYSTEM'이라 할 수 있습니다. 이에 저는 MCU의 모든 기능을 파악한 후에 개발하기 보다는, 기본 예제를 기반으로 그때 그때 필요한 기능들을 찾아서 개발하고 있습니다. MCU를 전체적으로 이해하는 몇 안되는 천재들은 당연히 존재하겠습니다만, 대부분의 개발자는 저와 비슷하리라 생각합니다.

 

  이렇듯 MCU의 모든 기능을 파악하지 않고도 개발이 가능한 이유는, MCU 제공 회사들이 다양한 예제 혹은 SDK를 같이 배포하고, Community를 제공하며, MCU 사용자들이 github등에 자신의 결과물을 배포하기 때문입니다. 다만, MCU 사용자들이 제공하는 기능은, 개별적으로 제공되다 보니 각각의 기능을 직접 찾아야 할 수는 있겠습니다.

 

  Espressif사가 제공하는 ESP32는 WiFi를 제공하는 값싼 전용 MCU로, 다양한 분야에 사용 가능한 범용 MCU라고 생각하지는 않았습니다. 그런데, 시간이 지날수록 다양한 예제들이 나오고 LCD 이후 Camera까지 제공되기에 이르렀습니다. 특히나 Linux가 아닌 small embedded OS(예를 들면 freeRTOS)에서 powerful한 network 예제를 제공하는 것은 매우 큰 장점입니다. 최근에는 Multi core도 제공합니다. Espressif는 이미 WiFi 시장을 석권하였고, 이제는 범용 MCU로서 low end 범용 MCU 시장까지도 진입 하려는 것으로 보입니다.

 

  다만, 다른 Major MCU 회사들과 달리, Espressif의 향후 MCU line up을 확인하기는 어렸습니다. 물론 MCU line up이 인터넷에 그냥 open하는 정보가 아니기는 합니다. 대개 새로운 line up은 core의 진화에 의한 것이 많은데, 사용자가 많은 ARM과 달리 Espressif가 사용하는 Xtensa Core는 매우 특화된 시장을 가지고 있으며, 상대적으로 진화 속도는 느릴 것으로 생각됩니다. 이에 Core의 진화보다는 periperal의 보강으로 line up을 가져가려는 것으로 보입니다. 사실 이 방법이 보다 현명할 것 같습니다. ESP32의 개발 환경은 IDF이며, 이는 IoT Development Framework의 약자입니다. WiFi 이후 IoT 시장을 지향하는 것이 Espressif의 방향이라면 Core의 Operating clock이나 불필요하게 여러가지의 Periperal을 추가하기 보다는, IoT에 필요한 Periperal들을 추가하면서 점점 mid/high end 시장으로의 확대를 방향성으로 가져가는 것은 현명해 보입니다. (개인 뇌피셜입니다.)

 

  ESP32의 개발 환경으로 Arduino이 있습니다. ESP32가 Arduino 환경을 지원하기에 Arduino open hardware처럼 open hardware를 지향하려나 생각했습니다만, Arduino는 그 자체로 훌륭한 개발 환경입니다. 처음에는 예제로 초보자들이 따라하기 쉬우라고 제공하는 단순한 프로그램이라고 생각했습니다. 그런데, ESP32 CAM 예제를 실행하다 보니, 다양한 라이브러리와 Core들을 제공하는 어엿한 개발환경이더군요. Arduino 이외에 ESP32는 PlatformIO도 개발 환경으로 지원하고 있습니다.

 

  ESP32 관련해서는 이미 많은 내용이 인터넷상에 있기는 합니다만, 이후에는 hardware 보다는 software (or firmware) 위주로, ESP32 CAM과 관련하여 좀더 읽기 편하게 정리해 보려고 합니다.

 

- End -

 

반응형

sed는 정말 강력한 명령어입니다.

디버깅을 위해서 source의 define이나 코드들을 변경해야 할 때, 그때마다 source를 열어서 변경하지 않고, shell script를 실행해서 변경하고자 할 때 유용합니다.

이미 많은 post들이 있지만, 이글을 쓰는 이유는 sed를 이용해서 하나의 line 뿐만 아니라, 두개의 line에 대해서도 작업을 할 수 있었고, 이를 정리하기 위해서 입니다.

 

기본적인 예제는 다음과 같습니다.

 

1. 이름이 '파일_name'인 파일에서 '찾고자 하는 문자열'을 가진 문자열을 출력하는 예제

sed -n '/찾고자 하는 문자열/p' 파일_name

'찾고자 하는 문자열'에 대해서 다양한 패턴들을 넣어서 실험할 때, 실제로 해당 패턴들이 정상적으로 동작하는지 출력을 통해서 확인할 수 있습니다.

즉, sed를 이용해서 shell script를 작성하기에 앞서, 실제 동작 검증용(디버깅용)으로 사용할 수 있습니다.

 

2. 이름이 '파일_name'인 파일에서 문장이 '//#define ENABLE_TEST' 문자열로 시작하는 경우, 해당 문자열을 '#define ENABLE_TEST'로 변경하는 예제

sed -i 's/^\/\/#define ENABLE_TEST/#define ENABLE_TEST/' 파일_name

 

3. 이름이 '파일_name'인 파일에서, 'something'이라는 문자열을 찾고, 'something'이라는 문자열을 포함하여 5줄(+5)을 제거(d)하는 예제 (https://ksr930.tistory.com/14)

$ sed -i '/something/,+5 d' 파일_name

 

4. 이름이 '파일_name'인 파일에서, 'something'이라는 문자열을 갖는 라인을 찾고, 다음 라인에서 'special'이라는 문자열이 있는 경우 처리하는 예제

(https://stackoverflow.com/questions/18620153/find-matching-text-and-replace-next-line/18622953)

# 1
sed -n '/something/{n;/special/p}' 파일_name
# 2
sed -n '/something/{n;s/special/not special/p}' 파일_name
# 3
sed -i '/something/{n;s/special/not special/}' 파일_name

 

위의 코드에는 3개의 예제가 있습니다.

'# 1'은 'something'이라는 문자열이 있는 라인을 찾고, 다음 라인에 'special'이 있으면 출력합니다. (초기 디버깅용)

'# 2'은 'something'이라는 문자열이 있는 라인을 찾고, 다음 라인에 'special'이 있으면 'not special'로 변경한 후 출력합니다. (초기 디버깅용)

'# 3'은 'something'이라는 문자열이 있는 라인을 찾고, 다음 라인에 'special'이 있으면 'not special'로 파일을 변경합니다. (최종)

 

위에 참고한 post들은 적었고, (저도 다 읽지는 않았습니다만) 추가로 유용해 보이는 post들은 다음과 같습니다.

 

https://jhnyang.tistory.com/287

 

[리눅스/유닉스] 유용 명령어 sed를 살펴보자! sed 명령어 사용법과 예시, 패턴 스페이스와 홀드 스

[리눅스 유닉스 완전정복 목차] 안녕하세요. 주인장 양햄찌입니다. 오늘은 sed 명령어에 대해 살펴보려고 해요. SED 명령어 알기, SED는 무슨 명령어야? vi편집기 아시죵~ sed 명령어도 vi편집기처럼

jhnyang.tistory.com

 

https://snipcademy.com/shell-scripting-sed#the-hold-buffer-space

 

Bash Shell Scripting: Sed - Snipcademy

Introduction to sed Sed (short for stream editor) is a non-interactive command line program that takes some text input, performs some command, and prints the results to standard out. Its support for regular expressions makes it extremely powerful, and is o

snipcademy.com

 

- 끝 -

반응형

'프로그래밍 > Linux_commands' 카테고리의 다른 글

[Linux] uniq  (0) 2019.12.15
[Linux] find  (0) 2019.12.15
[Linux] grep  (0) 2019.04.24

가끔 깜빡이기는 했지만 사용하는데 특별히 불편함이 없었던 냉장고의 LED가 갑자기 꺼져버렸습니다.

AS를 불러야 하나 찾아보니, 비용이 만만치 않습니다.

 

인터넷을 찾아봅니다.

역시 있군요.

blog.naver.com/mkyky/221128032979

 

LG 냉장고 LED조명 교체(R-T756PH)

냉장고가 6년 쯤 쓰니 냉장고 조명 LED가 한개씩 죽더니 이제 불이 2개만 들어옴.. 모듈만 사서 갈려고 ...

blog.naver.com

양영감님 블로그에 있는 것을 그대로 따라서 했습니다.

참고로 몇가지만 추가합니다.

 

1. LED와 컨넥터

LED와 컨넥터

오픈마켓에서 12V 5050으로 구매했습니다. (2 set를 구매했는데, 만원 조금 덜 들었음. 1set만 사용하고 나머지는 보관 중)

컨넥터의 앞쪽 커버를 열고, 붉은색선쪽에 LED 기판의 + 전극을, 검은색선쪽에 LED 기판의 - 전극을 위치합니다.

연결될리 없다고 생각될 정도로 맞지 않아 보입니다.

그리고, 가장자리만이라도 연결되겠구나 생각하고 커버를 닫으려해도 쉽지 않습니다. (LED 기판이 너무 두껍습니다.)

저는 벤치로 강제로 커버를 닫았습니다.

약간 튀어나오고 삐뚤어졌지만 동작은 잘 했습니다.

 

2. 냉장고 커버는 다소 힘을 줘서 분리했습니다. 부서지지 않습니다.

 

3. 전선 연결

양영감님 블로그를 보면, 하얀색 선과 나머지 선들이 연결되어 있는 사진을 볼 수 있습니다.

[하얀색 선]

처음에 컨넥터를 그냥 빼고(선을 전혀 연결하지 않고) 냉장고를 구동했더니, 시간이 조금 지난 후 Er rS 에러가 발생했습니다. "냉장센서1 단선 혹은 합선" 에러로 LED를 따로 연결하지 않더라도 하얀색 선을 연결된 상태로 사용하셔야 합니다.

[붉은색 선]

사진 위치(오른쪽 맨아래)에 12V를 그대로 연결해도 LED가 들어옵니다. 하지만, 문이 닫혀도 센서 인식을 하지 못하고 항상 LED가 켜지는 문제가 있습니다.

따라서 블로그에서 가이드한대로 맨좌측 가운데 홀에 12V를 연결해야, 문이 닫힐 때 LED가 꺼지게 됩니다.

아래에 보면 노란색 커버가 있는데, 이를 먼저 분리한 후, 12V 붉은선을 분리해야 합니다.

저도 그냥 뽑을 수가 없어서 해당 위치는 플라스틱을 깨고 선을 뽑았습니다.

[검정색 선]

Ground로 변경할 필요가 없습니다.

[나머지 선들]

용도는 알기 어렵고, 특별히 연결하지 않았습니다.

 

LED를 교체한 후 환해진 냉장고를 보면서 너무나 뿌듯했습니다.

다시한번 양영감님 블로그 작성해 주신 분께 감사드립니다. 덕분에 비용을 아낄 수 있었습니다.

 

- 끝 -

 

반응형

이미지에서 object들을 detect했는데, 얼마나 정확한지 평가를 해야 합니다. 이를 위해서는 일종의 평가 지표가 필요하죠. AP와 mAP(mean average precision)도 평가의 지표입니다.

이에 대한 상세하고 쉬운 설명은 아래 링크를 참고해 주세요.

https://bskyvision.com/465

 

물체 검출 알고리즘 성능 평가방법 AP(Average Precision)의 이해

물체 검출(object detection) 알고리즘의 성능은 precision-recall 곡선과 average precision(AP)로 평가하는 것이 대세다. 이에 대해서 이해하려고 한참을 구글링했지만 초보자가 이해하기에 적당한 문서는 찾�

bskyvision.com

글쓴이가 전문가라서 그런지, 매우 이해하기 쉽게 설명해 주셔서 처음 접하는 개념인데도 이해하기 쉬웠습니다.

mAP를 구하기 위한 코드로 아래 링크를 제안해 주셨습니다.

https://github.com/Cartucho/mAP

 

Cartucho/mAP

mean Average Precision - This code evaluates the performance of your neural net for object recognition. - Cartucho/mAP

github.com

git 소스에 예제 파일들이 포함되어 있어서, 실행 및 결과를 쉽게 확인할 수 있습니다.

 

원할한 수행을 위해서는 numpy, matplotlib, opencv-python 패키지가 필요합니다.

virtualenv를 이용한 가장 기본적인 환경 설정은 다음과 같습니다.

# virtualenv 환경 설치
virtualenv venv --python=python3
# virtualenv 실행
source venv/bin/activate
# 필요한 패키지 설치
pip install numpy
pip install matplotlib
pip install opencv-python

이후에는 단순히 아래 명령어를 수행하면 됩니다.

python main.py

프로그램이 실행되면서 화면이 계속 변경되는 것을 확인할 수 있습니다.

최종적인 디렉토리 구조는 아래와 같습니다.

├── input
│   ├── detection-results # detection 결과 txt 파일들
│   ├── ground-truth      # object 정보 txt 파일들 (정답)
│   └── images-optional   # 원본 이미지
└── output                # 통계 이미지, output.txt
    ├── classes           # class별 AP 그림
    └── images            # 원본과 detection 결과를 같이 보여 주는 이미지
        └── detections_one_by_one # 각각의 object별 이미지

소스를 처음 받으면 input 폴더와 하위 폴더만 있고, 실행 후에 output 폴더가 생성됩니다.

각 폴더 및 폴더에 포함된 파일들에 대한 상세 설명은 아래와 같습니다.

  • input/detection-results : 모델을 통해서 얻어진 detection 결과값
  • input/ground-truth : ground-truth data. 일종의 정답
  • input/images-optional : 실제 사용한 이미지들
  • output : 통계 이미지. AP, mAP를 위한 실제 데이터 값 (output.txt)
  • output/classes : class별 AP 이미지
  • output/images : detection 정보 및 ground-truth data가 box 형태로 실제 이미지에 표시된 최종 결과 이미지
  • output/images/detections_one_by_one : detection된 내용이 개별적으로 이미지에 표시된 파일

detection-results에 포함된 "이미지파일명.txt" 파일들의 구성은 다음과 같습니다.

class명 confidence xtl ytl xbr ybr
  • confidence : 모델이 해당 class로 확신하는 정도. float. %
  • xtl, ytl : box의 좌측상단 좌표(top left)
  • xbr, ybr : box의 우측하단 좌표(bottom right)

ground-truth에 포함된 "이미지파일명.txt"는 위와 동일한데, confidence만 없습니다.

class명 xtl ytl xbr ybr

다음에는 예제 실행을 통해서 얻은 데이터를 확인하도록 하겠습니다.

 

- End -

반응형

앞서 darknet 시험 방법에 대해서 간단히 정리했습니다. 아래 링크를 참고해 주십시오.

 

steadyandslow.tistory.com/143

 

[Big data] darknet 기본 시험 방법 - 1

Table Of Content 1. 소스 다운로드 하고, 컴파일 하기 2. weight 파일 다운로드하기 3. 예제 실행하기 4. mAP 측정하기 Darknet(pjreddie.com/darknet/)은 tensor flow, keras와 같이 big data를 처리하기 위한 f..

steadyandslow.tistory.com

이글은 train하고 모델을 변경해서 성능을 향상시키는 것이 목표가 아닙니다. Train을 완료한 config 파일과 weights 파일을 이용해서 테스트 파일을 시험하고, 모델의 성능을 평가하는 것이 주요 목표입니다.

평가를 위해서는 test를 통해서 object를 detect하고, 해당 object로 인식하는 confidence, 위치, 크기등의 정보가 필요합니다. 이를 위해서는 "./darknet detector test" 명령어를 사용하며, git 소스의 src/detector.c에 있는 test_detector() 함수를 직접 호출하게 되는데, 함수의 원형은 다음과 같습니다.

void test_detector(char *datacfg, char *cfgfile, char *weightfile, char *filename,
     float thresh, float hier_thresh, int dont_show, int ext_output, int save_labels,
     char *outfile, int letter_box, int benchmark_layers)

Arguments들에 대해서 확인한 내용을 정리하면 다음과 같습니다.

 

datacfg : 데이터 파일

cfgfile : cfg 파일

weightfile : weights 파일

filename : 시험에 사용할 테스트 파일

thesh : object를 인식하기 위한 minimum threshold

hier_thresh : -

dont_show : OpenCV가 있는 경우, 찾은 object를 box로 표시한 그림을 볼 수 있는데, 이를 보지 않도록 하는 옵션

ext_output : 찾은 object의 위치 정보를 console에 출력하기 위한 옵션

save_labels : 찾은 object의 위치 정보를 txt 파일로 자동 저장 (예를 들어 data/dog.jpg를 시험하면, data/dog.txt 파일이 자동으로 생성됨)

outfile :찾은 object의 확률 및 정보등을 json 파일 형식으로 저장하기 위한 옵션

letter_box : box를 letterbox로 그리는 것으로 보임(확인해 보지 않음)

benchmark_layers : -

 

옵션을 사용하기 위해서 입력해야 하는 변수는 위의 이름과 틀릴 수 있습니다. (hier_thresh가 아니라 -hier을 사용하는등... 자세한 사항은 소스 참조)

 

이글에서는 save_labels와 outfile 옵션을 소개합니다.

 

앞선 글에서 설명했듯이, -ext_output 옵션을 사용하면 화면에 detect한 object들의 위치를 출력합니다.

-save_labels 옵션을 사용하면 이미지 파일이 존재하는 폴더에 이미지 파일에서 확장자를 'txt'로 변경한 파일명을 가지는 label 파일이 생성됩니다.

이 label 파일에는 -ext_output의 출력 내용을 map 옵션에서 사용하기 위해서 변경한 최종 내용이 포함됩니다.

예를 들어 data/dog.jpg에서 data/dog.txt 파일이 생성되고, 그 내용은 아래와 같습니다.

16 0.2889 0.6654 0.2558 0.5551
7 0.7584 0.2202 0.2816 0.1368
1 0.4471 0.4834 0.5881 0.5357

즉, 구태여 -ext_output 옵션을 사용해서 화면에 출력하고, 따로 계산해서 label 파일을 만들 필요 없이, -save_labels 옵션을 사용하면 됩니다.

 

outfile 옵션은 '-out 파일명' 형식으로 사용하면 되는데, 해당 파일명을 가지는 파일에는 json 형식으로 detect한 object들의 정보가 포함됩니다.

각 이미지 파일별로 생성하는 것이 아니고 모두 포함된 파일 하나만 생성됩니다.

그 내용은 아래와 같습니다.

[
{
"frame_id":1,
"filename":"data/dog.jpg",
"objects": [
{"class_id":16, "name":"dog", "relative_coordinates":{"center_x":0.288886, "center_y":0.665429, "width":0.255769, "height":0.555123}, "confidence":0.997768},
{"class_id":7, "name":"truck", "relative_coordinates":{"center_x":0.758406, "center_y":0.220200, "width":0.281645, "height":0.136754}, "confidence":0.931509},
{"class_id":1, "name":"bicycle", "relative_coordinates":{"center_x":0.447122, "center_y":0.483448, "width":0.588141, "height":0.535695}, "confidence":0.989874}
]
},
...
]

시험 방법은 다음과 같습니다.

일단 다음과 같은 내용을 가지는 cfg/test.txt 파일을 생성합니다. (이용할 파일들의 path를 정리)

data/dog.jpg
data/eagle.jpg
data/giraffe.jpg
data/horses.jpg
data/person.jpg
data/scream.jpg

그리고, 아래 명령을 실행합니다.

./darknet detector test cfg/coco.data cfg/yolov3.cfg yolov3.weights \
-ext_output -dont_show -save_labels -out output.json < cfg/test.txt

위 명령은

- detect한 object들의 정보를 화면에 출력하고 (-ext_output)

- 따로 그림으로 그려서 보여주지는 않고 (-dont_show)

- 각 이미지 파일명과 동일한 label 파일들을 생성하고 (-save_labels)

- 모든 label 정보가 포함된 json 파일을 생성하는데 (-out output.json)

- cfg/test.txt 파일에 있는 이미지 파일들에 대해서 'darknet detector test'를 수행한다.

는 의미입니다.

 

생성한 파일들은 이후 AP, mAP등으로 성능 평가를 진행할 때 매우 유용하게 사용할 수 있습니다.

 

(추가)

-dont_show 옵션이 없다면, detect한 object들을 box로 표시한 이미지를 확인할 수 있습니다.

그리고, 여러 이미지를 사용해서 시험하더라도 출력은 항상 고정된 파일명인 prediections.jpg로 저장됩니다.

이미지마다 detect한 object들을 포함하는 이미지로 각각 저장하기 위해서는 아래와 같이 일부 코드를 수정하면 됩니다.

find_replace_extension(input, ".jpg", ".1.jpg", output_buff);

save_image(im, output_buff);
if (!dont_show) {
    show_image(im, "predictions");
}

 

- End -

반응형

'프로그래밍 > Big data' 카테고리의 다른 글

[Big data] AP, mAP  (0) 2020.09.23
[Big data] darknet 기본 시험 방법 - 1  (2) 2020.09.14

 

Table Of Content

Darknet(pjreddie.com/darknet/)은 tensor flow, keras와 같이 big data를 처리하기 위한 framework 중의 하나로 이해하고 있습니다.

대부분 python 기반으로 제공하는 일반적인 big data framework과 달리, 이미지 추출을 위해서 빠른 처리 시간을 제공하는 c 언어 기반의 framework입니다.

워낙 널리 사용되고 유명해서 참고할만한 페이지들이 많기는 합니다만, 다시 한번 정리해 봅니다. (Host 시스템: 우분투 18.04)

1. 소스 다운로드 하고, 컴파일 하기

$ git clone https://github.com/AlexeyAB/darknet.git
$ cd darknet
$ make

- 컴파일이 정상적으로 완료되면, darknet이라는 실행파일이 생성됩니다.

2. weight 파일 다운로드하기

- darknet을 실행하기 위해서는 cfg 파일과 weights 파일이 필요합니다.

- weights 파일은 크기가 커서(over than 250MB) git 소스에 포함되어 있지 않으며, 따로 다운로드 해야 합니다.

- weights 파일의 종류는 pjreddie.com/darknet/yolo/에 있는 아래 그림에서 wieghts 부분을 누르면 다운로드 할 수 있습니다.

Darknet original weights

- 시험에 사용한 3개의 weights들(yolo-voc.weights, yolov3-tiny.weights, yolov3.weights)은 아래 명령어로도 다운로드 받을 수 있습니다.

$ wget https://pjreddie.com/media/files/yolo-voc.weights
$ wget https://pjreddie.com/media/files/yolov3-tiny.weights
$ wget https://pjreddie.com/media/files/yolov3.weights

- cfg 파일과 weights 파일은 pair가 맞아야 합니다.

3. 예제 실행하기

- data 폴더에는 여러개의 예제 jpg 파일들이 있으며, 이를 이용해서 시험할 수 있습니다.

- 아래 명령어들을 이용해서 darknet을 실행할 수 있습니다. 이 두 명령은 동일합니다.

$ ./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg
$ ./darknet detector test cfg/coco.data cfg/yolov3.cfg yolov3.weights data/dog.jpg

- 여기서 'detecor test' 명령에는 data 파일이 사용되는데, data 파일의 형식은 다음과 같습니다. (coco.data 파일에 주석을 달았습니다.)

# #는 주석 표시
# class의 갯수
classes= 80
# train에 사용하는 파일
train  = /home/pjreddie/data/coco/trainvalno5k.txt
# validation이나 test에 사용하는 파일
valid  = coco_testdev
#valid = data/coco_val_5k.list
# class와 class id를 matching시키기 위한 names 파일
names = data/coco.names
backup = /home/pjreddie/backup/
eval=coco

- 시험에 사용할 파일명( (여기서는 data/dog.jpg)을 맨 마지막에 넣어 줬는데, 파일명이 없는 경우 아래와 같은 메시지가 출력되면서 파일 경로 입력을 기다립니다.

"Enter Image Path: 

- 인식 확률이 출력되는데, '-ext_output' 옵션을 추가하면, 검출된 objects의 위치와 크기 정보를 출력합니다.

$ ./darknet detector test cfg/coco.data cfg/yolov3.cfg yolov3.weights data/dog.jpg -ext_output
....
bicycle: 99%	(left_x: 118 top_y: 124 width: 452 height: 309)
dog: 100%	(left_x: 124 top_y: 223 width: 196 height: 320)
truck: 93%	(left_x: 474 top_y: 87 width: 216 height: 79)
Not compiled with OpenCV, saving to predictions.png instead


4. mAP 측정하기

- 성능의 측정을 위해서 주로 사용하는 것은 mAP(mean Average Precision)입니다.

- 자세한 설명은 https://bskyvision.com/465를 참고해 주세요. mAP를 전혀 몰랐지만, 어렴풋이 이해하는데 큰 도움이 됩니다.

- mAP는 다음 명령어로 확인할 수 있습니다.

$ ./darknet detector map cfg/coco.data cfg/yolov3.cfg yolov3.weights

- cfg/coco.data 파일의 valid 필드에 포함된  파일에 시험을 진행할 files이 적혀 있어야 합니다.

- 본 예제에서는 coco_testdev 파일이며, 해당 파일에 data/dog.jpg만 적도록 합니다.

- mAP 계산을 위해서는 이미지 파일과 정답 annotation 파일(해당 파일에 있는 objects의 위치와 크기를 표시해 둔 파일)이 필요합니다.

- 본 예제에서는 data/dog.jpg와 data/dog.txt 파일이 됩니다.

- data/dog.jpg는 git source에 포함되어 있지만, data/dog.txt 파일은 따로 없습니다.

- 앞서'-ext_output' 옵션을 사용해서 확인한 내용을 정리해서 dog.txt 파일로 만들어 시험했습니다.

- dog.txt 파일의 형식은 "class ID, X, Y, width, height" 순서입니다.

   https://github.com/AlexeyAB/Yolo_mark/issues/60를 참고하면 다음의 내용을 확인할 수 있습니다.

.txt-file for each .jpg-image-file - in the same directory and with the same name, but with .txt-extension, and put to file: object number and object coordinates on this image, for each object in new line: <object-class> <x> <y> <width> <height>

Where:

    <object-class> - integer number of object from 0 to (classes-1)
    <x> <y> <width> <height> - float values relative to width and height of image, it can be equal from (0.0 to 1.0]
    for example: <x> = <absolute_x> / <image_width> or <height> = <absolute_height> / <image_height>
    atention: <x> <y> - are center of rectangle (are not top-left corner)

For example for img1.jpg you will be created img1.txt containing:

- 여기서 X, Y는 이미지의 start point가 아니라, 전체 이미지의 center 값입니다. 내용을 이해하기 어려운데 git source의 script/voc_lable.py의 convert() 함수에 다음 내용이 있습니다.

x = (box[0] + box[1])/2.0 - 1
y = (box[2] + box[3])/2.0 - 1
x = x*dw
w = w*dw

여기서 box[0], box[1]은 xmin, xmax로, box[2], box[3]은 ymin, ymax로 이해하면 되며, 이를 수식으로 표시하면 다음과 같습니다.

x1 : (xmin + xmax)/2 - 1 = xmin + width/2 - 1
y1 : (ymin + ymax)/2 - 1 = ymin + height/2 - 1

x = x1 / image_width
y = y1 / image_height

즉, X, Y는 object의 center 값입니다.

- 시험에 사용한 dog.txt는 다음과 같습니다.

1  0.447 0.483 0.588 0.536
16 0.289 0.664 0.255 0.555
7  0.757 0.219 0.281 0.137

- 이제 준비는 다 되었고, 앞서 명령어를 실행합니다.

$ ./darknet detector map cfg/coco.data cfg/yolov3.cfg yolov3.weights

-시험 결과는 다음과 같습니다.

...
for conf_thresh = 0.25, precision = 1.00, recall = 1.00, F1-score = 1.00 
for conf_thresh = 0.25, TP = 3, FP = 0, FN = 0, average IoU = 99.31 % 

IoU threshold = 50 %, used Area-Under-Curve for each unique Recall 
mean average precision (mAP@0.50) = 0.037500, or 3.75 %

- 여기서 mAP 3.75%는 80개의 class 중 3개 class에 대해서 AP가 100%이기 때문입니다. (3x100%/80 = 0.0375)

 

이상으로 간단하게 정리한 darknet의 예제 실행을 마무리 합니다.

 

- End -

반응형

'프로그래밍 > Big data' 카테고리의 다른 글

[Big data] AP, mAP  (0) 2020.09.23
[Big data] darknet 기본 시험 방법 - 2  (0) 2020.09.15

네트워크 프로토콜 관련해서 시험해 보았습니다.

프로토콜의 맨 마지막 형식은 CRC로 패킷 일부에 대한 CRC를 계산하도록 되어 있고,  사용하는 형식은 "표준 CRC 16"이라고 되어 있었습니다.

CRC 16 관련 코드를 찾아서 구현하고 서버로 패킷을 전송했습니다.

그런데 response packet에서 CRC 16 error를 확인할 수 있었습니다.

코드를 다시 한번 확인해 보아도 이유를 알 수가 없었습니다.

다행시 response packet에서 CRC 필드를 확인할 수 있고, 제가 사용하는 코드에 넣어서 시험했더니 받은 CRC 값과 계산한 CRC 값이 틀린겁니다.

검색을 해 봐도 이유를 확인하기 어렵고 ㅠㅠ

그러다 만난 사이트입니다.

 

https://crccalc.com/

 

Online CRC-8 CRC-16 CRC-32 Calculator

Please enable JavaScript on this site or click one of the buttons above. Share your result: Cookies policies

crccalc.com

사이트에 접속하면 아래와 같은 화면을 볼 수 있습니다.

(1) 입력한 데이터를 Hex로 확인합니다. Byte align이 맞지 않는 경우는 (3)의 9를 표시하는 방법을 참고하면 되겠습니다.

(2) 맨 아래 Processed data 필드 (3)를 활성화합니다. 실제 계산에 사용하는 입력 데이터를 확인할 수 있습니다.

(3) 실제 계산에 사용하는 데이터입니다.

(4) CRC 계산 방법을 선택합니다.

 

CRC16을  선택했는데, 사용하는 Algorithm이 아래와 같이 매우 다양했습니다.

입력 packet의 CRC와 일치하는 algorithm을 확인해보니 CRC-16/MODBUS였습니다.

이를 검색해서 코드를 사용했더니 CRC 에러가 발생하지 않았습니다.

 

- End -

반응형

'프로그래밍 > Tips & sites' 카테고리의 다른 글

[Obsidian] Google drive와 연동하기  (0) 2022.04.03
[Tips] 파워포인트 매크로  (0) 2019.12.28
[Tips] VIM  (0) 2019.12.17
[Tips] Notepad++  (0) 2019.12.15

Python으로 프로그래밍을 하다 보면, 반복해서 수행하는 함수나 loop등에서 변수들의 상태를 모니터링하고 싶은 경우가 많습니다. 물론 print 함수를 이용해서 하나 하나 trace할 수도 있지만, Python이 제공하는 디버깅 기능을 이용하면 좋습니다.

기본적인 예제는 다음과 같습니다.

from IPython.core.debugger import set_trace

sum = 0

for i in range(10):
    sum += i
    set_trace()

set_trace()가 동작할 때는 jupyter notebook에 아래와 같은 입력창이 활성화됩니다.

입력창에 필요한 디버깅 command를 입력하거나, 확인하고자 하는 변수를 입력하고 enter를 눌러 결과를 확인할 수 있습니다.

디버깅 command와 관련해서는 입력창에 'help'를 입력하면 아래와 같이 사용가능한 command들이 나타납니다. 그리고 디버깅 command에 대해서 좀 더 확인하고 싶으면, 'help command명'을 입력하면 설명을 확인할 수 있습니다.

아래는 위의 예제를 실제 실행하면서, i와 sum 변수를 중간 중간 출력한 화면입니다. 출력 이후 다시 실행하기 위해서는 'c' 명령을 입력하였습니다. 마지막으로 디버깅을 멈추기 위해서는 'q'를 입력했습니다.

 

만약 'q'를 입력해서 프로그램을 종료하지 않은 상태로, jupyter notebook의 다른 명령을 실행시키는 경우 실행이 종료되지 않습니다. 이 경우 해당 notebook을 'Shutdown'후 다시 실행하면 됩니다.

- End -

반응형

'프로그래밍 > Python' 카테고리의 다른 글

[Python] Unicode error  (0) 2021.11.23
[Python] 폴더 생성, tar 예제  (0) 2020.05.03
[Python] Animation 예제  (0) 2020.05.03
[Python] matplotlib 예제  (0) 2020.05.03

일련의 규칙에 맞춰 폴더를 생성하는 예제와 tar 파일을 extract하는 예제입니다.

import tarfile
import os

# 폴더 생성 예제
# Linux의 경우 '/'로 시작해야 하며, '~'로 home page를 표시할 수는 없음
srcFolderName = os.path.join('/home','apple', 'Downloads')
for i in range(1, 14):
    # Documents 폴더에 'Output_01', 'Output_03', ... , 'Output_13'을 생성
    dstFolderName = os.path.join('/home','apple', 'Documents', 'Output_'+'%02d'%i)
    
    # 예외 처리
    try:
        if not(os.path.isdir(dstFolderName)):
            os.makedirs(os.path.join(dstFolderName))
    except OSError as e:
        if e.errno != errno.EEXIST:
            print("Failed to create directory!!!!!")
            raise

" srcFolder에 있는 summary.tar.bz2 파일을 dstFolder에 extract
tar = tarfile.open(os.path.join(srcFolderName, 'summary.tar.bz2'), "r:bz2")
tar.extractall(dstFolderName)
tar.close()
반응형

'프로그래밍 > Python' 카테고리의 다른 글

[Python] Unicode error  (0) 2021.11.23
[Python] 디버깅  (0) 2020.05.03
[Python] Animation 예제  (0) 2020.05.03
[Python] matplotlib 예제  (0) 2020.05.03

Animation 예제입니다.

(참고링크)

import numpy as np
import matplotlib.pyplot as plt
import math
import matplotlib.animation as animation

def B(alpha, beta):
    return math.gamma(alpha) * math.gamma(beta) / math.gamma(alpha + beta)

def beta_pdf(x, alpha, beta):
# [0, 1] 구간 밖에서는 밀도가 없음
    if x < 0 or x > 1:
        return 0
    return x ** (alpha - 1) * (1 - x) ** (beta - 1) / B(alpha, beta)

x_data = []
y_data = []

fig, ax = plt.subplots()
ax.set_xlim(0, 1)
ax.set_ylim(0, 12)
line, = ax.plot(0, 0)

def animation_frame(i):
    xs = [x / 100.0 for x in range(0,100)]

    x_data = [x / 100.0 for x in range(0,100)]
    y_data = [beta_pdf(x, alpha=i,beta=i+10) for x in xs]

    line.set_xdata(x_data)
    line.set_ydata(y_data)

    return

anim = animation.FuncAnimation(fig, func=animation_frame, frames=np.arange(0.1, 80, 1), interval=50, repeat=False)
plt.show()

Jupyter notebook에서 예제를 시험할 때, animation이 동작하지 않을 수 있습니다.

이 경우에는 아래 코드를 먼저 실행한 후, 위 코드를 수행하면 animation 동작을 확인할 수 있습니다.

(참고링크)

%matplotlib notebook

 

 

반응형

'프로그래밍 > Python' 카테고리의 다른 글

[Python] Unicode error  (0) 2021.11.23
[Python] 디버깅  (0) 2020.05.03
[Python] 폴더 생성, tar 예제  (0) 2020.05.03
[Python] matplotlib 예제  (0) 2020.05.03

+ Recent posts