Какие? Хозяин кошки внезапно исчез за одну ночь?

искусственный интеллект задняя часть
Какие? Хозяин кошки внезапно исчез за одну ночь?

Соси кошек вместе с кодом! Эта статья участвует【Эссе "Мяу Звезды"】.

1. Что? Хозяин кошки внезапно исчез за одну ночь?

Какие? Мастер внезапно исчез за одну ночь?

что делать? Спешите опубликовать свое откровение об охоте на кошек, что? Нет фотографии владельца кошки? Ручной вырез? ? ? Пристегиваться до полуночи? Затем родилась целая фотография, вырезанная одним щелчком мыши. . . . . .

1. Основная работа

  • Извлечение наборов данных о кошках и собаках из набора данных Oxford-IIIT Pet
  • Переделайте этикетку, установите для фона значение 0, а для изображения — значение 1.
  • Когда конечный результат 2100 г., mIoU = 0,7874, еще есть возможности для улучшения, но это занимает много времени, больше не тренируется
  • Разверните экспортированную статическую модель через paddlehub.

Файлы модели видят текущую директориюmodel.gz, см. развертывание лопастной втулкиcatseg_mobile.zip.

Наконец, вы можете идеально вырезать картинку и сделать фотографию для удостоверения личности кошки.

2. Введение в PaddleSeg

PaddleSeg — это комплект для разработки сквозной сегментации изображений, разработанный на основе PaddlePaddle, который охватывает большое количество высококачественных моделей сегментации в различных направлениях, таких как высокоточные и облегченные. Благодаря модульной конструкции он предоставляет два метода применения: управление конфигурацией и вызов API, чтобы помочь разработчикам легче завершить весь процесс приложений сегментации изображений от обучения до развертывания.

характеристика

  • Высокоточная модель: на основе самостоятельно разработанного Baidu обучения Semi-Supervised Label Knowledge Distillation (SSLD) для получения высокоточной магистральной сети в сочетании с передовой технологией сегментации предоставляется более 50 высококачественных моделей предварительного обучения, которые лучше, чем другие реализации с открытым исходным кодом.
  • Модульная конструкция: поддержка более 15 основных сетей сегментации в сочетании с различными компонентами, такими как стратегии улучшения данных, магистральные сети и функции потерь в модульной конструкции, позволяет разработчикам собирать различные конфигурации обучения на основе реальных сценариев приложений для удовлетворения различных требований к производительности и точности.
  • Высокая производительность: поддержка многопроцессорного асинхронного ввода-вывода, параллельного обучения с несколькими картами, оценки и других стратегий ускорения в сочетании с функцией оптимизации памяти базовой платформы Flying Paddle может значительно снизить накладные расходы на обучение разделенной модели, позволяя разработчикам чтобы снизить затраты и повысить эффективность полного обучения сегментации изображений.
