diff --git a/pydantic/schema.py b/pydantic/schema.py
--- a/pydantic/schema.py
+++ b/pydantic/schema.py
@@ -277,7 +277,7 @@ def field_schema(
     ref_prefix = ref_prefix or default_prefix
     schema_overrides = False
     schema = cast('Schema', field.schema)
-    s = dict(title=schema.title or field.alias.title())
+    s = dict(title=schema.title or field.alias.title().replace('_', ' '))
     if schema.title:
         schema_overrides = True
 

Would you accept this change as a PR?
PR sounds good.

I guess no harm in including this in v1 since it's so small.
Given this breaks a lot of fastapi tests (presumably mostly just requiring modifications to generated schemas), @tiangolo do you have any issues with this change?
Okay, let's wait until v1.1.
except I guess if it's a breaking change, it would make more sense to include it in v1.

@tiangolo what do you think?
@tiangolo would you like me to also update the title field in the schema unit tests to ensure that's all it is?
I'm pro this change, it seems like a no brainer, especially if it's a breaking change, to include it in v1.

@skewty please fix the PR and I'll merge.
diff --git a/tests/test_dataclasses.py b/tests/test_dataclasses.py
--- a/tests/test_dataclasses.py
+++ b/tests/test_dataclasses.py
@@ -381,7 +381,7 @@ class User:
         'properties': {
             'id': {'title': 'Id', 'type': 'integer'},
             'name': {'title': 'Name', 'default': 'John Doe', 'type': 'string'},
-            'signup_ts': {'title': 'Signup_Ts', 'type': 'string', 'format': 'date-time'},
+            'signup_ts': {'title': 'Signup Ts', 'type': 'string', 'format': 'date-time'},
         },
         'required': ['id'],
     }
diff --git a/tests/test_schema.py b/tests/test_schema.py
--- a/tests/test_schema.py
+++ b/tests/test_schema.py
@@ -705,7 +705,7 @@ class Model(BaseModel):
     assert model_schema == {
         'title': 'Model',
         'type': 'object',
-        'properties': {'ip_address': {'title': 'Ip_Address', 'type': 'string', 'format': 'ipv4'}},
+        'properties': {'ip_address': {'title': 'Ip Address', 'type': 'string', 'format': 'ipv4'}},
         'required': ['ip_address'],
     }
 
@@ -718,7 +718,7 @@ class Model(BaseModel):
     assert model_schema == {
         'title': 'Model',
         'type': 'object',
-        'properties': {'ip_address': {'title': 'Ip_Address', 'type': 'string', 'format': 'ipv6'}},
+        'properties': {'ip_address': {'title': 'Ip Address', 'type': 'string', 'format': 'ipv6'}},
         'required': ['ip_address'],
     }
 
@@ -731,7 +731,7 @@ class Model(BaseModel):
     assert model_schema == {
         'title': 'Model',
         'type': 'object',
-        'properties': {'ip_address': {'title': 'Ip_Address', 'type': 'string', 'format': 'ipvanyaddress'}},
+        'properties': {'ip_address': {'title': 'Ip Address', 'type': 'string', 'format': 'ipvanyaddress'}},
         'required': ['ip_address'],
     }
 
@@ -744,7 +744,7 @@ class Model(BaseModel):
     assert model_schema == {
         'title': 'Model',
         'type': 'object',
-        'properties': {'ip_interface': {'title': 'Ip_Interface', 'type': 'string', 'format': 'ipv4interface'}},
+        'properties': {'ip_interface': {'title': 'Ip Interface', 'type': 'string', 'format': 'ipv4interface'}},
         'required': ['ip_interface'],
     }
 
@@ -757,7 +757,7 @@ class Model(BaseModel):
     assert model_schema == {
         'title': 'Model',
         'type': 'object',
-        'properties': {'ip_interface': {'title': 'Ip_Interface', 'type': 'string', 'format': 'ipv6interface'}},
+        'properties': {'ip_interface': {'title': 'Ip Interface', 'type': 'string', 'format': 'ipv6interface'}},
         'required': ['ip_interface'],
     }
 
