## 2 Methodologies
Figure 2 displays the pick grasps, the place grasps, and the separation of the pick grasps into valid and invalid grasps. The grasps are represented as coordinate frames in Blender. In our experiments, two grasps are considered \"corresponding\" if the distance between their position is smaller than 5 mm and their orientation forms a smaller angle than 10\({}^{\circ}\). Based on this correspondence, the grasps are also pre-filtered to remove pick grasps that are too similar. Once all the pick grasps are classified as either valid or invalid, a JSON object is generated and saved, which contains a list of 2D grasps, represented by a 2D point (in pixel units), an angle, and a label (1 for valid grasps and 0 for invalid grasps). After this, an RGB-D image is rendered. The RGB image is saved as a PNG, while the depth data are saved as a NumPy array (npy file). We also generate segmentation masks for each rendered frame using the Blender Annotation Tool (BAT) (Available online at [[https://github.com/ABC-iRobotics/blender_annotation_tool](https://github.com/ABC-iRobotics/blender_annotation_tool)]([https://github.com/ABC-iRobotics/blender_annotation_tool](https://github.com/ABC-iRobotics/blender_annotation_tool)), accessed on 12 December 2022), although currently these segmentation masks are not utilized [17]. The Blender scene is prepared so that the object's location along the X and Y axes and its orientation along the Z axis are set to a random value for each frame. As a result, repeating the above process for multiple frames leads to a collection of rendered synthetic depth images and corresponding 2D grasps for multiple object poses. Using the output from Blender, a Python script creates a synthetic grasp dataset in DexNet 2.0 format. The Python script loads the depth images and the corresponding 2D grasps and crops, rotates and resizes the depth image to create \(32\times 32\) sized depth images for each grasp, where the grasp point is in the middle of the image, and the opening direction of the gripper is horizontal. Since we only use grasps which are appropriate for picking (but not necessarily for placing), additional 12 invalid grasps are added to each grasp (both valid and invalid), which are located at the same spot where the original grasp is, but they are rotated in either the positive or negative direction along the Z axis in increments of 15\({}^{\circ}\) (up to +90\({}^{\circ}\) and \(-90^{\circ}\)). During our experiments, adding these additional invalid grasps improved the accuracy of the orientation of the predicted grasps significantly. For cropping, we found that a \(128\times 128\) square proved to be better than \(64\times 64\), although the best value most likely depends on the specific setup (camera-object distance). The \(32\times 32\) depth images are bundled in a single NumPy array and saved as an npz file. Similarly, the labels and the hand poses (containing the depth of the grasp points) are saved as npz archives. Finally, the GQCNN, which was pre-trained on the Dex-Net 2.0 dataset, is fine-tuned on our automatically generated synthetic grasp planning dataset, using the scripts provided for fine-tuning with the GQCNN implementation (Available online at [[https://github.com/BerkeleyAutomation/gqcnn](https://github.com/BerkeleyAutomation/gqcnn)]([https://github.com/BerkeleyAutomation/gqcnn](https://github.com/BerkeleyAutomation/gqcnn)), accessed on 12 December 2022). During fine-tuning, a train/validation split of 0.9/0.1 was used and trained for 60 epochs. We used a base learning rate of 0.01 with sparse loss, momentum-based optimizer, and 0.999 as the decay rate. All the specific configuration settings can be found in our supplementary materials. After training, we evaluated the GQCNN models using synthetic depth images from Blender and the Moveitt task constructor (MTC) framework [18].