Dies ist die Entwicklungsversion des Codes für das folgende Dokument:
Bugra Tekin, Sudipta N. Sinha und Pascal Fua, „Real-Time Seamless Single Shot 6D Object Pose Prediction“, CVPR 2018.
Das Original-Repository für die Codebasis für das obige Dokument finden Sie unter dem folgenden Link.
Wir schlagen einen Single-Shot-Ansatz zur gleichzeitigen Erkennung eines Objekts in einem RGB-Bild und zur Vorhersage seiner 6D-Pose vor, ohne dass mehrere Schritte erforderlich sind oder mehrere Hypothesen untersucht werden müssen. Die Schlüsselkomponente unserer Methode ist eine neue CNN-Architektur, die vom YOLO-Netzwerkdesign inspiriert ist und die 2D-Bildpositionen der projizierten Eckpunkte des 3D-Begrenzungsrahmens des Objekts direkt vorhersagt. Die 6D-Pose des Objekts wird dann mithilfe eines PnP-Algorithmus geschätzt. Papier, arXiv
Wenn Sie diesen Code verwenden, geben Sie bitte Folgendes an
@inproceedings{tekin18,
TITEL = {{Nahtlose Einzelbild-6D-Objektposenvorhersage in Echtzeit}}, AUTOR = {Tekin, Bugra und Sinha, Sudipta N. und Fua, Pascal},
BUCHTITEL = {CVPR},
JAHR = {2018}
}
SingleShotPose wird unter der MIT-Lizenz veröffentlicht (Einzelheiten finden Sie in der LIZENZ-Datei).
Der Code wurde unter Windows mit CUDA v8 und cudNN v5.1 getestet. Die Implementierung basiert auf PyTorch 0.4.1 und wurde auf Python3.6 getestet. Der Code erfordert die folgenden Abhängigkeiten, die mit Conda oder Pip installiert werden könnten: Numpy, Scipy, PIL, OpenCV-Python. Eine frühere Version, die mit PyTorch 0.3.1 kompatibel ist und auf Python2.7 getestet wurde, finden Sie im Ordner py2
.
Führen Sie im Hauptcodeverzeichnis Folgendes aus, um (1) den vorverarbeiteten LINEMOD-Datensatz, (2) trainierte Modelle für den LINEMOD-Datensatz, (3) das trainierte Modell für den OCCLUSION-Datensatz und (4) Hintergrundbilder aus VOC2012 herunterzuladen und zu extrahieren Datensatz bzw.
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
Alternativ können Sie direkt auf die oben stehenden Links gehen und die Dateien manuell in den entsprechenden Verzeichnissen herunterladen und extrahieren. Der gesamte Downloadvorgang kann lange dauern (ca. 60 Minuten). Bitte beachten Sie auch, dass der Zugriff auf OneDrive in einigen Ländern möglicherweise eingeschränkt ist.
Um den Modelllauf zu trainieren,
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]
z.B
python train.py --datacfg cfg/ape.data --modelcfg cfg/yolo-pose.cfg --initweightfile cfg/darknet19_448.conv.23 --pretrain_num_epochs 15
wenn Sie mit den von ImageNet initialisierten Gewichten beginnen möchten, oder
python train.py --datacfg cfg/ape.data --modelcfg cfg/yolo-pose.cfg --initweightfile backup/duck/init.weights
wenn Sie für eine schnellere Konvergenz mit einem bereits vorab trainierten Modell auf LINEMOD beginnen möchten.
[datacfg] enthält Informationen zu den Trainings-/Testsplits, 3D-Objektmodellen und Kameraparametern
[modelcfg] enthält Informationen über die Netzwerkstruktur
[initweightfile] enthält Initialisierungsgewichte. <
Zu Beginn des Trainings sehen Sie eine Ausgabe wie diese:
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
Dadurch wird die Netzwerkstruktur definiert. Während des Trainings wird das beste Netzwerkmodell in der Datei „model.weights“ gespeichert. Um Netzwerke für andere Objekte zu trainieren, ändern Sie einfach den Objektnamen, während Sie die Trainingsfunktion aufrufen, z. B. „ python train.py --datacfg cfg/duck.data --modelcfg cfg/yolo-pose.cfg --initweightfile backup/duck/init.weights
". Wenn Sie beim Training auf GPU-Speicherfehler stoßen, können Sie versuchen, die Stapelgröße auf beispielsweise 16 oder 8 zu verringern, damit sie in den Speicher passt. Die Open-Source-Version des Codes wurde einem starken Refactoring unterzogen und außerdem mussten einige Modelle neu trainiert werden. Die von uns bereitgestellten neu trainierten Modelle ändern sich nicht wesentlich von den anfänglichen Ergebnissen, die wir liefern (manchmal etwas schlechter und manchmal etwas besser).
Zum Testen des Modelllaufs
python valid.py --datacfg [path_to_data_config_file] --modelcfg [path_to_model_config_file] --weightfile [path_to_trained_model_weights]
z.B
python valid.py --datacfg cfg/ape.data --modelcfg cfg/yolo-pose.cfg --weightfile backup/ape/model_backup.weights
Sie können valid.ipynb auch verwenden, um das Modell zu testen und die Ergebnisse zu visualisieren.
Im Ordner multi_obj_pose_estimation/
Testen:
python valid_multi.py cfgfile weightfile
z.B
python valid_multi.py cfg/yolo-pose-multi.cfg backup_multi/model_backup.weights
Ausbildung:
python train_multi.py datafile cfgfile weightfile
z.B,
python train_multi.py cfg/occlusion.data cfg/yolo-pose-multi.cfg backup_multi/init.weights
Unsere Etikettendateien bestehen aus 21 Grundwahrheitswerten. Wir sagen 9 Punkte voraus, die dem Schwerpunkt und den Ecken des 3D-Objektmodells entsprechen. Zusätzlich sagen wir die Klasse in jeder Zelle voraus. Das ergibt 9x2+1 = 19 Punkte. Beim Training mit mehreren Objekten weisen wir während des Trainings denjenigen Ankerkasten zu, dessen Größe dem aktuellen Objekt am ähnlichsten ist, und der dafür verantwortlich ist, die 2D-Koordinaten für dieses Objekt vorherzusagen. Um die Größe der Objekte zu kodieren, haben wir zusätzlich 2 Zahlen für den Bereich in x-Dimension und y-Dimension. Daher haben wir 9x2+1+2 = 21 Zahlen.
Jeweils 21 Zahlen entsprechen Folgendem: 1. Zahl: Klassenbezeichnung, 2. Zahl: x0 (x-Koordinate des Schwerpunkts), 3. Zahl: y0 (y-Koordinate des Schwerpunkts), 4. Zahl: x1 (x-Koordinate von die erste Ecke), 5. Zahl: y1 (y-Koordinate der ersten Ecke), ..., 18. Zahl: x8 (x-Koordinate der achten Ecke), 19. Zahl: y8 (y-Koordinate der achten Ecke) , 20. Zahl: x-Bereich, 21. Zahl: y-Bereich.
Die Koordinaten werden durch die Bildbreite und -höhe normalisiert: x / image_width
und y / image_height
. Dies ist nützlich, um ähnliche Ausgabebereiche für die Koordinatenregressions- und Objektklassifizierungsaufgaben zu haben.
Wir trainieren und testen unsere Modelle auf dem LINEMOD-Datensatz, indem wir dieselben Trainings-/Testaufteilungen mit der BB8-Methode verwenden, um unseren Ansatz zu validieren. Wenn Sie ein Modell auf Ihrem eigenen Datensatz trainieren möchten, können Sie dieselbe Ordnerstruktur mit dem bereitgestellten LINEMOD-Datensatz erstellen und die Pfade in cfg/[OBJECT].data, [DATASET]/[OBJECT]/train.txt und anpassen [DATASET]/[OBJECT]/test.txt-Dateien. Der Ordner für jedes Objekt sollte Folgendes enthalten:
(1) ein Ordner mit Bilddateien,
(2) ein Ordner mit Etikettendateien (eine ausführliche Erklärung zum Erstellen von Etiketten finden Sie unter diesem Link. Sie können auch die Toolbox ObjectDatasetTools von Drittanbietern finden, die zum Erstellen von Ground-Truth-Etiketten für die Posenschätzung von 6D-Objekten nützlich ist.)
(3) eine Textdatei mit den Dateinamen für Trainingsbilder ( train.txt
),
(4) eine Textdatei mit den Dateinamen für Testbilder ( test.txt
),
(5) eine .ply-Datei, die das 3D-Objektmodell enthält (die Einheit des Objektmodells wird in Metern angegeben),
(6) optional ein Ordner mit Segmentierungsmasken (Wenn Sie den Hintergrund Ihrer Trainingsbilder ändern möchten, um ihn robuster gegenüber unterschiedlichen Hintergründen zu machen, wäre dies für eine bessere Generalisierungsfähigkeit unerlässlich),
Bitte achten Sie auch darauf, die folgenden Werte in den Daten- und Modellkonfigurationsdateien entsprechend Ihren Bedürfnissen anzupassen:
diam
“-Wert in der Datenkonfigurationsdatei mit dem Durchmesser des vorliegenden Objektmodells ändern.yolo-pose.cfg
) und einigen Datenerweiterungsparametern (Jitter, Farbton, Sättigung, Belichtungsparameter in dataset.py
). Möglicherweise muss auch eine Anpassung vorgenommen werden, um eine bessere Konvergenz in Ihrem Datensatz zu erzielen.yolo-pose-multi.cfg
) angeben. Bitte stellen Sie außerdem sicher, dass Sie die richtige Anzahl an Klassen verwenden und geben Sie diese in yolo-pose-multi.cfg
an.fx
, fy
, u0
, v0
, width
, height
) in den Datenkonfigurationsdateien mit den für Ihren Datensatz spezifischen Parametern ändern. Beim Erstellen eines Trainingsdatensatzes wäre es wichtig, eine große Anzahl von Blickwinkeln/Abständen zu erfassen und eine große Variabilität der Beleuchtungs-/Okklusions-/Hintergrundeinstellungen zu modellieren, um die Generalisierungsfähigkeit des Ansatzes auf Ihren Datensatz zu erhöhen. Wenn Sie einige Modell- und Verlustparameter (z. B. Gewichtungsfaktor für unterschiedliche Verlustterme) für Ihre eigenen Zwecke anpassen möchten, können Sie dies in der Modellkonfigurationsdatei ( yolo-pose.cfg
) tun.
Der Code wurde von Bugra Tekin geschrieben und basiert auf der YOLOv2-Implementierung des Github-Benutzers @marvis
Bei Fragen oder Fehlerberichten wenden Sie sich bitte an Bugra Tekin