6 Ревизии 3df6f23ce1 ... 0be4b5a819

Автор SHA1 Съобщение Дата
  郑博超 3df6f23ce1 Initial commit преди 3 седмици
  zbc 0be4b5a819 -update: version beta1.0 преди 5 месеца
  xmba15 2d9643d596 hotfix: fix matching bug преди 1 година
  xmba15 9142afc695 v0.0.2 преди 1 година
  xmba15 8ab0990dd6 get torch Tensor prediction interface from opencv keypoints, numpy descriptors преди 1 година
  Ba Tran 366b97be93 Initial commit преди 1 година
променени са 100 файла, в които са добавени 2099 реда и са изтрити 10 реда
  1. 2 0
      .flake8
  2. 43 0
      .github/workflows/build.yml
  3. 31 0
      .github/workflows/pypi.yml
  4. 92 0
      .gitignore
  5. 45 0
      .pre-commit-config.yaml
  6. 0 8
      LICENSE
  7. 2 0
      MANIFEST.in
  8. 113 2
      README.md
  9. 135 0
      count_env.py
  10. 0 0
      data/.keep
  11. 22 0
      data/JSON/DSC_4604.json
  12. 30 0
      data/JSON_MASK/DSC_4604_mask.json
  13. BIN
      data/QUERY/DSC_4575.JPG
  14. BIN
      data/QUERY/DSC_4576.JPG
  15. BIN
      data/QUERY/DSC_4577.JPG
  16. BIN
      data/QUERY/DSC_4579.JPG
  17. BIN
      data/QUERY/DSC_4581.JPG
  18. BIN
      data/QUERY/DSC_4582.JPG
  19. BIN
      data/QUERY/DSC_4585.JPG
  20. BIN
      data/QUERY/DSC_4586.JPG
  21. BIN
      data/QUERY/DSC_4587.JPG
  22. BIN
      data/QUERY/DSC_4588.JPG
  23. BIN
      data/QUERY/DSC_4590.JPG
  24. BIN
      data/QUERY/DSC_4591.JPG
  25. BIN
      data/QUERY/DSC_4594.JPG
  26. BIN
      data/QUERY/DSC_4596.JPG
  27. BIN
      data/QUERY/DSC_4597.JPG
  28. BIN
      data/QUERY/DSC_4599.JPG
  29. BIN
      data/QUERY/DSC_4600.JPG
  30. BIN
      data/QUERY/DSC_4602.JPG
  31. BIN
      data/QUERY/DSC_4603.JPG
  32. BIN
      data/REF/DSC_4604.JPG
  33. BIN
      data/demo_613/1_image_query/DSC_0474.JPG
  34. BIN
      data/demo_613/2_image_query/ADSC_0485.JPG
  35. BIN
      data/demo_613/2_image_query/DSC_0476.JPG
  36. BIN
      data/demo_613/2_image_query/DSC_0479.JPG
  37. BIN
      data/demo_613/2_image_query/DSC_0482.JPG
  38. BIN
      data/demo_613/2_image_query/DSC_0488.JPG
  39. BIN
      data/demo_613/2_image_query/DSC_0492.JPG
  40. BIN
      data/demo_613/3_image_query/ADSC_0480.JPG
  41. BIN
      data/demo_613/3_image_query/DSC_0477.JPG
  42. BIN
      data/demo_613/3_image_query/DSC_0483.JPG
  43. BIN
      data/demo_613/3_image_query/DSC_0486.JPG
  44. BIN
      data/demo_613/3_image_query/DSC_0489.JPG
  45. BIN
      data/demo_613/3_image_query/DSC_0493.JPG
  46. 262 0
      data/demo_613/json/ADSC_0478.json
  47. 30 0
      data/demo_613/json/ADSC_0478_mask.json
  48. 118 0
      data/demo_613/json/ADSC_0480.json
  49. 30 0
      data/demo_613/json/ADSC_0480_mask.json
  50. 182 0
      data/demo_613/json/ADSC_0485.json
  51. 30 0
      data/demo_613/json/ADSC_0485_mask.json
  52. BIN
      data/demo_613/ref_image/ADSC_0478.JPG
  53. BIN
      data/demo_613/ref_image/ADSC_0480.JPG
  54. BIN
      data/demo_613/ref_image/ADSC_0485.JPG
  55. 262 0
      data/json/image165214-001.json
  56. 214 0
      data/json/image165214-019.json
  57. 166 0
      data/json/image165214-037.json
  58. 70 0
      data/json1/DSC_0449.json
  59. 30 0
      data/json1/DSC_0449_mask.json
  60. 70 0
      data/json1/DSC_0453.json
  61. 30 0
      data/json1/DSC_0453_mask.json
  62. 30 0
      data/mask_json/image165214-001_mask.json
  63. 30 0
      data/mask_json/image165214-019_mask.json
  64. 30 0
      data/mask_json/image165214-037_mask.json
  65. BIN
      data/new/DSC_4531.JPG
  66. BIN
      data/new/DSC_4532.JPG
  67. BIN
      data/new/DSC_4533.JPG
  68. BIN
      data/new/DSC_4534.JPG
  69. BIN
      data/new/DSC_4535.JPG
  70. BIN
      data/new/DSC_4536.JPG
  71. BIN
      data/new/DSC_4537.JPG
  72. BIN
      data/new/DSC_4538.JPG
  73. BIN
      data/new/DSC_4539.JPG
  74. BIN
      data/new/DSC_4540.JPG
  75. BIN
      data/new/DSC_4541.JPG
  76. BIN
      data/new/DSC_4542.JPG
  77. BIN
      data/new/DSC_4543.JPG
  78. BIN
      data/new/DSC_4544.JPG
  79. BIN
      data/new/DSC_4545.JPG
  80. BIN
      data/new/DSC_4546.JPG
  81. BIN
      data/new/DSC_4547.JPG
  82. BIN
      data/new/DSC_4548.JPG
  83. BIN
      data/new/DSC_4549.JPG
  84. BIN
      data/new/DSC_4550.JPG
  85. BIN
      data/new/DSC_4551.JPG
  86. BIN
      data/new/DSC_4552.JPG
  87. BIN
      data/new_images/DSC_4527.JPG
  88. BIN
      data/new_images/DSC_4528.JPG
  89. BIN
      data/new_images/DSC_4529.JPG
  90. BIN
      data/new_images/DSC_4530.JPG
  91. BIN
      data/new_images/DSC_4531.JPG
  92. BIN
      data/new_images/DSC_4532.JPG
  93. BIN
      data/new_images/DSC_4533.JPG
  94. BIN
      data/new_images/DSC_4534.JPG
  95. BIN
      data/new_images/DSC_4535.JPG
  96. BIN
      data/new_images/DSC_4536.JPG
  97. BIN
      data/new_images/DSC_4537.JPG
  98. BIN
      data/new_images/DSC_4538.JPG
  99. BIN
      data/new_images/DSC_4539.JPG
  100. BIN
      data/new_images/DSC_4540.JPG

