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. 二進制
      data/QUERY/DSC_4575.JPG
  14. 二進制
      data/QUERY/DSC_4576.JPG
  15. 二進制
      data/QUERY/DSC_4577.JPG
  16. 二進制
      data/QUERY/DSC_4579.JPG
  17. 二進制
      data/QUERY/DSC_4581.JPG
  18. 二進制
      data/QUERY/DSC_4582.JPG
  19. 二進制
      data/QUERY/DSC_4585.JPG
  20. 二進制
      data/QUERY/DSC_4586.JPG
  21. 二進制
      data/QUERY/DSC_4587.JPG
  22. 二進制
      data/QUERY/DSC_4588.JPG
  23. 二進制
      data/QUERY/DSC_4590.JPG
  24. 二進制
      data/QUERY/DSC_4591.JPG
  25. 二進制
      data/QUERY/DSC_4594.JPG
  26. 二進制
      data/QUERY/DSC_4596.JPG
  27. 二進制
      data/QUERY/DSC_4597.JPG
  28. 二進制
      data/QUERY/DSC_4599.JPG
  29. 二進制
      data/QUERY/DSC_4600.JPG
  30. 二進制
      data/QUERY/DSC_4602.JPG
  31. 二進制
      data/QUERY/DSC_4603.JPG
  32. 二進制
      data/REF/DSC_4604.JPG
  33. 二進制
      data/demo_613/1_image_query/DSC_0474.JPG
  34. 二進制
      data/demo_613/2_image_query/ADSC_0485.JPG
  35. 二進制
      data/demo_613/2_image_query/DSC_0476.JPG
  36. 二進制
      data/demo_613/2_image_query/DSC_0479.JPG
  37. 二進制
      data/demo_613/2_image_query/DSC_0482.JPG
  38. 二進制
      data/demo_613/2_image_query/DSC_0488.JPG
  39. 二進制
      data/demo_613/2_image_query/DSC_0492.JPG
  40. 二進制
      data/demo_613/3_image_query/ADSC_0480.JPG
  41. 二進制
      data/demo_613/3_image_query/DSC_0477.JPG
  42. 二進制
      data/demo_613/3_image_query/DSC_0483.JPG
  43. 二進制
      data/demo_613/3_image_query/DSC_0486.JPG
  44. 二進制
      data/demo_613/3_image_query/DSC_0489.JPG
  45. 二進制
      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. 二進制
      data/demo_613/ref_image/ADSC_0478.JPG
  53. 二進制
      data/demo_613/ref_image/ADSC_0480.JPG
  54. 二進制
      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. 二進制
      data/new/DSC_4531.JPG
  66. 二進制
      data/new/DSC_4532.JPG
  67. 二進制
      data/new/DSC_4533.JPG
  68. 二進制
      data/new/DSC_4534.JPG
  69. 二進制
      data/new/DSC_4535.JPG
  70. 二進制
      data/new/DSC_4536.JPG
  71. 二進制
      data/new/DSC_4537.JPG
  72. 二進制
      data/new/DSC_4538.JPG
  73. 二進制
      data/new/DSC_4539.JPG
  74. 二進制
      data/new/DSC_4540.JPG
  75. 二進制
      data/new/DSC_4541.JPG
  76. 二進制
      data/new/DSC_4542.JPG
  77. 二進制
      data/new/DSC_4543.JPG
  78. 二進制
      data/new/DSC_4544.JPG
  79. 二進制
      data/new/DSC_4545.JPG
  80. 二進制
      data/new/DSC_4546.JPG
  81. 二進制
      data/new/DSC_4547.JPG
  82. 二進制
      data/new/DSC_4548.JPG
  83. 二進制
      data/new/DSC_4549.JPG
  84. 二進制
      data/new/DSC_4550.JPG
  85. 二進制
      data/new/DSC_4551.JPG
  86. 二進制
      data/new/DSC_4552.JPG
  87. 二進制
      data/new_images/DSC_4527.JPG
  88. 二進制
      data/new_images/DSC_4528.JPG
  89. 二進制
      data/new_images/DSC_4529.JPG
  90. 二進制
      data/new_images/DSC_4530.JPG
  91. 二進制
      data/new_images/DSC_4531.JPG
  92. 二進制
      data/new_images/DSC_4532.JPG
  93. 二進制
      data/new_images/DSC_4533.JPG
  94. 二進制
      data/new_images/DSC_4534.JPG
  95. 二進制
      data/new_images/DSC_4535.JPG
  96. 二進制
      data/new_images/DSC_4536.JPG
  97. 二進制
      data/new_images/DSC_4537.JPG
  98. 二進制
      data/new_images/DSC_4538.JPG
  99. 二進制
      data/new_images/DSC_4539.JPG
  100. 二進制
      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


