难点如下:不同的注释图像数据库具有不同的标记集。例如,IMM数据库有近60个标记,而BioID有大约17个标记。一些标记在数据库之间是共同的“共享”,其中一些不是。
我想问一下如何在Haskell中表示这些数据结构的建议?任务是使用不同的图像数据库,使用相同的工具训练它们,并能够“交叉”比较用它们训练的预测变量所做的结果吗?
这里有一些伪代码:
--
data FaceIMM = LeftEye RightEye Nose Mouth Chin
data FaceBioID = LeftEye RightEye LeftNoseTip RightNoseTip NoseTop Mouth
...
-- training
--
predictor <- train confParameters landmarkDescriptors positionValues
...
fitter <- meanShifter . predictors
...
-- detection
--
fitBioID = fitterBioID face
fitIMM = fitterIMM face
...
-- comparison
errorBioID = distance (fitBioID - truth)
errorIMM = distance (fitIMM - truth)
compare errorBioID errorIMM
为了清楚起见我已经有了“train”和“fit”功能,这些功能目前是存储或接受数据列表。但我想做得更好。
我不希望看到完全抛光的数据结构,而是帮助我开始解决这个问题。
EXTRA:将来我也愿意:
选择两个图像数据库的“交叉点”,训练一个装有少量地标的装配工,但训练数据的尺寸更大。
采用两个图像数据库的“联合”并训练另一个具有最多地标的装配工,但可能是较小尺寸的训练数据,因为只使用两个数据库共有的点。
FRANCK:link to franck database
BioID:link to BioID database
答案 0 :(得分:3)
简单的方法可能是
import qualified Data.Map as M
data MarkType = LeftEye | RightEye | LeftNoseTip | RightNoseTip | NoseTop | Mouth
data MarkData = MarkData { mdX :: Int, mdY :: Int, ... }
type Face = M.Map MarkType MarkData
因此,您可以在MarkType
中列出所有数据集中的各个标记标识符,然后Face
可以有不同的标记,如果您希望在两个面之间共享标记,则执行M.intersect
。