pub struct QuantumVisionPipeline { /* private fields */ }
Expand description
Main quantum computer vision pipeline
Implementations§
Source§impl QuantumVisionPipeline
impl QuantumVisionPipeline
Sourcepub fn new(config: QuantumVisionConfig) -> Result<Self>
pub fn new(config: QuantumVisionConfig) -> Result<Self>
Create new quantum vision pipeline
Examples found in repository?
examples/computer_vision.rs (line 211)
131fn vision_backbone_demo() -> Result<()> {
132 println!(" Testing quantum vision backbone architectures...");
133
134 // Different backbone configurations
135 let backbones = vec![
136 (
137 "Quantum CNN",
138 QuantumVisionConfig {
139 num_qubits: 12,
140 encoding_method: ImageEncodingMethod::AmplitudeEncoding,
141 backbone: VisionBackbone::QuantumCNN {
142 conv_layers: vec![
143 ConvolutionalConfig {
144 num_filters: 32,
145 kernel_size: 3,
146 stride: 1,
147 padding: 1,
148 quantum_kernel: true,
149 circuit_depth: 4,
150 },
151 ConvolutionalConfig {
152 num_filters: 64,
153 kernel_size: 3,
154 stride: 2,
155 padding: 1,
156 quantum_kernel: true,
157 circuit_depth: 6,
158 },
159 ],
160 pooling_type: PoolingType::Quantum,
161 },
162 task_config: VisionTaskConfig::Classification {
163 num_classes: 10,
164 multi_label: false,
165 },
166 preprocessing: PreprocessingConfig::default(),
167 quantum_enhancement: QuantumEnhancement::Medium,
168 },
169 ),
170 (
171 "Quantum ViT",
172 QuantumVisionConfig {
173 num_qubits: 16,
174 encoding_method: ImageEncodingMethod::QPIE,
175 backbone: VisionBackbone::QuantumViT {
176 patch_size: 16,
177 embed_dim: 768,
178 num_heads: 12,
179 depth: 12,
180 },
181 task_config: VisionTaskConfig::Classification {
182 num_classes: 10,
183 multi_label: false,
184 },
185 preprocessing: PreprocessingConfig::default(),
186 quantum_enhancement: QuantumEnhancement::High,
187 },
188 ),
189 (
190 "Hybrid CNN-Transformer",
191 QuantumVisionConfig {
192 num_qubits: 14,
193 encoding_method: ImageEncodingMethod::HierarchicalEncoding { levels: 3 },
194 backbone: VisionBackbone::HybridBackbone {
195 cnn_layers: 4,
196 transformer_layers: 2,
197 },
198 task_config: VisionTaskConfig::Classification {
199 num_classes: 10,
200 multi_label: false,
201 },
202 preprocessing: PreprocessingConfig::default(),
203 quantum_enhancement: QuantumEnhancement::High,
204 },
205 ),
206 ];
207
208 for (name, config) in backbones {
209 println!("\n --- {} Backbone ---", name);
210
211 let mut pipeline = QuantumVisionPipeline::new(config)?;
212
213 // Test forward pass
214 let test_images = create_test_image(2, 3, 224, 224)?;
215 let output = pipeline.forward(&test_images)?;
216
217 match &output {
218 TaskOutput::Classification {
219 logits,
220 probabilities,
221 } => {
222 println!(" Output shape: {:?}", logits.dim());
223 println!(" Probability shape: {:?}", probabilities.dim());
224 }
225 _ => {}
226 }
227
228 // Get metrics
229 let metrics = pipeline.metrics();
230 println!(" Quantum metrics:");
231 println!(
232 " - Circuit depth: {}",
233 metrics.quantum_metrics.circuit_depth
234 );
235 println!(
236 " - Quantum advantage: {:.2}x",
237 metrics.quantum_metrics.quantum_advantage
238 );
239 println!(
240 " - Coherence utilization: {:.1}%",
241 metrics.quantum_metrics.coherence_utilization * 100.0
242 );
243
244 // Architecture-specific properties
245 match name {
246 "Quantum CNN" => {
247 println!(" ✓ Hierarchical feature extraction with quantum convolutions");
248 }
249 "Quantum ViT" => {
250 println!(" ✓ Global context modeling with quantum attention");
251 }
252 "Hybrid CNN-Transformer" => {
253 println!(" ✓ Local features + global context integration");
254 }
255 _ => {}
256 }
257 }
258
259 Ok(())
260}
261
262/// Demonstrate image classification
263fn classification_demo() -> Result<()> {
264 println!(" Quantum image classification demo...");
265
266 // Create classification pipeline
267 let config = QuantumVisionConfig::default();
268 let mut pipeline = QuantumVisionPipeline::new(config)?;
269
270 // Create synthetic dataset
271 let num_classes = 10;
272 let num_samples = 20;
273 let (train_data, val_data) = create_classification_dataset(num_samples, num_classes)?;
274
275 println!(
276 " Dataset: {} training, {} validation samples",
277 train_data.len(),
278 val_data.len()
279 );
280
281 // Train the model (simplified)
282 println!("\n Training quantum classifier...");
283 let history = pipeline.train(
284 &train_data,
285 &val_data,
286 5, // epochs
287 OptimizationMethod::Adam,
288 )?;
289
290 // Display training results
291 println!("\n Training results:");
292 for (epoch, train_loss, val_loss) in history
293 .epochs
294 .iter()
295 .zip(history.train_losses.iter())
296 .zip(history.val_losses.iter())
297 .map(|((e, t), v)| (e, t, v))
298 {
299 println!(
300 " Epoch {}: train_loss={:.4}, val_loss={:.4}",
301 epoch + 1,
302 train_loss,
303 val_loss
304 );
305 }
306
307 // Test on new images
308 println!("\n Testing on new images...");
309 let test_images = create_test_image(5, 3, 224, 224)?;
310 let predictions = pipeline.forward(&test_images)?;
311
312 match predictions {
313 TaskOutput::Classification { probabilities, .. } => {
314 for (i, prob_row) in probabilities.outer_iter().enumerate() {
315 let (predicted_class, confidence) = prob_row
316 .iter()
317 .enumerate()
318 .max_by(|(_, a), (_, b)| a.partial_cmp(b).unwrap())
319 .map(|(idx, &prob)| (idx, prob))
320 .unwrap_or((0, 0.0));
321
322 println!(
323 " Image {}: Class {} (confidence: {:.2}%)",
324 i + 1,
325 predicted_class,
326 confidence * 100.0
327 );
328 }
329 }
330 _ => {}
331 }
332
333 // Analyze quantum advantage
334 let quantum_advantage = analyze_classification_quantum_advantage(&pipeline)?;
335 println!("\n Quantum advantage analysis:");
336 println!(
337 " - Parameter efficiency: {:.2}x classical",
338 quantum_advantage.param_efficiency
339 );
340 println!(
341 " - Feature expressiveness: {:.2}x",
342 quantum_advantage.expressiveness
343 );
344 println!(
345 " - Training speedup: {:.2}x",
346 quantum_advantage.training_speedup
347 );
348
349 Ok(())
350}
351
352/// Demonstrate object detection
353fn object_detection_demo() -> Result<()> {
354 println!(" Quantum object detection demo...");
355
356 // Create detection pipeline
357 let config = QuantumVisionConfig::object_detection(80); // 80 classes (COCO-like)
358 let mut pipeline = QuantumVisionPipeline::new(config)?;
359
360 // Test image
361 let test_images = create_test_image(2, 3, 416, 416)?;
362
363 println!(
364 " Processing {} images for object detection...",
365 test_images.dim().0
366 );
367
368 // Run detection
369 let detections = pipeline.forward(&test_images)?;
370
371 match detections {
372 TaskOutput::Detection {
373 boxes,
374 scores,
375 classes,
376 } => {
377 println!(" Detection results:");
378
379 for batch_idx in 0..boxes.dim().0 {
380 println!("\n Image {}:", batch_idx + 1);
381
382 // Filter detections by score threshold
383 let threshold = 0.5;
384 let mut num_detections = 0;
385
386 for det_idx in 0..boxes.dim().1 {
387 let score = scores[[batch_idx, det_idx]];
388
389 if score > threshold {
390 let class_id = classes[[batch_idx, det_idx]];
391 let bbox = boxes.slice(scirs2_core::ndarray::s![batch_idx, det_idx, ..]);
392
393 println!(" - Object {}: Class {}, Score {:.3}, Box [{:.1}, {:.1}, {:.1}, {:.1}]",
394 num_detections + 1, class_id, score,
395 bbox[0], bbox[1], bbox[2], bbox[3]);
396
397 num_detections += 1;
398 }
399 }
400
401 if num_detections == 0 {
402 println!(" - No objects detected above threshold");
403 } else {
404 println!(" Total objects detected: {}", num_detections);
405 }
406 }
407 }
408 _ => {}
409 }
410
411 // Analyze detection performance
412 println!("\n Detection performance analysis:");
413 println!(" - Quantum anchor generation improves localization");
414 println!(" - Entangled features enhance multi-scale detection");
415 println!(" - Quantum NMS reduces redundant detections");
416
417 Ok(())
418}
419
420/// Demonstrate semantic segmentation
421fn segmentation_demo() -> Result<()> {
422 println!(" Quantum semantic segmentation demo...");
423
424 // Create segmentation pipeline
425 let config = QuantumVisionConfig::segmentation(21); // 21 classes (Pascal VOC-like)
426 let mut pipeline = QuantumVisionPipeline::new(config)?;
427
428 // Test images
429 let test_images = create_test_image(1, 3, 512, 512)?;
430
431 println!(" Processing image for semantic segmentation...");
432
433 // Run segmentation
434 let segmentation = pipeline.forward(&test_images)?;
435
436 match segmentation {
437 TaskOutput::Segmentation {
438 masks,
439 class_scores,
440 } => {
441 println!(" Segmentation results:");
442 println!(" - Mask shape: {:?}", masks.dim());
443 println!(" - Class scores shape: {:?}", class_scores.dim());
444
445 // Analyze segmentation quality
446 let seg_metrics = analyze_segmentation_quality(&masks, &class_scores)?;
447 println!("\n Segmentation metrics:");
448 println!(" - Mean IoU: {:.3}", seg_metrics.mean_iou);
449 println!(
450 " - Pixel accuracy: {:.1}%",
451 seg_metrics.pixel_accuracy * 100.0
452 );
453 println!(
454 " - Boundary precision: {:.3}",
455 seg_metrics.boundary_precision
456 );
457
458 // Class distribution
459 println!("\n Predicted class distribution:");
460 let class_counts = compute_class_distribution(&masks)?;
461 for (class_id, count) in class_counts.iter().take(5) {
462 let percentage = *count as f64 / (512.0 * 512.0) * 100.0;
463 println!(" - Class {}: {:.1}% of pixels", class_id, percentage);
464 }
465 }
466 _ => {}
467 }
468
469 // Quantum advantages for segmentation
470 println!("\n Quantum segmentation advantages:");
471 println!(" - Quantum attention captures long-range dependencies");
472 println!(" - Hierarchical encoding preserves multi-scale features");
473 println!(" - Entanglement enables pixel-to-pixel correlations");
474
475 Ok(())
476}
477
478/// Demonstrate feature extraction
479fn feature_extraction_demo() -> Result<()> {
480 println!(" Quantum feature extraction demo...");
481
482 // Create feature extraction pipeline
483 let config = QuantumVisionConfig {
484 num_qubits: 14,
485 encoding_method: ImageEncodingMethod::QPIE,
486 backbone: VisionBackbone::QuantumResNet {
487 blocks: vec![
488 ResidualBlock {
489 channels: 64,
490 kernel_size: 3,
491 stride: 1,
492 quantum_conv: true,
493 },
494 ResidualBlock {
495 channels: 128,
496 kernel_size: 3,
497 stride: 2,
498 quantum_conv: true,
499 },
500 ],
501 skip_connections: true,
502 },
503 task_config: VisionTaskConfig::FeatureExtraction {
504 feature_dim: 512,
505 normalize: true,
506 },
507 preprocessing: PreprocessingConfig::default(),
508 quantum_enhancement: QuantumEnhancement::High,
509 };
510
511 let mut pipeline = QuantumVisionPipeline::new(config)?;
512
513 // Extract features from multiple images
514 let num_images = 10;
515 let test_images = create_test_image(num_images, 3, 224, 224)?;
516
517 println!(" Extracting features from {} images...", num_images);
518
519 let features_output = pipeline.forward(&test_images)?;
520
521 match features_output {
522 TaskOutput::Features {
523 features,
524 attention_maps,
525 } => {
526 println!(" Feature extraction results:");
527 println!(" - Feature dimension: {}", features.dim().1);
528 println!(" - Features normalized: Yes");
529
530 // Compute feature statistics
531 let feature_stats = compute_feature_statistics(&features)?;
532 println!("\n Feature statistics:");
533 println!(" - Mean magnitude: {:.4}", feature_stats.mean_magnitude);
534 println!(" - Variance: {:.4}", feature_stats.variance);
535 println!(" - Sparsity: {:.1}%", feature_stats.sparsity * 100.0);
536
537 // Compute pairwise similarities
538 println!("\n Feature similarity matrix (first 5 images):");
539 let similarities = compute_cosine_similarities(&features)?;
540
541 print!(" ");
542 for i in 0..5.min(num_images) {
543 print!("Img{} ", i + 1);
544 }
545 println!();
546
547 for i in 0..5.min(num_images) {
548 print!(" Img{} ", i + 1);
549 for j in 0..5.min(num_images) {
550 print!("{:.3} ", similarities[[i, j]]);
551 }
552 println!();
553 }
554
555 // Quantum feature properties
556 println!("\n Quantum feature properties:");
557 println!(" - Entanglement enhances discriminative power");
558 println!(" - Quantum superposition encodes multiple views");
559 println!(" - Phase information captures subtle variations");
560 }
561 _ => {}
562 }
563
564 Ok(())
565}
566
567/// Demonstrate multi-task learning
568fn multitask_demo() -> Result<()> {
569 println!(" Multi-task quantum vision demo...");
570
571 // Create a pipeline that can handle multiple tasks
572 let tasks = vec![
573 (
574 "Classification",
575 VisionTaskConfig::Classification {
576 num_classes: 10,
577 multi_label: false,
578 },
579 ),
580 (
581 "Detection",
582 VisionTaskConfig::ObjectDetection {
583 num_classes: 20,
584 anchor_sizes: vec![(32, 32), (64, 64)],
585 iou_threshold: 0.5,
586 },
587 ),
588 (
589 "Segmentation",
590 VisionTaskConfig::Segmentation {
591 num_classes: 10,
592 output_stride: 8,
593 },
594 ),
595 ];
596
597 println!(
598 " Testing {} vision tasks with shared backbone...",
599 tasks.len()
600 );
601
602 // Use same backbone for all tasks
603 let base_config = QuantumVisionConfig {
604 num_qubits: 16,
605 encoding_method: ImageEncodingMethod::HierarchicalEncoding { levels: 3 },
606 backbone: VisionBackbone::HybridBackbone {
607 cnn_layers: 4,
608 transformer_layers: 2,
609 },
610 task_config: tasks[0].1.clone(), // Will be replaced for each task
611 preprocessing: PreprocessingConfig::default(),
612 quantum_enhancement: QuantumEnhancement::High,
613 };
614
615 // Test each task
616 let test_images = create_test_image(2, 3, 416, 416)?;
617
618 for (task_name, task_config) in tasks {
619 println!("\n --- {} Task ---", task_name);
620
621 let mut config = base_config.clone();
622 config.task_config = task_config;
623
624 let mut pipeline = QuantumVisionPipeline::new(config)?;
625 let output = pipeline.forward(&test_images)?;
626
627 match output {
628 TaskOutput::Classification { logits, .. } => {
629 println!(" Classification output shape: {:?}", logits.dim());
630 }
631 TaskOutput::Detection { boxes, scores, .. } => {
632 println!(
633 " Detection: {} anchors, score shape: {:?}",
634 boxes.dim().1,
635 scores.dim()
636 );
637 }
638 TaskOutput::Segmentation { masks, .. } => {
639 println!(" Segmentation mask shape: {:?}", masks.dim());
640 }
641 _ => {}
642 }
643
644 // Task-specific quantum advantages
645 match task_name {
646 "Classification" => {
647 println!(" ✓ Quantum features improve class discrimination");
648 }
649 "Detection" => {
650 println!(" ✓ Quantum anchors adapt to object scales");
651 }
652 "Segmentation" => {
653 println!(" ✓ Quantum correlations enhance boundary detection");
654 }
655 _ => {}
656 }
657 }
658
659 println!("\n Multi-task benefits:");
660 println!(" - Shared quantum backbone reduces parameters");
661 println!(" - Task-specific quantum heads optimize performance");
662 println!(" - Quantum entanglement enables cross-task learning");
663
664 Ok(())
665}
666
667/// Demonstrate performance analysis
668fn performance_analysis_demo() -> Result<()> {
669 println!(" Analyzing quantum vision performance...");
670
671 // Compare different quantum enhancement levels
672 let enhancement_levels = vec![
673 ("Low", QuantumEnhancement::Low),
674 ("Medium", QuantumEnhancement::Medium),
675 ("High", QuantumEnhancement::High),
676 (
677 "Custom",
678 QuantumEnhancement::Custom {
679 quantum_layers: vec![0, 2, 4, 6],
680 entanglement_strength: 0.8,
681 },
682 ),
683 ];
684
685 println!("\n Quantum Enhancement Level Comparison:");
686 println!(" Level | FLOPs | Memory | Accuracy | Q-Advantage");
687 println!(" ---------|---------|---------|----------|------------");
688
689 for (level_name, enhancement) in enhancement_levels {
690 let config = QuantumVisionConfig {
691 num_qubits: 12,
692 encoding_method: ImageEncodingMethod::AmplitudeEncoding,
693 backbone: VisionBackbone::QuantumCNN {
694 conv_layers: vec![ConvolutionalConfig {
695 num_filters: 32,
696 kernel_size: 3,
697 stride: 1,
698 padding: 1,
699 quantum_kernel: true,
700 circuit_depth: 4,
701 }],
702 pooling_type: PoolingType::Quantum,
703 },
704 task_config: VisionTaskConfig::Classification {
705 num_classes: 10,
706 multi_label: false,
707 },
708 preprocessing: PreprocessingConfig::default(),
709 quantum_enhancement: enhancement,
710 };
711
712 let pipeline = QuantumVisionPipeline::new(config)?;
713 let metrics = pipeline.metrics();
714
715 // Simulate performance metrics
716 let (flops, memory, accuracy, q_advantage) = match level_name {
717 "Low" => (1.2, 50.0, 0.85, 1.2),
718 "Medium" => (2.5, 80.0, 0.88, 1.5),
719 "High" => (4.1, 120.0, 0.91, 2.1),
720 "Custom" => (3.2, 95.0, 0.90, 1.8),
721 _ => (0.0, 0.0, 0.0, 0.0),
722 };
723
724 println!(
725 " {:<8} | {:.1}G | {:.0}MB | {:.1}% | {:.1}x",
726 level_name,
727 flops,
728 memory,
729 accuracy * 100.0,
730 q_advantage
731 );
732 }
733
734 // Scalability analysis
735 println!("\n Scalability Analysis:");
736 let image_sizes = vec![64, 128, 224, 416, 512];
737
738 println!(" Image Size | Inference Time | Throughput");
739 println!(" -----------|----------------|------------");
740
741 for size in image_sizes {
742 let inference_time = 5.0 + (size as f64 / 100.0).powi(2);
743 let throughput = 1000.0 / inference_time;
744
745 println!(
746 " {}x{} | {:.1}ms | {:.0} img/s",
747 size, size, inference_time, throughput
748 );
749 }
750
751 // Quantum advantages summary
752 println!("\n Quantum Computer Vision Advantages:");
753 println!(" 1. Exponential feature space with limited qubits");
754 println!(" 2. Natural multi-scale representation via entanglement");
755 println!(" 3. Quantum attention for global context modeling");
756 println!(" 4. Phase encoding for rotation-invariant features");
757 println!(" 5. Quantum pooling preserves superposition information");
758
759 // Hardware requirements
760 println!("\n Hardware Requirements:");
761 println!(" - Minimum qubits: 10 (basic tasks)");
762 println!(" - Recommended: 16-20 qubits (complex tasks)");
763 println!(" - Coherence time: >100μs for deep networks");
764 println!(" - Gate fidelity: >99.9% for accurate predictions");
765
766 Ok(())
767}
Sourcepub fn forward(&mut self, images: &Array4<f64>) -> Result<TaskOutput>
pub fn forward(&mut self, images: &Array4<f64>) -> Result<TaskOutput>
Process images through the pipeline
Examples found in repository?
examples/computer_vision.rs (line 215)
131fn vision_backbone_demo() -> Result<()> {
132 println!(" Testing quantum vision backbone architectures...");
133
134 // Different backbone configurations
135 let backbones = vec![
136 (
137 "Quantum CNN",
138 QuantumVisionConfig {
139 num_qubits: 12,
140 encoding_method: ImageEncodingMethod::AmplitudeEncoding,
141 backbone: VisionBackbone::QuantumCNN {
142 conv_layers: vec![
143 ConvolutionalConfig {
144 num_filters: 32,
145 kernel_size: 3,
146 stride: 1,
147 padding: 1,
148 quantum_kernel: true,
149 circuit_depth: 4,
150 },
151 ConvolutionalConfig {
152 num_filters: 64,
153 kernel_size: 3,
154 stride: 2,
155 padding: 1,
156 quantum_kernel: true,
157 circuit_depth: 6,
158 },
159 ],
160 pooling_type: PoolingType::Quantum,
161 },
162 task_config: VisionTaskConfig::Classification {
163 num_classes: 10,
164 multi_label: false,
165 },
166 preprocessing: PreprocessingConfig::default(),
167 quantum_enhancement: QuantumEnhancement::Medium,
168 },
169 ),
170 (
171 "Quantum ViT",
172 QuantumVisionConfig {
173 num_qubits: 16,
174 encoding_method: ImageEncodingMethod::QPIE,
175 backbone: VisionBackbone::QuantumViT {
176 patch_size: 16,
177 embed_dim: 768,
178 num_heads: 12,
179 depth: 12,
180 },
181 task_config: VisionTaskConfig::Classification {
182 num_classes: 10,
183 multi_label: false,
184 },
185 preprocessing: PreprocessingConfig::default(),
186 quantum_enhancement: QuantumEnhancement::High,
187 },
188 ),
189 (
190 "Hybrid CNN-Transformer",
191 QuantumVisionConfig {
192 num_qubits: 14,
193 encoding_method: ImageEncodingMethod::HierarchicalEncoding { levels: 3 },
194 backbone: VisionBackbone::HybridBackbone {
195 cnn_layers: 4,
196 transformer_layers: 2,
197 },
198 task_config: VisionTaskConfig::Classification {
199 num_classes: 10,
200 multi_label: false,
201 },
202 preprocessing: PreprocessingConfig::default(),
203 quantum_enhancement: QuantumEnhancement::High,
204 },
205 ),
206 ];
207
208 for (name, config) in backbones {
209 println!("\n --- {} Backbone ---", name);
210
211 let mut pipeline = QuantumVisionPipeline::new(config)?;
212
213 // Test forward pass
214 let test_images = create_test_image(2, 3, 224, 224)?;
215 let output = pipeline.forward(&test_images)?;
216
217 match &output {
218 TaskOutput::Classification {
219 logits,
220 probabilities,
221 } => {
222 println!(" Output shape: {:?}", logits.dim());
223 println!(" Probability shape: {:?}", probabilities.dim());
224 }
225 _ => {}
226 }
227
228 // Get metrics
229 let metrics = pipeline.metrics();
230 println!(" Quantum metrics:");
231 println!(
232 " - Circuit depth: {}",
233 metrics.quantum_metrics.circuit_depth
234 );
235 println!(
236 " - Quantum advantage: {:.2}x",
237 metrics.quantum_metrics.quantum_advantage
238 );
239 println!(
240 " - Coherence utilization: {:.1}%",
241 metrics.quantum_metrics.coherence_utilization * 100.0
242 );
243
244 // Architecture-specific properties
245 match name {
246 "Quantum CNN" => {
247 println!(" ✓ Hierarchical feature extraction with quantum convolutions");
248 }
249 "Quantum ViT" => {
250 println!(" ✓ Global context modeling with quantum attention");
251 }
252 "Hybrid CNN-Transformer" => {
253 println!(" ✓ Local features + global context integration");
254 }
255 _ => {}
256 }
257 }
258
259 Ok(())
260}
261
262/// Demonstrate image classification
263fn classification_demo() -> Result<()> {
264 println!(" Quantum image classification demo...");
265
266 // Create classification pipeline
267 let config = QuantumVisionConfig::default();
268 let mut pipeline = QuantumVisionPipeline::new(config)?;
269
270 // Create synthetic dataset
271 let num_classes = 10;
272 let num_samples = 20;
273 let (train_data, val_data) = create_classification_dataset(num_samples, num_classes)?;
274
275 println!(
276 " Dataset: {} training, {} validation samples",
277 train_data.len(),
278 val_data.len()
279 );
280
281 // Train the model (simplified)
282 println!("\n Training quantum classifier...");
283 let history = pipeline.train(
284 &train_data,
285 &val_data,
286 5, // epochs
287 OptimizationMethod::Adam,
288 )?;
289
290 // Display training results
291 println!("\n Training results:");
292 for (epoch, train_loss, val_loss) in history
293 .epochs
294 .iter()
295 .zip(history.train_losses.iter())
296 .zip(history.val_losses.iter())
297 .map(|((e, t), v)| (e, t, v))
298 {
299 println!(
300 " Epoch {}: train_loss={:.4}, val_loss={:.4}",
301 epoch + 1,
302 train_loss,
303 val_loss
304 );
305 }
306
307 // Test on new images
308 println!("\n Testing on new images...");
309 let test_images = create_test_image(5, 3, 224, 224)?;
310 let predictions = pipeline.forward(&test_images)?;
311
312 match predictions {
313 TaskOutput::Classification { probabilities, .. } => {
314 for (i, prob_row) in probabilities.outer_iter().enumerate() {
315 let (predicted_class, confidence) = prob_row
316 .iter()
317 .enumerate()
318 .max_by(|(_, a), (_, b)| a.partial_cmp(b).unwrap())
319 .map(|(idx, &prob)| (idx, prob))
320 .unwrap_or((0, 0.0));
321
322 println!(
323 " Image {}: Class {} (confidence: {:.2}%)",
324 i + 1,
325 predicted_class,
326 confidence * 100.0
327 );
328 }
329 }
330 _ => {}
331 }
332
333 // Analyze quantum advantage
334 let quantum_advantage = analyze_classification_quantum_advantage(&pipeline)?;
335 println!("\n Quantum advantage analysis:");
336 println!(
337 " - Parameter efficiency: {:.2}x classical",
338 quantum_advantage.param_efficiency
339 );
340 println!(
341 " - Feature expressiveness: {:.2}x",
342 quantum_advantage.expressiveness
343 );
344 println!(
345 " - Training speedup: {:.2}x",
346 quantum_advantage.training_speedup
347 );
348
349 Ok(())
350}
351
352/// Demonstrate object detection
353fn object_detection_demo() -> Result<()> {
354 println!(" Quantum object detection demo...");
355
356 // Create detection pipeline
357 let config = QuantumVisionConfig::object_detection(80); // 80 classes (COCO-like)
358 let mut pipeline = QuantumVisionPipeline::new(config)?;
359
360 // Test image
361 let test_images = create_test_image(2, 3, 416, 416)?;
362
363 println!(
364 " Processing {} images for object detection...",
365 test_images.dim().0
366 );
367
368 // Run detection
369 let detections = pipeline.forward(&test_images)?;
370
371 match detections {
372 TaskOutput::Detection {
373 boxes,
374 scores,
375 classes,
376 } => {
377 println!(" Detection results:");
378
379 for batch_idx in 0..boxes.dim().0 {
380 println!("\n Image {}:", batch_idx + 1);
381
382 // Filter detections by score threshold
383 let threshold = 0.5;
384 let mut num_detections = 0;
385
386 for det_idx in 0..boxes.dim().1 {
387 let score = scores[[batch_idx, det_idx]];
388
389 if score > threshold {
390 let class_id = classes[[batch_idx, det_idx]];
391 let bbox = boxes.slice(scirs2_core::ndarray::s![batch_idx, det_idx, ..]);
392
393 println!(" - Object {}: Class {}, Score {:.3}, Box [{:.1}, {:.1}, {:.1}, {:.1}]",
394 num_detections + 1, class_id, score,
395 bbox[0], bbox[1], bbox[2], bbox[3]);
396
397 num_detections += 1;
398 }
399 }
400
401 if num_detections == 0 {
402 println!(" - No objects detected above threshold");
403 } else {
404 println!(" Total objects detected: {}", num_detections);
405 }
406 }
407 }
408 _ => {}
409 }
410
411 // Analyze detection performance
412 println!("\n Detection performance analysis:");
413 println!(" - Quantum anchor generation improves localization");
414 println!(" - Entangled features enhance multi-scale detection");
415 println!(" - Quantum NMS reduces redundant detections");
416
417 Ok(())
418}
419
420/// Demonstrate semantic segmentation
421fn segmentation_demo() -> Result<()> {
422 println!(" Quantum semantic segmentation demo...");
423
424 // Create segmentation pipeline
425 let config = QuantumVisionConfig::segmentation(21); // 21 classes (Pascal VOC-like)
426 let mut pipeline = QuantumVisionPipeline::new(config)?;
427
428 // Test images
429 let test_images = create_test_image(1, 3, 512, 512)?;
430
431 println!(" Processing image for semantic segmentation...");
432
433 // Run segmentation
434 let segmentation = pipeline.forward(&test_images)?;
435
436 match segmentation {
437 TaskOutput::Segmentation {
438 masks,
439 class_scores,
440 } => {
441 println!(" Segmentation results:");
442 println!(" - Mask shape: {:?}", masks.dim());
443 println!(" - Class scores shape: {:?}", class_scores.dim());
444
445 // Analyze segmentation quality
446 let seg_metrics = analyze_segmentation_quality(&masks, &class_scores)?;
447 println!("\n Segmentation metrics:");
448 println!(" - Mean IoU: {:.3}", seg_metrics.mean_iou);
449 println!(
450 " - Pixel accuracy: {:.1}%",
451 seg_metrics.pixel_accuracy * 100.0
452 );
453 println!(
454 " - Boundary precision: {:.3}",
455 seg_metrics.boundary_precision
456 );
457
458 // Class distribution
459 println!("\n Predicted class distribution:");
460 let class_counts = compute_class_distribution(&masks)?;
461 for (class_id, count) in class_counts.iter().take(5) {
462 let percentage = *count as f64 / (512.0 * 512.0) * 100.0;
463 println!(" - Class {}: {:.1}% of pixels", class_id, percentage);
464 }
465 }
466 _ => {}
467 }
468
469 // Quantum advantages for segmentation
470 println!("\n Quantum segmentation advantages:");
471 println!(" - Quantum attention captures long-range dependencies");
472 println!(" - Hierarchical encoding preserves multi-scale features");
473 println!(" - Entanglement enables pixel-to-pixel correlations");
474
475 Ok(())
476}
477
478/// Demonstrate feature extraction
479fn feature_extraction_demo() -> Result<()> {
480 println!(" Quantum feature extraction demo...");
481
482 // Create feature extraction pipeline
483 let config = QuantumVisionConfig {
484 num_qubits: 14,
485 encoding_method: ImageEncodingMethod::QPIE,
486 backbone: VisionBackbone::QuantumResNet {
487 blocks: vec![
488 ResidualBlock {
489 channels: 64,
490 kernel_size: 3,
491 stride: 1,
492 quantum_conv: true,
493 },
494 ResidualBlock {
495 channels: 128,
496 kernel_size: 3,
497 stride: 2,
498 quantum_conv: true,
499 },
500 ],
501 skip_connections: true,
502 },
503 task_config: VisionTaskConfig::FeatureExtraction {
504 feature_dim: 512,
505 normalize: true,
506 },
507 preprocessing: PreprocessingConfig::default(),
508 quantum_enhancement: QuantumEnhancement::High,
509 };
510
511 let mut pipeline = QuantumVisionPipeline::new(config)?;
512
513 // Extract features from multiple images
514 let num_images = 10;
515 let test_images = create_test_image(num_images, 3, 224, 224)?;
516
517 println!(" Extracting features from {} images...", num_images);
518
519 let features_output = pipeline.forward(&test_images)?;
520
521 match features_output {
522 TaskOutput::Features {
523 features,
524 attention_maps,
525 } => {
526 println!(" Feature extraction results:");
527 println!(" - Feature dimension: {}", features.dim().1);
528 println!(" - Features normalized: Yes");
529
530 // Compute feature statistics
531 let feature_stats = compute_feature_statistics(&features)?;
532 println!("\n Feature statistics:");
533 println!(" - Mean magnitude: {:.4}", feature_stats.mean_magnitude);
534 println!(" - Variance: {:.4}", feature_stats.variance);
535 println!(" - Sparsity: {:.1}%", feature_stats.sparsity * 100.0);
536
537 // Compute pairwise similarities
538 println!("\n Feature similarity matrix (first 5 images):");
539 let similarities = compute_cosine_similarities(&features)?;
540
541 print!(" ");
542 for i in 0..5.min(num_images) {
543 print!("Img{} ", i + 1);
544 }
545 println!();
546
547 for i in 0..5.min(num_images) {
548 print!(" Img{} ", i + 1);
549 for j in 0..5.min(num_images) {
550 print!("{:.3} ", similarities[[i, j]]);
551 }
552 println!();
553 }
554
555 // Quantum feature properties
556 println!("\n Quantum feature properties:");
557 println!(" - Entanglement enhances discriminative power");
558 println!(" - Quantum superposition encodes multiple views");
559 println!(" - Phase information captures subtle variations");
560 }
561 _ => {}
562 }
563
564 Ok(())
565}
566
567/// Demonstrate multi-task learning
568fn multitask_demo() -> Result<()> {
569 println!(" Multi-task quantum vision demo...");
570
571 // Create a pipeline that can handle multiple tasks
572 let tasks = vec![
573 (
574 "Classification",
575 VisionTaskConfig::Classification {
576 num_classes: 10,
577 multi_label: false,
578 },
579 ),
580 (
581 "Detection",
582 VisionTaskConfig::ObjectDetection {
583 num_classes: 20,
584 anchor_sizes: vec![(32, 32), (64, 64)],
585 iou_threshold: 0.5,
586 },
587 ),
588 (
589 "Segmentation",
590 VisionTaskConfig::Segmentation {
591 num_classes: 10,
592 output_stride: 8,
593 },
594 ),
595 ];
596
597 println!(
598 " Testing {} vision tasks with shared backbone...",
599 tasks.len()
600 );
601
602 // Use same backbone for all tasks
603 let base_config = QuantumVisionConfig {
604 num_qubits: 16,
605 encoding_method: ImageEncodingMethod::HierarchicalEncoding { levels: 3 },
606 backbone: VisionBackbone::HybridBackbone {
607 cnn_layers: 4,
608 transformer_layers: 2,
609 },
610 task_config: tasks[0].1.clone(), // Will be replaced for each task
611 preprocessing: PreprocessingConfig::default(),
612 quantum_enhancement: QuantumEnhancement::High,
613 };
614
615 // Test each task
616 let test_images = create_test_image(2, 3, 416, 416)?;
617
618 for (task_name, task_config) in tasks {
619 println!("\n --- {} Task ---", task_name);
620
621 let mut config = base_config.clone();
622 config.task_config = task_config;
623
624 let mut pipeline = QuantumVisionPipeline::new(config)?;
625 let output = pipeline.forward(&test_images)?;
626
627 match output {
628 TaskOutput::Classification { logits, .. } => {
629 println!(" Classification output shape: {:?}", logits.dim());
630 }
631 TaskOutput::Detection { boxes, scores, .. } => {
632 println!(
633 " Detection: {} anchors, score shape: {:?}",
634 boxes.dim().1,
635 scores.dim()
636 );
637 }
638 TaskOutput::Segmentation { masks, .. } => {
639 println!(" Segmentation mask shape: {:?}", masks.dim());
640 }
641 _ => {}
642 }
643
644 // Task-specific quantum advantages
645 match task_name {
646 "Classification" => {
647 println!(" ✓ Quantum features improve class discrimination");
648 }
649 "Detection" => {
650 println!(" ✓ Quantum anchors adapt to object scales");
651 }
652 "Segmentation" => {
653 println!(" ✓ Quantum correlations enhance boundary detection");
654 }
655 _ => {}
656 }
657 }
658
659 println!("\n Multi-task benefits:");
660 println!(" - Shared quantum backbone reduces parameters");
661 println!(" - Task-specific quantum heads optimize performance");
662 println!(" - Quantum entanglement enables cross-task learning");
663
664 Ok(())
665}
Sourcepub fn train(
&mut self,
train_data: &[(Array4<f64>, TaskTarget)],
val_data: &[(Array4<f64>, TaskTarget)],
epochs: usize,
optimizer: OptimizationMethod,
) -> Result<TrainingHistory>
pub fn train( &mut self, train_data: &[(Array4<f64>, TaskTarget)], val_data: &[(Array4<f64>, TaskTarget)], epochs: usize, optimizer: OptimizationMethod, ) -> Result<TrainingHistory>
Train the pipeline
Examples found in repository?
examples/computer_vision.rs (lines 283-288)
263fn classification_demo() -> Result<()> {
264 println!(" Quantum image classification demo...");
265
266 // Create classification pipeline
267 let config = QuantumVisionConfig::default();
268 let mut pipeline = QuantumVisionPipeline::new(config)?;
269
270 // Create synthetic dataset
271 let num_classes = 10;
272 let num_samples = 20;
273 let (train_data, val_data) = create_classification_dataset(num_samples, num_classes)?;
274
275 println!(
276 " Dataset: {} training, {} validation samples",
277 train_data.len(),
278 val_data.len()
279 );
280
281 // Train the model (simplified)
282 println!("\n Training quantum classifier...");
283 let history = pipeline.train(
284 &train_data,
285 &val_data,
286 5, // epochs
287 OptimizationMethod::Adam,
288 )?;
289
290 // Display training results
291 println!("\n Training results:");
292 for (epoch, train_loss, val_loss) in history
293 .epochs
294 .iter()
295 .zip(history.train_losses.iter())
296 .zip(history.val_losses.iter())
297 .map(|((e, t), v)| (e, t, v))
298 {
299 println!(
300 " Epoch {}: train_loss={:.4}, val_loss={:.4}",
301 epoch + 1,
302 train_loss,
303 val_loss
304 );
305 }
306
307 // Test on new images
308 println!("\n Testing on new images...");
309 let test_images = create_test_image(5, 3, 224, 224)?;
310 let predictions = pipeline.forward(&test_images)?;
311
312 match predictions {
313 TaskOutput::Classification { probabilities, .. } => {
314 for (i, prob_row) in probabilities.outer_iter().enumerate() {
315 let (predicted_class, confidence) = prob_row
316 .iter()
317 .enumerate()
318 .max_by(|(_, a), (_, b)| a.partial_cmp(b).unwrap())
319 .map(|(idx, &prob)| (idx, prob))
320 .unwrap_or((0, 0.0));
321
322 println!(
323 " Image {}: Class {} (confidence: {:.2}%)",
324 i + 1,
325 predicted_class,
326 confidence * 100.0
327 );
328 }
329 }
330 _ => {}
331 }
332
333 // Analyze quantum advantage
334 let quantum_advantage = analyze_classification_quantum_advantage(&pipeline)?;
335 println!("\n Quantum advantage analysis:");
336 println!(
337 " - Parameter efficiency: {:.2}x classical",
338 quantum_advantage.param_efficiency
339 );
340 println!(
341 " - Feature expressiveness: {:.2}x",
342 quantum_advantage.expressiveness
343 );
344 println!(
345 " - Training speedup: {:.2}x",
346 quantum_advantage.training_speedup
347 );
348
349 Ok(())
350}
Sourcepub fn metrics(&self) -> &VisionMetrics
pub fn metrics(&self) -> &VisionMetrics
Get performance metrics
Examples found in repository?
examples/computer_vision.rs (line 229)
131fn vision_backbone_demo() -> Result<()> {
132 println!(" Testing quantum vision backbone architectures...");
133
134 // Different backbone configurations
135 let backbones = vec![
136 (
137 "Quantum CNN",
138 QuantumVisionConfig {
139 num_qubits: 12,
140 encoding_method: ImageEncodingMethod::AmplitudeEncoding,
141 backbone: VisionBackbone::QuantumCNN {
142 conv_layers: vec![
143 ConvolutionalConfig {
144 num_filters: 32,
145 kernel_size: 3,
146 stride: 1,
147 padding: 1,
148 quantum_kernel: true,
149 circuit_depth: 4,
150 },
151 ConvolutionalConfig {
152 num_filters: 64,
153 kernel_size: 3,
154 stride: 2,
155 padding: 1,
156 quantum_kernel: true,
157 circuit_depth: 6,
158 },
159 ],
160 pooling_type: PoolingType::Quantum,
161 },
162 task_config: VisionTaskConfig::Classification {
163 num_classes: 10,
164 multi_label: false,
165 },
166 preprocessing: PreprocessingConfig::default(),
167 quantum_enhancement: QuantumEnhancement::Medium,
168 },
169 ),
170 (
171 "Quantum ViT",
172 QuantumVisionConfig {
173 num_qubits: 16,
174 encoding_method: ImageEncodingMethod::QPIE,
175 backbone: VisionBackbone::QuantumViT {
176 patch_size: 16,
177 embed_dim: 768,
178 num_heads: 12,
179 depth: 12,
180 },
181 task_config: VisionTaskConfig::Classification {
182 num_classes: 10,
183 multi_label: false,
184 },
185 preprocessing: PreprocessingConfig::default(),
186 quantum_enhancement: QuantumEnhancement::High,
187 },
188 ),
189 (
190 "Hybrid CNN-Transformer",
191 QuantumVisionConfig {
192 num_qubits: 14,
193 encoding_method: ImageEncodingMethod::HierarchicalEncoding { levels: 3 },
194 backbone: VisionBackbone::HybridBackbone {
195 cnn_layers: 4,
196 transformer_layers: 2,
197 },
198 task_config: VisionTaskConfig::Classification {
199 num_classes: 10,
200 multi_label: false,
201 },
202 preprocessing: PreprocessingConfig::default(),
203 quantum_enhancement: QuantumEnhancement::High,
204 },
205 ),
206 ];
207
208 for (name, config) in backbones {
209 println!("\n --- {} Backbone ---", name);
210
211 let mut pipeline = QuantumVisionPipeline::new(config)?;
212
213 // Test forward pass
214 let test_images = create_test_image(2, 3, 224, 224)?;
215 let output = pipeline.forward(&test_images)?;
216
217 match &output {
218 TaskOutput::Classification {
219 logits,
220 probabilities,
221 } => {
222 println!(" Output shape: {:?}", logits.dim());
223 println!(" Probability shape: {:?}", probabilities.dim());
224 }
225 _ => {}
226 }
227
228 // Get metrics
229 let metrics = pipeline.metrics();
230 println!(" Quantum metrics:");
231 println!(
232 " - Circuit depth: {}",
233 metrics.quantum_metrics.circuit_depth
234 );
235 println!(
236 " - Quantum advantage: {:.2}x",
237 metrics.quantum_metrics.quantum_advantage
238 );
239 println!(
240 " - Coherence utilization: {:.1}%",
241 metrics.quantum_metrics.coherence_utilization * 100.0
242 );
243
244 // Architecture-specific properties
245 match name {
246 "Quantum CNN" => {
247 println!(" ✓ Hierarchical feature extraction with quantum convolutions");
248 }
249 "Quantum ViT" => {
250 println!(" ✓ Global context modeling with quantum attention");
251 }
252 "Hybrid CNN-Transformer" => {
253 println!(" ✓ Local features + global context integration");
254 }
255 _ => {}
256 }
257 }
258
259 Ok(())
260}
261
262/// Demonstrate image classification
263fn classification_demo() -> Result<()> {
264 println!(" Quantum image classification demo...");
265
266 // Create classification pipeline
267 let config = QuantumVisionConfig::default();
268 let mut pipeline = QuantumVisionPipeline::new(config)?;
269
270 // Create synthetic dataset
271 let num_classes = 10;
272 let num_samples = 20;
273 let (train_data, val_data) = create_classification_dataset(num_samples, num_classes)?;
274
275 println!(
276 " Dataset: {} training, {} validation samples",
277 train_data.len(),
278 val_data.len()
279 );
280
281 // Train the model (simplified)
282 println!("\n Training quantum classifier...");
283 let history = pipeline.train(
284 &train_data,
285 &val_data,
286 5, // epochs
287 OptimizationMethod::Adam,
288 )?;
289
290 // Display training results
291 println!("\n Training results:");
292 for (epoch, train_loss, val_loss) in history
293 .epochs
294 .iter()
295 .zip(history.train_losses.iter())
296 .zip(history.val_losses.iter())
297 .map(|((e, t), v)| (e, t, v))
298 {
299 println!(
300 " Epoch {}: train_loss={:.4}, val_loss={:.4}",
301 epoch + 1,
302 train_loss,
303 val_loss
304 );
305 }
306
307 // Test on new images
308 println!("\n Testing on new images...");
309 let test_images = create_test_image(5, 3, 224, 224)?;
310 let predictions = pipeline.forward(&test_images)?;
311
312 match predictions {
313 TaskOutput::Classification { probabilities, .. } => {
314 for (i, prob_row) in probabilities.outer_iter().enumerate() {
315 let (predicted_class, confidence) = prob_row
316 .iter()
317 .enumerate()
318 .max_by(|(_, a), (_, b)| a.partial_cmp(b).unwrap())
319 .map(|(idx, &prob)| (idx, prob))
320 .unwrap_or((0, 0.0));
321
322 println!(
323 " Image {}: Class {} (confidence: {:.2}%)",
324 i + 1,
325 predicted_class,
326 confidence * 100.0
327 );
328 }
329 }
330 _ => {}
331 }
332
333 // Analyze quantum advantage
334 let quantum_advantage = analyze_classification_quantum_advantage(&pipeline)?;
335 println!("\n Quantum advantage analysis:");
336 println!(
337 " - Parameter efficiency: {:.2}x classical",
338 quantum_advantage.param_efficiency
339 );
340 println!(
341 " - Feature expressiveness: {:.2}x",
342 quantum_advantage.expressiveness
343 );
344 println!(
345 " - Training speedup: {:.2}x",
346 quantum_advantage.training_speedup
347 );
348
349 Ok(())
350}
351
352/// Demonstrate object detection
353fn object_detection_demo() -> Result<()> {
354 println!(" Quantum object detection demo...");
355
356 // Create detection pipeline
357 let config = QuantumVisionConfig::object_detection(80); // 80 classes (COCO-like)
358 let mut pipeline = QuantumVisionPipeline::new(config)?;
359
360 // Test image
361 let test_images = create_test_image(2, 3, 416, 416)?;
362
363 println!(
364 " Processing {} images for object detection...",
365 test_images.dim().0
366 );
367
368 // Run detection
369 let detections = pipeline.forward(&test_images)?;
370
371 match detections {
372 TaskOutput::Detection {
373 boxes,
374 scores,
375 classes,
376 } => {
377 println!(" Detection results:");
378
379 for batch_idx in 0..boxes.dim().0 {
380 println!("\n Image {}:", batch_idx + 1);
381
382 // Filter detections by score threshold
383 let threshold = 0.5;
384 let mut num_detections = 0;
385
386 for det_idx in 0..boxes.dim().1 {
387 let score = scores[[batch_idx, det_idx]];
388
389 if score > threshold {
390 let class_id = classes[[batch_idx, det_idx]];
391 let bbox = boxes.slice(scirs2_core::ndarray::s![batch_idx, det_idx, ..]);
392
393 println!(" - Object {}: Class {}, Score {:.3}, Box [{:.1}, {:.1}, {:.1}, {:.1}]",
394 num_detections + 1, class_id, score,
395 bbox[0], bbox[1], bbox[2], bbox[3]);
396
397 num_detections += 1;
398 }
399 }
400
401 if num_detections == 0 {
402 println!(" - No objects detected above threshold");
403 } else {
404 println!(" Total objects detected: {}", num_detections);
405 }
406 }
407 }
408 _ => {}
409 }
410
411 // Analyze detection performance
412 println!("\n Detection performance analysis:");
413 println!(" - Quantum anchor generation improves localization");
414 println!(" - Entangled features enhance multi-scale detection");
415 println!(" - Quantum NMS reduces redundant detections");
416
417 Ok(())
418}
419
420/// Demonstrate semantic segmentation
421fn segmentation_demo() -> Result<()> {
422 println!(" Quantum semantic segmentation demo...");
423
424 // Create segmentation pipeline
425 let config = QuantumVisionConfig::segmentation(21); // 21 classes (Pascal VOC-like)
426 let mut pipeline = QuantumVisionPipeline::new(config)?;
427
428 // Test images
429 let test_images = create_test_image(1, 3, 512, 512)?;
430
431 println!(" Processing image for semantic segmentation...");
432
433 // Run segmentation
434 let segmentation = pipeline.forward(&test_images)?;
435
436 match segmentation {
437 TaskOutput::Segmentation {
438 masks,
439 class_scores,
440 } => {
441 println!(" Segmentation results:");
442 println!(" - Mask shape: {:?}", masks.dim());
443 println!(" - Class scores shape: {:?}", class_scores.dim());
444
445 // Analyze segmentation quality
446 let seg_metrics = analyze_segmentation_quality(&masks, &class_scores)?;
447 println!("\n Segmentation metrics:");
448 println!(" - Mean IoU: {:.3}", seg_metrics.mean_iou);
449 println!(
450 " - Pixel accuracy: {:.1}%",
451 seg_metrics.pixel_accuracy * 100.0
452 );
453 println!(
454 " - Boundary precision: {:.3}",
455 seg_metrics.boundary_precision
456 );
457
458 // Class distribution
459 println!("\n Predicted class distribution:");
460 let class_counts = compute_class_distribution(&masks)?;
461 for (class_id, count) in class_counts.iter().take(5) {
462 let percentage = *count as f64 / (512.0 * 512.0) * 100.0;
463 println!(" - Class {}: {:.1}% of pixels", class_id, percentage);
464 }
465 }
466 _ => {}
467 }
468
469 // Quantum advantages for segmentation
470 println!("\n Quantum segmentation advantages:");
471 println!(" - Quantum attention captures long-range dependencies");
472 println!(" - Hierarchical encoding preserves multi-scale features");
473 println!(" - Entanglement enables pixel-to-pixel correlations");
474
475 Ok(())
476}
477
478/// Demonstrate feature extraction
479fn feature_extraction_demo() -> Result<()> {
480 println!(" Quantum feature extraction demo...");
481
482 // Create feature extraction pipeline
483 let config = QuantumVisionConfig {
484 num_qubits: 14,
485 encoding_method: ImageEncodingMethod::QPIE,
486 backbone: VisionBackbone::QuantumResNet {
487 blocks: vec![
488 ResidualBlock {
489 channels: 64,
490 kernel_size: 3,
491 stride: 1,
492 quantum_conv: true,
493 },
494 ResidualBlock {
495 channels: 128,
496 kernel_size: 3,
497 stride: 2,
498 quantum_conv: true,
499 },
500 ],
501 skip_connections: true,
502 },
503 task_config: VisionTaskConfig::FeatureExtraction {
504 feature_dim: 512,
505 normalize: true,
506 },
507 preprocessing: PreprocessingConfig::default(),
508 quantum_enhancement: QuantumEnhancement::High,
509 };
510
511 let mut pipeline = QuantumVisionPipeline::new(config)?;
512
513 // Extract features from multiple images
514 let num_images = 10;
515 let test_images = create_test_image(num_images, 3, 224, 224)?;
516
517 println!(" Extracting features from {} images...", num_images);
518
519 let features_output = pipeline.forward(&test_images)?;
520
521 match features_output {
522 TaskOutput::Features {
523 features,
524 attention_maps,
525 } => {
526 println!(" Feature extraction results:");
527 println!(" - Feature dimension: {}", features.dim().1);
528 println!(" - Features normalized: Yes");
529
530 // Compute feature statistics
531 let feature_stats = compute_feature_statistics(&features)?;
532 println!("\n Feature statistics:");
533 println!(" - Mean magnitude: {:.4}", feature_stats.mean_magnitude);
534 println!(" - Variance: {:.4}", feature_stats.variance);
535 println!(" - Sparsity: {:.1}%", feature_stats.sparsity * 100.0);
536
537 // Compute pairwise similarities
538 println!("\n Feature similarity matrix (first 5 images):");
539 let similarities = compute_cosine_similarities(&features)?;
540
541 print!(" ");
542 for i in 0..5.min(num_images) {
543 print!("Img{} ", i + 1);
544 }
545 println!();
546
547 for i in 0..5.min(num_images) {
548 print!(" Img{} ", i + 1);
549 for j in 0..5.min(num_images) {
550 print!("{:.3} ", similarities[[i, j]]);
551 }
552 println!();
553 }
554
555 // Quantum feature properties
556 println!("\n Quantum feature properties:");
557 println!(" - Entanglement enhances discriminative power");
558 println!(" - Quantum superposition encodes multiple views");
559 println!(" - Phase information captures subtle variations");
560 }
561 _ => {}
562 }
563
564 Ok(())
565}
566
567/// Demonstrate multi-task learning
568fn multitask_demo() -> Result<()> {
569 println!(" Multi-task quantum vision demo...");
570
571 // Create a pipeline that can handle multiple tasks
572 let tasks = vec![
573 (
574 "Classification",
575 VisionTaskConfig::Classification {
576 num_classes: 10,
577 multi_label: false,
578 },
579 ),
580 (
581 "Detection",
582 VisionTaskConfig::ObjectDetection {
583 num_classes: 20,
584 anchor_sizes: vec![(32, 32), (64, 64)],
585 iou_threshold: 0.5,
586 },
587 ),
588 (
589 "Segmentation",
590 VisionTaskConfig::Segmentation {
591 num_classes: 10,
592 output_stride: 8,
593 },
594 ),
595 ];
596
597 println!(
598 " Testing {} vision tasks with shared backbone...",
599 tasks.len()
600 );
601
602 // Use same backbone for all tasks
603 let base_config = QuantumVisionConfig {
604 num_qubits: 16,
605 encoding_method: ImageEncodingMethod::HierarchicalEncoding { levels: 3 },
606 backbone: VisionBackbone::HybridBackbone {
607 cnn_layers: 4,
608 transformer_layers: 2,
609 },
610 task_config: tasks[0].1.clone(), // Will be replaced for each task
611 preprocessing: PreprocessingConfig::default(),
612 quantum_enhancement: QuantumEnhancement::High,
613 };
614
615 // Test each task
616 let test_images = create_test_image(2, 3, 416, 416)?;
617
618 for (task_name, task_config) in tasks {
619 println!("\n --- {} Task ---", task_name);
620
621 let mut config = base_config.clone();
622 config.task_config = task_config;
623
624 let mut pipeline = QuantumVisionPipeline::new(config)?;
625 let output = pipeline.forward(&test_images)?;
626
627 match output {
628 TaskOutput::Classification { logits, .. } => {
629 println!(" Classification output shape: {:?}", logits.dim());
630 }
631 TaskOutput::Detection { boxes, scores, .. } => {
632 println!(
633 " Detection: {} anchors, score shape: {:?}",
634 boxes.dim().1,
635 scores.dim()
636 );
637 }
638 TaskOutput::Segmentation { masks, .. } => {
639 println!(" Segmentation mask shape: {:?}", masks.dim());
640 }
641 _ => {}
642 }
643
644 // Task-specific quantum advantages
645 match task_name {
646 "Classification" => {
647 println!(" ✓ Quantum features improve class discrimination");
648 }
649 "Detection" => {
650 println!(" ✓ Quantum anchors adapt to object scales");
651 }
652 "Segmentation" => {
653 println!(" ✓ Quantum correlations enhance boundary detection");
654 }
655 _ => {}
656 }
657 }
658
659 println!("\n Multi-task benefits:");
660 println!(" - Shared quantum backbone reduces parameters");
661 println!(" - Task-specific quantum heads optimize performance");
662 println!(" - Quantum entanglement enables cross-task learning");
663
664 Ok(())
665}
666
667/// Demonstrate performance analysis
668fn performance_analysis_demo() -> Result<()> {
669 println!(" Analyzing quantum vision performance...");
670
671 // Compare different quantum enhancement levels
672 let enhancement_levels = vec![
673 ("Low", QuantumEnhancement::Low),
674 ("Medium", QuantumEnhancement::Medium),
675 ("High", QuantumEnhancement::High),
676 (
677 "Custom",
678 QuantumEnhancement::Custom {
679 quantum_layers: vec![0, 2, 4, 6],
680 entanglement_strength: 0.8,
681 },
682 ),
683 ];
684
685 println!("\n Quantum Enhancement Level Comparison:");
686 println!(" Level | FLOPs | Memory | Accuracy | Q-Advantage");
687 println!(" ---------|---------|---------|----------|------------");
688
689 for (level_name, enhancement) in enhancement_levels {
690 let config = QuantumVisionConfig {
691 num_qubits: 12,
692 encoding_method: ImageEncodingMethod::AmplitudeEncoding,
693 backbone: VisionBackbone::QuantumCNN {
694 conv_layers: vec![ConvolutionalConfig {
695 num_filters: 32,
696 kernel_size: 3,
697 stride: 1,
698 padding: 1,
699 quantum_kernel: true,
700 circuit_depth: 4,
701 }],
702 pooling_type: PoolingType::Quantum,
703 },
704 task_config: VisionTaskConfig::Classification {
705 num_classes: 10,
706 multi_label: false,
707 },
708 preprocessing: PreprocessingConfig::default(),
709 quantum_enhancement: enhancement,
710 };
711
712 let pipeline = QuantumVisionPipeline::new(config)?;
713 let metrics = pipeline.metrics();
714
715 // Simulate performance metrics
716 let (flops, memory, accuracy, q_advantage) = match level_name {
717 "Low" => (1.2, 50.0, 0.85, 1.2),
718 "Medium" => (2.5, 80.0, 0.88, 1.5),
719 "High" => (4.1, 120.0, 0.91, 2.1),
720 "Custom" => (3.2, 95.0, 0.90, 1.8),
721 _ => (0.0, 0.0, 0.0, 0.0),
722 };
723
724 println!(
725 " {:<8} | {:.1}G | {:.0}MB | {:.1}% | {:.1}x",
726 level_name,
727 flops,
728 memory,
729 accuracy * 100.0,
730 q_advantage
731 );
732 }
733
734 // Scalability analysis
735 println!("\n Scalability Analysis:");
736 let image_sizes = vec![64, 128, 224, 416, 512];
737
738 println!(" Image Size | Inference Time | Throughput");
739 println!(" -----------|----------------|------------");
740
741 for size in image_sizes {
742 let inference_time = 5.0 + (size as f64 / 100.0).powi(2);
743 let throughput = 1000.0 / inference_time;
744
745 println!(
746 " {}x{} | {:.1}ms | {:.0} img/s",
747 size, size, inference_time, throughput
748 );
749 }
750
751 // Quantum advantages summary
752 println!("\n Quantum Computer Vision Advantages:");
753 println!(" 1. Exponential feature space with limited qubits");
754 println!(" 2. Natural multi-scale representation via entanglement");
755 println!(" 3. Quantum attention for global context modeling");
756 println!(" 4. Phase encoding for rotation-invariant features");
757 println!(" 5. Quantum pooling preserves superposition information");
758
759 // Hardware requirements
760 println!("\n Hardware Requirements:");
761 println!(" - Minimum qubits: 10 (basic tasks)");
762 println!(" - Recommended: 16-20 qubits (complex tasks)");
763 println!(" - Coherence time: >100μs for deep networks");
764 println!(" - Gate fidelity: >99.9% for accurate predictions");
765
766 Ok(())
767}
Trait Implementations§
Source§impl Clone for QuantumVisionPipeline
impl Clone for QuantumVisionPipeline
Source§fn clone(&self) -> QuantumVisionPipeline
fn clone(&self) -> QuantumVisionPipeline
Returns a duplicate of the value. Read more
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from
source
. Read moreAuto Trait Implementations§
impl Freeze for QuantumVisionPipeline
impl !RefUnwindSafe for QuantumVisionPipeline
impl !Send for QuantumVisionPipeline
impl !Sync for QuantumVisionPipeline
impl Unpin for QuantumVisionPipeline
impl !UnwindSafe for QuantumVisionPipeline
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
Converts
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
The inverse inclusion map: attempts to construct
self
from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
Checks if
self
is actually part of its subset T
(and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
Use with care! Same as
self.to_subset
but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
The inclusion map: converts
self
to the equivalent element of its superset.