What format do the photos in the attachment table need to be?
The field mapping only recognizes BLOB (Binary Large OBject, so byte data) fields. If you have an ArcGIS Attachment table, there should be a BLOB field in there. If not, you can also create a BLOB field in your feature class and store the images there.
And do you think there would be a way to dynamically offset all the labels so that the points don't get obscured (maybe in Python)?
Dynamically? Probably not, for that you need to work with labels, not symbology. Maaaaaybe with Point Clustering in 2.9, but it doesn't seem likely.
With Python? You could map X and Y offset to fields in your feature class. You could then calculate these fields with Python, using the distance to nearby points as input. This could work for a fixed map scale and picture marker size. But as soon as you zoom out, the images will overlap each other again.
A simple approach to that with Arcade:
// calculate field OffsetX
// load other features
var gid = $feature.GlobalID
var fs = Filter(FeatureSetByName($datastore, "FeatureClass"), "GlobalID <> @gid")
// get nearby features
var nearby_features = Intersects(fs, Buffer($feature, 50))
// gravitational force in horizontal direction
var force = 0
for(var f in nearby_features) {
var dist = Distance($feature, f)
var dx = Geometry(f).X - Geometry($feature).X
force -= dx / (dist * dist)
}
// magical number dependent on map scale and picture marker size
var magic_factor = 100
return force * magic_factor
// calculate field OffsetY
// load other features
var gid = $feature.GlobalID
var fs = Filter(FeatureSetByName($datastore, "FeatureClass"), "GlobalID <> @gid")
// get nearby features
var nearby_features = Intersects(fs, Buffer($feature, 50))
// gravitational force in vertical direction
var force = 0
for(var f in nearby_features) {
var dist = Distance($feature, f)
var dy = Geometry(f).Y - Geometry($feature).Y
force -= dy / (dist * dist)
}
// magical number dependent on map scale and picture marker size
var magic_factor = 100
return force * magic_factor
Without offsets:

With offsets:

But it only works for a fix scale. When you zoom out, the images overlap again:

Have a great day!
Johannes