이는 다음 문서에 대한 코드의 개발 버전입니다.
Bugra Tekin, Sudipta N. Sinha 및 Pascal Fua, "실시간 연속 단일 샷 6D 개체 포즈 예측", CVPR 2018.
위 논문의 코드베이스에 대한 원본 저장소는 다음 링크에서 찾을 수 있습니다.
우리는 여러 단계를 요구하거나 여러 가설을 조사할 필요 없이 RGB 이미지에서 개체를 동시에 감지하고 해당 개체의 6D 포즈를 예측하기 위한 단일 샷 접근 방식을 제안합니다. 우리 방법의 핵심 구성 요소는 객체의 3D 경계 상자에 투영된 정점의 2D 이미지 위치를 직접 예측하는 YOLO 네트워크 설계에서 영감을 받은 새로운 CNN 아키텍처입니다. 그런 다음 PnP 알고리즘을 사용하여 개체의 6D 포즈를 추정합니다. 종이, arXiv
이 코드를 사용하는 경우 다음을 인용해 주세요.
@inproceedings{tekin18,
제목 = {{실시간 원활한 단일 샷 6D 개체 포즈 예측}}, 작성자 = {Tekin, Bugra 및 Sinha, Sudipta N. 및 Fua, Pascal},
책제목 = {CVPR},
연도 = {2018}
}
SingleShotPose는 MIT 라이선스에 따라 출시됩니다(자세한 내용은 LICENSE 파일 참조).
코드는 CUDA v8 및 cudNN v5.1을 사용하여 Windows 에서 테스트되었습니다. 구현은 PyTorch 0.4.1을 기반으로 하며 Python3.6 에서 테스트되었습니다. 코드에는 conda 또는 pip와 함께 설치할 수 있는 numpy, scipy, PIL, opencv-python 종속성이 필요합니다. PyTorch 0.3.1과 호환되고 Python2.7에서 테스트된 이전 버전은 py2
폴더를 참조하세요.
기본 코드 디렉터리 내에서 다음을 실행하여 (1) 사전 처리된 LINEMOD 데이터 세트, (2) LINEMOD 데이터 세트에 대해 훈련된 모델, (3) OCCLUSION 데이터 세트에 대해 훈련된 모델, (4) VOC2012의 배경 이미지를 다운로드하고 추출합니다. 각각 데이터 세트.
wget -O LINEMOD.tar --no-check-certificate "https://onedrive.live.com/download?cid=05750EBEE1537631&resid=5750EBEE1537631%21135&authkey=AJRHFmZbcjXxTmI"
wget -O backup.tar --no-check-certificate "https://onedrive.live.com/download?cid=0C78B7DE6C569D7B&resid=C78B7DE6C569D7B%21191&authkey=AP183o4PlczZR78"
wget -O multi_obj_pose_estimation/backup_multi.tar --no-check-certificate "https://onedrive.live.com/download?cid=05750EBEE1537631&resid=5750EBEE1537631%21136&authkey=AFQv01OSbvhGnoM"
wget https://pjreddie.com/media/files/VOCtrainval_11-May-2012.tar
wget https://pjreddie.com/media/files/darknet19_448.conv.23 -P cfg/
tar xf LINEMOD.tar
tar xf backup.tar
tar xf multi_obj_pose_estimation/backup_multi.tar -C multi_obj_pose_estimation/
tar xf VOCtrainval_11-May-2012.tar
또는 위의 링크로 직접 이동하여 해당 디렉터리에서 파일을 수동으로 다운로드하고 추출할 수 있습니다. 전체 다운로드 프로세스는 오랜 시간이 걸릴 수 있습니다(~60분). 일부 국가에서는 OneDrive에 대한 액세스가 제한될 수도 있습니다.
모델 실행을 훈련하려면,
python train.py --datacfg [path_to_data_config_file] --modelcfg [path_to_model_config_file] --initweightfile [path_to_initialization_weights] --pretrain_num_epochs [number_of_epochs to pretrain]
예를 들어
python train.py --datacfg cfg/ape.data --modelcfg cfg/yolo-pose.cfg --initweightfile cfg/darknet19_448.conv.23 --pretrain_num_epochs 15
ImageNet 초기화 가중치에서 시작하려는 경우 또는
python train.py --datacfg cfg/ape.data --modelcfg cfg/yolo-pose.cfg --initweightfile backup/duck/init.weights
더 빠른 수렴을 위해 LINEMOD에서 이미 사전 훈련된 모델로 시작하려는 경우.
[datacfg] 에는 훈련/테스트 분할, 3D 객체 모델 및 카메라 매개변수에 대한 정보가 포함되어 있습니다.
[modelcfg]에는 네트워크 구조에 대한 정보가 포함되어 있습니다.
[initweightfile] 에는 초기화 가중치가 포함되어 있습니다. <
훈련이 시작되면 다음과 같은 출력이 표시됩니다.
layer filters size input output
0 conv 32 3 x 3 / 1 416 x 416 x 3 -> 416 x 416 x 32
1 max 2 x 2 / 2 416 x 416 x 32 -> 208 x 208 x 32
2 conv 64 3 x 3 / 1 208 x 208 x 32 -> 208 x 208 x 64
3 max 2 x 2 / 2 208 x 208 x 64 -> 104 x 104 x 64
...
30 conv 20 1 x 1 / 1 13 x 13 x1024 -> 13 x 13 x 20
31 detection
이는 네트워크 구조를 정의합니다. 훈련 중에 최상의 네트워크 모델이 "model.weights" 파일에 저장됩니다. 다른 개체에 대한 네트워크를 훈련하려면 훈련 함수를 호출하는 동안 개체 이름을 변경하기만 하면 됩니다(예: " python train.py --datacfg cfg/duck.data --modelcfg cfg/yolo-pose.cfg --initweightfile backup/duck/init.weights
". 훈련 중에 GPU 메모리 오류가 발생하는 경우 배치 크기를 예를 들어 16 또는 8로 줄여 메모리에 맞출 수 있습니다. 코드의 오픈 소스 버전은 강력한 리팩토링을 거쳤으며 일부 모델은 재교육을 받아야 했습니다. 우리가 제공하는 재학습된 모델은 우리가 제공하는 초기 결과에서 크게 변하지 않습니다(때로는 약간 더 나쁠 때도 있고 때로는 약간 더 좋을 때도 있음).
모델 실행을 테스트하려면
python valid.py --datacfg [path_to_data_config_file] --modelcfg [path_to_model_config_file] --weightfile [path_to_trained_model_weights]
예를 들어
python valid.py --datacfg cfg/ape.data --modelcfg cfg/yolo-pose.cfg --weightfile backup/ape/model_backup.weights
valid.ipynb를 사용하여 모델을 테스트하고 결과를 시각화할 수도 있습니다.
multi_obj_pose_estimation/ 폴더 내부
테스트:
python valid_multi.py cfgfile weightfile
예를 들어
python valid_multi.py cfg/yolo-pose-multi.cfg backup_multi/model_backup.weights
훈련:
python train_multi.py datafile cfgfile weightfile
예:
python train_multi.py cfg/occlusion.data cfg/yolo-pose-multi.cfg backup_multi/init.weights
우리의 라벨 파일은 21개의 실측 값으로 구성됩니다. 3D 객체 모델의 중심과 모서리에 해당하는 9개의 점을 예측합니다. 추가적으로 우리는 각 셀의 클래스를 예측합니다. 그러면 9x2+1 = 19점이 됩니다. 다중 객체 훈련에서는 훈련 중에 현재 객체와 가장 유사한 크기를 가진 앵커 상자를 해당 객체의 2D 좌표를 예측하는 담당 앵커 상자로 할당합니다. 객체의 크기를 인코딩하기 위해 x 차원과 y 차원의 범위에 대한 추가 숫자 2개가 있습니다. 따라서 9x2+1+2 = 21개의 숫자가 있습니다.
각각 21개의 숫자는 다음과 같습니다. 첫 번째 숫자: 클래스 레이블, 두 번째 숫자: x0(중심의 x 좌표), 세 번째 숫자: y0(중심의 y 좌표), 네 번째 숫자: x1(중심의 x 좌표) 첫 번째 모서리), 5번째 숫자: y1(첫 번째 모서리의 y좌표), ..., 18번째 숫자: x8(8번째 모서리의 x좌표), 19번째 숫자: y8(8번째 모서리의 y좌표), 20번째 숫자: x 범위, 21번째 숫자: y 범위.
좌표는 이미지 너비와 높이( x / image_width
및 y / image_height
로 정규화됩니다. 이는 좌표 회귀 및 객체 분류 작업에 대해 유사한 출력 범위를 갖는 데 유용합니다.
우리는 접근 방식을 검증하기 위해 BB8 방법과 동일한 학습/테스트 분할을 사용하여 LINEMOD 데이터 세트에서 모델을 학습하고 테스트합니다. 자체 데이터세트에서 모델을 교육하려면 제공된 LINEMOD 데이터세트로 동일한 폴더 구조를 만들고 cfg/[OBJECT].data, [DATASET]/[OBJECT]/train.txt 및 [데이터세트]/[OBJECT]/test.txt 파일. 각 개체의 폴더에는 다음이 포함되어야 합니다.
(1) 이미지 파일이 포함된 폴더,
(2) 라벨 파일이 포함된 폴더(라벨 생성 방법에 대한 자세한 설명은 이 링크를 참조하십시오. 6D 객체 포즈 추정을 위한 실측 라벨을 생성하는 데 유용한 타사 ObjectDatasetTools 도구 상자도 찾을 수 있습니다)
(3) 학습 이미지의 파일 이름이 포함된 텍스트 파일( train.txt
),
(4) 테스트 이미지의 파일 이름이 포함된 텍스트 파일( test.txt
),
(5) 3D 객체 모델이 포함된 .ply 파일(객체 모델의 단위는 미터로 제공됨),
(6) 선택적으로 분할 마스크가 포함된 폴더(훈련 이미지의 배경을 다양한 배경에 대해 더욱 강력하게 변경하려는 경우 더 나은 일반화 능력을 위해 필수적입니다),
또한 필요에 따라 데이터 및 모델 구성 파일에서 다음 값을 조정하십시오.
diam
" 값을 변경해야 합니다.yolo-pose.cfg
파일의 steps, scales, max_epochs 매개변수) 및 일부 데이터 증대 매개변수( dataset.py
의 지터, 색조, 채도, 노출 매개변수) 데이터 세트의 더 나은 수렴을 위해 조정해야 할 수도 있습니다.yolo-pose-multi.cfg
)에 지정해야 합니다. 또한 올바른 클래스 수를 사용하고 yolo-pose-multi.cfg
에 지정했는지 확인하세요.fx
, fy
, u0
, v0
, width
, height
)를 데이터 세트에 특정한 것으로 추가로 변경해야 합니다. 교육 데이터 세트를 생성하는 동안 많은 수의 시점/거리를 샘플링하고 조명/폐색/배경 설정의 큰 가변성을 모델링하는 것은 데이터 세트에 대한 접근 방식의 일반화 능력을 높이는 데 중요합니다. 자신의 목적에 맞게 일부 모델 및 손실 매개변수(예: 다양한 손실 조건에 대한 가중치 계수)를 조정하려면 모델 구성 파일( yolo-pose.cfg
)에서 조정할 수 있습니다.
이 코드는 Bugra Tekin이 작성했으며 github 사용자 @marvis의 YOLOv2 구현을 기반으로 구축되었습니다.
질문이나 버그 보고서가 있으면 Bugra Tekin에 문의하세요.