Upgradeable NFT Smart Contract

To provide more context:

Your initializer could be named literally as "initialize" so that it is called automatically when you use Upgrades Plugins e.g.

function initialize() initializer public {

(otherwise you'd need to specify the initializer function name when using the plugin).

The initializer should also call the _init() methods of its parent contracts, which seems to be missing from your example.

The constructor is needed due to this reason.