점 클 라 우 드 딥 러 닝 시리즈 1 - PointCNN 코드 읽 기 소감
코드 를 본 학생 들 은 모두 알 고 있 습 니 다. 작가 의 핵심 사상 X 변환 은 코드 pointcn. py 에 있 는데 그 안에 주로 두 부분, 특징 추출 과 X 매트릭스 훈련 이 포함 되 어 있 습 니 다.다음은 따로 말씀 드 리 겠 습 니 다.
인접 지역 의 특징 을 추출 하 는 데 사용 되 는 것 은 두 개의 dense 층 (fc 층 / MLP 라 고도 함) 뿐 이 며, 간단하게 척도 (P, K, C) 의 인접 지역 구 조 를 (P, K, C) 로 올 렸 다.
# Prepare features to be transformed
nn_fts_from_pts_0 = pf.dense(nn_pts_local_bn, C_pts_fts, tag + 'nn_fts_from_pts_0', is_training)#fc1, (N, P, K, C_pts_fts)
nn_fts_from_pts = pf.dense(nn_fts_from_pts_0, C_pts_fts, tag + 'nn_fts_from_pt', is_training)#fc2, features, f_delta
if fts is None:
nn_fts_input = nn_fts_from_pts
else:
nn_fts_from_prev = tf.gather_nd(fts, indices, name=tag + 'nn_fts_from_prev')
nn_fts_input = tf.concat([nn_fts_from_pts, nn_fts_from_prev], axis=-1, name=tag + 'nn_fts_input')
이 어 저 자 는 pointnet 의 max pooling 을 사용 하지 않 았 다 는 점 에서 도 언급 했다. 저 자 는 X 변환 을 훈련 시 켜 더 좋 은 효 과 를 거 둘 수 있다 고 생각 하기 때문이다.
그리고 X 변환 에 대해 3 층 이 있 고 1 층 은 권 적 층 이 라 놀 랍 습 니 다. 권 적 핵 은 1 * k 입 니 다. 즉, 이웃 차원 에서 k 개의 이웃 점 을 한 점 에 모 았 고 K 를 사 용 했 습 니 다.×K 개의 볼 륨 층 은 특징 차원 을 k * k 로 올 리 고 차원 은 (P, K, C) 에서 (P, 1, K) 로 바 뀌 었 다.×K);
######################## X-transformation #########################
X_0 = pf.conv2d(nn_pts_local_bn, K * K, tag + 'X_0', is_training, (1, K), with_bn=False)
#kernal size(1, K, 3), kernal num=K*K, so the output size is (N, P, 1, K*K). so this operator is in the neighbor point dimentional.
이 어 작 가 는 두 개의 dense 층 을 사용 하여 이 구 조 를 유지 했다.
X_1 = pf.dense(X_0, K * K, tag + 'X_1', is_training, with_bn=False)#in the center point dimensional ,P decrease to 1.
X_2 = pf.dense(X_1, K * K, tag + 'X_2', is_training, with_bn=False, activation=None)#(N, P, 1, K*K)
그리고 reshape 성 (P, K, K) 은 X - transform 행렬 을 얻 었 다.
X = tf.reshape(X_2, (N, P, K, K), name=tag + 'X')
위 에서 얻 은 특징 도와 권 적 상승 을 하 다.
fts_X = tf.matmul(X, nn_fts_input, name=tag + 'fts_X')
마지막 으로 볼 륨 작업 입 니 다. 출력 채널 수 는 C 이 고 (1, K) 척도 의 볼 륨 핵 은 K 인접 도 메 인 을 융합 시 키 는 데 사 용 됩 니 다. 여 기 는 Pointnet + 의 풀 화 작업 과 다 릅 니 다.
fts = pf.separable_conv2d(fts_X, C, tag + 'fts', is_training, (1, K), depth_multiplier=depth_multiplier)# (N, P, 1, C)
return tf.squeeze(fts, axis=2, name=tag + 'fts_3d')# (N, P, C)
볼 륨 가능 한 separable 에 대하 여conv2d 의 소 개 는 나의 다른 블 로 그 를 참고 할 수 있다: tf. layers. separableconv2d 깊이 볼 륨 실현
솔직히 보고 놀 랐 어 요.X 를 훈련 시 켜 행렬 을 바 꾸 는 복잡성 이 특징 추출 부분 보다 더 커 보이 기 때문이다.(사실 PointCNN 의 변환 행렬 은 PointNet 의 T - net 코드 보다 훨씬 적다)
전체적으로 말 하면 작가 의 출발점 은 점 클 라 우 드 정렬 문 제 를 해결 하 는 것 이다. 코드 를 보면 더욱 정확하게 말하자면 K 이웃 지역 의 정렬 문제 이다.특징 을 추출 할 때 조 심 스 럽 고 이웃 지역 의 차원 에서 경거망동 하지 못 한다. 예 를 들 어 볼 륨 작업 등 은 정렬 의 변화 로 인해 결 과 를 변화 시 킬 수 있 기 때문에 이 차원 에서 pointnet 은 max pooling 을 사용 했다. 본 고 는 어떠한 조작 도 하지 않 고 이웃 지역 의 점 을 조용히 높이 고 각자 차원 을 올 린 다음 에 심 부 름 을 들 었 다.하지만 X 가 행렬 을 바 꾸 도록 훈련 할 때 손발 을 놓 고 활짝 열 었 고, K * K 의 행렬 을 얻 기 위해 물리 적 의 미 를 떠 나 다양한 차원 의 변 화 를 하 는 것 은 거 리 낌 이 없다 고 할 수 있다.
또 다른 문제 가 생각 났 습 니 다. 여기 서 해결 한 것 은 이웃 점 의 정렬 문제 이기 때 문 입 니 다. 그러면 점 구름 속 에서 중심 점 을 선택 할 때 중심 점 의 정렬 은 괜 찮 습 니까?또는 중심 점 의 선택 이 매번 다르다 면 이웃 지역 의 정렬 문 제 를 해결 할 수 있 더 라 도 이러한 이웃 지역 은 근본적으로 서로 다 를 수 있다.이에 따라 올해 새로 나 온 소 넷 은 이 문 제 를 해결 하려 하고 있다.점 운 을 공간 분포 에서 유일한 추출 을 진행 하 였 다.이 사고방식 은 그래도 매우 좋 고 실험 효과 도 좋다.그러나 코드 를 실행 할 때 설정 해 야 할 것 이 너무 복잡 해서 나 는 줄곧 잘 하지 못 했 는데 이것 도 작은 결함 이 라 고 할 수 있다.
코드 GitHub 주소:https://github.com/yangyanli/PointCNN
논문 arXiv 주소:https://arxiv.org/abs/1801.07791
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
점 클라우드 딥러닝 시리즈 3 - PointNet/PointNet++ 코드 비교글은 소개하지 않겠습니다. 여기서는 주로 코드를 말합니다. PointNet++는 PointNet의 업그레이드 버전으로 주로 국부 정보에 대한 감지 능력을 증가시켰다.코드에 나타나면 변화가 비교적 많다. 우리는 분류를...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.