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  참고