! git clone https://gitee.com/paddlepaddle/PaddleSeg.git  --depth=1
Cloning into 'PaddleSeg'...
remote: Enumerating objects: 1589, done.[K
remote: Counting objects: 100% (1589/1589), done.[K
remote: Compressing objects: 100% (1354/1354), done.[K
remote: Total 1589 (delta 309), reused 1117 (delta 142), pack-reused 0[K
Receiving objects: 100% (1589/1589), 88.49 MiB | 5.57 MiB/s, done.
Resolving deltas: 100% (309/309), done.
Checking connectivity... done.

3. Производство набора данных

Вам необходимо вручную удалить заголовок файла dataset/annotations/list.txt, чтобы облегчить чтение pandas.Если это проблематично, вы можете напрямую использовать подготовленный набор данных 2, набор данных cat.

# 解压缩数据集
!mkdir dataset
!tar -xvf data/data50154/images.tar.gz -C dataset/
!tar -xvf data/data50154/annotations.tar.gz -C dataset/
# 需要手动删除dataset/annotations/list.txt文件头,然后以pandas读取

import pandas as pd
import shutil
import os


# Image CLASS-ID SPECIES BREED ID
# ID: 1:37 Class ids
# SPECIES: 1:Cat 2:Dog
# BREED ID: 1-25:Cat 1:12:Dog
# All images with 1st letter as captial are cat images
# images with small first letter are dog images
# ._Abyssinian_100.png

def copyfile(animal, filename):
    # image\label列表
    file_list = []
    image_file = filename + '.jpg'
    label_file = filename + '.png'

    if os.path.exists(os.path.join('dataset/images', image_file)):
        shutil.copy(os.path.join('dataset/images', image_file), os.path.join(f'{animal}/images', image_file))
        shutil.copy(os.path.join('dataset/annotations/trimaps', label_file),
                    os.path.join(f'{animal}/labels', label_file))
        temp = os.path.join('images/', image_file) + ' ' + os.path.join('labels/',label_file) + '\n'
        file_list.append(temp)
    with open(os.path.join(animal, animal + '.txt'), 'a') as f:
        f.writelines(file_list)


if __name__ == "__main__":

    data = pd.read_csv('dataset/annotations/list.txt', header=None, sep=' ')
    data.head()

    cat = data[data[2] == 1]
    dog = data[data[2] == 2]

    for item in cat[0]:
        copyfile('cat', item)

    for item in dog[0]:
        copyfile('dog', item)

# 删除无用数据
!rm dataset/ -rf

4. Обучите пользовательский набор данных

4.1 Файловая структура

├── cat.txt
├── images
│   ├── Abyssinian_100.jpg
│   ├── Abyssinian_101.jpg
│   ├── ...
├── labels
│   ├── Abyssinian_100.png
│   ├── Abyssinian_101.png
│   ├── ...

4.2 Содержимое cat.txt:

images/Abyssinian_1.jpg labels/Abyssinian_1.png
images/Abyssinian_10.jpg labels/Abyssinian_10.png
images/Abyssinian_100.jpg labels/Abyssinian_100.png
...

4.3. Просмотр данных

%cd ~
from PIL import Image

img=Image.open('cat/images/Abyssinian_101.jpg')
print(img)
img
/home/aistudio
<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=450x313 at 0x7FED044B0F10>
img=Image.open('cat/images/Abyssinian_123.jpg')
print(img)
img
<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=500x333 at 0x7F174201AC90>

output_9_1.png

5. Обработка этикеток

Этикетки отсортированы с 0, данные этого проекта взяты из Oxford-IIIT PetWoohoo.robots.O-type.AC.UK/~v GG/data/afraid…Набор данных Pet, набор данных закодирован с 1, поэтому его необходимо перекодировать. Фон установлен на 0, а изображение установлено на 1.

# 执行一次即可
import pandas as pd
import os
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image

def re_label(filename):
    img = plt.imread(filename) * 255.0
    img_label = np.zeros((img.shape[0], img.shape[1]), np.uint8)
    for i in range(img.shape[0]):
        for j in range(img.shape[1]):
            value = img[i, j]
            if value == 2:
                img_label[i, j] = 1
    label0 = Image.fromarray(np.uint8(img_label))
    label0.save( filename)

data=pd.read_csv("cat/cat.txt", header=None, sep=' ') 
for item in data[1]:
    re_label(os.path.join('cat', item))
print('处理完毕!')    
处理完毕!

2. Предварительная обработка набора данных

import os
from sklearn.model_selection import train_test_split
import pandas as pd


def break_data(target, rate=0.2):
    origin_dataset = pd.read_csv("cat/cat.txt", header=None, sep=' ')  # 加入参数
    train_data, test_data = train_test_split(origin_dataset, test_size=rate)
    train_data,eval_data=train_test_split(train_data, test_size=rate)
    train_filename = os.path.join(target, 'train.txt')
    test_filename = os.path.join(target, 'test.txt')
    eval_filename = os.path.join(target, 'eval.txt')

    train_data.to_csv(train_filename, index=False, sep=' ',  header=None)
    test_data.to_csv(test_filename, index=False, sep=' ', header=None)
    eval_data.to_csv(eval_filename, index=False, sep=' ', header=None)

    print('train_data:',len(train_data))
    print('test_data:',len(test_data))
    print('eval_data:',len(eval_data))

if __name__ == '__main__':
    break_data(target='cat', rate=0.2)
train_data: 1516
test_data: 475
eval_data: 380
# 查看
!head cat/train.txt
images/Bengal_173.jpg labels/Bengal_173.png
images/Siamese_179.jpg labels/Siamese_179.png
images/British_Shorthair_201.jpg labels/British_Shorthair_201.png
images/Russian_Blue_60.jpg labels/Russian_Blue_60.png
images/British_Shorthair_93.jpg labels/British_Shorthair_93.png
images/British_Shorthair_26.jpg labels/British_Shorthair_26.png
images/British_Shorthair_209.jpg labels/British_Shorthair_209.png
images/British_Shorthair_101.jpg labels/British_Shorthair_101.png
images/British_Shorthair_269.jpg labels/British_Shorthair_269.png
images/Ragdoll_59.jpg labels/Ragdoll_59.png

3. Конфигурация

# 已配置好,可以不用复制了
# !cp PaddleSeg/configs/quick_start/bisenet_optic_disc_512x512_1k.yml ~/bisenet_optic_disc_512x512_1k.yml

Измените bisenet_optic_disc_512x512_1k.yml, обратите внимание на следующие моменты:

  • 1. Конфигурация пути набора данных
  • 2.num_classes настройка, фон не учитывается
  • 3.трансформирует настройки
  • 4.установка потерь
batch_size: 600
iters: 5000

train_dataset:   
  type: Dataset
  dataset_root: /home/aistudio/cat/
  train_path: /home/aistudio/cat/train.txt
  num_classes: 2
  transforms:
    - type: ResizeStepScaling
      min_scale_factor: 0.5
      max_scale_factor: 2.0
      scale_step_size: 0.25
    - type: RandomPaddingCrop
      crop_size: [224, 224]
    - type: RandomHorizontalFlip
    - type: RandomDistort
      brightness_range: 0.4
      contrast_range: 0.4
      saturation_range: 0.4
    - type: Normalize
  mode: train


val_dataset: 
  type: Dataset
  dataset_root: /home/aistudio/cat/
  val_path: /home/aistudio/cat/eval.txt
  num_classes: 2
  transforms:
    - type: Normalize
  mode: val

optimizer:
  type: sgd
  momentum: 0.9
  weight_decay: 0.0005

lr_scheduler:
  type: PolynomialDecay
  learning_rate: 0.05
  end_lr: 0
  power: 0.9

loss:
  types:
    - type: CrossEntropyLoss
  coef: [1]

model:
  type: FCN
  backbone:
    type: HRNet_W18_Small_V1
    align_corners: False
  num_classes: 2
  pretrained: Null


4. Обучение

%cd ~/PaddleSeg/
! python train.py --config  ../bisenet_optic_disc_512x512_1k.yml\
    --do_eval \
    --use_vdl \
    --save_interval 100 \
    --save_dir output
2021-11-13 19:30:52 [INFO]	[TRAIN] epoch: 1105, iter: 2210/5000, loss: 0.1849, lr: 0.029586, batch_cost: 8.8180, reader_cost: 7.73956, ips: 68.0427 samples/sec | ETA 06:50:02
2021-11-13 19:32:18 [INFO]	[TRAIN] epoch: 1110, iter: 2220/5000, loss: 0.1768, lr: 0.029490, batch_cost: 8.6004, reader_cost: 7.52235, ips: 69.7641 samples/sec | ETA 06:38:29
2021-11-13 19:33:47 [INFO]	[TRAIN] epoch: 1115, iter: 2230/5000, loss: 0.1791, lr: 0.029395, batch_cost: 8.8851, reader_cost: 7.80702, ips: 67.5288 samples/sec | ETA 06:50:11
2021-11-13 19:35:14 [INFO]	[TRAIN] epoch: 1120, iter: 2240/5000, loss: 0.1835, lr: 0.029299, batch_cost: 8.6699, reader_cost: 7.59314, ips: 69.2053 samples/sec | ETA 06:38:48
2021-11-13 19:36:41 [INFO]	[TRAIN] epoch: 1125, iter: 2250/5000, loss: 0.1815, lr: 0.029204, batch_cost: 8.7713, reader_cost: 7.68169, ips: 68.4051 samples/sec | ETA 06:42:00
2021-11-13 19:38:08 [INFO]	[TRAIN] epoch: 1130, iter: 2260/5000, loss: 0.1833, lr: 0.029108, batch_cost: 8.7045, reader_cost: 7.62504, ips: 68.9299 samples/sec | ETA 06:37:30
2021-11-13 19:39:35 [INFO]	[TRAIN] epoch: 1135, iter: 2270/5000, loss: 0.1741, lr: 0.029013, batch_cost: 8.7032, reader_cost: 7.61708, ips: 68.9401 samples/sec | ETA 06:35:59
2021-11-13 19:41:03 [INFO]	[TRAIN] epoch: 1140, iter: 2280/5000, loss: 0.1810, lr: 0.028917, batch_cost: 8.8020, reader_cost: 7.72264, ips: 68.1664 samples/sec | ETA 06:39:01
2021-11-13 19:42:33 [INFO]	[TRAIN] epoch: 1145, iter: 2290/5000, loss: 0.1799, lr: 0.028821, batch_cost: 8.9336, reader_cost: 7.84692, ips: 67.1623 samples/sec | ETA 06:43:30
2021-11-13 19:44:02 [INFO]	[TRAIN] epoch: 1150, iter: 2300/5000, loss: 0.1756, lr: 0.028726, batch_cost: 8.9216, reader_cost: 7.84517, ips: 67.2524 samples/sec | ETA 06:41:28
2021-11-13 19:44:02 [INFO]	Start evaluating (total_samples: 380, total_iters: 380)...
380/380 [==============================] - 15s 40ms/step - batch_cost: 0.0394 - reader cost: 0.001
2021-11-13 19:44:17 [INFO]	[EVAL] #Images: 380 mIoU: 0.7640 Acc: 0.8681 Kappa: 0.7330 
2021-11-13 19:44:17 [INFO]	[EVAL] Class IoU: 
[0.7378 0.7902]
2021-11-13 19:44:17 [INFO]	[EVAL] Class Acc: 
[0.7925 0.9347]
2021-11-13 19:44:17 [INFO]	[EVAL] The model with the best validation mIoU (0.7874) was saved at iter 2100.

5. Тест

!python val.py \
       --config  /home/aistudio/bisenet_optic_disc_512x512_1k.yml\
       --model_path output/best_model/model.pdparams
2021-11-13 19:48:13 [INFO]	
---------------Config Information---------------
batch_size: 600
iters: 5000
loss:
  coef:
  - 1
  types:
  - type: CrossEntropyLoss
lr_scheduler:
  end_lr: 0
  learning_rate: 0.05
  power: 0.9
  type: PolynomialDecay
model:
  backbone:
    align_corners: false
    type: HRNet_W18_Small_V1
  num_classes: 2
  pretrained: null
  type: FCN
optimizer:
  momentum: 0.9
  type: sgd
  weight_decay: 0.0005
train_dataset:
  dataset_root: /home/aistudio/cat/
  mode: train
  num_classes: 2
  train_path: /home/aistudio/cat/train.txt
  transforms:
  - max_scale_factor: 2.0
    min_scale_factor: 0.5
    scale_step_size: 0.25
    type: ResizeStepScaling
  - crop_size:
    - 224
    - 224
    type: RandomPaddingCrop
  - type: RandomHorizontalFlip
  - brightness_range: 0.4
    contrast_range: 0.4
    saturation_range: 0.4
    type: RandomDistort
  - type: Normalize
  type: Dataset
val_dataset:
  dataset_root: /home/aistudio/cat/
  mode: val
  num_classes: 2
  transforms:
  - type: Normalize
  type: Dataset
  val_path: /home/aistudio/cat/eval.txt
------------------------------------------------
W1113 19:48:13.707370  4265 device_context.cc:404] Please NOTE: device: 0, GPU Compute Capability: 7.0, Driver API Version: 10.1, Runtime API Version: 10.1
W1113 19:48:13.707428  4265 device_context.cc:422] device: 0, cuDNN Version: 7.6.
2021-11-13 19:48:19 [INFO]	Loading pretrained model from output/best_model/model.pdparams
2021-11-13 19:48:19 [INFO]	There are 363/363 variables loaded into FCN.
2021-11-13 19:48:19 [INFO]	Loaded trained params of model successfully
2021-11-13 19:48:19 [INFO]	Start evaluating (total_samples: 380, total_iters: 380)...
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/fluid/dygraph/math_op_patch.py:239: UserWarning: The dtype of left and right variables are not the same, left dtype is paddle.int32, but right dtype is paddle.bool, the right dtype will convert to paddle.int32
  format(lhs_dtype, rhs_dtype, lhs_dtype))
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/fluid/dygraph/math_op_patch.py:239: UserWarning: The dtype of left and right variables are not the same, left dtype is paddle.int64, but right dtype is paddle.bool, the right dtype will convert to paddle.int64
  format(lhs_dtype, rhs_dtype, lhs_dtype))
