|
6 | 6 | Settings, DesktopJob, RunPipeline, RunTraining, |
7 | 7 | DesktopJobUpdater, |
8 | 8 | ExportTrainedPipeline, |
9 | | - // QueuedDesktopJob, |
10 | 9 | } from 'platform/desktop/constants'; |
11 | 10 | import { cleanString } from 'platform/desktop/sharedUtils'; |
12 | 11 | import { serialize } from 'platform/desktop/backend/serializers/viame'; |
@@ -215,192 +214,6 @@ async function runPipeline( |
215 | 214 | return jobBase; |
216 | 215 | } |
217 | 216 |
|
218 | | -/** |
219 | | -async function generateDesktopPipelineJob( |
220 | | - settings: Settings, |
221 | | - runPipelineArgs: RunPipeline, |
222 | | - updater: DesktopJobUpdater, |
223 | | - validateViamePath: (settings: Settings) => Promise<true | string>, |
224 | | - viameConstants: ViameConstants, |
225 | | - forceTranscodedVideo?: boolean, |
226 | | -): QueuedDesktopJob { |
227 | | - const { datasetId, pipeline } = runPipelineArgs; |
228 | | -
|
229 | | - const isValid = await validateViamePath(settings); |
230 | | - if (isValid !== true) { |
231 | | - throw new Error(isValid); |
232 | | - } |
233 | | -
|
234 | | - let pipelinePath = npath.join(settings.viamePath, PipelineRelativeDir, pipeline.pipe); |
235 | | - if (runPipelineArgs.pipeline.type === 'trained') { |
236 | | - pipelinePath = pipeline.pipe; |
237 | | - } |
238 | | - const projectInfo = await common.getValidatedProjectDir(settings, datasetId); |
239 | | - const meta = await common.loadJsonMetadata(projectInfo.metaFileAbsPath); |
240 | | - const jobWorkDir = await createWorkingDirectory(settings, [meta], pipeline.name); |
241 | | -
|
242 | | - const detectorOutput = npath.join(jobWorkDir, 'detector_output.csv'); |
243 | | - let trackOutput = npath.join(jobWorkDir, 'track_output.csv'); |
244 | | - const joblog = npath.join(jobWorkDir, 'runlog.txt'); |
245 | | -
|
246 | | - //TODO: TEMPORARY FIX FOR DEMO PURPOSES |
247 | | - let requiresInput = false; |
248 | | - if ((/utility_|filter_|transcode_|measurement_/g).test(pipeline.pipe)) { |
249 | | - requiresInput = true; |
250 | | - } |
251 | | - let groundTruthFileName; |
252 | | - if (requiresInput) { |
253 | | - // MultiCam ids have '/' in it to designate camera, replace to make a valid location |
254 | | - groundTruthFileName = `groundtruth_${meta.id.replace('/', '_')}.csv`; |
255 | | - const groundTruthFileStream = fs.createWriteStream( |
256 | | - npath.join(jobWorkDir, groundTruthFileName), |
257 | | - ); |
258 | | - const inputData = await common.loadAnnotationFile(projectInfo.trackFileAbsPath); |
259 | | - await serialize(groundTruthFileStream, inputData, meta); |
260 | | - groundTruthFileStream.end(); |
261 | | - } |
262 | | -
|
263 | | - let metaType = meta.type; |
264 | | -
|
265 | | - if (metaType === MultiType && meta.multiCam) { |
266 | | - metaType = meta.multiCam.cameras[meta.multiCam.defaultDisplay].type; |
267 | | - } |
268 | | -
|
269 | | - let command: string[] = []; |
270 | | - const stereoOrMultiCam = (pipeline.type === stereoPipelineMarker |
271 | | - || multiCamPipelineMarkers.includes(pipeline.type)); |
272 | | -
|
273 | | - if (metaType === 'video') { |
274 | | - let videoAbsPath = npath.join(meta.originalBasePath, meta.originalVideoFile); |
275 | | - if (meta.type === MultiType) { |
276 | | - videoAbsPath = getMultiCamVideoPath(meta, forceTranscodedVideo); |
277 | | - } else if ((meta.transcodedVideoFile && meta.transcodedMisalign) || forceTranscodedVideo) { |
278 | | - videoAbsPath = npath.join(projectInfo.basePath, meta.transcodedVideoFile); |
279 | | - } |
280 | | - command = [ |
281 | | - `${viameConstants.setupScriptAbs} &&`, |
282 | | - `"${viameConstants.kwiverExe}" runner`, |
283 | | - '-s "input:video_reader:type=vidl_ffmpeg"', |
284 | | - `-p "${pipelinePath}"`, |
285 | | - `-s downsampler:target_frame_rate=${meta.fps}`, |
286 | | - ]; |
287 | | - if (!stereoOrMultiCam) { |
288 | | - command.push(`-s input:video_filename="${videoAbsPath}"`); |
289 | | - command.push(`-s detector_writer:file_name="${detectorOutput}"`); |
290 | | - command.push(`-s track_writer:file_name="${trackOutput}"`); |
291 | | - } |
292 | | - } else if (metaType === 'image-sequence') { |
293 | | - // Create frame image manifest |
294 | | - const manifestFile = npath.join(jobWorkDir, 'image-manifest.txt'); |
295 | | - // map image file names to absolute paths |
296 | | - let imageList = meta.originalImageFiles; |
297 | | - if (meta.type === MultiType) { |
298 | | - imageList = getMultiCamImageFiles(meta); |
299 | | - } |
300 | | - const fileData = imageList |
301 | | - .map((f) => npath.join(meta.originalBasePath, f)) |
302 | | - .join('\n'); |
303 | | - await fs.writeFile(manifestFile, fileData); |
304 | | - command = [ |
305 | | - `${viameConstants.setupScriptAbs} &&`, |
306 | | - `"${viameConstants.kwiverExe}" runner`, |
307 | | - `-p "${pipelinePath}"`, |
308 | | - ]; |
309 | | - if (!stereoOrMultiCam) { |
310 | | - command.push(`-s input:video_filename="${manifestFile}"`); |
311 | | - command.push(`-s detector_writer:file_name="${detectorOutput}"`); |
312 | | - command.push(`-s track_writer:file_name="${trackOutput}"`); |
313 | | - } |
314 | | - } |
315 | | -
|
316 | | - if (runPipelineArgs.pipeline.type === 'filter') { |
317 | | - command.push(`-s kwa_writer:output_directory="${npath.join(jobWorkDir, 'output')}"`); |
318 | | - command.push(`-s image_writer:file_name_prefix="${jobWorkDir}/"`); |
319 | | - } |
320 | | - if (runPipelineArgs.pipeline.type === 'transcode') { |
321 | | - command.push(`-s video_writer:video_filename="${npath.join(jobWorkDir, `${datasetId}.mp4`)}"`); |
322 | | - } |
323 | | -
|
324 | | - if (requiresInput && !stereoOrMultiCam) { |
325 | | - command.push(`-s detection_reader:file_name="${groundTruthFileName}"`); |
326 | | - command.push(`-s track_reader:file_name="${groundTruthFileName}"`); |
327 | | - } |
328 | | -
|
329 | | - let multiOutFiles: Record<string, string>; |
330 | | - if (meta.multiCam && stereoOrMultiCam) { |
331 | | - // eslint-disable-next-line max-len |
332 | | - const { argFilePair, outFiles } = await writeMultiCamStereoPipelineArgs(jobWorkDir, meta, settings, requiresInput); |
333 | | - Object.entries(argFilePair).forEach(([arg, file]) => { |
334 | | - command.push(`-s ${arg}="${file}"`); |
335 | | - }); |
336 | | - multiOutFiles = {}; |
337 | | - Object.entries(outFiles).forEach(([cameraName, fileName]) => { |
338 | | - multiOutFiles[cameraName] = npath.join(jobWorkDir, fileName); |
339 | | - }); |
340 | | - trackOutput = npath.join(jobWorkDir, outFiles[meta.multiCam.defaultDisplay]); |
341 | | -
|
342 | | - if (meta.multiCam.calibration) { |
343 | | - command.push(`-s measurer:calibration_file="${meta.multiCam.calibration}"`); |
344 | | - command.push(`-s calibration_reader:file="${meta.multiCam.calibration}"`); |
345 | | - } |
346 | | - } else if (pipeline.type === stereoPipelineMarker) { |
347 | | - throw new Error('Attempting to run a multicam pipeline on non multicam data'); |
348 | | - } |
349 | | - const queuedJob: QueuedDesktopJob = { |
350 | | - key: 'pipeline', // TODO make this a random thing |
351 | | - command: command.join(' '), |
352 | | - jobType: 'pipeline', |
353 | | - args: runPipelineArgs, |
354 | | - title: runPipelineArgs.pipeline.name, |
355 | | - workingDir: jobWorkDir, |
356 | | - datasetIds: [datasetId], |
357 | | - }; |
358 | | - return queuedJob; |
359 | | -} |
360 | | -
|
361 | | -async function runDesktopPipelineJob( |
362 | | - queuedJob: QueuedDesktopJob, |
363 | | - viameConstants: ViameConstants, |
364 | | - updater: DesktopJobUpdater, |
365 | | -) { |
366 | | - const { command, workingDir } = queuedJob; |
367 | | - const job = observeChild(spawn(command, { |
368 | | - shell: viameConstants.shell, |
369 | | - cwd: workingDir, |
370 | | - })); |
371 | | - fs.writeFile(npath.join(workingDir, DiveJobManifestName), JSON.stringify(queuedJob, null, 2)); |
372 | | - const joblog = npath.join(workingDir, 'runlog.txt'); |
373 | | - updater({ |
374 | | - ...queuedJob, |
375 | | - startTime: new Date(), |
376 | | - body: [''], |
377 | | - exitCode: job.exitCode, |
378 | | - pid: job.pid, |
379 | | - }); |
380 | | - job.stdout.on('data', jobFileEchoMiddleware(queuedJob as DesktopJob, updater, joblog)); |
381 | | - job.stderr.on('data', jobFileEchoMiddleware(queuedJob as DesktopJob, updater, joblog)); |
382 | | -
|
383 | | - job.on('exit', async (code) => { |
384 | | - if (code === 0) { |
385 | | - try { |
386 | | - const { meta: newMeta } = await common.ingestDataFiles(settings, datasetId, [detectorOutput, trackOutput], multiOutFiles); |
387 | | - if (newMeta) { |
388 | | - meta.attributes = newMeta.attributes; |
389 | | - await common.saveMetadata(settings, datasetId, meta); |
390 | | - } |
391 | | - } catch (err) { |
392 | | - console.error(err); |
393 | | - } |
394 | | - } |
395 | | - updater({ |
396 | | - ...queuedJob, |
397 | | - body: [''], |
398 | | - exitCode: code, |
399 | | - endTime: new Date(), |
400 | | - }); |
401 | | - }); |
402 | | -} |
403 | | -*/ |
404 | 217 | /** |
405 | 218 | * a node.js implementation of dive_tasks.tasks.export_trained_model |
406 | 219 | */ |
|
0 commit comments