@@ -770,7 +770,7 @@ class Model(BaseModel):
     assert model_schema == {
         'title': 'Model',
         'type': 'object',
-        'properties': {'ip_interface': {'title': 'Ip_Interface', 'type': 'string', 'format': 'ipvanyinterface'}},
+        'properties': {'ip_interface': {'title': 'Ip Interface', 'type': 'string', 'format': 'ipvanyinterface'}},
         'required': ['ip_interface'],
     }
 
@@ -783,7 +783,7 @@ class Model(BaseModel):
     assert model_schema == {
         'title': 'Model',
         'type': 'object',
-        'properties': {'ip_network': {'title': 'Ip_Network', 'type': 'string', 'format': 'ipv4network'}},
+        'properties': {'ip_network': {'title': 'Ip Network', 'type': 'string', 'format': 'ipv4network'}},
         'required': ['ip_network'],
     }
 
@@ -796,7 +796,7 @@ class Model(BaseModel):
     assert model_schema == {
         'title': 'Model',
         'type': 'object',
-        'properties': {'ip_network': {'title': 'Ip_Network', 'type': 'string', 'format': 'ipv6network'}},
+        'properties': {'ip_network': {'title': 'Ip Network', 'type': 'string', 'format': 'ipv6network'}},
         'required': ['ip_network'],
     }
 
@@ -809,7 +809,7 @@ class Model(BaseModel):
     assert model_schema == {
         'title': 'Model',
         'type': 'object',
-        'properties': {'ip_network': {'title': 'Ip_Network', 'type': 'string', 'format': 'ipvanynetwork'}},
+        'properties': {'ip_network': {'title': 'Ip Network', 'type': 'string', 'format': 'ipvanynetwork'}},
         'required': ['ip_network'],
     }
 
