У меня возникли некоторые проблемы с моим кодом, и я был бы признателен за некоторую помощь:)
Я пытаюсь оптимизировать текстуру модели так, чтобы визуализированное изображение выглядело как заданное изображение истинной земли.В настоящее время я тестирую его с помощью кода из демо-версии «оптимизация» opendr, используя chumpy для оптимизации.
По некоторым причинам оптимизация делает только 1 шаг и не меняет текстуру.У кого-то есть идея, почему?
(мне пришлось изменить значение по умолчанию для sparse_solver в chumpy (для минимизации изгиба) с 'spsolve' на 'cg', чтобы можно было запускать код)
import numpy as np
import chumpy as ch
import cv2
from opendr.renderer import ColoredRenderer, TexturedRenderer
from opendr.simple import *
import skimage.io as io
from opendr.util_tests import get_earthmesh
import matplotlib.pyplot as plt
def earth_mesh_vis():
img = io.imread("earth_round.png") # ground truth image
w, h = 320, 240
m = get_earthmesh(trans=ch.array([0,0,0]), rotation=ch.zeros(3))
m.texture_image = ch.array(m.texture_image)
V = ch.array(m.v)
A = SphericalHarmonics(vn=VertNormals(v=V, f=m.f),components=[3.,2.,0.,0.,0.,0.,0.,0.,0.], light_color=ch.ones(3))
U = ProjectPoints(v=V, f=[w,w], c=[w/2.,h/2.], k=ch.zeros(5), t=ch.zeros(3), rt=ch.zeros(3))
f = TexturedRenderer(vc=A, camera=U, f=m.f, bgcolor=[0.,0.,0.],
texture_image=m.texture_image, vt=m.vt, ft=m.ft,
frustum={'width':w, 'height':h, 'near':1,'far':20})
translation, rotation = ch.array([0,0,8]), ch.zeros(3)
f.v = translation + V.dot(Rodrigues(rotation))
return f, img, m.texture_image, A.components
def visualize():
f, img, texture, Acomps = earth_mesh_vis()
E_raw = ch.sum((f - img)**2.)
#Energy.show_tree()
free_variables=[texture]
ch.minimize({'raw': E_raw}, x0=free_variables, method='dogleg') #, options={'delta_0': 10})
def main():
visualize()
if __name__ == '__main__':
main()
Оптимизация должна изменить текстуру модели так, чтобы при визуализации она выглядела как изображение истинной земли.