380/380 [==============================] - 15s 41ms/step - batch_cost: 0.0405 - reader cost: 0.00
2021-11-13 19:48:35 [INFO]	[EVAL] #Images: 380 mIoU: 0.7874 Acc: 0.8838 Kappa: 0.7616 
2021-11-13 19:48:35 [INFO]	[EVAL] Class IoU: 
[0.7566 0.8181]
2021-11-13 19:48:35 [INFO]	[EVAL] Class Acc: 
[0.8349 0.9211]
380/380 [==============================] - 15s 41ms/step - batch_cost: 0.0405 - reader cost: 0.00
2021-11-13 19:48:35 [INFO]	[EVAL] #Images: 380 mIoU: 0.7874 Acc: 0.8838 Kappa: 0.7616 
2021-11-13 19:48:35 [INFO]	[EVAL] Class IoU: 
[0.7566 0.8181]
2021-11-13 19:48:35 [INFO]	[EVAL] Class Acc: 
[0.8349 0.9211]

6. Экспортируйте статическую модель

!python export.py \
       --config /home/aistudio/bisenet_optic_disc_512x512_1k.yml\
       --model_path output/best_model/model.pdparams
 op_type, op_type, EXPRESSION_MAP[method_name]))
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/fluid/layers/math_op_patch.py:322: UserWarning: /tmp/tmp_l3u6xjv.py:58
The behavior of expression A + B has been unified with elementwise_add(X, Y, axis=-1) from Paddle 2.0. If your code works well in the older versions but crashes in this version, try to use elementwise_add(X, Y, axis=0) instead of A + B. This transitional warning will be dropped in the future.
  op_type, op_type, EXPRESSION_MAP[method_name]))
2021-11-03 01:01:11 [INFO]	Model is saved in ./output.

7. Прогноз

deploy.yaml

Deploy:
  model: model.pdmodel
  params: model.pdiparams
  transforms:
  - type: Normalize
# 安装paddleseg
!pip install -e .
# 预测
%cd ~/PaddleSeg/
!python deploy/python/infer.py --config output/deploy.yaml  --image_path /home/aistudio/cat/images/Bombay_130.jpg
/home/aistudio/PaddleSeg
# 打印原图
from PIL import Image
img=Image.open('/home/aistudio/cat/images/Bombay_130.jpg')
img

output_30_0.png

# 打印输出图,颜色可调
from PIL import Image
img=Image.open('/home/aistudio/PaddleSeg/output/Bombay_130.png')
img

output_31_0.png

Восемь, развертывание концентратора

Развернулся с хабом, а вырезать карту можно через командную строку или питон! , чтобы узнать о конкретном хаб-файле, см. сжатый пакет каталога Catseg_Mobile.zip.

hub run catseg_mobile --input_path .\cat1.jpg

После того, как я узнал об этом, я каждый день меняю хозяина кота, и я могу каждый день фотографировать по желанию, ахахаха! ! ! Умный, как я.