1. image crop

from PIL import Image

area = (가로시작점, 세로시작점, 가로범위, 세로범위)

crop_image = img.crop(area)

im.save # 저장하기

 

2. opveCV 활용

import cv2

src=cv2.imread("Image/pawns.jpg", cv2.IMREAD_COLOR)

dst=src.copy()

dst=src[100:600, 200:700] %높이, 너비

 

3. trim 활용

import cv2 #cv2 임포트

def im_trim (img): #함수로 만든다

x = 845;

y = 325; #자르고 싶은 지점의 x좌표와 y좌표 지정

w = 180; h = 235; #x로부터 width, y로부터 height를 지정

img_trim = img[y:y+h, x:x+w] #trim한 결과를 img_trim에 담는다

cv2.imwrite('org_trim.jpg',img_trim) #org_trim.jpg 라는 이름으로 저장

return img_trim #필요에 따라 결과물을 리턴

org_image = cv2.imread('test.jpg') #test.jpg 라는 파일을 읽어온다

trim_image = im_trim(org_image) #trim_image 변수에 결과물을 넣는다

출처: https://pikabu.tistory.com/42 [피카부]

 

4. numpy 슬라이싱

import cv2 img = cv2.imread("lenna.png")

crop_img = img[200:400, 100:300] # Crop from x, y, w, h -> 100, 200, 300, 400

# NOTE: its img[y: y + h, x: x + w] and *not* img[x: x + w, y: y + h]

cv2.imshow("cropped", crop_img)

cv2.waitKey(0)

아주 기본적인것으로 1차안이다

계속 업그레이드 하면서 발전시키려고 함

IMU 센서(가속도, 자이로스코프)

Variable Euler Angle Symbol Output Interval (Degrees)
X Roll ϕ −180 ≤ ϕ < 180
Y Pitch θ −90 ≤ θ ≤ 90
Z Yaw ψ −180 ≤ ψ < 180

https://kr.mathworks.com/help/fusion/gs/spatial-representation-coordinate-systems-and-conventions.html?searchHighlight=roll%20pitch&s_tid=doc_srchtitle

 

Orientation, Position, and Coordinate Systems - MATLAB & Simulink - MathWorks 한국

아래 MATLAB 명령에 해당하는 링크를 클릭하셨습니다. 이 명령을 MATLAB 명령 창에 입력해 실행하십시오. 웹 브라우저에서는 MATLAB 명령을 지원하지 않습니다.

kr.mathworks.com

3축 가속도 센서의 출력 값에는 회전성분이 포 함되므로 이를 고려하지 않고 하나의 대표값으로 처리

accmag = sqrt(accx.^2 + accy.^2 + accz.^2); 

roll: y축에 대한 회전 (갸웃갸웃) roll = arctan(y/z)

pitch: x축에 대한 회전 (끄덕끄덕) pitch = arctan(x/z) 