+ 2 - 0
.flake8

@@ -0,0 +1,2 @@
+[flake8]
+max-line-length = 120

+ 43 - 0
.github/workflows/build.yml

@@ -0,0 +1,43 @@
+name: Build
+
+on:
+  push:
+    branches: ["master"]
+  pull_request:
+
+jobs:
+  linting:
+    runs-on: ubuntu-latest
+
+    steps:
+      - uses: actions/checkout@v3
+
+      - name: Setup python
+        uses: actions/setup-python@v4
+        with:
+          python-version: "3.x"
+
+      - name: Apply pre-commit
+        uses: pre-commit/action@v3.0.0
+        with:
+          extra_args: --all-files
+
+  test-production:
+    runs-on: ubuntu-latest
+
+    strategy:
+      fail-fast: false
+
+    steps:
+      - uses: actions/checkout@v3
+      - name: Setup python
+        uses: actions/setup-python@v4
+        with:
+          python-version: "3.x"
+
+      - name: Run tests
+        run: |
+          pip install . -U
+          pip install -r requirements-dev.txt
+          python setup.py sdist
+          pytest -vv --cov --profile

+ 31 - 0
.github/workflows/pypi.yml

@@ -0,0 +1,31 @@
+on:
+  release:
+    types:
+      - created
+
+jobs:
+  deploy:
+    runs-on: ubuntu-latest
+
+    steps:
+      - uses: actions/checkout@v3
+      - name: Setup python
+        uses: actions/setup-python@v4
+        with:
+          python-version: "3.x"
+
+      - name: Install dependencies
+        run: |
+          python -m pip install --upgrade pip
+          python -m pip install wheel
+
+      - name: Build
+        run: |
+          python setup.py sdist bdist_wheel
+
+      - name: Publish to PyPI
+        if: startsWith(github.event.ref, 'refs/tags') || github.event_name == 'release'
+        uses: pypa/gh-action-pypi-publish@release/v1.5
+        with:
+          user: __token__
+          password: ${{ secrets.PYPI_API_TOKEN }}

