在tensorflow&keras中实现包括流行数据集的各种语义分割模型

tf-semantic-segmentation的Python项目详细描述


TF语义分割

Build StatusPyPI Status Badgecodecovlatest tag

特点

  • 数据集

    • 阿德20K
    • 卡姆维德
    • 城市景观
    • 制图挑战
    • 莫沙伦奇
    • 可可
    • 帕斯卡沃克2012
    • 玉米卷
    • 形状(随机创建三角形、矩形和圆形)
    • 玩具(用MNIST覆盖TinyImageNet)
    • ISIC218标准
    • CVC临床数据库
  • 多个gpu上的分布式训练

  • 基于WandB的超参数优化

  • 万达集成

  • 从目录轻松创建TFRecord

  • 张量板可视化

  • 集成推理

  • 型号:

    • Unet公司
    • Erfnet公司
    • 多源网
    • 卫星网
    • MobilenetUnet(带在imagenet上预先培训过的mobilenet编码器的unet)
    • unet_inception_resnet_v2(unet with inception resnet v2编码器在imagenet上预先培训)
    • ResnetUnet(使用在imagenet上预先训练的resnet50编码器的unet)
  • 损失:

    • 分类交叉熵
    • 二元交叉熵
    • 交叉熵+SSIM
    • 掷骰子
    • 交叉熵+骰子
    • 特沃斯基
    • 焦点
    • 焦点+特沃斯基
  • 激活:

    • 米什
    • 斯威什
    • relu6型
  • 优化器:

    • 护林员
    • 雷达
  • 规范化

    • 实例规范
    • 批量定额
  • 动态增强

    • 向左/向右翻转
    • 向上/向下翻转
    • 旋转180度
    • 颜色

要求

sudo apt-get install libsm6 libxext6 libxrender-dev libyaml-dev libpython3-dev

Tensorflow(2.x)和Tensorflow插件(可选)

^{pr2}$

或者

pip install tensorflow-gpu==2.0.0 --upgrade
pip install tensorflow-addons==0.6.0 --upgrade

培训

提示:要查看列车/测试/val图像,您必须像这样启动tensorboard

tensorboard --logdir=logs/ --reload_multifile=true

内置数据集(生成器)

python -m tf_semantic_segmentation.bin.train -ds 'tacobinary' -bs 8 -e 100\
    -logdir 'logs/taco-binary-test' -o 'adam' -lr 5e-3 --size 256,256 \
    -l 'binary_crossentropy' -fa 'sigmoid'\
    --train_on_generator --gpus='0'\
    --tensorboard_train_images --tensorboard_val_images

使用固定记录路径

python -m tf_semantic_segmentation.bin.train --record_dir=records/cityscapes-512x256-rgb/ \
    -bs 4 -e 100 -logdir 'logs/cityscapes-bs8-e100-512x256' -o 'adam' -lr 1e-4 -l 'categorical_crossentropy'\
    -fa 'softmax' -bufsize 50 --metrics='iou_score,f1_score' -m 'erfnet' --gpus='0' -a 'mish'\
    --tensorboard_train_images --tensorboard_val_images

多GPU培训

python -m tf_semantic_segmentation.bin.train --record_dir=records/cityscapes-512x256-rgb/ \
    -bs 4 -e 100 -logdir 'logs/cityscapes-bs8-e100-512x256' -o 'adam' -lr 1e-4 -l 'categorical_crossentropy'\
    -fa 'softmax' -bufsize 50 --metrics='iou_score,f1_score' -m 'erfnet' --gpus='0,1,2,3' -a 'mish'

使用代码

fromtf_semantic_segmentation.bin.trainimporttrain_test_model,get_args# get the default argsargs=get_args({})# change some parameters# !rm -r logs/args.model='erfnet'# args['color_mode'] = 0args.batch_size=8args.size=[128,128]# resize input dataset to this sizeargs.epochs=10args.learning_rate=1e-4args.optimizer='adam'# ['adam', 'radam', 'ranger']args.loss='dice'args.logdir='logs'args.record_dir="datasets/shapes/records"args.final_activation='softmax'# train and testresults,model=train_test_model(args)

模型

  • Erfnet公司
  • Unet公司
fromtf_semantic_segmentationimportmodels# print all available modelsprint(list(modes.models_by_name.keys()))# returns a model (without the final activation function) and the base model without the top layer# because the activation function depends on the loss functionmodel,base_model=models.get_model_by_name('erfnet',{"input_shape":(128,128,3),"num_classes":5})# call models directlymodel,base_model=models.erfnet(input_shape=(128,128),num_classes=5)

使用您自己的数据集

  • 可接受的文件类型有:jpg(jpeg)和png

如果已经进行了列车/测试/val拆分,则使用以下数据结构:

dataset/
    labels.txt
    test/
        images/
        masks/
    train/
        images/
        masks/
    val/
        images/
        masks/

或使用

dataset/
    labels.txt
    images/
    masks/

在标签.txt应该包含一个用newline[/n]分隔的标签列表。例如,它看起来像这样:

background
car
pedestrian
  • 要使用原始图像大小和颜色创建tfrecord,请使用如下脚本:
INPUT_DIR= ...
tf-semantic-segmentation-tfrecord-writer -dir $INPUT_DIR -r $INPUT_DIR/records

有以下附加参数:

  • -s[--size]'$width,$height'(f.e.“512512”)
  • -rm[--resize_method]('resize','resize_with_pad',resize_with_crop_or_pad)
  • cm[--颜色模式](0=RGB,1=灰色,2=无(默认))

数据集

