Skip to content

Commit 7ab41aa

Browse files
committed
chore(Visual Recognition): Apply manual changes
1 parent b76653b commit 7ab41aa

File tree

5 files changed

+148
-116
lines changed

5 files changed

+148
-116
lines changed

visual-recognition/src/main/java/com/ibm/watson/developer_cloud/visual_recognition/v3/VisualRecognition.java

Lines changed: 36 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,12 @@
3232
import com.ibm.watson.developer_cloud.visual_recognition.v3.model.GetCoreMlModelOptions;
3333
import com.ibm.watson.developer_cloud.visual_recognition.v3.model.ListClassifiersOptions;
3434
import com.ibm.watson.developer_cloud.visual_recognition.v3.model.UpdateClassifierOptions;
35-
import java.io.InputStream;
3635
import okhttp3.MultipartBody;
3736
import okhttp3.RequestBody;
3837

38+
import java.io.File;
39+
import java.io.InputStream;
40+
3941
/**
4042
* The IBM Watson™ Visual Recognition service uses deep learning algorithms to identify scenes, objects, and faces
4143
* in images you upload to the service. You can create and train a custom classifier to identify subjects that suit
@@ -137,9 +139,13 @@ public VisualRecognition(String versionDate, IamOptions iamOptions) {
137139
*/
138140
public ServiceCall<ClassifiedImages> classify(ClassifyOptions classifyOptions) {
139141
Validator.notNull(classifyOptions, "classifyOptions cannot be null");
140-
Validator.isTrue((classifyOptions.imagesFile() != null) || (classifyOptions.url() != null) || (classifyOptions
141-
.threshold() != null) || (classifyOptions.owners() != null) || (classifyOptions.classifierIds() != null),
142-
"At least one of imagesFile, url, threshold, owners, or classifierIds must be supplied.");
142+
Validator.isTrue((classifyOptions.imagesFile() != null)
143+
|| (classifyOptions.url() != null)
144+
|| (classifyOptions.threshold() != null)
145+
|| (classifyOptions.owners() != null)
146+
|| (classifyOptions.classifierIds() != null)
147+
|| (classifyOptions.parameters() != null),
148+
"At least one of imagesFile, url, threshold, owners, classifierIds, or parameters must be supplied.");
143149
String[] pathSegments = { "v3/classify" };
144150
RequestBuilder builder = RequestBuilder.post(RequestBuilder.constructHttpUrl(getEndPoint(), pathSegments));
145151
builder.query(VERSION, versionDate);
@@ -153,6 +159,9 @@ public ServiceCall<ClassifiedImages> classify(ClassifyOptions classifyOptions) {
153159
.imagesFileContentType());
154160
multipartBuilder.addFormDataPart("images_file", classifyOptions.imagesFilename(), imagesFileBody);
155161
}
162+
if (classifyOptions.parameters() != null) {
163+
multipartBuilder.addFormDataPart("parameters", classifyOptions.parameters());
164+
}
156165
if (classifyOptions.url() != null) {
157166
multipartBuilder.addFormDataPart("url", classifyOptions.url());
158167
}
@@ -200,8 +209,10 @@ public ServiceCall<ClassifiedImages> classify() {
200209
*/
201210
public ServiceCall<DetectedFaces> detectFaces(DetectFacesOptions detectFacesOptions) {
202211
Validator.notNull(detectFacesOptions, "detectFacesOptions cannot be null");
203-
Validator.isTrue((detectFacesOptions.imagesFile() != null) || (detectFacesOptions.url() != null),
204-
"At least one of imagesFile or url must be supplied.");
212+
Validator.isTrue((detectFacesOptions.imagesFile() != null)
213+
|| (detectFacesOptions.url() != null)
214+
|| (detectFacesOptions.parameters() != null),
215+
"At least one of imagesFile, url, or parameters must be supplied.");
205216
String[] pathSegments = { "v3/detect_faces" };
206217
RequestBuilder builder = RequestBuilder.post(RequestBuilder.constructHttpUrl(getEndPoint(), pathSegments));
207218
builder.query(VERSION, versionDate);
@@ -212,6 +223,9 @@ public ServiceCall<DetectedFaces> detectFaces(DetectFacesOptions detectFacesOpti
212223
.imagesFileContentType());
213224
multipartBuilder.addFormDataPart("images_file", detectFacesOptions.imagesFilename(), imagesFileBody);
214225
}
226+
if (detectFacesOptions.parameters() != null) {
227+
multipartBuilder.addFormDataPart("parameters", detectFacesOptions.parameters());
228+
}
215229
if (detectFacesOptions.url() != null) {
216230
multipartBuilder.addFormDataPart("url", detectFacesOptions.url());
217231
}
@@ -261,10 +275,13 @@ public ServiceCall<Classifier> createClassifier(CreateClassifierOptions createCl
261275
MultipartBody.Builder multipartBuilder = new MultipartBody.Builder();
262276
multipartBuilder.setType(MultipartBody.FORM);
263277
multipartBuilder.addFormDataPart("name", createClassifierOptions.name());
264-
RequestBody classnamePositiveExamplesBody = RequestUtils.inputStreamBody(createClassifierOptions
265-
.classnamePositiveExamples(), "application/octet-stream");
266-
multipartBuilder.addFormDataPart("classname_positive_examples", createClassifierOptions
267-
.classnamePositiveExamplesFilename(), classnamePositiveExamplesBody);
278+
// Classes
279+
for (String className : createClassifierOptions.classNames()) {
280+
String dataName = className + "_positive_examples";
281+
File positiveExamples = createClassifierOptions.positiveExamplesByClassName(className);
282+
RequestBody body = RequestUtils.fileBody(positiveExamples, "application/octet-stream");
283+
multipartBuilder.addFormDataPart(dataName, positiveExamples.getName(), body);
284+
}
268285
if (createClassifierOptions.negativeExamples() != null) {
269286
RequestBody negativeExamplesBody = RequestUtils.inputStreamBody(createClassifierOptions.negativeExamples(),
270287
"application/octet-stream");
@@ -342,7 +359,8 @@ public ServiceCall<Classifiers> listClassifiers() {
342359
* Update a custom classifier by adding new positive or negative classes (examples) or by adding new images to
343360
* existing classes. You must supply at least one set of positive or negative examples. For details, see [Updating
344361
* custom
345-
* classifiers](https://console.bluemix.net/docs/services/visual-recognition/customizing.html#updating-custom-classifiers).
362+
* classifiers]
363+
* (https://console.bluemix.net/docs/services/visual-recognition/customizing.html#updating-custom-classifiers).
346364
*
347365
* Encode all names in UTF-8 if they contain non-ASCII characters (.zip and image file names, and classifier and class
348366
* names). The service assumes UTF-8 encoding if it encounters non-ASCII characters.
@@ -356,7 +374,7 @@ public ServiceCall<Classifiers> listClassifiers() {
356374
*/
357375
public ServiceCall<Classifier> updateClassifier(UpdateClassifierOptions updateClassifierOptions) {
358376
Validator.notNull(updateClassifierOptions, "updateClassifierOptions cannot be null");
359-
Validator.isTrue((updateClassifierOptions.classnamePositiveExamples() != null) || (updateClassifierOptions
377+
Validator.isTrue((updateClassifierOptions.classNames().size() > 0) || (updateClassifierOptions
360378
.negativeExamples() != null),
361379
"At least one of classnamePositiveExamples or negativeExamples must be supplied.");
362380
String[] pathSegments = { "v3/classifiers" };
@@ -366,11 +384,12 @@ public ServiceCall<Classifier> updateClassifier(UpdateClassifierOptions updateCl
366384
builder.query(VERSION, versionDate);
367385
MultipartBody.Builder multipartBuilder = new MultipartBody.Builder();
368386
multipartBuilder.setType(MultipartBody.FORM);
369-
if (updateClassifierOptions.classnamePositiveExamples() != null) {
370-
RequestBody classnamePositiveExamplesBody = RequestUtils.inputStreamBody(updateClassifierOptions
371-
.classnamePositiveExamples(), "application/octet-stream");
372-
multipartBuilder.addFormDataPart("classname_positive_examples", updateClassifierOptions
373-
.classnamePositiveExamplesFilename(), classnamePositiveExamplesBody);
387+
// Classes
388+
for (String className : updateClassifierOptions.classNames()) {
389+
String dataName = className + "_positive_examples";
390+
File positiveExamples = updateClassifierOptions.positiveExamplesByClassName(className);
391+
RequestBody body = RequestUtils.fileBody(positiveExamples, "application/octet-stream");
392+
multipartBuilder.addFormDataPart(dataName, positiveExamples.getName(), body);
374393
}
375394
if (updateClassifierOptions.negativeExamples() != null) {
376395
RequestBody negativeExamplesBody = RequestUtils.inputStreamBody(updateClassifierOptions.negativeExamples(),

visual-recognition/src/main/java/com/ibm/watson/developer_cloud/visual_recognition/v3/model/ClassifyOptions.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,8 @@ public interface AcceptLanguage {
6767
private List<String> owners;
6868
private List<String> classifierIds;
6969
private String imagesFileContentType;
70+
@Deprecated
71+
private String parameters;
7072

7173
/**
7274
* Builder.
@@ -80,6 +82,8 @@ public static class Builder {
8082
private List<String> owners;
8183
private List<String> classifierIds;
8284
private String imagesFileContentType;
85+
@Deprecated
86+
private String parameters;
8387

8488
private Builder(ClassifyOptions classifyOptions) {
8589
imagesFile = classifyOptions.imagesFile;
@@ -90,6 +94,7 @@ private Builder(ClassifyOptions classifyOptions) {
9094
owners = classifyOptions.owners;
9195
classifierIds = classifyOptions.classifierIds;
9296
imagesFileContentType = classifyOptions.imagesFileContentType;
97+
parameters = classifyOptions.parameters;
9398
}
9499

95100
/**
@@ -240,6 +245,18 @@ public Builder imagesFile(File imagesFile) throws FileNotFoundException {
240245
this.imagesFilename = imagesFile.getName();
241246
return this;
242247
}
248+
249+
/**
250+
* Set the parameters.
251+
*
252+
* @param parameters the parameters
253+
* @return the ClassifyOptions builder
254+
* @deprecated replaced by the top-level parameters url, threshold, owners, and classifierIds
255+
*/
256+
public Builder parameters(String parameters) {
257+
this.parameters = parameters;
258+
return this;
259+
}
243260
}
244261

245262
private ClassifyOptions(Builder builder) {
@@ -251,6 +268,7 @@ private ClassifyOptions(Builder builder) {
251268
owners = builder.owners;
252269
classifierIds = builder.classifierIds;
253270
imagesFileContentType = builder.imagesFileContentType;
271+
parameters = builder.parameters;
254272
}
255273

256274
/**
@@ -373,4 +391,14 @@ public List<String> classifierIds() {
373391
public String imagesFileContentType() {
374392
return imagesFileContentType;
375393
}
394+
395+
/**
396+
* Gets the parameters.
397+
*
398+
* @return the parameters
399+
* @deprecated replaced by the top-level parameters url, threshold, owners, and classifierIds
400+
*/
401+
public String parameters() {
402+
return parameters;
403+
}
376404
}

visual-recognition/src/main/java/com/ibm/watson/developer_cloud/visual_recognition/v3/model/CreateClassifierOptions.java

Lines changed: 29 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@
1616
import java.io.FileInputStream;
1717
import java.io.FileNotFoundException;
1818
import java.io.InputStream;
19+
import java.util.HashMap;
20+
import java.util.Map;
21+
import java.util.Set;
1922

2023
import com.ibm.watson.developer_cloud.service.model.GenericModel;
2124
import com.ibm.watson.developer_cloud.util.Validator;
@@ -26,8 +29,7 @@
2629
public class CreateClassifierOptions extends GenericModel {
2730

2831
private String name;
29-
private InputStream classnamePositiveExamples;
30-
private String classnamePositiveExamplesFilename;
32+
private Map<String, File> classnamePositiveExamples;
3133
private InputStream negativeExamples;
3234
private String negativeExamplesFilename;
3335

@@ -36,15 +38,13 @@ public class CreateClassifierOptions extends GenericModel {
3638
*/
3739
public static class Builder {
3840
private String name;
39-
private InputStream classnamePositiveExamples;
40-
private String classnamePositiveExamplesFilename;
41+
private Map<String, File> classnamePositiveExamples;
4142
private InputStream negativeExamples;
4243
private String negativeExamplesFilename;
4344

4445
private Builder(CreateClassifierOptions createClassifierOptions) {
4546
name = createClassifierOptions.name;
46-
classnamePositiveExamples = createClassifierOptions.classnamePositiveExamples;
47-
classnamePositiveExamplesFilename = createClassifierOptions.classnamePositiveExamplesFilename;
47+
classnamePositiveExamples.putAll(createClassifierOptions.classnamePositiveExamples);
4848
negativeExamples = createClassifierOptions.negativeExamples;
4949
negativeExamplesFilename = createClassifierOptions.negativeExamplesFilename;
5050
}
@@ -53,17 +53,17 @@ private Builder(CreateClassifierOptions createClassifierOptions) {
5353
* Instantiates a new builder.
5454
*/
5555
public Builder() {
56+
classnamePositiveExamples = new HashMap<>();
5657
}
5758

5859
/**
5960
* Instantiates a new builder with required properties.
6061
*
6162
* @param name the name
62-
* @param classnamePositiveExamples the classnamePositiveExamples
6363
*/
64-
public Builder(String name, InputStream classnamePositiveExamples) {
64+
public Builder(String name) {
65+
this();
6566
this.name = name;
66-
this.classnamePositiveExamples = classnamePositiveExamples;
6767
}
6868

6969
/**
@@ -87,24 +87,17 @@ public Builder name(String name) {
8787
}
8888

8989
/**
90-
* Set the classnamePositiveExamples.
90+
* Adds a classifier with a name and positive examples. If the classifier name is already contained, the old
91+
* positive examples are replaced by the specified value.
9192
*
92-
* @param classnamePositiveExamples the classnamePositiveExamples
93-
* @return the CreateClassifierOptions builder
93+
* @param className the class name
94+
* @param positiveExamples the positive examples
95+
* @return the builder
9496
*/
95-
public Builder classnamePositiveExamples(InputStream classnamePositiveExamples) {
96-
this.classnamePositiveExamples = classnamePositiveExamples;
97-
return this;
98-
}
99-
100-
/**
101-
* Set the classnamePositiveExamplesFilename.
102-
*
103-
* @param classnamePositiveExamplesFilename the classnamePositiveExamplesFilename
104-
* @return the CreateClassifierOptions builder
105-
*/
106-
public Builder classnamePositiveExamplesFilename(String classnamePositiveExamplesFilename) {
107-
this.classnamePositiveExamplesFilename = classnamePositiveExamplesFilename;
97+
public Builder addClass(String className, File positiveExamples) {
98+
Validator.notNull(className, "className cannot be null");
99+
Validator.notNull(positiveExamples, "positiveExamples cannot be null");
100+
classnamePositiveExamples.put(className, positiveExamples);
108101
return this;
109102
}
110103

@@ -130,20 +123,6 @@ public Builder negativeExamplesFilename(String negativeExamplesFilename) {
130123
return this;
131124
}
132125

133-
/**
134-
* Set the classnamePositiveExamples.
135-
*
136-
* @param classnamePositiveExamples the classnamePositiveExamples
137-
* @return the CreateClassifierOptions builder
138-
*
139-
* @throws FileNotFoundException if the file could not be found
140-
*/
141-
public Builder classnamePositiveExamples(File classnamePositiveExamples) throws FileNotFoundException {
142-
this.classnamePositiveExamples = new FileInputStream(classnamePositiveExamples);
143-
this.classnamePositiveExamplesFilename = classnamePositiveExamples.getName();
144-
return this;
145-
}
146-
147126
/**
148127
* Set the negativeExamples.
149128
*
@@ -161,12 +140,10 @@ public Builder negativeExamples(File negativeExamples) throws FileNotFoundExcept
161140

162141
private CreateClassifierOptions(Builder builder) {
163142
Validator.notNull(builder.name, "name cannot be null");
164-
Validator.notNull(builder.classnamePositiveExamples, "classnamePositiveExamples cannot be null");
165-
Validator.isTrue((builder.negativeExamples == null) || (builder.negativeExamplesFilename != null),
166-
"negativeExamplesFilename cannot be null if negativeExamples is not null.");
143+
Validator.isTrue(!builder.classnamePositiveExamples.isEmpty(),
144+
"To create a classifier, you must supply at least one positive examples file.");
167145
name = builder.name;
168146
classnamePositiveExamples = builder.classnamePositiveExamples;
169-
classnamePositiveExamplesFilename = builder.classnamePositiveExamplesFilename;
170147
negativeExamples = builder.negativeExamples;
171148
negativeExamplesFilename = builder.negativeExamplesFilename;
172149
}
@@ -192,7 +169,7 @@ public String name() {
192169
}
193170

194171
/**
195-
* Gets the classnamePositiveExamples.
172+
* Gets the class names.
196173
*
197174
* A .zip file of images that depict the visual subject of a class in the new classifier. You can include more than
198175
* one positive example file in a call.
@@ -205,21 +182,20 @@ public String name() {
205182
*
206183
* Encode special characters in the file name in UTF-8.
207184
*
208-
* @return the classnamePositiveExamples
185+
* @return the classNames
209186
*/
210-
public InputStream classnamePositiveExamples() {
211-
return classnamePositiveExamples;
187+
public Set<String> classNames() {
188+
return classnamePositiveExamples.keySet();
212189
}
213190

214191
/**
215-
* Gets the classnamePositiveExamplesFilename.
216-
*
217-
* The filename for classnamePositiveExamples.
192+
* Gets the positive examples by class name.
218193
*
219-
* @return the classnamePositiveExamplesFilename
194+
* @param className the class name
195+
* @return the positiveExamples
220196
*/
221-
public String classnamePositiveExamplesFilename() {
222-
return classnamePositiveExamplesFilename;
197+
public File positiveExamplesByClassName(String className) {
198+
return classnamePositiveExamples.get(className);
223199
}
224200

225201
/**

0 commit comments

Comments
 (0)