Using the double eval trick, you can create the following rule on your button to disable it until each people picker contains exactly 1 valid username:
not(xdMath:Eval(xdMath:Eval(dfs:dataFields/my:SharePointListItem_RW/my:PeoplePickerColumn/pc:Person, 'concat(pc:AccountType, ";")'), "..") = "User;" and xdMath:Eval(xdMath:Eval(dfs:dataFields/my:SharePointListItem_RW/my:PeoplePickerColumn2/pc:Person, 'concat(pc:AccountType, ";")'), "..") = "User;")
Now, this won't work by just copy pasting. You'll need to get both of the dfs:dataFields... pointing at the right field. You can use the function builder (perhaps in a calculated field that you'll use for testing) to get the right XPath. Paste the following into your formula builder:
not(eval(eval(Person, 'concat(pc:AccountType, ";")'), "..") = "User;" and eval(eval(Person, 'concat(pc:AccountType, ";")'), "..") = "User;")
Then switch to advanced field view and replace each "Person" with the "Person" reapeating group under each people picker group you want to use. Check the "Edit XPath (advanced)" box and copy the formula into your formatting rule. Sometimes pc:AccountType
will be my:AccountType
and I don't know why. You can add the AccountType field to your function builder to see which it is.