fromtf_semantic_sementation.datasetsimportget_datasetbyname,datasets_by_name,DataType,get_cache_dir# print availiable dataset namesprint(list(datasets_by_name.keys()))# get the binary (waste or not) datasetdata_dir='/hdd/data/'name='tacobinary'cache_dir=get_cache_dir(data_dir,name.lower())ds=get_dataset_by_name(name,cache_dir)# print labels and classesprint(ds.labels)print(ds.num_classes)# print number of training examplesprint(ds.num_examples(DataType.TRAIN))# or simply print the summaryds.summary()

调试数据集

python -m tf_semantic_segmentation.debug.dataset_vis -d ade20k

TF记录

这个库简化了创建tfrecord数据集的过程,以便更快地进行培训。

写入TF记录:

fromtf_semantic_segmentation.datasetsimportTFWriterds=...writer=TFWriter(record_dir)writer.write(ds)writer.validate(ds)

或将simple与此脚本一起使用(将以128 x 128(宽x高)的大小保存):

tf-semantic-segmentation-tfrecord-writer -d 'toy' -c /hdd/datasets/ -s '128,128'

分析已写入的tfrecord(带平均值)

python -m tf_semantic_segmentation.bin.tfrecord_analyser -r records/ --mean

码头工人

docker build -t tf_semantic_segmentation -f docker/Dockerfile ./

或者拉最新版本

docker pull baudcode/tf_semantic_segmentation:latest

预测

^{pr21}$

使用代码

fromtensorflow.keras.modelsimportload_modelimportnumpyasnpfromtf_semantic_segmentation.processingimportdatasetfromtf_semantic_segmentation.visualizationsimportshow,masksmodel=load_model('logs/model-best.h5',compile=False)# model parameterssize=tuple(model.input.shape[1:3])depth=model.input.shape[-1]color_mode=dataset.ColorMode.GRAYifdepth==1elsedataset.ColorMode.RGB# define an imageimage=np.zeros((256,256,3),np.uint8)# preprocessingimage=image.astype(np.float32)/255.image,_=dataset.resize_and_change_color(image,None,size,color_mode,resize_method='resize')image_batch=np.expand_dims(image,axis=0)# predict (returns probabilities)p=model.predict(image_batch)# draw segmentation mapnum_classes=p.shape[-1]ifp.shape[-1]>1else2predictions_rgb=masks.get_colored_segmentation_mask(p,num_classes,images=image_batch,binary_threshold=0.5)# show images using matplotlibshow.show_images([predictions_rgb[0],image_batch[0]])

使用脚本

  • 论形象
python -m tf_semantic_segmentation.evaluation.predict -m model-best.h5  -i image.png
  • tfval是“数据”类型的默认值
python -m tf_semantic_segmentation.evaluation.predict -m model-best.h5 -r records/camvid/
  • 在TFRecord上(带导出到目录)
python -m tf_semantic_segmentation.evaluation.predict -m model-best.h5 -r records/cubbinary/ -o out/ -rm 'resize_with_pad'
  • 视频
python -m tf_semantic_segmentation.evaluation.predict -m model-best.h5 -v video.mp4
  • 视频(带导出到输出/p-视频.mp4)在
python -m tf_semantic_segmentation.evaluation.predict -m model-best.h5 -v video.mp4 -o out/

使用Tensorflow模型服务器进行预测

  • 安装
# installecho"deb [arch=amd64] http://storage.googleapis.com/tensorflow-serving-apt stable tensorflow-model-server tensorflow-model-server-universal"| sudo tee /etc/apt/sources.list.d/tensorflow-serving.list &&\
curl https://storage.googleapis.com/tensorflow-serving-apt/tensorflow-serving.release.pub.gpg | sudo apt-key add -
sudo apt-get update && apt-get install tensorflow-model-server
  • 启动模型服务器
### using a single model
tensorflow_model_server --rest_api_port=8501 --model_base_path=/home/user/models/mymodel/saved_model

### or using an ensamble of multiple models# helper to write the ensamble config yaml file (models/ contains multiple logdirs/, logdir must contain the name 'unet')
python -m tf_semantic_segmentation.bin.model_server_config_writer -d models/ -c 'unet'# start model server with written models.yaml
tensorflow_model_server --model_config_file=models.yaml --rest_api_port=8501

比较模型和ensemnble

python -m tf_semantic_segmentation.evaluation.compare_models -i logs/ -c 'taco' -data /hdd/datasets/ -d 'tacobinary'

参数:

  • -i(包含模型的目录)
  • -c(模型名(目录名)必须包含此值)
  • -data(数据目录)
  • ^{emm>(数据集名称)

使用--help获取更多帮助

使用代码

^{pr31}$

TFLite支持

转换模型

python -m tf_semantic_segmentation.bin.convert_tflite -i logs/mymodel/saved_model/0/ -o model.tflite

对模型的检验推理

python -m tf_semantic_segmentation.debug.tflite_test -m model.tflite -i Harris_Sparrow_0001_116398.jpg

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
在java中读取excel时,变量为空   java不在API26+安卓设备上显示socket消息   java编辑来自另一个类的JLabel文本   集合建模Java可移植性:路由不可移植<Stations>或路由。电台()?   java H2数据库Postgres模式Upsert   检索数组列表大小时发生java错误   Java中的jsf打印   java如何在错误消息中插入新行,以及如何在每次验证中只插入一条错误消息,而不是3条   如何在java中创建一个get方法,使节点脱离泛型类型   java向数组中添加按钮   使用Xmx32m java命令计算3个文件中的最大字频率   java从内部类访问变量   Groovy中的闭包在等效Java中实现   LibGDX/Java:仅对来自另一个数组的对象进行排序   java如何以及在何处分配OpenJDK源代码中解释的堆内存?   java使用自动化Selenium将值插入文本字段   java确认活动可穿戴如何?   Java中的多线程问题:两个优先级相同的线程应该没有“顺序”对吗?