+ 92 - 0
.gitignore

@@ -0,0 +1,92 @@
+# Compiled source #
+###################
+*.com
+*.class
+*.dll
+*.exe
+*.o
+*.so
+*.pyc
+.ipynb_checkpoints
+*~
+*#
+build*
+*egg-info
+dist/*
+
+# Packages #
+###################
+# it's better to unpack these files and commit the raw source
+# git has its own built in compression methods
+*.7z
+*.dmg
+*.gz
+*.iso
+*.jar
+*.rar
+*.tar
+*.zip
+
+# Logs and databases #
+######################
+*.log
+*.sql
+*.sqlite
+
+# OS generated files #
+######################
+.DS_Store
+.DS_Store?
+._*
+.Spotlight-V100
+.Trashes
+ehthumbs.db
+Thumbs.db
+
+# Images
+######################
+*.jpg
+*.gif
+*.png
+*.svg
+*.ico
+
+# Video
+######################
+*.wmv
+*.mpg
+*.mpeg
+*.mp4
+*.mov
+*.flv
+*.avi
+*.ogv
+*.ogg
+*.webm
+
+# Audio
+######################
+*.wav
+*.mp3
+*.wma
+
+# Fonts
+######################
+Fonts
+*.eot
+*.ttf
+*.woff
+
+# Format
+######################
+CPPLINT.cfg
+.clang-format
+
+# Gtags
+######################
+GPATH
+GRTAGS
+GSYMS
+GTAGS
+
+*.pth

+ 45 - 0
.pre-commit-config.yaml

@@ -0,0 +1,45 @@
+exclude: |
+  (?x)(
+      ^superpoint_superglue_deployment/superpoint.py |
+      ^superpoint_superglue_deployment/superglue.py
+  )
+
+repos:
+  - repo: https://github.com/pycqa/flake8
+    rev: 4.0.1
+    hooks:
+      - id: flake8
+        additional_dependencies: [pep8-naming]
+
+  - repo: https://github.com/psf/black
+    rev: 22.6.0
+    hooks:
+      - id: black
+        language_version: python3
+
+  - repo: https://github.com/pycqa/isort
+    rev: 5.12.0
+    hooks:
+      - id: isort
+
+  - repo: https://github.com/pre-commit/mirrors-mypy
+    rev: v0.961
+    hooks:
+      - id: mypy
+
+  - repo: https://github.com/pre-commit/pre-commit-hooks
+    rev: v4.3.0
+    hooks:
+      - id: end-of-file-fixer
+      - id: trailing-whitespace
+
+  - repo: https://github.com/pre-commit/mirrors-prettier
+    rev: v2.7.1
+    hooks:
+      - id: prettier
+        types_or: [json, markdown, yaml]
+
+  - repo: https://github.com/lovesegfault/beautysh
+    rev: v6.2.1
+    hooks:
+      - id: beautysh

+ 0 - 8
LICENSE

@@ -1,8 +0,0 @@
-MIT License
-Copyright (c) <year> <copyright holders>
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

+ 2 - 0
MANIFEST.in

@@ -0,0 +1,2 @@
+include README.md
+include requirements.txt

+ 113 - 2
README.md

@@ -1,3 +1,114 @@
-# Welding-Parts-Anomaly-Detection
+<p align="center">
+<a href="https://github.com/xmba15/superpoint_superglue_deployment/actions/workflows/build.yml" target="_blank">
+  <img src="https://github.com/xmba15/superpoint_superglue_deployment/actions/workflows/build.yml/badge.svg" alt="Build Status">
+</a>
+</p>
 
-永生机械斗臂焊接件异常情况检测算法开发
+# 📝 simple library to make life easy when deploying superpoint, superglue models
+
+---
+
+## :gear: Installation
+
+---
+
+```bash
+pip install superpoint_superglue_deployment
+```
+
+## :tada: TODO
+
+---
+
+- [x] interface to deploy superpoint, superglue
+- [x] testing on real data
+
+## :running: How to Run
+
+---
+
+### Basic usage
+
+```python
+import cv2
+import numpy as np
+from loguru import logger
+
+from superpoint_superglue_deployment import Matcher
+
+
+def main():
+    query_image = cv2.imread("./data/images/one_pillar_pagoda_1.jpg")
+    ref_image = cv2.imread("./data/images/one_pillar_pagoda_2.jpg")
+
+    query_gray = cv2.imread("./data/images/one_pillar_pagoda_1.jpg", 0)
+    ref_gray = cv2.imread("./data/images/one_pillar_pagoda_2.jpg", 0)
+
+    superglue_matcher = Matcher(
+        {
+            "superpoint": {
+                "input_shape": (-1, -1),
+                "keypoint_threshold": 0.003,
+            },
+            "superglue": {
+                "match_threshold": 0.5,
+            },
+            "use_gpu": True,
+        }
+    )
+    query_kpts, ref_kpts, _, _, matches = superglue_matcher.match(query_gray, ref_gray)
+    M, mask = cv2.findHomography(
+        np.float64([query_kpts[m.queryIdx].pt for m in matches]).reshape(-1, 1, 2),
+        np.float64([ref_kpts[m.trainIdx].pt for m in matches]).reshape(-1, 1, 2),
+        method=cv2.USAC_MAGSAC,
+        ransacReprojThreshold=5.0,
+        maxIters=10000,
+        confidence=0.95,
+    )
+    logger.info(f"number of inliers: {mask.sum()}")
+    matches = np.array(matches)[np.all(mask > 0, axis=1)]
+    matches = sorted(matches, key=lambda match: match.distance)
+    matched_image = cv2.drawMatches(
+        query_image,
+        query_kpts,
+        ref_image,
+        ref_kpts,
+        matches[:50],
+        None,
+        flags=2,
+    )
+    cv2.imwrite("matched_image.jpg", matched_image)
+
+
+if __name__ == "__main__":
+    main()
+```
+
+<p align="center">
+  <img src="https://raw.githubusercontent.com/xmba15/superpoint_superglue_deployment/master/docs/images/matched_image.jpg" alt="matched image sample">
+</p>
+
+- [Notebook with detailed sample code for SuperPoint](notebooks/demo_superpoint.ipynb)
+- [Notebook with detailed sample code for SuperGlue](notebooks/demo_superglue.ipynb)
+
+- Command line to test matching two images after installing the library
+
+```bash
+match_two_images --query_path [path/to/query/image] --ref_path [path/to/reference/image] --use_gpu
+```
+
+## 🎛 Development environment
+
+---
+
+```bash
+mamba env create --file environment.yml
+mamba activate superpoint_superglue_deployment
+```
+
+## :gem: References
+
+---
+
+- [SuperPoint: Self-Supervised Interest Point Detection and Description.](https://github.com/rpautrat/SuperPoint)
+- [SuperGlue: Learning Feature Matching with Graph Neural Networks](https://github.com/magicleap/SuperGluePretrainedNetwork)

+ 135 - 0
count_env.py

@@ -0,0 +1,135 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# @Time    : 2024/6/13 0013 下午 12:03
+# @Author  : liudan
+# @File    : count_env.py
+# @Software: pycharm
+import cv2
+import os
+from PIL import Image, ImageDraw
+import numpy as np
+
+from skimage.metrics import structural_similarity as compare_ssim
+import json
+import random
+import yaml
+import demo_env
+from demo_env import registration_demo
+
+
+def compare_boxes_similarity(image1_path, image2_path, json_file_path, similarity_threshold=0.4):
+    try:
+        if not os.path.exists(image1_path):
+            raise FileNotFoundError(f"Image file {image1_path} not found")
+
+
+        image1 = Image.open(image1_path)# 原图尺寸,未resize
+        image2 = wrap_image
+
+        draw1 = ImageDraw.Draw(image1)
+
+        # 存储相似度结果和是否相同的判断
+        similarity_results = []
+        same_content_boxes = []
+
+
+        with open(json_file_path, 'r') as f:
+            data = json.load(f)
+
+
+        for shape in data['shapes']:
+            if 'points' in shape:
+                shape['points'] = [[int(round(x)), int(round(y))] for x, y in shape['points']]
+                x1, y1 = shape['points'][0]
+                x2, y2 = shape['points'][1]
+
+            # 从两幅图像中截取对应区域
+            region1 = image1.crop((x1, y1, x2, y2))
+            # region1 = image1.crop((x1, y1, x2, y2)).convert('L')
+            draw1.rectangle([x1, y1, x2, y2], outline='red', width=2)
+            image1.save(os.path.join(params['save_dir'], f'save_annotated1_{i}.jpg'))
+            region1.save(os.path.join(params['save_dir'], f'111111{i}.jpg'))
+
+
+            # region2 = image2.crop((left-80, top, right-80, bottom))
+            region2 = image2[y1:y2, x1:x2]
+            # region2 = cv2.cvtColor(region2, cv2.COLOR_BGR2GRAY)
+            # region2= region2.transpose(Image.FLIP_TOP_BOTTOM) #旋转180°针对pillowImage对象
+            # region2 = cv2.rotate(region2, cv2.ROTATE_180)
+
+            filename = f'json_image_{shape["label"]}_{i}.jpg'
+            cv2.imwrite(os.path.join(params['save_dir'], filename), region2)
+            cv2.rectangle(image2, (x1, y1), (x2, y2),(0,255,0), 2)
+            cv2.imwrite(os.path.join(params['save_dir'], f'save_annotated2_{i}.jpg'), image2)
+
+            # 将PIL图像转换为numpy数组,以便进行计算
+            arr1 = np.array(region1)
+            arr2 = region2 # region2一直是numpy数组,所以上述image1和image2处理方式不同
+
+            # 确保两个数组的形状是相同的
+            assert arr1.shape == arr2.shape, "Images do not have the same size for the given box"
+
+            # 使用SSIM计算相似度(范围在-1到1之间,1表示完全相似)
+            # ssim = compare_ssim(arr1, arr2, multichannel=False) # 这是旧版,可以计算灰度图相似度,对于计算彩色图像即使设置multichannel=True也错
+            ssim = compare_ssim(arr1, arr2, channel_axis=2)
+
+
+            similarity_results.append(ssim)
+
+            if ssim > similarity_threshold:
+                same_content_boxes.append(shape)
+                cv2.rectangle(image2, (x1, y1), (x2, y2),(0,255,0), 2)
+
+                text = "Similarity: " + str(round(ssim, 3))
+                text_pos = (x1, y1 - 5)
+                # 参数:图像, 文本, 文本位置, 字体类型, 字体大小, 字体颜色, 字体粗细
+                cv2.putText(image2, text, text_pos, cv2.FONT_HERSHEY_SIMPLEX, 1.5, (0, 255, 0), 2)
+                cv2.imwrite(os.path.join(params['visualization_dir'],f'{wrap_images_name[:-8]}_{i}.jpg'), image2)
+
+            else:
+                cv2.rectangle(image2, (x1, y1), (x2, y2), (0, 0, 255), 2)
+                text = "score: " + str(round(ssim, 3))
+                text_pos = (x1, y1 - 5)
+                # 参数:图像, 文本, 文本位置, 字体类型, 字体大小, 字体颜色, 字体粗细
+                cv2.putText(image2, text, text_pos, cv2.FONT_HERSHEY_SIMPLEX, 1.5, (0, 0, 255), 2)
+                cv2.imwrite(os.path.join(params['visualization_dir'], f'{wrap_images_name[:-8]}_{i}.jpg'), image2)
+
+        return similarity_results, same_content_boxes
+
+    except FileNotFoundError as e:
+        print(f"An error occurred: {e}")
+    except Exception as e:
+        print(f"An unexpected error occurred: {e}")
+    return None, None
+
+
+def read_params_from_yml(yml_file_path):
+    with open(yml_file_path, 'r') as file:
+        params = yaml.safe_load(file)
+    return params
+
+
+
+
+
+if __name__ == "__main__":
+    yml_file_path = 'params.yml'
+    params = read_params_from_yml(yml_file_path)
+
+
+
+    wrap_images_all = registration_demo(params['image_dir'],params['demo_image_path'], params['json_ref_path'], params['ref_image_path'])
+    for i, item in enumerate(wrap_images_all):
+
+        wrap_image,wrap_images_name = item
+        similarity_results, same_content_boxes = compare_boxes_similarity(params['path_to_image1'], wrap_image, params['json_file_path'],
+                                                                          params['similarity_threshold'])
+        # 打印所有坐标框的相似度结果
+        print(f"{wrap_images_name}\n")
+        for idx, score in enumerate(similarity_results, 1):
+            print(f"Similarity Score for Box {idx}: {score}")
+
+        # 打印被认为是相同内容的坐标框
+        print("Boxes with the same content:")
+        for shape in same_content_boxes:
+            print(shape['label'] + ' object is same as template')

+ 0 - 0
data/.keep


Файловите разлики са ограничени, защото са твърде много
+ 22 - 0
data/JSON/DSC_4604.json


Файловите разлики са ограничени, защото са твърде много
+ 30 - 0
data/JSON_MASK/DSC_4604_mask.json


BIN
data/QUERY/DSC_4575.JPG


BIN
data/QUERY/DSC_4576.JPG


BIN
data/QUERY/DSC_4577.JPG


BIN
data/QUERY/DSC_4579.JPG


BIN
data/QUERY/DSC_4581.JPG


BIN
data/QUERY/DSC_4582.JPG


BIN
data/QUERY/DSC_4585.JPG


BIN
data/QUERY/DSC_4586.JPG


BIN
data/QUERY/DSC_4587.JPG


BIN
data/QUERY/DSC_4588.JPG


BIN
data/QUERY/DSC_4590.JPG


BIN
data/QUERY/DSC_4591.JPG


BIN
data/QUERY/DSC_4594.JPG


BIN
data/QUERY/DSC_4596.JPG


BIN
data/QUERY/DSC_4597.JPG


BIN
data/QUERY/DSC_4599.JPG


BIN
data/QUERY/DSC_4600.JPG


BIN
data/QUERY/DSC_4602.JPG


BIN
data/QUERY/DSC_4603.JPG


BIN
data/REF/DSC_4604.JPG


BIN
data/demo_613/1_image_query/DSC_0474.JPG


BIN
data/demo_613/2_image_query/ADSC_0485.JPG


BIN
data/demo_613/2_image_query/DSC_0476.JPG


BIN
data/demo_613/2_image_query/DSC_0479.JPG


BIN
data/demo_613/2_image_query/DSC_0482.JPG


BIN
data/demo_613/2_image_query/DSC_0488.JPG


BIN
data/demo_613/2_image_query/DSC_0492.JPG


BIN
data/demo_613/3_image_query/ADSC_0480.JPG


BIN
data/demo_613/3_image_query/DSC_0477.JPG


BIN
data/demo_613/3_image_query/DSC_0483.JPG


BIN
data/demo_613/3_image_query/DSC_0486.JPG


BIN
data/demo_613/3_image_query/DSC_0489.JPG


BIN
data/demo_613/3_image_query/DSC_0493.JPG


Файловите разлики са ограничени, защото са твърде много
+ 262 - 0
data/demo_613/json/ADSC_0478.json


Файловите разлики са ограничени, защото са твърде много
+ 30 - 0
data/demo_613/json/ADSC_0478_mask.json


Файловите разлики са ограничени, защото са твърде много
+ 118 - 0
data/demo_613/json/ADSC_0480.json


Файловите разлики са ограничени, защото са твърде много
+ 30 - 0
data/demo_613/json/ADSC_0480_mask.json


Файловите разлики са ограничени, защото са твърде много
+ 182 - 0
data/demo_613/json/ADSC_0485.json


Файловите разлики са ограничени, защото са твърде много
+ 30 - 0
data/demo_613/json/ADSC_0485_mask.json


BIN
data/demo_613/ref_image/ADSC_0478.JPG


BIN
data/demo_613/ref_image/ADSC_0480.JPG


BIN
data/demo_613/ref_image/ADSC_0485.JPG


Файловите разлики са ограничени, защото са твърде много
+ 262 - 0
data/json/image165214-001.json


Файловите разлики са ограничени, защото са твърде много
+ 214 - 0
data/json/image165214-019.json


Файловите разлики са ограничени, защото са твърде много
+ 166 - 0
data/json/image165214-037.json


Файловите разлики са ограничени, защото са твърде много
+ 70 - 0
data/json1/DSC_0449.json


Файловите разлики са ограничени, защото са твърде много
+ 30 - 0
data/json1/DSC_0449_mask.json


Файловите разлики са ограничени, защото са твърде много
+ 70 - 0
data/json1/DSC_0453.json


Файловите разлики са ограничени, защото са твърде много
+ 30 - 0
data/json1/DSC_0453_mask.json


Файловите разлики са ограничени, защото са твърде много
+ 30 - 0
data/mask_json/image165214-001_mask.json


Файловите разлики са ограничени, защото са твърде много
+ 30 - 0
data/mask_json/image165214-019_mask.json


Файловите разлики са ограничени, защото са твърде много
+ 30 - 0
data/mask_json/image165214-037_mask.json


BIN
data/new/DSC_4531.JPG


BIN
data/new/DSC_4532.JPG


BIN
data/new/DSC_4533.JPG


BIN
data/new/DSC_4534.JPG


BIN
data/new/DSC_4535.JPG


BIN
data/new/DSC_4536.JPG


BIN
data/new/DSC_4537.JPG


BIN
data/new/DSC_4538.JPG


BIN
data/new/DSC_4539.JPG


BIN
data/new/DSC_4540.JPG


BIN
data/new/DSC_4541.JPG


BIN
data/new/DSC_4542.JPG


BIN
data/new/DSC_4543.JPG


BIN
data/new/DSC_4544.JPG


BIN
data/new/DSC_4545.JPG


BIN
data/new/DSC_4546.JPG


BIN
data/new/DSC_4547.JPG


BIN
data/new/DSC_4548.JPG


BIN
data/new/DSC_4549.JPG


BIN
data/new/DSC_4550.JPG


BIN
data/new/DSC_4551.JPG


BIN
data/new/DSC_4552.JPG


BIN
data/new_images/DSC_4527.JPG


BIN
data/new_images/DSC_4528.JPG


BIN
data/new_images/DSC_4529.JPG


BIN
data/new_images/DSC_4530.JPG


BIN
data/new_images/DSC_4531.JPG


BIN
data/new_images/DSC_4532.JPG


BIN
data/new_images/DSC_4533.JPG


BIN
data/new_images/DSC_4534.JPG


BIN
data/new_images/DSC_4535.JPG


BIN
data/new_images/DSC_4536.JPG


BIN
data/new_images/DSC_4537.JPG


BIN
data/new_images/DSC_4538.JPG


BIN
data/new_images/DSC_4539.JPG


BIN
data/new_images/DSC_4540.JPG


Някои файлове не бяха показани, защото твърде много файлове са промени