Source code for SCTrack.sctrack
#! /usr/bin/python3
# -*- coding: utf-8 -*-
# @FileName: main.py
# @Author: Li Chengxin
# @Time: 2023/7/2 19:51
import argparse
import logging
import os
import sys
import time
import imagesize
from SCTrack import track, config
[docs]def main():
logging.basicConfig(format="%(asctime)s %(levelname)s: %(message)s", datefmt="%Y-%m-%d %H:%M:%S",
level=logging.INFO)
parser = argparse.ArgumentParser(description="", add_help=False)
help_content = """
Welcome to use SC-Track!
using this script to auto tracking the single cell images and identify each cell's type.\n
usage:
sctrack -i <image filepath> -a <annotation filepath, json annotation or segmentation mask filepath>
-bf[optional] <bright field image filepath> -o [optional] <output result filepath>
-t [optional]
"""
parser.add_argument("-h", "--help", action="help", help=help_content)
parser.add_argument('-i', "--image", default=False, help="input image filepath for nuclear")
parser.add_argument('-o', "--output", default=False, help='output json file path')
parser.add_argument('-bf', "--bf", default=False, help='input image filepath of bright field')
parser.add_argument('-ot', "--ot", default=False, help='tracking output result saved dir')
parser.add_argument('-a', "--annotation", default=False, help='annotation file path, json file or tiff mask file.')
parser.add_argument('-r', "--range", default=False,
help='tracking frame range, default is None, means tracking the whole timelapse')
args = parser.parse_args()
if len(sys.argv) < 2:
parser.print_help()
sys.exit(0)
if args.image is False:
logging.warning("Raw image not be given, so that the visualization result will not be support!")
visualization = False
else:
image = args.image
visualization = config.EXPORT_TRACKING_VISUALIZATION
image_width, image_height = imagesize.get(image)
bf = args.bf
if args.annotation is False:
logging.error(
'You must provide segmentation annotation file for tracking, support json format or mask tif format.')
sys.exit(-1)
else:
annotation = args.annotation
if args.output is False:
output = os.path.join(os.path.dirname(annotation), 'output.json')
logging.warning(f"-o not provided, using the default output file name: {output}")
else:
if not args.output.endswith('.json'):
output = os.path.join(os.path.dirname(args.image), 'output.json')
else:
output = args.output
start_time = time.time()
if args.ot:
track_output = args.ot
else:
track_output = os.path.dirname(output)
if args.range is False:
xrange = None
else:
try:
xrange = int(args.range)
except ValueError:
logging.error(f'param <-r/--range >={args.range}, the value must be int!')
sys.exit(-1)
logging.info(f"Tracking result will saved to {track_output}\\tracking_output.")
logging.info('start tracking ...')
track.start_track(fannotation=annotation, fimage=args.image, fbf=None, fout=track_output, track_range=xrange,
export_visualization=visualization,
basename=os.path.splitext(os.path.basename(args.annotation))[0])
end_time = time.time()
logging.info(f'tracking cost time: {end_time - start_time:.4f}')
if __name__ == '__main__':
main()