> For the complete documentation index, see [llms.txt](https://docs.roboflow.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.roboflow.com/datasets/ja/guan-li/manage-images.md).

# 画像を管理

## 概要

Roboflowでは、REST API と Python SDK を使って、プロジェクト内の個々の画像をアップロード、アノテーション、確認、タグ付け、削除できます。これらの操作は、バルクのデータセットアップロードフローより細かな制御が必要なときに使用してください。たとえば、ストリームから1枚ずつ画像をアップロードしたり、後からアノテーションを追加したり、画像のメタデータやタグを更新したりできます。ラベル付きデータセット全体を一度に一括インポートする場合は、次を参照してください [データセットをアップロード](/datasets/ja/toappurdo/upload-a-dataset.md).

## HTTP API

REST API では、画像とアノテーションのアップロード、画像詳細の取得、画像の削除、画像タグとメタデータの管理のための画像ごとの操作が提供されています。

### 画像をアップロード

REST API を使用して、ローカルファイルまたは URL から画像をアップロードします。

{% tabs %}
{% tab title="cURL" %}

#### パラメータ

API が受け付けるクエリ文字列パラメータ：

**api\_key**： <https://app.roboflow.com/account/api> から取得します\
**image**： \[オプション] 追加する画像の URL。画像が別の場所でホストされている場合に使用します（リクエスト本文で base64 エンコードされた画像を POST しない場合に必須）。\
**name**： \[オプション] 画像のファイル名（未設定の場合は推定を試みます）。\
**batch**： \[オプション] この名前のバッチで画像をグループ化します\
**tag**： \[オプション] 複数回指定できます。アップロードした画像にタグを追加します。\
**split**： \[オプション] train、valid、test のいずれか（既定は train）。\
**sequence\_number**： \[オプション] データセット内で画像の順序を保持したい場合、アップロードする画像に増加するシーケンス番号を付けられます。\
**sequence\_size**： \[オプション] シーケンス内の画像の総数。未設定の場合は 100,000 が既定です。\
**inference\_id**： \[オプション] roboflow の推論検出から返される inference ID。この inference\_id により、画像を Model Monitoring（エンタープライズ機能）内の roboflow の検出と関連付けられます。

#### Linux または macOS

次のローカルファイルをアップロードします `YOUR_IMAGE.jpg` multipart/form-data を使用します（推奨）：

```
curl -F name=YOUR_IMAGE.jpg -F split=train \
-F file=@YOUR_IMAGE.jpg \
"https://api.roboflow.com/dataset/YOUR_DATASET_NAME/upload?\
api_key=$ROBOFLOW_API_KEY"
```

代わりに、base64 エンコードされた画像をアップロードします：

```bash
base64 -i YOUR_IMAGE.jpg | curl -d @- \
"https://api.roboflow.com/dataset/your-dataset/upload?\
api_key=$ROBOFLOW_API_KEY&\
name=YOUR_IMAGE.jpg&\
split=train&\
batch=BATCH_NAME_FOR_UPLOAD"
```

URL を使用して Web 上でホストされている画像をアップロードします（忘れずに [URL エンコードしてください](https://www.urlencoder.org/)):

```bash
curl -X POST "https://api.roboflow.com/dataset/your-dataset/upload?\
api_key=$ROBOFLOW_API_KEY&\
image=https%3A%2F%2Fi.imgur.com%2FPEEvqPN.png&\
name=201-956-1246.png&\
split=train"
```

#### Windows

次のものをインストールする必要があります [Windows 用 curl](https://curl.se/windows/) と [Windows 用 GNU base64 ツール](http://gnuwin32.sourceforge.net/packages/coreutils.htm)。これを行う最も簡単な方法は、 [Git for Windows インストーラー](https://git-scm.com/downloads) を使用することです。これには次のものも含まれます： `curl` と `base64` インストール時に「Use Git and optional Unix tools from the Command Prompt」を選択すると、コマンドラインツールも含まれます。

その後は、上記と同じコマンドを使用できます。
{% endtab %}

{% tab title="JavaScript" %}

#### Node.js

この例では次のものを使用しています： [axios](https://github.com/axios/axios) と [form-data](https://github.com/form-data/form-data) この例で POST リクエストを実行するため、まず次を実行してください `npm install axios form-data` 依存関係をインストールします。

#### **multipart/form-data を使用してアップロードします（推奨）：**

```javascript
const axios = require("axios");
const fs = require("fs");
const FormData = require('form-data');

const formData = new FormData();
formData.append("name", "YOUR_IMAGE.jpg");
formData.append("file", fs.createReadStream("YOUR_IMAGE.jpg"));
formData.append("split", "train");

axios({
    method: "POST",
    url: "https://api.roboflow.com/dataset/YOUR_DATASET_NAME/upload",
    params: {
        api_key: "YOUR_API_KEY"
    },
    data: formData,
    headers: formData.getHeaders()
})
.then(function(response) {
    console.log(response.data);
})
.catch(function(error) {
    console.log(error.message);
});
```

#### **base64 エンコードされた画像を使用してアップロードします（非推奨）：**

```javascript
const axios = require("axios");
const fs = require("fs");

const image = fs.readFileSync("YOUR_IMAGE.jpg", {
    encoding: "base64"
});

axios({
    method: "POST",
    url: "https://api.roboflow.com/dataset/YOUR_DATASET_NAME/upload",
    params: {
        api_key: "YOUR_API_KEY",
        name: "YOUR_IMAGE.jpg",
        split: "train",
        batch: "YOUR_BATCH_NAME"
    },
    data: image,
    headers: {
        "Content-Type": "application/x-www-form-urlencoded"
    }
})
.then(function(response) {
    console.log(response.data);
})
.catch(function(error) {
    console.log(error.message);
});
```

**URL で他の場所にホストされている画像を追加する**

```javascript
const axios = require("axios");

axios({
    method: "POST",
    url: "https://api.roboflow.com/dataset/YOUR_DATASET_NAME/upload",
    params: {
        api_key: "YOUR_API_KEY",
        image: "https://i.imgur.com/PEEvqPN.png",
        name: "201-956-1246.png",
        split: "train"
    }
})
.then(function(response) {
    console.log(response.data);
})
.catch(function(error) {
    console.log(error.message);
});
```

#### Web

現在ベータテスト中です `roboflow.js`は、ブラウザベースの JavaScript ライブラリで、その機能のひとつとして、秘密の API キーを Web に公開せずに安全なクライアントサイドアップロードを含みます。早期アクセスをご希望の場合は、 [お問い合わせください](https://roboflow.com/contact).
{% endtab %}

{% tab title="Swift" %}

#### Swift

iOS 開発向けの Swift を使ったアップロードのサンプルです。

```swift
// 提供されたプロジェクトに画像をアップロードする
public func uploadImage(image: UIImage, project: String, completion: @escaping (UploadResult)->()) {
    let encodedImage = convertImageToBase64String(img: image)
    let uuid = UUID().uuidString
    
    var request = URLRequest(url: URL(string: "https://api.roboflow.com/dataset/\(project)/upload?api_key=\(apiKey!)&name=\(uuid)&split=train")!,timeoutInterval: Double.infinity)

    request.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
    request.httpMethod = "POST"
    request.httpBody = encodedImage.toData()
    
    URLSession.shared.dataTask(with: request) { data, response, error in
        // レスポンスを文字列として解析
        guard let data = data else {
            completion(UploadResult.Error)
            return
        }

        do {
            let dict = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any]
            let duplicate = dict!["duplicate"] as? Bool
            
            if duplicate ==  true {
                completion(UploadResult.Duplicate)
            } else {
                let success = dict!["success"] as! Bool
                if success == true {
                    completion(UploadResult.Success)
                } else {
                    completion(UploadResult.Error)
                }
            }

        } catch {
            print(error.localizedDescription)
            completion(UploadResult.Error)
        }
    }.resume()
}

func convertImageToBase64String (img: UIImage) -> String {
    return img.jpegData(compressionQuality: 1)?.base64EncodedString() ?? ""
}
```

}
{% endtab %}
{% endtabs %}

{% tabs %}
{% tab title="Android & Java" %}

#### Kotlin

#### **base64 エンコードされた画像を使用してアップロードします：**

```kotlin
import java.io.*
import java.net.HttpURLConnection
import java.net.URL
import java.nio.charset.StandardCharsets
import java.util.*

fun main() {
    // 画像のパスを取得
    val filePath = System.getProperty("user.dir") + System.getProperty("file.separator") + "YOUR_IMAGE.jpg"
    val file = File(filePath)

    // Base64 でエンコード
    val encodedFile: String
    val fileInputStreamReader = FileInputStream(file)
    val bytes = ByteArray(file.length().toInt())
    fileInputStreamReader.read(bytes)
    encodedFile = String(Base64.getEncoder().encode(bytes), StandardCharsets.US_ASCII)
    val API_KEY = "" // API キー
    val DATASET_NAME = "your-dataset" // データセット名を設定（データセット URL で確認できます）

    // URL を構築
    val uploadURL = "https://api.roboflow.com/dataset/" +
            DATASET_NAME + "/upload" +
            "?api_key=" + API_KEY +
            "&name=YOUR_IMAGE.jpg" +
            "&split=train"

    // HTTP リクエスト
    var connection: HttpURLConnection? = null
    try {
        // URL への接続を設定
        val url = URL(uploadURL)
        connection = url.openConnection() as HttpURLConnection
        connection.requestMethod = "POST"
        connection.setRequestProperty("Content-Type",
                "application/x-www-form-urlencoded")
        connection.setRequestProperty("Content-Length",
                Integer.toString(encodedFile.toByteArray().size))
        connection.setRequestProperty("Content-Language", "en-US")
        connection.useCaches = false
        connection.doOutput = true

        // リクエストを送信
        val wr = DataOutputStream(
                connection.outputStream)
        wr.writeBytes(encodedFile)
        wr.close()

        // レスポンスを取得
        val stream = connection.inputStream
        val reader = BufferedReader(InputStreamReader(stream))
        var line: String?
        while (reader.readLine().also { line = it } != null) {
            println(line)
        }
        reader.close()
    } catch (e: Exception) {
        e.printStackTrace()
    } finally {
        connection?.disconnect()
    }
}
main()
```

**URL で他の場所にホストされている画像を追加します：**

```kotlin
import java.io.BufferedReader
import java.io.DataOutputStream
import java.io.InputStreamReader
import java.net.HttpURLConnection
import java.net.URL
import java.net.URLEncoder
import java.nio.charset.StandardCharsets

fun main() {
    val imageURL = "https://i.imgur.com/PEEvqPN.png" // 画像の URL を置き換えてください
    val API_KEY = "" // API キー
    val DATASET_NAME = "your-dataset" // データセット名を設定（データセット URL で確認できます）

    // アップロード URL
    val uploadURL = ("https://api.roboflow.com/dataset/" + DATASET_NAME + "/upload" + "?api_key=" + API_KEY
            + "&name=YOUR_IMAGE.jpg" + "&split=train" + "&image="
            + URLEncoder.encode(imageURL, "utf-8"))

    // HTTP リクエスト
    var connection: HttpURLConnection? = null
    try {
        // URL への接続を設定
        val url = URL(uploadURL)
        connection = url.openConnection() as HttpURLConnection
        connection.requestMethod = "POST"
        connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded")
        connection.setRequestProperty("Content-Length", Integer.toString(uploadURL.toByteArray().size))
        connection.setRequestProperty("Content-Language", "en-US")
        connection.useCaches = false
        connection.doOutput = true

        // リクエストを送信
        val wr = DataOutputStream(connection.outputStream)
        wr.writeBytes(uploadURL)
        wr.close()

        // レスポンスを取得
        val stream = connection.inputStream
        val reader = BufferedReader(InputStreamReader(stream))
        var line: String?
        while (reader.readLine().also { line = it } != null) {
            println(line)
        }
        reader.close()
    } catch (e: Exception) {
        e.printStackTrace()
    } finally {
        connection?.disconnect()
    }
}

main()
```

#### Android (Java)

#### **base64 エンコードされた画像を使用してアップロードします：**

```java
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.Base64;

public class UploadLocal {
    public static void main(String[] args) throws IOException {
        // 画像のパスを取得
        String filePath = System.getProperty("user.dir") + System.getProperty("file.separator") + "YOUR_IMAGE.jpg";
        File file = new File(filePath);

        // Base64 でエンコード
        String encodedFile;
        FileInputStream fileInputStreamReader = new FileInputStream(file);
        byte[] bytes = new byte[(int) file.length()];
        fileInputStreamReader.read(bytes);
        encodedFile = new String(Base64.getEncoder().encode(bytes), StandardCharsets.US_ASCII);

        String API_KEY = ""; // API キー
        String DATASET_NAME = "your-dataset"; // データセット名を設定（データセット URL で確認できます）

        // URL を構築
        String uploadURL =
                "https://api.roboflow.com/dataset/"+
                        DATASET_NAME + "/upload" +
                        "?api_key=" + API_KEY +
                        "&name=YOUR_IMAGE.jpg" +
                        "&split=train";

        // HTTP リクエスト
        HttpURLConnection connection = null;
        try {
            // URL への接続を設定
            URL url = new URL(uploadURL);
            connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("POST");
            connection.setRequestProperty("Content-Type",
                    "application/x-www-form-urlencoded");

            connection.setRequestProperty("Content-Length",
                    Integer.toString(encodedFile.getBytes().length));
            connection.setRequestProperty("Content-Language", "en-US");
            connection.setUseCaches(false);
            connection.setDoOutput(true);

            // リクエストを送信
            DataOutputStream wr = new DataOutputStream(
                    connection.getOutputStream());
            wr.writeBytes(encodedFile);
            wr.close();

            // レスポンスを取得
            InputStream stream = connection.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
            reader.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (connection != null) {
                connection.disconnect();
            }
        }
    }
}
```

**URL で他の場所にホストされている画像を追加します：**

```java
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;

public class UploadHosted {
    public static void main(String[] args) {
        String imageURL = "https://i.imgur.com/PEEvqPN.png"; // 画像の URL を置き換えてください
        String API_KEY = ""; // API キー
        String DATASET_NAME = "your-dataset"; // データセット名を設定（データセット URL で確認できます）

        // アップロード URL
        String uploadURL = "https://api.roboflow.com/dataset/" + DATASET_NAME + "/upload" + "?api_key=" + API_KEY
                + "&name=YOUR_IMAGE.jpg" + "&split=train" + "&image="
                + URLEncoder.encode(imageURL, StandardCharsets.UTF_8);

        // HTTP リクエスト
        HttpURLConnection connection = null;
        try {
            // URL への接続を設定
            URL url = new URL(uploadURL);
            connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("POST");
            connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");

            connection.setRequestProperty("Content-Length", Integer.toString(uploadURL.getBytes().length));
            connection.setRequestProperty("Content-Language", "en-US");
            connection.setUseCaches(false);
            connection.setDoOutput(true);

            // リクエストを送信
            DataOutputStream wr = new DataOutputStream(connection.getOutputStream());
            wr.writeBytes(uploadURL);
            wr.close();

            // レスポンスを取得
            InputStream stream = connection.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
            reader.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (connection != null) {
                connection.disconnect();
            }
        }
    }
}
```

{% endtab %}

{% tab title="Ruby" %}

#### **Ruby**

{% code title="Gemfile" %}

```ruby
source "https://rubygems.org"

gem "httparty", "~> 0.18.1"
gem "base64", "~> 0.1.0"
gem "cgi", "~> 0.2.1"
```

{% endcode %}

{% code title="Gemfile.lock" %}

```ruby
GEM
  remote: https://rubygems.org/
  specs:
    base64 (0.1.0)
    cgi (0.2.1)
    httparty (0.18.1)
      mime-types (~> 3.0)
      multi_xml (>= 0.5.2)
    mime-types (3.3.1)
      mime-types-data (~> 3.2015)
    mime-types-data (3.2021.0225)
    multi_xml (0.6.0)

PLATFORMS
  x64-mingw32
  x86_64-linux

DEPENDENCIES
  base64 (~> 0.1.0)
  cgi (~> 0.2.1)
  httparty (~> 0.18.1)

BUNDLED WITH
   2.2.15
```

{% endcode %}

#### **base64 エンコードされた画像を使用してアップロードします：**

```ruby
require 'base64'
require 'httparty'

encoded = Base64.encode64(File.open("YOUR_IMAGE.jpg", "rb").read)
dataset_name = "your-dataset" # データセット名を設定（データセット URL で確認できます）
api_key = "" # API キーはこちら

params = "?api_key=" + api_key + 
"&name=YOUR_IMAGE.jpg" + 
"&split=train"

response = HTTParty.post(
    "https://api.roboflow.com/dataset/" + dataset_name + "/upload" + params,
    body: encoded, 
    headers: {
    'Content-Type' => 'application/x-www-form-urlencoded',
    'charset' => 'utf-8'
  })

  puts response

 
```

**URL で他の場所にホストされている画像を追加します：**

```ruby
require 'httparty'
require 'cgi'

dataset_name = "your-dataset" # データセット名を設定（データセット URL で確認できます）
api_key = "" # API キーはこちら
img_url = "https://i.imgur.com/PEEvqPN.png" # URL を構築

img_url = CGI::escape(img_url)

params = "?api_key=" + api_key + 
"&name=YOUR_IMAGE.jpg" + 
"&split=train" +
"&image=" + img_url

response = HTTParty.post(
    "https://api.roboflow.com/dataset/" + dataset_name + "/upload" + params,
    headers: {
    'Content-Type' => 'application/x-www-form-urlencoded',
    'charset' => 'utf-8'
  })

puts response
```

{% endtab %}

{% tab title="PHP" %}

#### **PHP**

#### **base64 エンコードされた画像を使用してアップロードします：**

```php
<?php

// 画像をBase64エンコード
$data = base64_encode(file_get_contents("YOUR_IMAGE.jpg"));

$api_key = ""; // APIキーを設定
$dataset_name = "your-dataset"; // データセット名を設定（データセットURLにあります）

// HTTPリクエスト用のURL
$url = "https://api.roboflow.com/dataset/" 
. $dataset_name .  "/upload" 
.  "?api_key="  .  $api_key  
.  "&name=YOUR_IMAGE.jpg" 
. "&split=train";

// セットアップ + HTTPリクエストを送信
$options = array(
  'http' => array (
    'header' => "Content-type: application/x-www-form-urlencoded\r\n",
    'method'  => 'POST',
    'content' => $data
  ));

$context  = stream_context_create($options);
$result = file_get_contents($url, false, $context);
echo $result;
?>
```

**URL で他の場所にホストされている画像を追加します：**

```php
<?php

$api_key = ""; // APIキーを設定
$dataset_name = "your-dataset"; // データセット名を設定（データセットURLにあります）
$img_url = "https://i.imgur.com/PEEvqPN.png";

// HTTPリクエスト用のURL
$url = "https://api.roboflow.com/dataset/" 
. $dataset_name .  "/upload" 
.  "?api_key="  .  $api_key  
.  "&name=YOUR_IMAGE.jpg" 
. "&split=train" 
. "&image=" . urlencode($img_url);

// セットアップ + HTTPリクエストを送信
$options = array(
  'http' => array (
    'header' => "Content-type: application/x-www-form-urlencoded\r\n",
    'method'  => 'POST'
  ));

$context  = stream_context_create($options);
$result = file_get_contents($url, false, $context);
echo $result;
?>
```

{% endtab %}

{% tab title="Go" %}

#### **Go**

#### **base64 エンコードされた画像を使用してアップロードします：**

```go
package main

import (
    "bufio"
    "encoding/base64"
    "fmt"
    "io/ioutil"
    "os"
	"net/http"
	"strings"
)

func main() {
	api_key := ""  // APIキー
	dataset_name := "Your-Dataset" // データセット名を設定（データセットURLにあります）

    // ディスク上のファイルを開く。
    f, _ := os.Open("YOUR_IMAGE.jpg")

    // JPG全体をバイトスライスとして読み取る。
    reader := bufio.NewReader(f)
    content, _ := ioutil.ReadAll(reader)

    // base64としてエンコードする。
    data := base64.StdEncoding.EncodeToString(content)
	uploadURL := "https://api.roboflow.com/dataset/"+ dataset_name + "/upload"+
    "?api_key=" + api_key +
    "&name=YOUR_IMAGE.jpg" +
    "&split=train"

	res, _ := http.Post(uploadURL, "application/x-www-form-urlencoded", strings.NewReader(data))
    body, _ := ioutil.ReadAll(res.Body)
	fmt.Println(string(body))

}
```

**URL で他の場所にホストされている画像を追加します：**

```go
package main

import (
    "fmt"
	"net/http"
	"net/url"
	"io/ioutil"

)

func main() {
	api_key := ""  // APIキー
	dataset_name := "Your-Dataset" // データセット名を設定（データセットURLにあります）
	img_url := "https://i.imgur.com/PEEvqPN.png"


	uploadURL := "https://api.roboflow.com/dataset/"+ dataset_name + "/upload"+
    "?api_key=" + api_key +
    "&name=YOUR_IMAGE.jpg" +
    "&split=train" + "&image=" + url.QueryEscape(img_url)

	res, _ := http.Post(uploadURL, "application/x-www-form-urlencoded", nil)
	body, _ := ioutil.ReadAll(res.Body)
    fmt.Println(string(body))


}
```

{% endtab %}

{% tab title=".NET" %}

#### **.NET**

#### **base64 エンコードされた画像を使用してアップロードします：**

```csharp
using System;
using System.IO;
using System.Net;
using System.Text;

namespace UploadLocal
{
    class UploadLocal
    {

        static void Main(string[] args)
        {
            byte[] imageArray = System.IO.File.ReadAllBytes(@"YOUR_IMAGE.jpg");
            string encoded = Convert.ToBase64String(imageArray);
            byte[] data = Encoding.ASCII.GetBytes(encoded);
            string API_KEY = ""; // APIキー
            string DATASET_NAME = "your-dataset"; // データセット名を設定（データセットURLにあります）

            // URL を構築
            string uploadURL =
                    "https://api.roboflow.com/dataset/" +
                            DATASET_NAME + "/upload" +
                            "?api_key=" + API_KEY +
                            "&name=YOUR_IMAGE.jpg" +
                            "&split=train";

            // サービスリクエスト設定
            ServicePointManager.Expect100Continue = true;
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

            // リクエストを構成
            WebRequest request = WebRequest.Create(uploadURL);
            request.Method = "POST";
            request.ContentType = "application/x-www-form-urlencoded";
            request.ContentLength = data.Length;

            // データを書き込む
            using (Stream stream = request.GetRequestStream())
            {
                stream.Write(data, 0, data.Length);
            }

            // レスポンスを取得
            string responseContent = null;
            using (WebResponse response = request.GetResponse())
            {
                using (Stream stream = response.GetResponseStream())
                {
                    using (StreamReader sr99 = new StreamReader(stream))
                    {
                        responseContent = sr99.ReadToEnd();
                    }
                }
            }

            Console.WriteLine(responseContent);

        }
    }
}
```

**URL で他の場所にホストされている画像を追加します：**

```csharp
using System;
using System.IO;
using System.Net;
using System.Web;

namespace UploadHosted
{
    class UploadHosted
    {
        static void Main(string[] args)
        {
            string API_KEY = ""; // APIキー
            string DATASET_NAME = "your-dataset"; // データセット名を設定（データセットURLにあります）
            string imageURL = "https://i.imgur.com/PEEvqPN.png";
            imageURL = HttpUtility.UrlEncode(imageURL);

            // URL を構築
            string uploadURL =
                    "https://api.roboflow.com/dataset/" +
                            DATASET_NAME + "/upload" +
                            "?api_key=" + API_KEY +
                            "&name=YOUR_IMAGE.jpg" +
                            "&split=train" +
                            "&image=" + imageURL;

            // サービスポイント設定
            ServicePointManager.Expect100Continue = true;
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

            // HTTPリクエストを構成
            WebRequest request = WebRequest.Create(uploadURL);
            request.Method = "POST";
            request.ContentType = "application/x-www-form-urlencoded";
            request.ContentLength = 0;

            // レスポンスを取得
            string responseContent = null;
            using (WebResponse response = request.GetResponse())
            {
                using (Stream stream = response.GetResponseStream())
                {
                    using (StreamReader sr99 = new StreamReader(stream))
                    {
                        responseContent = sr99.ReadToEnd();
                    }
                }
            }

            Console.WriteLine(responseContent);

        }
    }
}
```

{% endtab %}
{% endtabs %}

#### Roboflowでアップロード済み画像を表示

API経由でアップロードされた画像は、以下にあります `アノテーション` タブの、 `未割り当て` 列にあり、 `API経由でアップロード済み`.

〜を指定すると、 `batch` アップロードパラメータを指定しても、画像は引き続き `アノテーション` タブにありますが、 `API経由でアップロード済み` バッチに入る代わりに、指定したバッチに入ります。

### アノテーションをアップロード

既存のアノテーションが画像と一緒にある場合、それらをRoboflowにアップロードできます。

{% hint style="success" %}
これは以下のいずれにも対応します [サポートされているアノテーション形式](http://roboflow.com/formats) アップロードした画像のファイル名を参照するアノテーションファイルを使用するものです。
{% endhint %}

{% hint style="info" %}
ご存知でしたか？ APIを使わずに、アプリのアップロードページで画像と一緒にアノテーションファイルをドラッグ＆ドロップ（または選択）できます。
{% endhint %}

{% tabs %}
{% tab title="cURL" %}

#### 例

〜を添付する [VOC XMLアノテーション](https://roboflow.com/formats/pascal-voc-xml) IDを持つ画像に `abc123` の `your-dataset` というデータセットに `YOUR_ANNOTATION.xml`:

```bash
cat YOUR_ANNOTATION.xml | curl -d @- \
"https://api.roboflow.com/dataset/your-dataset/annotate/abc123?\
api_key=YOUR_KEY&\
name=YOUR_ANNOTATION.xml"
```

〜を添付する [Darknet TXTアノテーション](https://roboflow.com/formats/yolo-darknet-txt) IDを持つ画像に `abc123` の `your-dataset` というデータセットに `YOUR_ANNOTATION.txt` JSONのラベルマップを使用します。この場合、アノテーションファイルの内容を、そのまま本文として送るのではなくJSONで送る必要があります。

```bash
#!/bin/bash
# アノテーションをJSON互換の文字列として保存する
txt_content=$(cat YOUR_ANNOTATION.txt | sed 's/\\/\\\\/g; s/"/\\"/g; s/$/\\n/' | tr -d '\n')
# アノテーションファイルとラベルマップ [0=flower, 1=leaf] を含むJSON文字列を作成する
json_payload="{ \"annotationFile\": \"$txt_content\", \"labelmap\":{\"0\":\"flower\", \"1\":\"leaf\"} }"

# アノテーション + ラベルマップをアップロードする
echo $json_payload | curl -H "Content-Type: application/json" -d @- \
"https://api.roboflow.com/dataset/cultura-pepino-dark/annotate/abc123?\
api_key=YOUR_KEY&\
name=YOUR_ANNOTATION.txt"
```

{% endtab %}

{% tab title="JavaScript" %}
この例では次のものを使用しています： [axios](https://github.com/axios/axios) この例で POST リクエストを実行するため、まず次を実行してください `npm install axios` 依存関係をインストールします。

**ローカル画像のアップロード**

```javascript
const axios = require("axios");
const fs = require("fs");

const filename = "YOUR_ANNOTATION.xml";
const annotation = fs.readFileSync(filename, "utf-8");

axios({
    method: "POST",
    url: "https://api.roboflow.com/dataset/your-dataset/annotate/abc123",
    params: {
        api_key: "YOUR_KEY",
        name: filename
    },
    data: annotation,
    headers: {
        "Content-Type": "text/plain"
    }
})
.then(function(response) {
    console.log(response.data);
})
.catch(function(error) {
    console.log(error.message);
});
```

{% endtab %}

{% tab title="Android と Java" %}

#### Kotlin

#### **base64 エンコードされた画像を使用してアップロードします：**

```kotlin
import java.io.*
import java.net.HttpURLConnection
import java.net.URL
import java.nio.charset.StandardCharsets
import java.util.*

fun main() {
    // 画像のパスを取得
    val filePath = System.getProperty("user.dir") + System.getProperty("file.separator") + "YOUR_IMAGE.jpg"
    val file = File(filePath)

    // Base64 でエンコード
    val encodedFile: String
    val fileInputStreamReader = FileInputStream(file)
    val bytes = ByteArray(file.length().toInt())
    fileInputStreamReader.read(bytes)
    encodedFile = String(Base64.getEncoder().encode(bytes), StandardCharsets.US_ASCII)
    val API_KEY = "" // API キー
    val DATASET_NAME = "your-dataset" // データセット名を設定（データセット URL で確認できます）

    // URL を構築
    val uploadURL = "https://api.roboflow.com/dataset/" +
            DATASET_NAME + "/upload" +
            "?api_key=" + API_KEY +
            "&name=YOUR_IMAGE.jpg" +
            "&split=train"

    // HTTP リクエスト
    var connection: HttpURLConnection? = null
    try {
        // URL への接続を設定
        val url = URL(uploadURL)
        connection = url.openConnection() as HttpURLConnection
        connection.requestMethod = "POST"
        connection.setRequestProperty("Content-Type",
                "application/x-www-form-urlencoded")
        connection.setRequestProperty("Content-Length",
                Integer.toString(encodedFile.toByteArray().size))
        connection.setRequestProperty("Content-Language", "en-US")
        connection.useCaches = false
        connection.doOutput = true

        // リクエストを送信
        val wr = DataOutputStream(
                connection.outputStream)
        wr.writeBytes(encodedFile)
        wr.close()

        // レスポンスを取得
        val stream = connection.inputStream
        val reader = BufferedReader(InputStreamReader(stream))
        var line: String?
        while (reader.readLine().also { line = it } != null) {
            println(line)
        }
        reader.close()
    } catch (e: Exception) {
        e.printStackTrace()
    } finally {
        connection?.disconnect()
    }
}
main()
```

**URL で他の場所にホストされている画像を追加します：**

```kotlin
import java.io.BufferedReader
import java.io.DataOutputStream
import java.io.InputStreamReader
import java.net.HttpURLConnection
import java.net.URL
import java.net.URLEncoder
import java.nio.charset.StandardCharsets

fun main() {
    val imageURL = "https://i.imgur.com/PEEvqPN.png" // 画像の URL を置き換えてください
    val API_KEY = "" // API キー
    val DATASET_NAME = "your-dataset" // データセット名を設定（データセット URL で確認できます）

    // アップロード URL
    val uploadURL = ("https://api.roboflow.com/dataset/" + DATASET_NAME + "/upload" + "?api_key=" + API_KEY
            + "&name=YOUR_IMAGE.jpg" + "&split=train" + "&image="
            + URLEncoder.encode(imageURL, "utf-8"))

    // HTTP リクエスト
    var connection: HttpURLConnection? = null
    try {
        // URL への接続を設定
        val url = URL(uploadURL)
        connection = url.openConnection() as HttpURLConnection
        connection.requestMethod = "POST"
        connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded")
        connection.setRequestProperty("Content-Length", Integer.toString(uploadURL.toByteArray().size))
        connection.setRequestProperty("Content-Language", "en-US")
        connection.useCaches = false
        connection.doOutput = true

        // リクエストを送信
        val wr = DataOutputStream(connection.outputStream)
        wr.writeBytes(uploadURL)
        wr.close()

        // レスポンスを取得
        val stream = connection.inputStream
        val reader = BufferedReader(InputStreamReader(stream))
        var line: String?
        while (reader.readLine().also { line = it } != null) {
            println(line)
        }
        reader.close()
    } catch (e: Exception) {
        e.printStackTrace()
    } finally {
        connection?.disconnect()
    }
}

main()
```

#### Android (Java)

#### **base64 エンコードされた画像を使用してアップロードします：**

```java
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.Base64;

public class UploadLocal {
    public static void main(String[] args) throws IOException {
        // 画像のパスを取得
        String filePath = System.getProperty("user.dir") + System.getProperty("file.separator") + "YOUR_IMAGE.jpg";
        File file = new File(filePath);

        // Base64 でエンコード
        String encodedFile;
        FileInputStream fileInputStreamReader = new FileInputStream(file);
        byte[] bytes = new byte[(int) file.length()];
        fileInputStreamReader.read(bytes);
        encodedFile = new String(Base64.getEncoder().encode(bytes), StandardCharsets.US_ASCII);

        String API_KEY = ""; // API キー
        String DATASET_NAME = "your-dataset"; // データセット名を設定（データセット URL で確認できます）

        // URL を構築
        String uploadURL =
                "https://api.roboflow.com/dataset/"+
                        DATASET_NAME + "/upload" +
                        "?api_key=" + API_KEY +
                        "&name=YOUR_IMAGE.jpg" +
                        "&split=train";

        // HTTP リクエスト
        HttpURLConnection connection = null;
        try {
            // URL への接続を設定
            URL url = new URL(uploadURL);
            connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("POST");
            connection.setRequestProperty("Content-Type",
                    "application/x-www-form-urlencoded");

            connection.setRequestProperty("Content-Length",
                    Integer.toString(encodedFile.getBytes().length));
            connection.setRequestProperty("Content-Language", "en-US");
            connection.setUseCaches(false);
            connection.setDoOutput(true);

            // リクエストを送信
            DataOutputStream wr = new DataOutputStream(
                    connection.getOutputStream());
            wr.writeBytes(encodedFile);
            wr.close();

            // レスポンスを取得
            InputStream stream = connection.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
            reader.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (connection != null) {
                connection.disconnect();
            }
        }
    }
}
```

**URL で他の場所にホストされている画像を追加します：**

```java
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;

public class UploadHosted {
    public static void main(String[] args) {
        String imageURL = "https://i.imgur.com/PEEvqPN.png"; // 画像の URL を置き換えてください
        String API_KEY = ""; // API キー
        String DATASET_NAME = "your-dataset"; // データセット名を設定（データセット URL で確認できます）

        // アップロード URL
        String uploadURL = "https://api.roboflow.com/dataset/" + DATASET_NAME + "/upload" + "?api_key=" + API_KEY
                + "&name=YOUR_IMAGE.jpg" + "&split=train" + "&image="
                + URLEncoder.encode(imageURL, StandardCharsets.UTF_8);

        // HTTP リクエスト
        HttpURLConnection connection = null;
        try {
            // URL への接続を設定
            URL url = new URL(uploadURL);
            connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("POST");
            connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");

            connection.setRequestProperty("Content-Length", Integer.toString(uploadURL.getBytes().length));
            connection.setRequestProperty("Content-Language", "en-US");
            connection.setUseCaches(false);
            connection.setDoOutput(true);

            // リクエストを送信
            DataOutputStream wr = new DataOutputStream(connection.getOutputStream());
            wr.writeBytes(uploadURL);
            wr.close();

            // レスポンスを取得
            InputStream stream = connection.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
            reader.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (connection != null) {
                connection.disconnect();
            }
        }
    }
}
```

{% endtab %}
{% endtabs %}

### 画像の詳細を取得する

REST APIを使って特定の画像の詳細を取得できます。

特定の画像の詳細を取得するには、以下のAPIエンドポイントにGETリクエストを送信します。

```url
https://api.roboflow.com/:workspace/:project/images/:image_id
```

画像の詳細を取得するためのAPIへのリクエスト例です

```bash
curl -X GET "https://api.roboflow.com/my-workspace/my-project-name/images/image-id?api_key=$ROBOFLOW_API_KEY" \
-H 'Content-Type: application/json'
```

このエンドポイントは、画像に関する以下の情報を含むJSONオブジェクトを返します:

```typescript
{
    "image":
        "id": string,
        "name": string,
        "annotation": {
            "key": string,
            "width": number,
            "height": number,
            "boxes": Array<{
                "label": string,
                "x": number,
                "y": number,
                "width": number,
                "height": number
            }>
        },
        "labels": string[],
        "split": string,
        "tags": string[],
        "created": number,
        "urls": {
            "original": string,
            "thumb": string,
            "annotation": string
        },
        "embedding": number[]
    }
}
```

### データセットから画像を削除する

REST APIを使ってデータセットから画像を削除できます。

{% tabs %}
{% tab title="REST API" %}
データセットから画像を削除するには、以下のAPIエンドポイントにDELETEリクエストを送信し、エンドポイントに画像IDを指定します。

```url
https://api.roboflow.com/:workspace/:project/images
```

画像を削除するためのAPIへのリクエスト例です

```bash
curl "https://api.roboflow.com/my-workspace/my-project/images?api_key=$ROBOFLOW_API_KEY" \
  -X DELETE \
  -H "Content-Type: application/json" \
  -d '{"images": ["1", "2"]}'
```

操作が成功した場合、このエンドポイントは204ステータスを返します。
{% endtab %}
{% endtabs %}

### 画像タグの一覧表示・追加・削除

REST APIを使ってRoboflow上の特定の画像にタグを割り当てることができます

{% tabs %}
{% tab title="REST API" %}
Roboflowでホストされている画像にタグを追加・削除・設定するには、以下のAPIエンドポイントにPOSTリクエストを送信します。画像名に対応する画像IDを取得するにはSearch APIを使用してください:

```url
https://api.roboflow.com/:workspace/:project/images/:image_id/tags
```

APIへのリクエスト例です（タグの"add"、"remove"、"set"が可能です）:

```bash
curl -X POST "https://api.roboflow.com/my-workspace/my-project-name/images/image-id/tags?api_key=$ROBOFLOW_API_KEY" \
-H 'Content-Type: application/json' \\
--data \\
'{
    "operation": "add",
    "tags": "image_tag_test"
}'
```

このエンドポイントは、POST ボディに次の値を受け付けます:

```json
{
     // // オプションは ["add", "remove", "set"] です
     "operation": string,
     
     // タグの文字列配列
     "tags": string[],
     
}
```

APIはRoboflow内の指定した画像にタグを追加します（POSTリクエストには画像名ではなく画像IDを渡すことを忘れないでください）。
{% endtab %}
{% endtabs %}

### 画像メタデータとタグを更新する

REST APIを使って、ワークスペース内の画像にカスタムメタデータとタグを書き込めます。エンドポイントは2つあります。1つは単一画像を同期的に更新するもので、もう1つは最大1,000枚の画像をバッチで更新するものです。

両方のエンドポイントには、 `image:tag` スコープ。

#### リクエストボディ

両方のエンドポイントは同じフィールドを受け付けます（バッチエンドポイントではそれらを `updates` 配列にまとめます):

```
- imageId（文字列）- 本文でのバッチ更新では必須、単一更新ではパスから推定されます
- metadata（オブジェクト）- 画像のユーザーメタデータに設定するキーと値のペア。
- removeMetadata（文字列[]）- 画像から削除するメタデータキー。
- addTags（文字列[]）- 画像に追加するタグ。
- removeTags（文字列[]）- 画像から削除するタグ。
```

これらのフィールドのうち少なくとも1つを含める必要があります。同じリクエスト内で同じメタデータキーやタグを設定と削除の両方に使うことはできません。

#### 単一画像

単一画像のメタデータとタグを更新します。

```
POST https://api.roboflow.com/:workspace/images/:image/metadata?api_key=YOUR_API_KEY
```

**例**

```bash
curl -X POST "https://api.roboflow.com/my-workspace/images/abc123/metadata?api_key=$ROBOFLOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "metadata": { "camera": "front", "blur_score": 0.8 },
    "addTags": ["reviewed"]
  }'
```

**応答**

```json
{
    "success": true
}
```

#### バッチ更新

複数画像のメタデータとタグを非同期に更新します。1リクエストあたり最大1,000枚の画像を受け付けます。

```
POST https://api.roboflow.com/:workspace/images/metadata?api_key=YOUR_API_KEY
```

**例**

```bash
curl -X POST "https://api.roboflow.com/my-workspace/images/metadata?api_key=$ROBOFLOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "updates": [
      {
        "imageId": "abc123",
        "metadata": { "camera": "front" },
        "addTags": ["reviewed"]
      },
      {
        "imageId": "def456",
        "removeTags": ["needs-review"]
      }
    ]
  }'
```

**応答**

返り値 `202` タスクID付きで返されます。進捗を確認するにはタスクURLをポーリングしてください。

```json
{
    "taskId": "task-id-here",
    "url": "https://api.roboflow.com/my-workspace/asynctasks/task-id-here"
}
```

参照 [非同期タスク](https://docs.roboflow.com/reference/platform/rest-api/async-tasks) タスク状態をポーリングする方法について。

#### エラー

```
- 400 - 空の本文、形式不正のフィールド型、または競合するフィールド（例: metadata と removeMetadata の両方に同じキーがある場合）。
- 404 - ワークスペース内に画像が見つかりません（単一画像エンドポイントのみ）。
```

## Python SDK

`プロジェクト` 一括処理を補完する、画像ごとの操作を [`upload_dataset`](/datasets/ja/toappurdo/upload-a-dataset.md#python-sdk) のフロー。単一画像アップロードをより細かく制御したい場合、後からアノテーションを付けたい場合、あるいはストリームから画像を1枚ずつ取り込む場合に使用します。

### 画像をアップロードする（任意でアノテーション付き）

`Project.upload()` は、高レベルの「適切に処理する」ヘルパーです。単一画像と任意の対応するアノテーションファイルを受け取り、両方を1回の呼び出しでプロジェクトに送信します。

```python
import roboflow

rf = roboflow.Roboflow(api_key="YOUR_API_KEY")
project = rf.workspace().project("my-detector")

result = project.upload(
    image_path="./photo.jpg",
    annotation_path="./photo.xml",   # optional; matched VOC / COCO / etc. annotation
    split="train",                    # train | valid | test
    batch_name="ingest-2026-05",     # optional; groups uploads in the web UI
    tag_names=["camera-A", "indoor"], # optional; apply tags
    is_prediction=False,              # レビュー待ちのモデル生成アノテーションの場合は True に設定
    num_retry_uploads=2,              # 一時的なアップロード失敗時に再試行
)
print(result)
```

`single_upload()` は、同じ引数を受け取り、画像と（指定されていれば）アノテーションの両方について生のAPI応答を返す低レベル版です。

### 画像のみをアップロードする

```python
project.upload_image(
    image_path="./photo.jpg",
    split="train",
    batch_name="ingest-2026-05",
    tag_names=["camera-A"],
)
```

アノテーションがまだ存在せず、画像がそのままラベラーに送られる場合に便利です。

### アップロード前に画像を検証する

`check_valid_image()` APIを呼び出さずに、Roboflowのローカルなサイズ／形式チェックを実行します:

```python
if project.check_valid_image("./photo.jpg"):
    project.upload_image("./photo.jpg")
```

### 既存の画像にアノテーションを添付する

`save_annotation()` すでにプロジェクト内にある画像に対してアノテーションを送信します。別の場所で作成したラベルを追加したり、モデルの予測を正解データに昇格させたりするのに便利です。

```python
project.save_annotation(
    image_id="<image-id>",
    annotation_path="./photo.xml",
    is_prediction=False,
    annotation_overwrite=True,    # 既存のアノテーションを置き換える
)
```

渡す `annotation_labelmap="./labelmap.yaml"` アノテーション形式で必要な場合、クラスインデックスをクラス名にマッピングするために。

### 画像のメタデータを取得する

```python
info = project.image("<image-id>")
print(info["name"], info["split"], info["annotations"] )
```

画像のメタデータ、現在の分割、アノテーションの状態を返します。

### 画像を削除する

プロジェクト単位（このプロジェクトに属する画像のみを削除）:

```python
project.delete_images(["<image-id-1>", "<image-id-2>"])
```

ワークスペース単位（どのプロジェクトが参照しているかに関係なく画像を削除します - 注意して使用してください）:

```python
workspace.delete_images(["<image-id-1>", "<image-id-2>"])
```

### v1.3.6以降のアップロードに関する注意

〜の時点で `roboflow` 1.3.6では、SDKはPillowで再エンコードするのではなく、元の画像バイトをアップロードします。これによりWebアップローダーとの整合性が戻り、RoboflowサーバーがSHA-256でアップロードを重複排除できるようになります。同じ画像を2回アップロードする自動処理がある場合（たとえば複数のバッチに追加するため）、2回目のアップロードは追加のストレージクレジットを消費せずに成功します。

## CLI

CLIを使って、1枚の画像と任意のアノテーション、タグ、またはメタデータをアップロードします。

```bash
roboflow image upload photo.jpg -p PROJECT_ID
```

### オプション

<table data-search="false"><thead><tr><th>フラグ</th><th>説明</th></tr></thead><tbody><tr><td><code>-p</code>, <code>--project</code></td><td>プロジェクトID（必須）</td></tr><tr><td><code>-a</code>, <code>--annotation</code></td><td>アノテーションファイルへのパス</td></tr><tr><td><code>-m</code>, <code>--labelmap</code></td><td>ラベルマップファイルへのパス</td></tr><tr><td><code>-s</code>, <code>--split</code></td><td>データセットの分割: <code>train</code>, <code>valid</code>、または <code>test</code>。デフォルトは <code>train</code>.</td></tr><tr><td><code>-t</code>, <code>--tag</code></td><td>カンマ区切りのタグ名</td></tr><tr><td><code>-M</code>, <code>--metadata</code></td><td>JSON文字列としてのメタデータ</td></tr><tr><td><code>--is-prediction</code></td><td>アップロードを予測としてマークします</td></tr><tr><td><code>-b</code>, <code>--batch</code></td><td>バッチ名</td></tr></tbody></table>

### 例

注釈付きで画像をアップロードするには:

```bash
roboflow image upload photo.jpg -p my-project -a annotation.xml -s valid
```

タグとメタデータ付きで画像をアップロードするには:

```bash
roboflow image upload photo.jpg -p my-project -t "outdoor,daytime" -M '{"camera_id":"cam001"}'
```

ディレクトリをアップロードするには、または `.zip` アーカイブについては、参照 [データセットをアップロード](/datasets/ja/toappurdo/upload-a-dataset.md).
