154 {
155 ZCT c = App.viewer.GetCoordinate();
156 List<float[]> lts = (List<float[]>)b.Tag;
157 int fr = b.GetFrameIndex(c.Z, c.C, c.T);
158 var embedding_tensor = new DenseTensor<float>(lts[fr], new[] { 1, 256, 64, 64 });
159 var bpmos = promotions.FindAll(e => e.mType == PromotionType.Box);
160 var pproms = promotions.FindAll(e => e.mType == PromotionType.Point);
161 int boxCount = promotions.FindAll(e => e.mType == PromotionType.Box).Count();
162 int pointCount = promotions.FindAll(e => e.mType == PromotionType.Point).Count();
163 float[] promotion = new float[2 * (boxCount * 2 + pointCount)];
164 float[] label = new float[boxCount * 2 + pointCount];
165 for (int i = 0; i < boxCount; i++)
166 {
167 var input = bpmos[i].GetInput();
168 for (int j = 0; j < input.Count(); j++)
169 {
170 promotion[4 * i + j] = input[j];
171 }
172 var la = bpmos[i].GetLable();
173 for (int j = 0; j < la.Count(); j++)
174 {
175 label[2 * i + j] = la[j];
176 }
177 }
178 for (int i = 0; i < pointCount; i++)
179 {
180 var p = pproms[i].GetInput();
181 for (int j = 0; j < p.Count(); j++)
182 {
183 promotion[boxCount * 4 + 2 * i + j] = p[j];
184 }
185 var la = pproms[i].GetLable();
186 for (int j = 0; j < la.Count(); j++)
187 {
188 label[boxCount * 2 + i + j] = la[j];
189 }
190 }
191
192 var point_coords_tensor = new DenseTensor<float>(promotion, new[] { 1, boxCount * 2 + pointCount, 2 });
193
194 var point_label_tensor = new DenseTensor<float>(label, new[] { 1, boxCount * 2 + pointCount });
195
196 float[] mask = new float[256 * 256];
197 for (int i = 0; i < mask.Count(); i++)
198 {
199 mask[i] = 0;
200 }
201 var mask_tensor = new DenseTensor<float>(mask, new[] { 1, 1, 256, 256 });
202
203 float[] hasMaskValues = new float[1] { 0 };
204 var hasMaskValues_tensor = new DenseTensor<float>(hasMaskValues, new[] { 1 });
205
206 var decode_inputs = new List<NamedOnnxValue>();
207 if (SAM2)
208 {
209 int[] orig_im_size_values = { (int)orgHei, (int)orgWid };
210 var orig_im_size_values_tensor = new DenseTensor<int>(orig_im_size_values, new[] { 2 });
211 var fs = new float[32 * 256 * 256];
212 var feats = new DenseTensor<float>(fs, new[] { 1, 32, 256, 256 });
213 var fs2 = new float[64 * 128 * 128];
214 var feats2 = new DenseTensor<float>(fs2, new[] { 1, 64, 128, 128 });
215 decode_inputs = new List<NamedOnnxValue>
216 {
217 NamedOnnxValue.CreateFromTensor("image_embed", embedding_tensor),
218 NamedOnnxValue.CreateFromTensor("high_res_feats_0", feats),
219 NamedOnnxValue.CreateFromTensor("high_res_feats_1", feats2),
220 NamedOnnxValue.CreateFromTensor("point_coords", point_coords_tensor),
221 NamedOnnxValue.CreateFromTensor("point_labels", point_label_tensor),
222 NamedOnnxValue.CreateFromTensor("mask_input", mask_tensor),
223 NamedOnnxValue.CreateFromTensor("has_mask_input", hasMaskValues_tensor),
224 NamedOnnxValue.CreateFromTensor("orig_im_size", orig_im_size_values_tensor)
225 };
226 }
227 else
228 {
229 float[] orig_im_size_values = { (float)orgHei, (float)orgWid };
230 var orig_im_size_values_tensor = new DenseTensor<float>(orig_im_size_values, new[] { 2 });
231 decode_inputs = new List<NamedOnnxValue>
232 {
233 NamedOnnxValue.CreateFromTensor("image_embeddings", embedding_tensor),
234 NamedOnnxValue.CreateFromTensor("point_coords", point_coords_tensor),
235 NamedOnnxValue.CreateFromTensor("point_labels", point_label_tensor),
236 NamedOnnxValue.CreateFromTensor("mask_input", mask_tensor),
237 NamedOnnxValue.CreateFromTensor("has_mask_input", hasMaskValues_tensor),
238 NamedOnnxValue.CreateFromTensor("orig_im_size", orig_im_size_values_tensor)
239 };
240 }
241 var segmask = this.mDecoder.Run(decode_inputs);
242 var outputmask = segmask.First().AsTensor<float>().ToArray();
243 BioLib.Recorder.AddLine("App.samTool.sam.Decode(Images.GetImage(\"" + b.Filename + "\"),App.samTool.Promotions," + orgWid + "," + orgHei + ");", false);
244 return outputmask;
245
246 }