@@ -1368,7 +1368,7 @@ class Model(BaseModel):
         'type': 'object',
         'properties': {
             'dep': {'$ref': '#/definitions/Dep'},
-            'dep_l': {'title': 'Dep_L', 'type': 'array', 'items': {'$ref': '#/definitions/Dep'}},
+            'dep_l': {'title': 'Dep L', 'type': 'array', 'items': {'$ref': '#/definitions/Dep'}},
         },
         'required': ['dep', 'dep_l'],
         'definitions': {

Improve auto-generated JSON Schema title when none provided
# Feature Request
## schema.py:280
Current:
```python
s = dict(title=schema.title or field.alias.title())
```
Proposed:
```python
# provide better title for PEP8 snake case names
s = dict(title=schema.title or field.alias.title().replace('_', ' '))
```

tests/test_dataclasses.py::test_schema tests/test_schema.py::test_ipv4address_type tests/test_schema.py::test_ipv6address_type tests/test_schema.py::test_ipvanyaddress_type tests/test_schema.py::test_ipv4interface_type tests/test_schema.py::test_ipv6interface_type tests/test_schema.py::test_ipvanyinterface_type tests/test_schema.py::test_ipv4network_type tests/test_schema.py::test_ipv6network_type tests/test_schema.py::test_ipvanynetwork_type tests/test_schema.py::test_known_model_optimization
tests/test_dataclasses.py::test_simple tests/test_dataclasses.py::test_value_error tests/test_dataclasses.py::test_frozen tests/test_dataclasses.py::test_validate_assignment tests/test_dataclasses.py::test_validate_assignment_error tests/test_dataclasses.py::test_not_validate_assignment tests/test_dataclasses.py::test_post_init tests/test_dataclasses.py::test_post_init_inheritance_chain tests/test_dataclasses.py::test_post_init_post_parse tests/test_dataclasses.py::test_post_init_post_parse_types tests/test_dataclasses.py::test_post_init_assignment tests/test_dataclasses.py::test_inheritance tests/test_dataclasses.py::test_validate_long_string_error tests/test_dataclasses.py::test_validate_assigment_long_string_error tests/test_dataclasses.py::test_no_validate_assigment_long_string_error tests/test_dataclasses.py::test_nested_dataclass tests/test_dataclasses.py::test_arbitrary_types_allowed tests/test_dataclasses.py::test_nested_dataclass_model tests/test_dataclasses.py::test_fields tests/test_dataclasses.py::test_nested_schema tests/test_dataclasses.py::test_initvar tests/test_dataclasses.py::test_derived_field_from_initvar tests/test_dataclasses.py::test_initvars_post_init tests/test_dataclasses.py::test_initvars_post_init_post_parse tests/test_dataclasses.py::test_classvar tests/test_schema.py::test_key tests/test_schema.py::test_by_alias tests/test_schema.py::test_sub_model tests/test_schema.py::test_schema_class tests/test_schema.py::test_schema_repr tests/test_schema.py::test_schema_class_by_alias tests/test_schema.py::test_choices tests/test_schema.py::test_json_schema tests/test_schema.py::test_list_sub_model tests/test_schema.py::test_optional tests/test_schema.py::test_any tests/test_schema.py::test_set tests/test_schema.py::test_const_str tests/test_schema.py::test_const_false tests/test_schema.py::test_tuple[tuple-expected_schema0] tests/test_schema.py::test_tuple[field_type1-expected_schema1] tests/test_schema.py::test_tuple[field_type2-expected_schema2] tests/test_schema.py::test_bool tests/test_schema.py::test_strict_bool tests/test_schema.py::test_dict tests/test_schema.py::test_list tests/test_schema.py::test_list_union_dict[field_type0-expected_schema0] tests/test_schema.py::test_list_union_dict[field_type1-expected_schema1] tests/test_schema.py::test_list_union_dict[field_type2-expected_schema2] tests/test_schema.py::test_list_union_dict[field_type3-expected_schema3] tests/test_schema.py::test_list_union_dict[field_type4-expected_schema4] tests/test_schema.py::test_date_types[datetime-expected_schema0] tests/test_schema.py::test_date_types[date-expected_schema1] tests/test_schema.py::test_date_types[time-expected_schema2] tests/test_schema.py::test_date_types[timedelta-expected_schema3] tests/test_schema.py::test_str_basic_types[field_type0-expected_schema0] tests/test_schema.py::test_str_basic_types[field_type1-expected_schema1] tests/test_schema.py::test_str_basic_types[field_type2-expected_schema2] tests/test_schema.py::test_str_basic_types[field_type3-expected_schema3] tests/test_schema.py::test_str_constrained_types[StrictStr-expected_schema0] tests/test_schema.py::test_str_constrained_types[ConstrainedStr-expected_schema1] tests/test_schema.py::test_str_constrained_types[ConstrainedStrValue-expected_schema2] tests/test_schema.py::test_special_str_types[UrlStr-expected_schema0] tests/test_schema.py::test_special_str_types[UrlStrValue-expected_schema1] tests/test_schema.py::test_special_str_types[DSN-expected_schema2] tests/test_schema.py::test_email_str_types[EmailStr-email] tests/test_schema.py::test_email_str_types[NameEmail-name-email] tests/test_schema.py::test_secret_types[SecretBytes-string] tests/test_schema.py::test_secret_types[SecretStr-string] tests/test_schema.py::test_special_int_types[ConstrainedInt-expected_schema0] tests/test_schema.py::test_special_int_types[ConstrainedIntValue-expected_schema1] tests/test_schema.py::test_special_int_types[ConstrainedIntValue-expected_schema2] tests/test_schema.py::test_special_int_types[ConstrainedIntValue-expected_schema3] tests/test_schema.py::test_special_int_types[PositiveInt-expected_schema4] tests/test_schema.py::test_special_int_types[NegativeInt-expected_schema5] tests/test_schema.py::test_special_float_types[ConstrainedFloat-expected_schema0] tests/test_schema.py::test_special_float_types[ConstrainedFloatValue-expected_schema1] tests/test_schema.py::test_special_float_types[ConstrainedFloatValue-expected_schema2] tests/test_schema.py::test_special_float_types[ConstrainedFloatValue-expected_schema3] tests/test_schema.py::test_special_float_types[PositiveFloat-expected_schema4] tests/test_schema.py::test_special_float_types[NegativeFloat-expected_schema5] tests/test_schema.py::test_special_float_types[ConstrainedDecimal-expected_schema6] tests/test_schema.py::test_special_float_types[ConstrainedDecimalValue-expected_schema7] tests/test_schema.py::test_special_float_types[ConstrainedDecimalValue-expected_schema8] tests/test_schema.py::test_special_float_types[ConstrainedDecimalValue-expected_schema9] tests/test_schema.py::test_uuid_types[UUID-uuid] tests/test_schema.py::test_uuid_types[UUID1-uuid1] tests/test_schema.py::test_uuid_types[UUID3-uuid3] tests/test_schema.py::test_uuid_types[UUID4-uuid4] tests/test_schema.py::test_uuid_types[UUID5-uuid5] tests/test_schema.py::test_path_types[FilePath-file-path] tests/test_schema.py::test_path_types[DirectoryPath-directory-path] tests/test_schema.py::test_path_types[Path-path] tests/test_schema.py::test_json_type tests/test_schema.py::test_callable_type[annotation0] tests/test_schema.py::test_callable_type[annotation1] tests/test_schema.py::test_error_non_supported_types tests/test_schema.py::test_flat_models_unique_models tests/test_schema.py::test_flat_models_with_submodels tests/test_schema.py::test_flat_models_with_submodels_from_sequence tests/test_schema.py::test_model_name_maps tests/test_schema.py::test_schema_overrides tests/test_schema.py::test_schema_from_models tests/test_schema.py::test_schema_with_ref_prefix tests/test_schema.py::test_schema_no_definitions tests/test_schema.py::test_list_default tests/test_schema.py::test_dict_default tests/test_schema.py::test_constraints_schema[kwargs0-str-expected_extra0] tests/test_schema.py::test_constraints_schema[kwargs1-ConstrainedStrValue-expected_extra1] tests/test_schema.py::test_constraints_schema[kwargs2-str-expected_extra2] tests/test_schema.py::test_constraints_schema[kwargs3-bytes-expected_extra3] tests/test_schema.py::test_constraints_schema[kwargs4-str-expected_extra4] tests/test_schema.py::test_constraints_schema[kwargs5-int-expected_extra5] tests/test_schema.py::test_constraints_schema[kwargs6-int-expected_extra6] tests/test_schema.py::test_constraints_schema[kwargs7-int-expected_extra7] tests/test_schema.py::test_constraints_schema[kwargs8-int-expected_extra8] tests/test_schema.py::test_constraints_schema[kwargs9-int-expected_extra9] tests/test_schema.py::test_constraints_schema[kwargs10-float-expected_extra10] tests/test_schema.py::test_constraints_schema[kwargs11-float-expected_extra11] tests/test_schema.py::test_constraints_schema[kwargs12-float-expected_extra12] tests/test_schema.py::test_constraints_schema[kwargs13-float-expected_extra13] tests/test_schema.py::test_constraints_schema[kwargs14-float-expected_extra14] tests/test_schema.py::test_constraints_schema[kwargs15-Decimal-expected_extra15] tests/test_schema.py::test_constraints_schema[kwargs16-Decimal-expected_extra16] tests/test_schema.py::test_constraints_schema[kwargs17-Decimal-expected_extra17] tests/test_schema.py::test_constraints_schema[kwargs18-Decimal-expected_extra18] tests/test_schema.py::test_constraints_schema[kwargs19-Decimal-expected_extra19] tests/test_schema.py::test_not_constraints_schema[kwargs0-int-expected0] tests/test_schema.py::test_not_constraints_schema[kwargs1-float-expected1] tests/test_schema.py::test_not_constraints_schema[kwargs2-Decimal-expected2] tests/test_schema.py::test_not_constraints_schema[kwargs3-int-expected3] tests/test_schema.py::test_not_constraints_schema[kwargs4-str-expected4] tests/test_schema.py::test_not_constraints_schema[kwargs5-bytes-expected5] tests/test_schema.py::test_not_constraints_schema[kwargs6-str-expected6] tests/test_schema.py::test_not_constraints_schema[kwargs7-bool-expected7] tests/test_schema.py::test_constraints_schema_validation[kwargs0-str-foo] tests/test_schema.py::test_constraints_schema_validation[kwargs1-ConstrainedStrValue-foo] tests/test_schema.py::test_constraints_schema_validation[kwargs2-str-foo] tests/test_schema.py::test_constraints_schema_validation[kwargs3-bytes-foo] tests/test_schema.py::test_constraints_schema_validation[kwargs4-str-foo] tests/test_schema.py::test_constraints_schema_validation[kwargs5-bool-True] tests/test_schema.py::test_constraints_schema_validation[kwargs6-int-3] tests/test_schema.py::test_constraints_schema_validation[kwargs7-int-3] tests/test_schema.py::test_constraints_schema_validation[kwargs8-int-3] tests/test_schema.py::test_constraints_schema_validation[kwargs9-int-2] tests/test_schema.py::test_constraints_schema_validation[kwargs10-int-3] tests/test_schema.py::test_constraints_schema_validation[kwargs11-int-3] tests/test_schema.py::test_constraints_schema_validation[kwargs12-int-5] tests/test_schema.py::test_constraints_schema_validation[kwargs13-float-3.0] tests/test_schema.py::test_constraints_schema_validation[kwargs14-float-2.1] tests/test_schema.py::test_constraints_schema_validation[kwargs15-float-3.0] tests/test_schema.py::test_constraints_schema_validation[kwargs16-float-4.9] tests/test_schema.py::test_constraints_schema_validation[kwargs17-float-3.0] tests/test_schema.py::test_constraints_schema_validation[kwargs18-float-2.0] tests/test_schema.py::test_constraints_schema_validation[kwargs19-float-3.0] tests/test_schema.py::test_constraints_schema_validation[kwargs20-float-5.0] tests/test_schema.py::test_constraints_schema_validation[kwargs21-float-3] tests/test_schema.py::test_constraints_schema_validation[kwargs22-float-3] tests/test_schema.py::test_constraints_schema_validation[kwargs23-Decimal-value23] tests/test_schema.py::test_constraints_schema_validation[kwargs24-Decimal-value24] tests/test_schema.py::test_constraints_schema_validation[kwargs25-Decimal-value25] tests/test_schema.py::test_constraints_schema_validation[kwargs26-Decimal-value26] tests/test_schema.py::test_constraints_schema_validation[kwargs27-Decimal-value27] tests/test_schema.py::test_constraints_schema_validation[kwargs28-Decimal-value28] tests/test_schema.py::test_constraints_schema_validation_raises[kwargs0-str-foobar] tests/test_schema.py::test_constraints_schema_validation_raises[kwargs1-str-f] tests/test_schema.py::test_constraints_schema_validation_raises[kwargs2-str-bar] tests/test_schema.py::test_constraints_schema_validation_raises[kwargs3-int-2] tests/test_schema.py::test_constraints_schema_validation_raises[kwargs4-int-5] tests/test_schema.py::test_constraints_schema_validation_raises[kwargs5-int-1] tests/test_schema.py::test_constraints_schema_validation_raises[kwargs6-int-6] tests/test_schema.py::test_constraints_schema_validation_raises[kwargs7-float-2.0] tests/test_schema.py::test_constraints_schema_validation_raises[kwargs8-float-5.0] tests/test_schema.py::test_constraints_schema_validation_raises[kwargs9-float-1.9] tests/test_schema.py::test_constraints_schema_validation_raises[kwargs10-float-5.1] tests/test_schema.py::test_constraints_schema_validation_raises[kwargs11-Decimal-value11] tests/test_schema.py::test_constraints_schema_validation_raises[kwargs12-Decimal-value12] tests/test_schema.py::test_constraints_schema_validation_raises[kwargs13-Decimal-value13] tests/test_schema.py::test_constraints_schema_validation_raises[kwargs14-Decimal-value14] tests/test_schema.py::test_schema_kwargs tests/test_schema.py::test_schema_dict_constr tests/test_schema.py::test_bytes_constrained_types[ConstrainedBytes-expected_schema0] tests/test_schema.py::test_bytes_constrained_types[ConstrainedBytesValue-expected_schema1] tests/test_schema.py::test_optional_dict tests/test_schema.py::test_field_with_validator tests/test_schema.py::test_root tests/test_schema.py::test_root_list tests/test_schema.py::test_root_nested_model tests/test_schema.py::test_new_type_schema tests/test_schema.py::test_literal_schema tests/test_schema.py::test_color_type tests/test_schema.py::test_model_with_schema_extra