yaw: z축에 대한 회전 (도리도리중력가속도 방향과 일치하는 z축에 대한 회전은 감지할 수 없음

 모든 물체는 지구 중심 방향으로 9.8m/s^2 중력가속도를 받음

스마트폰을 세워놓은 (정지)상태라면 중력가속도의 반대인 y축의 플러스 방향으로 9.8m/s^2의 가속도가 작용함

 

속력 = 거리/시간  -> 각속도 = 회전한 각도/시간

속력 * 시간 = 거리 -> 각속도 * 시간 = 회전한 각도

따라서 단위 시간 동안 측정되는 각속도를 이용하여 회전한 각도를 누적하여 더하게 되면 (적분) 회전한 각도를 구할 수 있게 된다cumtrapz(time,accelerometer)

clc
clear all

%데이터 불러오기
AccData = csvread('Accelerometer.csv',1,1);
GyrData = csvread('Gyroscope.csv',1,2);

%가속도
accx = AccData(:,2);
accy = AccData(:,3);
accz = AccData(:,4);

%acc대표값
accmag = sqrt(accx.^2 + accy.^2 + accz.^2);

%velocity 속도
time = AccData(:,1)./1000;
accelx = (accx-mean(accx))*9.8;
accvel = cumtrapz(time,accelx);
%Displacement(변위) : cumtrapz(time,accvel)

%roll x축 회전
accroll = atan(accy./accz)*180/pi;
%pitch y축 회전
accpitch = -atan(accx./accz)*180/pi;

%STFT변환
spectrogram(accvel,'yaxis');

%자이로스코프
gyrx = GyrData(:,1);
gyry = GyrData(:,2);
gyrz = GyrData(:,3);

%roll x축 회전
gyrroll = atan(gyry./gyrz)*180/pi;
%pitch y축 회전
gyrpitch = -atan(gyrx./gyrz)*180/pi;

%STFT변환
spectrogram(gyrx,'yaxis');

[이미지 전처리]

1. 128*128 사진 두장을 먼저 A, B에 넣기

 trainning 용이면 A, B의 위치가 중요하나 TEST를 하려면 둘다 같은 사진이여도 무방함

2. path/to/data 에 train, test, val 중에 하나로 폴더를 만들어서 이미지 넣기

3.  명령어 작성

sudo python scripts/combine_A_and_B.py --fold_A path/to/data/A --fold_B path/to/data/B --fold_AB path/to/data

이렇게 하면 train, test, val로 합쳐진 이미지가 만들어짐

그렇게 되면 datasets에 폴더를 만들고 만들어진 train, test, val 폴더를 가지고 옮겨줘야함

 

[test 실행하기]

1. cd .. 으로 폴더에서 벗어나 홈으로 나오기

2. 왜인지... 모르겠으나 매번 이작업을 해줘야 함...

luarocks install cutorch

source ~/.bashrc
source ~/.profile

이 두줄로 소스를 다시 공유함

3. 다시 cd ~/pix2pix로 들어가서

env DATA_ROOT=./datasets/wheel name=wheel_generation which_direction=BtoA th train.lua

env DATA_ROOT=./datasets/wheel name=wheel_generation which_direction=BtoA phase=test th test.lua

변경해줘야하는 부분

 

논문 : Image-to-image translation with conditional adversarial networks.

저자 : Isola, P., Zhu, J. Y., Zhou, T., & Efros, A. A. (2017)


Why do we choose cGAN?

# CNN과의 차이점

-어떻게 최소화 하는지 방법을 알려주어야 하는데, 그 과정에서 유클리디안 방식을 사용

-유클리디안 방식을 사용하면 흐리게 나옴(모든 출력의 평균을 최소화 하기 때문)

→ 목표 : 출력 이미지를 현실과 구별할 수 없게 내놓으면서도 목적에 맞게 로스 함수를 자동으로 학습

기존 방식

Conditional GANs

픽셀 단위의 classification or regression으로 문제 해결

각 출력 픽셀들은 다른 픽셀들에 서로 독립적이라고 생각

Unstructured 출력 공간 개념

Structured loss 사용

     : 주어진 목표 이미지와 출력의 다름을 penalize 하는 것

Generator U-net 사용

DiscriminatorPatchGAN 사용

# cGAN

G,D에 특정 condition 나타내는 정보 “y”더해줌

Generator GDiscriminator D가 실제 이미지인지 구분하지 못하는 출력을 내도록 학습되고

DGenerator가 생성한 이미지를 “fakes”로 구별할 수 있도록 훈련된다.

※ Z가 필요한가?

-Z의 유무가 큰 영향을 끼치지는 않지만, deterministic한 결론을 피하기 위해 dropout 형태로 여러 layer에 노이즈 줌 

* Deterministic : 입력값에 다라 출력값이 결정되는 것.

* Dropout : 네트워크의 일부를 생략, 모델결합에 투표효과를 주어 신경망 성능 향상

Method

# cGAN목적함수(Objective)

G는 목적함수를 최소화하는 방향으로, D는 최대화 하는 방향으로 나타냄

# L1 (맨하튼 거리)

격자 방식으로 픽셀상 거리를 나타냄, L2 유클리디안 거리는 블러리한 이미지 만들어냄

# 최종 목적함수(Objective)

Generator with skips

이전에는 입력이 여러 레이어를 통하면서 점점 다운샘플링 되고병목 레이어를 통화하고 나면 이러한 과정을 거꾸로 진행하는 처리

입력과 출력 사이에서 저수준의 정보를 공유   → 더 좋은 화질의 이미지 출력 가능

 i과 층 ni 잇는 skip connection만듬 (n은 전체 층의 )

skip connection은 층 i의 모든 채널을 그대로 ni층에 붙어있음

Markovian discriminator (PatchGAN)

#PatchGAN이란?

전체 영역이 아니라 특정 크기의 patch 단위로 가짜/진짜를 판별하고 그 결과에 평균을 구하는 방식

L1은 저주파 영역을 감당하고 D는 고주파 성분에 집중하여 가짜/진짜 여부를 판단함

픽셀들간의 연관성을 거리에 비례하여 작아짐(일정거리 이상 떨어지면 상호간의 관계가 의미가 없어짐)

특정 크기의 patch에 대하여 선명한 이미지 생성 비율을 찾고 학습을 한다면 G의 성능은 향상됨

전체 이미지의 가짜/진짜를 가리는 것보다 상관관계가 유지되는 범위의 적절한 크기를 정하는 것이 효율적임

 

Conclusion

# L1 + cGAN

전반적으로 보면 cGANGAN보다, 그리고 L1과의 combination이 더 좋은 결과를 내어줌.

DConditioning이 없는, Dx를 보지 않는 모델(GAN이라 표기/G에는 있음)

     사실 인풋과 아웃풋의 mismatch를 따지는 모델이 아니기 때문에 이 metric에서는 안좋은 성능일 수 밖에 없음.

L1을 사용한다는 것 ⇒ Discriminator가 하는 일은 변함이 없지만, GD를 속이는 일 뿐 아니라

    ground truth와의 L1 distance를 줄이는 일을 동시에 함

cGAN(특정) input과 비슷한 (특정) output을 생성하도록 지도받음

L1 lossground truth와 생성된 output이 서로 비슷해지도록 지도함

# Colorfulness

cGANcolor distributionground truth와 얼마나 matching하는지에 대한 표 (빨간색)

L1 이 더 narrowdistribution을 보이는데, averaged / grayish color를 만들어내기 때문

cGAN이 더 실제에 가까운 color distribution보임

# Fully-convolutional translation

PatchGAN은 고정된 패치 discriminator를 사용하므로 어떠한 이미지 크기에도 적용할 수 있다.

마찬가지로 generator또한 복잡하게 적용할 수 있으므로 학습할 때 보다 더 큰 이미지에도 적용할 수 있다.

256*256으로 학습했지만 512*512 결과물을 낼 수 있음

#  Semantic segmentation (영상분할)

아웃풋이 복잡하지 않을 때, 반대로 실험해본 결과

Photo에서 Lables로 바뀌는 값은 L1 loss만 사용하는 방법이 더 효과적

cGAN이 더 샤프한 아웃풋을 내주지만, 존재하지 않는 작은 오브젝트를 만들어냄

각각의 Traning Data에서 최대 3000장 정도가 사용/Architecture에서 Photo로 바꾸는 경우에는 400장밖에 사용

또한, training batch size1 또는 4로 작게 가져가고  4일때는 Batch Normalization을   1일때는 Instance Normalization사용

온라인에서도 변환가능  https://affinelayer.com/pixsrv/index.html

Style transfe?

두 영상(content image & style image)가 주어졌을 때

그 이미지의 주된 형태를 content image 유사하게 유지하고

스타일만 우리가 원하는 style image로 바꿔주는 것

Style image : 스타일을 추출해낼 이미지

Content image : 추출해낸 스타일을 적용시킬 이미지

Feature map 추출방법

Feature map 추출방법

오른쪽 아래 집 모양을 보면 약간 찌그러진 느낌

상위 레벨 feature 일수록 추상적임

Content image의 상위 레벨 하나의 feature

Style image의 모든 레벨의 feature correlation을 이용하여 Loss function을 정의함

High level content 적용시켜야지 디테일한 정보들이 사라지기에 Style이 좀더 강조

단순한 texture과 복잡한 texture을 가지고 일관된 texture만들어냄

[Content transfer]

이미지 사이의 content간의 차이는 content loss, Lcontent로 측정

정보의 추상화가 많이 이루어진 high level layerfeature map과 비교

L번째의 layer에서 content lossfeature간 차의 Frobenius norm 제곱

 

[Style transfer]

Stlye loss, Lstlye은 각 feature map에 대해 Gram matrix를 구하고 Gram matrix간의차 Frobenius norm의 제곱으로 정의

Gram matrix그림간의 유사성정향화 할때 사용(아래 수식 설명)

Low layer부터 high layer까지 다양한 수준의 loss를 계산하고 Weightes sum하여 Lstlye로 정의

L층에서 스타일 이미지에 대한 상관관계 행렬을 계산
l번째 층에 대한 스타일 비용함수는 두 상관관계의 차이를 프로베니우스 제곱 한 것

[최종 목적함수]

알파가 1고 베타가 0이면 content 이미지와 윤곽이 비슷한 이미지가 나옴

Lcontent는 상위 레이어에서 추출하고 있고 하위 레이어에서 추출한 feature을 사용

반면 알파가 0이고 베타가 1이면 style 이미지와 비슷한 이미지가 나옴

 

아래는 해당 논문입니다.

https://www.google.com/search?q=Image+Style+Transfer+Using+Convolutional+Neural+Networks&rlz=1C1CAFA_enKR837KR837&oq=Image+Style+Transfer+Using+Convolutional+Neural+Networks&aqs=chrome..69i57j69i60j69i59j0l3.694j0j8&sourceid=chrome&ie=UTF-8#

+ Recent posts