I think symbols are fine; they immediately convey the relevant information that an entire person might be more difficult to convey.
I agree with Sun and Shadows, that the weapons need to be pointed at different angles.
Also, the spear is hard to discern what it is supposed to be at the level of zoom.
Thirdly, I wouldn't color the weapon itself, I'd color the background of the icon to more visually tell friend from foe.
Here's a mockup of the changes:
(Note: In my sloppy mockup, the shading of the weapons and buildings themselves were accidentally colored. They shouldn't be colored, only the background circles should be colored)
Fourth, I also agree with ShadowFlar3, and came to the same conclusion myself, that it might feel a bit more "human" if the icons weren't perfectly aligned, but were each randomly shifted negatively or positively a few pixels on the horizontal and vertical axis. Here's an example of what that might look like:
You could do this nicely and more uniformly by saying: Every 4th column, offset the Y position of the icon by 3 pixels, Every 3rd column, offset by -1 pixels, Every 2nd column, offset by -2 pixels and +1 pixels horizontally, every 1st column, offset by +1 pixels. Then tweak it until it looks right. Actually, instead of each column and each row, get the index, and mod that to lookup in an array the offset.
int mapIndex = (tileY * map_width) + tileX;
std::vector<Offset2D> offsets;
iconOffset = offsets[mapIndex % offsets.size()];
A few tiny offsets would give a much less rigid look to the icon placements.
The spear icon still is too hard to see. Perhaps have just an enlarged spear head with only a few inches of the shaft for an icon, instead of the entire spear, that way it'd be much more visible (and as a triangular shape, it'd have a much more distinctively different shape than the other icons as well).
Your artwork looks good, btw!