二進制
data/QUERY/DSC_4575.JPG


二進制
data/QUERY/DSC_4576.JPG


二進制
data/QUERY/DSC_4577.JPG


二進制
data/QUERY/DSC_4579.JPG


二進制
data/QUERY/DSC_4581.JPG


二進制
data/QUERY/DSC_4582.JPG


二進制
data/QUERY/DSC_4585.JPG


二進制
data/QUERY/DSC_4586.JPG


二進制
data/QUERY/DSC_4587.JPG


二進制
data/QUERY/DSC_4588.JPG


二進制
data/QUERY/DSC_4590.JPG


二進制
data/QUERY/DSC_4591.JPG


二進制
data/QUERY/DSC_4594.JPG


二進制
data/QUERY/DSC_4596.JPG


二進制
data/QUERY/DSC_4597.JPG


二進制
data/QUERY/DSC_4599.JPG


二進制
data/QUERY/DSC_4600.JPG


二進制
data/QUERY/DSC_4602.JPG


二進制
data/QUERY/DSC_4603.JPG


二進制
data/REF/DSC_4604.JPG


二進制
data/demo_613/1_image_query/DSC_0474.JPG


二進制
data/demo_613/2_image_query/ADSC_0485.JPG


二進制
data/demo_613/2_image_query/DSC_0476.JPG


二進制
data/demo_613/2_image_query/DSC_0479.JPG


二進制
data/demo_613/2_image_query/DSC_0482.JPG


二進制
data/demo_613/2_image_query/DSC_0488.JPG


二進制
data/demo_613/2_image_query/DSC_0492.JPG


二進制
data/demo_613/3_image_query/ADSC_0480.JPG


二進制
data/demo_613/3_image_query/DSC_0477.JPG


二進制
data/demo_613/3_image_query/DSC_0483.JPG


二進制
data/demo_613/3_image_query/DSC_0486.JPG


二進制
data/demo_613/3_image_query/DSC_0489.JPG


二進制
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


二進制
data/demo_613/ref_image/ADSC_0478.JPG


二進制
data/demo_613/ref_image/ADSC_0480.JPG


二進制
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


二進制
data/new/DSC_4531.JPG


二進制
data/new/DSC_4532.JPG


二進制
data/new/DSC_4533.JPG


二進制
data/new/DSC_4534.JPG


二進制
data/new/DSC_4535.JPG


二進制
data/new/DSC_4536.JPG


二進制
data/new/DSC_4537.JPG


二進制
data/new/DSC_4538.JPG


二進制
data/new/DSC_4539.JPG


二進制
data/new/DSC_4540.JPG


二進制
data/new/DSC_4541.JPG


二進制
data/new/DSC_4542.JPG


二進制
data/new/DSC_4543.JPG


二進制
data/new/DSC_4544.JPG


二進制
data/new/DSC_4545.JPG


二進制
data/new/DSC_4546.JPG


二進制
data/new/DSC_4547.JPG


二進制
data/new/DSC_4548.JPG


二進制
data/new/DSC_4549.JPG


二進制
data/new/DSC_4550.JPG


二進制
data/new/DSC_4551.JPG


二進制
data/new/DSC_4552.JPG


二進制
data/new_images/DSC_4527.JPG


二進制
data/new_images/DSC_4528.JPG


二進制
data/new_images/DSC_4529.JPG


二進制
data/new_images/DSC_4530.JPG


二進制
data/new_images/DSC_4531.JPG


二進制
data/new_images/DSC_4532.JPG


二進制
data/new_images/DSC_4533.JPG


二進制
data/new_images/DSC_4534.JPG


二進制
data/new_images/DSC_4535.JPG


二進制
data/new_images/DSC_4536.JPG


二進制
data/new_images/DSC_4537.JPG


二進制
data/new_images/DSC_4538.JPG


二進制
data/new_images/DSC_4539.JPG


二進制
data/new_images/DSC_4540.JPG


部分文件因文件數量過多而無法顯示