defmodule Evision.Zoo.ImageSegmentation do
@moduledoc """
Image segmentation model collection.
"""
import Bitwise
@modules %{
"pp_humanseg" => Evision.Zoo.ImageSegmentation.PPHumanSeg,
"pp_humanseg_quant" => Evision.Zoo.ImageSegmentation.PPHumanSeg,
}
@module_list Enum.uniq(Map.values(@modules))
def modules, do: @modules
def module_list, do: @module_list
def id, do: "image_segmentation"
def label, do: "Image Segmentation"
def smartcell_tasks do
%{
id: id(),
label: label(),
variants: Enum.reduce(module_list(), [], fn module, acc -> module.smartcell_tasks() ++ acc end)
}
end
@doc """
Generate quoted code from smart cell attrs.
"""
@spec to_quoted(map()) :: list()
def to_quoted(%{"task_id" => "image_segmentation", "variant_id" => variant_id} = attrs) do
module = Map.get(modules(), variant_id)
if module do
module.to_quoted(attrs)
else
[]
end
end
def color_map(num_classes) do
color_map =
for i <- 0..num_classes, reduce: [] do
color_map ->
colors = gen_color_map(i, i, 0, [0, 0, 0])
[colors | color_map]
end
tl(Enum.reverse(color_map))
end
defp gen_color_map(0, _, _, colors), do: colors
defp gen_color_map(lab, i, j, [c1, c2, c3]) do
c1 = bor(c1, bsl(band(bsr(lab, 0), 1), 7 - j))
c2 = bor(c2, bsl(band(bsr(lab, 1), 1), 7 - j))
c3 = bor(c3, bsl(band(bsr(lab, 2), 1), 7 - j))
gen_color_map(lab >>> 3, i, j + 1, [c1, c2, c3])
end
end