Как насчет использования значений высоты пикселей в качестве меток, а изображений (я полагаю, RGB, так что 3 канала) в качестве обучающего набора. Тогда вы можете просто запустить контролируемое обучение. Хотя я не уверен, как можно восстановить высоту, просто взглянув на изображение, даже людям будет трудно это сделать, даже увидев много изображений. Я думаю, что вам нужен какой-то ориентир.
Чтобы преобразовать изображение в трехмерный массив значений (третье измерение - это цветовые каналы):
from keras.preprocessing import image
# loads RGB image as PIL.Image.Image type
img = image.load_img(img_file_path, target_size=(120, 120))
# convert PIL.Image.Image type to 3D tensor with shape (120, 120, 3)
x = image.img_to_array(img)
Существует также ряд других способов: Преобразовать изображение в двумерный массив в python
С точки зрения назначения меток изображениям (здесь метки - это высота пикселей), это было бы так же просто, как создать свой обучающий набор x_train
(nb_images, 120, 120, 3) и метки y_train
(nb_images, 120, 120, 1) и запустив контролируемое обучение на них, пока для каждого изображения в x_train
модель не сможет предсказать каждое соответствующее значение в наборе высот y_train
с определенной ошибкой.
Вот мое мнение - это пользовательский биндер модели, который при запросе GetPropertyValue смотрит, является ли свойство объектом из моей сборки модели, и имеет IRepository<>, зарегистрированный в моем NInject IKernel. Если он может получить IRepository из Ninject, он использует его для получения объекта внешнего ключа.
public class ForeignKeyModelBinder : System.Web.Mvc.DefaultModelBinder
{
private IKernel serviceLocator;
public ForeignKeyModelBinder( IKernel serviceLocator )
{
Check.Require( serviceLocator, "IKernel is required" );
this.serviceLocator = serviceLocator;
}
/// <summary>
/// if the property type being asked for has a IRepository registered in the service locator,
/// use that to retrieve the instance. if not, use the default behavior.
/// </summary>
protected override object GetPropertyValue( ControllerContext controllerContext, ModelBindingContext bindingContext,
PropertyDescriptor propertyDescriptor, IModelBinder propertyBinder )
{
var submittedValue = bindingContext.ValueProvider.GetValue( bindingContext.ModelName );
if ( submittedValue == null )
{
string fullPropertyKey = CreateSubPropertyName( bindingContext.ModelName, "Id" );
submittedValue = bindingContext.ValueProvider.GetValue( fullPropertyKey );
}
if ( submittedValue != null )
{
var value = TryGetFromRepository( submittedValue.AttemptedValue, propertyDescriptor.PropertyType );
if ( value != null )
return value;
}
return base.GetPropertyValue( controllerContext, bindingContext, propertyDescriptor, propertyBinder );
}
protected override object CreateModel( ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType )
{
string fullPropertyKey = CreateSubPropertyName( bindingContext.ModelName, "Id" );
var submittedValue = bindingContext.ValueProvider.GetValue( fullPropertyKey );
if ( submittedValue != null )
{
var value = TryGetFromRepository( submittedValue.AttemptedValue, modelType );
if ( value != null )
return value;
}
return base.CreateModel( controllerContext, bindingContext, modelType );
}
private object TryGetFromRepository( string key, Type propertyType )
{
if ( CheckRepository( propertyType ) && !string.IsNullOrEmpty( key ) )
{
Type genericRepositoryType = typeof( IRepository<> );
Type specificRepositoryType = genericRepositoryType.MakeGenericType( propertyType );
var repository = serviceLocator.TryGet( specificRepositoryType );
int id = 0;
#if DEBUG
Check.Require( repository, "{0} is not available for use in binding".FormatWith( specificRepositoryType.FullName ) );
#endif
if ( repository != null && Int32.TryParse( key, out id ) )
{
return repository.InvokeMethod( "GetById", id );
}
}
return null;
}
/// <summary>
/// perform simple check to see if we should even bother looking for a repository
/// </summary>
private bool CheckRepository( Type propertyType )
{
return propertyType.HasInterface<IModelObject>();
}
}
очевидно, вы можете заменить Ninject на ваш DI-контейнер и ваш собственный тип хранилища.
Возможно, это поздно, но для этого вы можете использовать привязку пользовательской модели. Обычно я делал бы это так же, как @tvanofosson, но у меня был случай, когда я добавлял UserDetails в таблицы AspNetMembershipProvider. Поскольку я также использую только POCO (и отображаю его из EntityFramework), я не хотел использовать идентификатор, потому что это не было оправдано с точки зрения бизнеса, поэтому я создал модель только для добавления / регистрации пользователей. У этой модели были все свойства для пользователя, а также свойство Role. Я хотел привязать текстовое имя роли к ее представлению RoleModel. В основном это то, что я сделал:
public class RoleModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
string roleName = controllerContext.HttpContext.Request["Role"];
var model = new RoleModel
{
RoleName = roleName
};
return model;
}
}
Затем мне пришлось добавить следующее в Global.asax:
ModelBinders.Binders.Add(typeof(RoleModel), new RoleModelBinder());
И использование в представлении:
<%= Html.DropDownListFor(model => model.Role, new SelectList(Model.Roles, "RoleName", "RoleName", Model.Role))%>
Надеюсь, это вам поможет.
Конечно, каждый автомобиль только имеет одного производителя. Если это так, затем у Вас должно быть поле ManufacturerID, к которому можно связать значение выбора. Таким образом, Ваш выбор должен сделать, чтобы Производитель назвал, поскольку это - текст и идентификатор как значение. В Вашем значении сохранения свяжите ManufacturerID, а не Производителя.
<%= Html.DropDownList( "ManufacturerID",
(IEnumerable<SelectListItem>)ViewData["Manufacturers"] ) %>
С
ViewData["Manufacturers"] = db.Manufacturers
.Select( m => new SelectListItem
{
Text = m.Name,
Value = m.ManufacturerID
} )
.ToList();
И
public JsonResult Save(int id,
[Bind(Include="Name, Description, ManufacturerID")]Car car)