글

python 에서 resize 이벤트 만들기

이미지
➤ pyqt 로 만든 임의의 창이 최대화를 하면 그에 따라 widget의 크기도 변해야 하나 변하지 않아 말썽이던 적이 있다. ➤ 최대화 버튼을 누르거나 임의로 창의 크기를 조절하면 이벤트가 발생하고 그 이벤트를 신호로 resize하는 함수를 만들어 보았다. ➤ 우선 Main에 신호를 선언하고 그 signal을 임의로 만들 slot과 연결하였다. <신호 선언> <선언한 신호와 함수 연결> <resize 이벤트가 발생할 떄 실행할 함수> ➤ 확인시 잘 동작하는 것을 확인 ➤  https://stackoverflow.com/questions/43126721/pyqt-detect-resizing-in-widget-window-resized-signal  참고하였음

이미지 파일

이미지
- 이미지 학습시에 너무 용량이 큰 사진이여서 resizer.py를 이용하여 사진 크기를 줄이는 작업을 실행하였다. - 작업 실행 후 확인하여 보니 사진 크기는 줄어 들었으나 .xml 파일의 box의 크기와 위치는 는 수정 되지 않고 그대로 유지되어 엉뚱한 곳에 있는 것을 확인하였다. (왼쪽위의 resize된 사진과 위치 정보가 그대로인 box) (아무 생각 없이 사진 올렸다 혹시 몰라 제품 샘플 사진은 지웠다.) - resizer.py의 파일을 확인하면 opencv를 이용하여 사진의 크기를 줄이는 함수만 정의되어 있는 것을 확인 할 수 있다. - 그래서 개인적으로 임의의 함수를 만들어 파일을 수정하여 주었다. - 우선 파일의 내용을 불러오는 방법은 f.read() 방식을 이용하였다. f.readlines()를 이용하여 f = open(filename, 'r+') lines = f.readlines() for line in lines:     print(line) 위의 방식으로 수정을 하려 하였으나, 필요한 부분만 내용을 바꾸고 다시 저장하는 방식을 실현하는데에 좀 시간이 걸릴것 같아 그냥 무식하게 구현을 하였다. data = f.read() 를 사용하여 파일 안의 내용 모두를 그냥 한 변수안에 선언하였다. - 그 후 find()를 이용하여 필요한 부분을 잘라내고 필요한 값으로 변경하는 작업을 하였다. box의 정보를 얻기위해 find()와 rfind()를 이용하여 box의 x,y 좌표값을 알아내고 정정할수 있게 하였다. value = data[data.find('<xmin>')+6 : data.rfind('</xmin>')] value = float(value) * 0.5 value = int(value) data = data[ : data.find('<xmin>')+6] + str(value) + data[da...

tensorflow 학습된 모델 평가하기(Classification)

이미지
➢ 학습을 진행하면 model.ckpt-* 파일들이 생성이 된다. ➢ 위의 파일들을 tensorflow 폴더에 있는 eval_image_classifier.py 파일을 이용하게 된다. (실행시 나타나는 결과 값) 아래쪽에 있는 Accuracy 값을 중점으로 보면 된다. ➢ 지금 나타나는 폴더 목록에서는 하나만 나타나 있지만 학습시 여러개의 파일들이 생성이 될 것이다. 이때 checkpoint 파일을 수정을 하지 않으면 계속해서 마지막 생성된 파일만 검사를 시행할 것이다. 그렇기에 자신이 원하는 ckpt를 검사하고 싶으면 checkpoint 파일을 수정하여 주면 된다. <예시> (수정 전) (수정 후) ➢ 그 후 eval_image_classifier.py 를 실행하여 주면 된다. $ python eval_image_classifier.py --alsologtostderr --checkpoint_path= /home/user/checkpoint/file/path/train_inception_v4_flower_FineTune_logs/all --dataset_dir= /tfrecord/file/path --dataset_name= flower --dataset_split_name=validation --model_name= inception_v4 (붉은색은 자신에게 맞게 바꾸어 준다.)

tensorflow classification 학습시 model 저장

이미지
tensorflow로 classification 학습시 일정 주기마다 model.ckpt를 저장하고 일정 갯수가 넘어가면 가장 오래된 파일을 지우고 새로 저장을 한다. 이때 total loss가 가장 낮은 상황일때 model을 저장하고 싶었다. tensorflow 폴더 안의 exporter.py를 비롯한 몇몇 파일을 이용하면 될 것 같으나 결국 방법을 찾지 못 하였다. 그래서 임의로 learning.py 파일에서 코드를 수정하고 추가하여 total loss를 비교하여 가장 낮을 때 따로 저장을 하게 하였다. 아래쪽에서 비교하기전 사용할 것들을 미리 선언 sv.save_path.rfind('model')을 통해 경로에서 model이라는 문자가 어디에 있는지 확인 < .find() 사용시 문자열의 앞부터 찾기 시작하며, .rfind()사용시 문자열의 뒤쪽부터 찾기 시작함> cutPath와 path_for_remove에 각각 경로를 자른 앞부분과 model을 저장할 경로를 지정하여 주었다. 위의 사진에서는 안 나왔으나 if not (os.path.isdir(path_for_remove)):     os.makedirs(path_for_remove) 를 이용하여 해당 경로가 없을 시 디렉토리를 생성하게 하였다. 그 후 위의 사진에서 보이듯이 디렉토리에 파일들이 있는지 검사하고 있으면 지우고, 없으면 해당 지점의 model을 저장하게 해 두었다.

이미지 binary

이미지
영상 binary, 이진화 처리 입력되는 사진이 bgr 사진이면 gray로 바꿔주는 작업이 필요하다. cv2.cvtColor() 함수를 이용하여 작업을 진행하여 준다. 첫 번째 threshold()함수는 일반적인 이진화이다. 첫번째 인자는 입력할 이미지, 두번째는 기준점, 세번째는 기준점을 넘을 시 바꿀 값을 설정한다. 두 번째 adaptiveThreshold() 함수는 첫번째 함수 보다 원형의 이미지를 살리면서 이진화를 실행한다. 첫번째 인자는 똑같이 입력할 이미지, 두번째는 기준점 넘을 시 바꾸어줄 값, 세번째는 적응형 이진화 타입, 네번째는 이진화 타입, 다섯번째는 임계값 계산시 함께 볼 픽셀의 범위, 여섯번째는 평균 값에서 뺄 값이다. qt designer를 이용하였다. combo box를 이용하여 이진화 종류를 선택하게 하였으며, slider를 이용해 기준점을 설정 할 수 있게 하였다.

이미지 blur 처리

이미지
이미지를 blur 처리하는데 대략 4가지의 방법이 있다. 1. cv2.blur() : 평균 블러 처리 방법이다. 입력되는 이미지의 뒤에 있는 커널의 수가 커질수록 흐려짐이 강하다. 2. cv2.GaussianBlur() : 가우시안 블러는 평균 블러보다 edge를 남겨둔 채로 blur 처리를 하기에 노이즈 제거에 사용된다. 3. cv2.meianBlur() : 무작위 노이즈를 제거하는데 효과적이나 edge가 모호해질 수 있다. 4. cv2.bilateralFilter() : 가우시안과 비슷하게 edge를 남기고 blur 처리에 쓰인다. 위의 comboBox를 이용해 효과를 선택하며, 아래의 slider를 이용하여 적용될 커널의 수를 조절할 수 있게 하였다.

이미지에서 edge 검출

이미지
opencv와 python, qt를 사용하였다. cv2.cvtColor()를 이용해 입력된 이미지의 색상을 변경하여 주었다. cv2.COLOR_BGR2GRAY은 bgr에서 gray로 변경되는 옵션이며, 다양한 옵션이 존재한다. 이미지 입력은 사진 그리고 videoCapture() 함수를 이용한 비디오와 웹캠의 이미지도 가능하다. cv2.Sobel()을 이용하여 수직선 방향의 edge를 검출한다. ksize는 커널 갯수 이며 숫자가 클수록 선의 굵기가 굵어진다. designer를 이용하여 slider와 연동되게 하였다. cv2.convertScaleAbs()를 통해 sobelx의 값에 절대값을 적용하고 범위를 8bit unsigned int로 변경한다. 이후 widget에 출력을 하여 주면 edge가 검출된 이미지가 출력이 된다. https://docs.opencv.org/3.4.3/d5/d0f/tutorial_py_gradients.html  참고

PyQt FileDialog

이미지
FileDialog를 사용하기 위해 가장 위에 import하여 선언하여 준다. log = QFileDialog()를 선언하면서 사용할 준비를 한다. 경로만 가져오는 방법도 있으며, 이름만 가져오기도 하며, 하나 또는 그 이상의 이름을 가져 오는 방법도 가능하다. 현재는 파일 하나의 이름만 가져오면 되기에 getOpenFileName()함수를 사용하였다. (다른 함수에 대한 설명은  https://doc.qt.io/qt-5/qfiledialog.html#static-public-members  에서 볼 수 있다.) getOpenFileName에서 차례로 1. self는Parent 설정 2. 'Get Model'은 Dialog가 열렸을 시 창에 제목을 붙여주며 3. os.getcwd()는 시작될 경로(os.getcwd()를 사용하려면 os를 import 해 줘야한다, sys를 사용하는 방법도 있다.) 4. 가져올 파일들의 확장자를 정의 할 수 있다. "video (*.mp4);;All (*.*)" 와 같이 두게 이상의 목록을 만들고 싶은면 세미콜론(;) 2개를 이용하면 된다. (다이얼로그를 연 모습) (qt designer를 이용해 만든 경로를 표시할 LineEdit과 ToolButton)

yolo에서 라벨링으로 생성한 txt 파일을 tensorflow에 맞는 xml 파일로 변환하기

이미지
우선 윈도우와 리눅스에서 아나콘다로 실행하여 본 결과 모두 정상 작동을 한다. 경로 작성시 window에서 아래와 같은 오류가 표시 될 시 경로 앞에 r을 붙여주면 된다. ex) IMG_PATH = r "D:\VisualStudio\WorkSpace\data\img-GBS-IMG" txt 파일에서 xml 파일로 변환시에 xml파일 이름 앞에 경로가 추가되는 오류는 고쳤으나 저장 경로가 제대로 지정되지 않는 오류는 아직 수정하지 못 하였다. 그러니 따로 디렉토리를 생성하고 그 안에서 이 코드를 돌리는 것이 나을 것이다. 코드에서 IMG_PATH와 txt_folder는 각각 .jpg, .txt 파일만 넣어 두는 것이 나을 것이다. 한 폴더 안에 jpg, txt 파일이 같이 있으면 파일 정보를 읽어 오는데 오류가 발생할 것이다.(능력자 분은 고쳐서 사용 하시면 됩니다...) from lxml import etree from PIL import Image import csv import os import io IMG_PATH = r"D:\VisualStudio\WorkSpace\data\img-GBS-IMG" fw = os.listdir(IMG_PATH) #path of save xml file save_path = r"D:\VisualStudio\WorkSpace\data\annotations" # txt_folder is txt file root that using darknet rectbox txt_folder = r"D:\VisualStudio\WorkSpace\data\img-GBS-TXT" #edit your label set labels = ['green','brown','sugar'] def csvread(fn):     with open(fn, 'r') as cs...

yolo 이용한 winform 작성

이미지
➢ 실행시 기본 화면 ➢ object detect 실행시 화면 ➢ marking open 실행시 나타나는 화면과 차례로 training과 selftrainig 선택시 나타나는 화면

winform에서 dialog 만들기

이미지
https://mirwebma.tistory.com/121 참고

YOLO(영상처리)와 6DoF 로봇 팔(window)

이미지
➢ 전에 사용한 tensorflow가 아닌 YOLO( You Only Look Once)를 사용하여 영상을 촬영하고 미리 학습시켜둔 이미지와 매칭하여 물체를 찾는 방법을 사용했다. 공식 홈페이지 :  https://pjreddie.com/darknet/yolo/ ➢ 기존 다른 Object Detection보다 처리 속도가 빠르다. ➢ YOLO 설치는  https://github.com/AlexeyAB/darknet#how-to-train-to-detect-your-custom-objects  를 참고하여 설치를 진행하였다. ➢ 각자 원하는 환경과 구성된 환경이 다르기에 설치 시 설정를 정확히 해야한다. 나는 opencv와 cuda가 깔려 있는 상황에서 설치를 시작하였다. 확인후 설치를 시작한다. ✫gpu를 사용한다면 cuda 설치를 해주어야 하며 이때가 가장 중요하다. cuda는 각 gpu가 지원하는 드라이버가 다른데 nvidia 홈페이지에서 자신에게 맞는 드라이버를 선택하고 설치를 하여야 한다. (지금은 환경은 window지만 ubuntu 환경에서 설치시에 고생을 많이 했다.) https://www.nvidia.com/Download/Find.aspx?lang=en-us 에서 자신에게 맞는 드라이버를 선택하여 설치를 하여주면 된다. ➢ 다운로드 후 컴파일은  https://github.com/AlexeyAB/darknet#how-to-compile-on-windows-legacy-way  방법을 사용했다. ➢컴파일도 완료하였으면 이제 training을 실시하여야 한다. training에 필요한 사진은 많으면 많을 수록 좋으며, 다양한 환경(다른 색의 배경 및 바닥, 다른 밝기의 조명)에서 찍은 사진이 많을 수록 좋은 것으로 보인다. 수는 최소 200장 정도 하면 적당한 것으로 생각된다. 필요한 사진들을 수집 완료 했으면 각 사진에 자신이 원하는 이미지를...

6축 로봇 팔

이미지
➢ 6축 로봇팔 제어 로봇팔은 각 낱개의 부품 형태로 배송되어짐. 조립은 동봉된 조립도를 보고 조립. ➢ 로봇팔의 구동 범위가 어디서부터 어디까지 구동 되는지 먼저 조사한다. ➢ 소스 #include <Servo.h> #define NO_OF_FIELDS 6 Servo base, shoulder, foreArm, wristFlex, wristRotate, claw; int inCommand[NO_OF_FIELDS]; int ledPin = 13; void EchoData(int echoWord[]) {  Serial.print("*");  float total;  for (int i = 0; i < NO_OF_FIELDS; i++)  {   Serial.print((int)echoWord[i]);    total+= inCommand[i];   Serial.print(",");  }  Serial.print((int)total);  Serial.print(",");  Serial.print("*");  Serial.print("&"); } void ClearOldData(int oldData[]) {  for (int i = 0; i < NO_OF_FIELDS; i++)  {   oldData[i] = 0;  } } void setup() {  Serial. begin(38400);  base.attach(3);  shoulder.attach(5);  foreArm.attach(6);  wristFlex.attach(9);  wristRotate.attach(10);...

Tensorflow Object_detect

이미지
➢ Object Detecting을 실행하기전 자신이 원하는 사진들을 찍어둔다. 사진은 많으면 많을 수록 좋으며 200장 이상 그리고 다른 배경에서 찍은 사진일수록 좋다. (찍어둔 사진들은 임의의 폴더를 만들고 그 안에 train폴더와 test폴더를 만들어 준다.) (.csv 파일은 아래 xml_to_csv.py 실행 시 생성된다.) ➢ 사진을 찍었으면 각 이미지에서 원하는 이미지를 박싱하여 라벨을 붙여 주어야 한다. 프로그램은 labelImg를 사용하였다. ➢ 각 이미지 마다 라벨링을 완료하였으면 맞지 않는 사이즈가 있을 수 있기에 사이즈 체크를 하여준다. $ cd tensorflow1/models/research/object_detection $ python3 sizeChecker.py  --move (뒤에 붙은 --move는 옵션이기에 빼주어도 상관없으며, --move 입력시 worng 폴더가 만들어지며 이 폴더 안에 맞지 않는 사진들이 들어간다.) (sizeChecker.py의 소스코드 중 디렉토리를 이미지가 저장되어 있는 폴더로 변경하여 주어야한다.) ➢ 사이즈 확인후 .xml 파일을 만들어 준다. $ python3 xml_to_csv.py (xml_to_csv.py 안에는 실행시 어디에 파일은 만들지에 대한 디렉토리가 있기에 사용자에 따라서 바꾸거나 그대로 둔다. 나는 내 임의의 경로로 새로 설정하여 주었다.) ➢ generate_tfrecord.py를 실행하여 준다. (실행전 파일에서 라벨 수와 이름을 변경하여 주어야 한다.) python3 generate_tfrecord.py --csv_input=images\train_labels.csv --image_dir=images\train --output_path=train.record python3 generate_tfrecord.py --csv_input=images\test_labels.csv --image_dir=image...

Ubuntu(18.04)에 tensorflow 설치

➢Tensorflow를 설치하기 전 ubuntu를 업데이트와 업그레이드 해준다. $ sudo apt-get update $ sudo apt-get upgrade ➢OpenCV 설치 $ sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev $ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev $ sudo apt-get install libxvidcore-dev libx264-dev $ pip3 install opencv-python ➢Tensorflow설치 및 PATH설정 $ pip3 install tensorflow $ mkdir tensorflow1 $ cd tensorflow1 $ git clone --recurse-submodules https://github.com/tensorflow/models.git $ sudo nano ~/.bashrc 마지막 줄에 export PYTHONPATH=$PYTHONPATH:/home/user/tensorflow1/models/research:/home/user/tensorflow1/models/research/slim 추가 ➢Protobuf tensorflow1/models/research에서 실행 $  protoc --python_out=. .\object_detection\protos\anchor_generator.proto .\object_detection\protos\argmax_matcher.proto .\object_detection\protos\bipartite_matcher.proto .\object_detection\protos\box_coder.proto .\object_detection\protos\box_predictor.proto .\object_detection\protos\eva...

온도 센서와 조도 센서 이용하기

이미지
➢ 라즈베리를 사용하고 온도 센서, 조도 센서를 mcp3204를 이용하여 값을 읽어와 화면에 출력을 한다. ➢ 값을 읽어 오면 부저자 짧게 두번 울리며 초록색 led가 점등한다. ➢ 온도와 조도 중 한 값이 제대로 읽어지지 않으면 적색 led가 점등한다. ➢ 조도 센서가 일정 값 만큼 어두워 지면 노란색 led가 점등한다. ➢ 모듈 ➢ 앱 ➢ 동작 영상 ➢ 나머지 헤더 파일 https://drive.google.com/drive/folders/18n9wTS1evdIPmOtWm_4icxFq_nXFGNqY?usp=sharing