Hello,
The boundingPoly in ProductSearchParams is expected to contain a product which should serve as the query, and its primary use case is to enable users to manually draw a bounding box around a product of interest to get results specifically for that product. When the box is provided, the API will skip its internal product localization and return results for the bounding box provided. In your case, you are setting the bounding box to a "Person" box, not a product box, so the API is treating the person box as a product when it is not, resulting in degraded results.
Feel free to share more details of your use case, but my recommendation is that you remove the the person bounding box in the product search queries to enable the API to do its own product detection for best results. If you need to know the "Person" box as well for your application, you can separately retrieve it via OBJECT_LOCALIZATION, as you are. You may wish to reason about the relationship between the "Person" boxes and the product boxes (returned by Product Search API in its multi-detection response
https://cloud.google.com/vision/product-search/docs/searching-response) — for example, for apparel use cases you may wish to group the product boxes into "outfits" based on the "Person" box. If this if true of your intended use case, then it is best to do this after getting both the OBJECT_LOCALIZATION and PRODUCT_SEARCH responses for the image, namely by computing how much each product box spatially overlaps each "Person" box and making a grouping based on this.
Hopefully this is helpful. Thanks and all the best,
clayton